---
title: "Cuadrilla: offline team app | abuenoben"
description: "Manage teams, tasks and photographs offline. Explore Cuadrilla videos for Android and iOS, local storage and manual synchronization."
canonical: "https://showroom.abuenoben.com/en/apps/cuadrilla/"
language: "en"
---

# Cuadrilla: work offline.

Teams, tasks and photographs saved on the device. When the connection returns, you choose when to synchronize.

### Save offline and synchronize later

Airplane mode, persisted changes, process shutdown, reopening with the photo available, connection failure and recovery.

[Watch video](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/cuadrilla-offline.mp4>)

Application walkthrough. 48 s.

[Watch vertical video](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/cuadrilla-offline-vertical.mp4>)[Download video](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/cuadrilla-offline.mp4>)

What this journey shows

Airplane mode, persisted changes, process shutdown, reopening with the photo available, connection failure and recovery.

-   Change task status and keep working offline.
-   Close and reopen the application with tasks and photographs preserved.
-   Reconnect and synchronize changes with the other devices.

## Does your team need a mobile app?

We can define workflows, data that must remain available offline and each platform’s integrations before agreeing the scope.

[Discuss a mobile project](<https://abuenoben.com/en/contact?utm_source=showroom&utm_medium=case&utm_campaign=cuadrilla&utm_content=en&showroom=cuadrilla#contact-form-shell>)

Screens and platforms

## Daily work on Android.

Each task brings together its assignee, status and photographs. Changes are saved on the device so work can continue without a connection.

### Organise work and attach a photo

Team, assignee, task status and import through the Android photo picker.

[Watch video](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/cuadrilla-uso.mp4>)

Application walkthrough. 59 s.

[Watch vertical video](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/cuadrilla-uso-vertical.mp4>)[Download video](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/cuadrilla-uso.mp4>)

What this journey shows

Team, assignee, task status and import through the Android photo picker.

### Application screenshots

[![Cuadrilla on Android: tasks and assignees. North Team task list with status, filters and assignees.](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/01-tareas-claro.webp>)](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/01-tareas-claro.webp>)

**Tasks and assignees**  
North Team task list with status, filters and assignees.

[![Cuadrilla on Android: team members. Team members, roles and open tasks.](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/02-equipo.webp>)](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/02-equipo.webp>)

**Team members**  
Team members, roles and open tasks.

[![Cuadrilla on Android: a photo within the task. Status, assignee and attached photograph.](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/04-tarea-con-foto.webp>)](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/04-tarea-con-foto.webp>)

**A photo within the task**  
Status, assignee and attached photograph.

View all application screens and states

[![Cuadrilla on Android: find a task. Local search for the term material.](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/03-busqueda.webp>)](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/03-busqueda.webp>)

**Find a task**  
Local search for the term material.

[![Cuadrilla on Android: view the photo. Viewer displaying the photograph saved with the task.](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/05-foto-ampliada.webp>)](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/05-foto-ampliada.webp>)

**View the photo**  
Viewer displaying the photograph saved with the task.

[![Cuadrilla on Android: change status offline. Task marked done with airplane mode enabled and server tunnel removed.](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/06-hecha-sin-conexion.webp>)](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/06-hecha-sin-conexion.webp>)

**Change status offline**  
Task marked done with airplane mode enabled and server tunnel removed.

[![Cuadrilla on Android: reopen without losing the photo. Photograph available after closing and reopening offline.](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/07-foto-tras-reabrir-offline.webp>)](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/07-foto-tras-reabrir-offline.webp>)

**Reopen without losing the photo**  
Photograph available after closing and reopening offline.

[![Cuadrilla on Android: changes waiting to be shared. After connection failure, local changes are retained and the remote revision is unchanged.](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/08-sincronizacion-pendiente.webp>)](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/08-sincronizacion-pendiente.webp>)

**Changes waiting to be shared**  
After connection failure, local changes are retained and the remote revision is unchanged.

[![Cuadrilla on Android: synchronization confirmed. Connectivity restored and manual sync completed; local and remote states verified equal.](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/09-sincronizado.webp>)](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/09-sincronizado.webp>)

**Synchronization confirmed**  
Connectivity restored and manual sync completed; local and remote states verified equal.

[![Cuadrilla on Android: dark theme. The same application using the system dark theme.](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/10-tareas-oscuro.webp>)](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/10-tareas-oscuro.webp>)

**Dark theme**  
The same application using the system dark theme.

[![Cuadrilla on Android: 320 dp and 200% font scale. Narrow-width, dark-theme and enlarged-text check; content scrolls.](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/11-320dp-texto-200-oscuro.webp>)](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/11-320dp-texto-200-oscuro.webp>)

**320 dp and 200% font scale**  
Narrow-width, dark-theme and enlarged-text check; content scrolls.

[![Cuadrilla on Android: tablet-width navigation. 600 dp width: navigation rail and additional content space.](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/12-tableta-600dp.webp>)](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/12-tableta-600dp.webp>)

**Tablet-width navigation**  
600 dp width: navigation rail and additional content space.

## iOS: shared UI, with native platform adapters.

The project includes a SwiftUI host, a Compose screen exposed through UIViewController, UIKit camera integration, PHPicker and the Darwin HTTP client. Screens and rules are shared; system permissions and pickers have platform-specific implementations.

### Teams, tasks and photographs on iPhone

[Watch video](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/cuadrilla-ios.mp4>)

What this journey shows

Team selection, task browsing, assignee selection and task detail with a photograph.

### Application screenshots

[![iOS: Task list](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/01-tareas-claro-ios.webp>)](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/01-tareas-claro-ios.webp>)

Task list

[![iOS: Team members](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/02-equipo-ios.webp>)](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/02-equipo-ios.webp>)

Team members

[![iOS: Task with a photograph](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/04-tarea-con-foto-ios.webp>)](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/04-tarea-con-foto-ios.webp>)

Task with a photograph

Architecture and limits

## What is shared and where the boundaries sit.

Kotlin Multiplatform shares the model, validation, persistence, change merging and HTTP client. Compose Multiplatform shares the screens. Android and iOS hosts provide application entry points and system integrations.

| Part | Technology | Responsibility |
| --- | --- | --- |
| Interface | Compose Multiplatform · Material 3 | Tasks, teams, forms, detail, photo viewer and settings. |
| Operations and state | AppController · Coroutines · StateFlow | Run asynchronous operations, observe data and report results or errors. |
| Rules and writes | WorkspaceRepository · Mutex | Validate changes and publish state only after persistence succeeds. |
| Local persistence | Okio · JSON · Base64 JPEG | Private workspace snapshot, using a temporary file and atomic rename. |
| Communication | Ktor client · OkHttp / Darwin | Fetch and send the workspace when the user taps Synchronize. |
| Optional server | Python HTTP · SQLite | One workspace with a shared key and revision checked within a transaction. |

### One shared codebase, clear boundaries

[![One shared codebase, clear boundaries. Screens, state, validation and persistence live in the Kotlin Multiplatform module.](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/arquitectura-compartida.en.png>)](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/arquitectura-compartida.en.png>)

Screens, state, validation and persistence live in the Kotlin Multiplatform module.

[Editable SVG](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/arquitectura-compartida.en.svg>)[Mermaid source](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/arquitectura-compartida.en.mmd>)[PNG](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/arquitectura-compartida.en.png>)

### What is shared and what is native

[![What is shared and what is native. Two mobile hosts. JVM runs shared-module tests; there is no desktop application.](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/plataformas.en.png>)](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/plataformas.en.png>)

Two mobile hosts. JVM runs shared-module tests; there is no desktop application.

[Editable SVG](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/plataformas.en.svg>)[Mermaid source](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/plataformas.en.mmd>)[PNG](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/plataformas.en.png>)

### Architecture decisions

Persist before confirming

The repository writes to disk before updating the UI. A network failure is not part of a local write, and a disk failure is not presented as a saved change.

A bounded snapshot

The JSON snapshot keeps data and photographs together: up to 12 MB, 500 tasks, 30 teams and 50 members per team. For many photos or incremental updates, the next step would be a local database with separate image files.

User-triggered sharing

Synchronization is manual. It compares the last synchronized baseline, local state and remote state to retain independent changes and detect incompatible edits to the same record.

Saving and synchronization

## From local work to shared changes.

A task belongs to a team and can be assigned to one of its members. It has a title, description, status, priority, optional due date and up to six photos. Removing a member keeps their tasks and clears the assignment.

### Tasks and photos independent of temporary source links

1.  Create or edit a task and its assignee.
2.  Open the system camera or picker and import a JPEG up to 1280 px and 900 KB.
3.  Validate the new workspace, write a temporary file and rename it atomically.
4.  Update the UI and read that state on reopening, including photos, with no server required.

### From a task to a photo available offline

[![From a task to a photo available offline. Confirmation follows persistence: network access is not part of a local write.](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/proceso-tarea-foto.en.png>)](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/proceso-tarea-foto.en.png>)

Confirmation follows persistence: network access is not part of a local write.

[Editable SVG](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/proceso-tarea-foto.en.svg>)[Mermaid source](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/proceso-tarea-foto.en.mmd>)[PNG](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/proceso-tarea-foto.en.png>)

### Synchronization with revisions and visible conflicts

1.  Tap Synchronize and fetch the remote workspace and revision.
2.  Compare base, local and remote versions per team or task. Independent changes are merged.
3.  If a record has incompatible changes, show both versions and ask which to keep. That choice may discard the other version.
4.  Send only when there are changes to share. SQLite checks the revision in a transaction; HTTP 409 requires fetching and merging again.
5.  After remote confirmation, persist the new local baseline. If the network fails, retain local work for another attempt.

### Share changes without blind overwrites

[![Share changes without blind overwrites. Manual sync compares base, local and remote versions; conflicts are detected per team or task.](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/proceso-sincronizacion.en.png>)](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/proceso-sincronizacion.en.png>)

Manual sync compares base, local and remote versions; conflicts are detected per team or task.

[Editable SVG](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/proceso-sincronizacion.en.svg>)[Mermaid source](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/proceso-sincronizacion.en.mmd>)[PNG](<https://showroom.abuenoben.com/assets/cuadrilla/v2026-11-02/proceso-sincronizacion.en.png>)

## A complete workflow, online and offline.

1.  Organize teams and assign each task to a person.
2.  Add photographs from the camera or gallery and save them with the task.
3.  Change task status and keep working offline.
4.  Close and reopen the application with tasks and photographs preserved.
5.  Reconnect and synchronize changes with the other devices.

Local persistence and synchronization are independent operations. The team shares a server address and workspace key; each person chooses when to send and receive changes from Settings.

[All demos (Spanish)](<https://showroom.abuenoben.com/demos/>)

Cuadrilla · Teams, tasks and photographs.

