Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
ccd2b6d
Merge pull request #705 from OpenDataEnsemble/main
r0ssing Jul 15, 2026
bf41379
fix(desktop): app bundle structure
r0ssing Jul 27, 2026
57e0875
fix numeric fields exporting as null in parquet export
najuna-brian Jul 30, 2026
2d3b780
Merge pull request #708 from najuna-brian/fix/numeric-export-null
najuna-brian Jul 31, 2026
2535716
Merge pull request #706 from HelloSapiens/fix/desktop-dev-bundle-zip
najuna-brian Jul 31, 2026
d9bc95c
feat(synkronus): Add charts and API stats route
r0ssing Jul 31, 2026
d29b99b
chore: re-generated api clients
r0ssing Jul 31, 2026
c41fb7c
feat: added cheeky no-observations gfx
r0ssing Jul 31, 2026
0b4f50d
feat(portal): layout fix
r0ssing Jul 31, 2026
01bb670
Merge pull request #709 from HelloSapiens/feat/portal_landing
r0ssing Jul 31, 2026
e33d4c6
fix(formplayer): Updated sub-observation table sort to use numerical …
r0ssing Aug 2, 2026
c221599
Merge pull request #710 from HelloSapiens/fix/subobservation-ordering
r0ssing Aug 2, 2026
543069f
fix(formplayer): apply clear-on-hide to all renderers per default, no…
r0ssing Aug 2, 2026
cc7c593
fix(formplayer): refactor clear-on-hide to remove the property comple…
r0ssing Aug 2, 2026
3303e0a
Merge pull request #711 from HelloSapiens/fix/clear-on-hide
r0ssing Aug 2, 2026
814c64c
feat(formplayer): Better display of validation errors on finalize screen
r0ssing Aug 3, 2026
64f3427
Merge pull request #712 from HelloSapiens/fix/formplayer-finalize-val…
r0ssing Aug 3, 2026
8711bb1
chore: release prep for v1.2.1
r0ssing Aug 3, 2026
b52c5d7
feat(formulus): Fix IOS startup
Aug 4, 2026
addc695
fix(desktop): Fix issue with injected dev scripts
Aug 4, 2026
5c9897c
chore: formatting
Aug 4, 2026
6b52bf8
Merge pull request #714 from strong-dk/feat/ios-formulus
r0ssing Aug 4, 2026
f56c456
Merge pull request #715 from strong-dk/fix/desktop-app-bundle-push
r0ssing Aug 4, 2026
e373313
chore(deps): update dependency typescript-eslint to v8.66.0
renovate[bot] Aug 4, 2026
46636d7
Merge pull request #686 from OpenDataEnsemble/renovate/typescript-esl…
Ndacyayisenga-droid Aug 5, 2026
a2ade7b
fix(formplayer): Update validation error display logic in SwipeLayout…
r0ssing Aug 6, 2026
611244f
fix(formplayer): Improve validation error handling in SwipeLayoutRend…
r0ssing Aug 6, 2026
07ed596
fix disable on empty
r0ssing Aug 6, 2026
7a4a1d1
feat(formplayer): add translations to default texts
r0ssing Aug 6, 2026
abbd79c
Merge pull request #717 from HelloSapiens/fix/formplayer-ui-snags
r0ssing Aug 6, 2026
5cb1035
feat(formulus): Added IOS metadata necessary for Apple AppStore submi…
Aug 6, 2026
6010464
Merge branch 'dev' into feat/ios-appstore
Aug 6, 2026
8b475fc
Merge pull request #718 from strong-dk/feat/ios-appstore
r0ssing Aug 6, 2026
a9fb20b
chore(deps): update actions/checkout digest to 11d5960
renovate[bot] Aug 6, 2026
6f2619c
Merge pull request #716 from OpenDataEnsemble/renovate/actions-checko…
Ndacyayisenga-droid Aug 10, 2026
4d160a7
chore(deps): update actions/setup-java digest to cf277c6
renovate[bot] Aug 10, 2026
2940c42
Merge pull request #719 from OpenDataEnsemble/renovate/actions-setup-…
Ndacyayisenga-droid Aug 10, 2026
9428464
chore(deps): enable Renovate automerge for patch and digest updates
Ndacyayisenga-droid Aug 10, 2026
61ec6c1
Merge pull request #721 from OpenDataEnsemble/chore/renovate-automerge
Ndacyayisenga-droid Aug 12, 2026
fce0d6e
feat(desktop): Add export functionality
r0ssing Aug 15, 2026
5380d8a
Merge branch 'dev' into feat/release-prep
r0ssing Aug 16, 2026
22239e7
Merge pull request #713 from HelloSapiens/feat/release-prep
r0ssing Aug 16, 2026
7629633
Merge branch 'dev' into feat/desktop_exporter
r0ssing Aug 16, 2026
43c5f9a
Merge pull request #722 from HelloSapiens/feat/desktop_exporter
r0ssing Aug 16, 2026
148763d
fix(formulus): resume interrupted observation pulls instead of restar…
r0ssing Aug 16, 2026
c63ab69
fix: making index rebuilding idempotent and more robust sync
r0ssing Aug 16, 2026
ace454a
feat(formulus): batching sync writes, updated progress UX
r0ssing Aug 16, 2026
c3ef119
fix(desktop): improved import functionality
r0ssing Aug 16, 2026
562bb32
feat(desktop): Improved import and sync UX
r0ssing Aug 16, 2026
d71bb82
Merge pull request #723 from HelloSapiens/fix/partial-sync-index
r0ssing Aug 16, 2026
db544e6
feat(formulus): add log viewer to Help&Support, optmizie sync impleme…
r0ssing Aug 16, 2026
d7eaaa1
Merge pull request #724 from HelloSapiens/feat/formulus_diagnostic_su…
r0ssing Aug 16, 2026
0652d8b
fix(formulus): Include bundled sqlite package (jsi) to prevent depend…
r0ssing Aug 16, 2026
51ccec4
Merge pull request #725 from HelloSapiens/fix/formulus-state-fix
r0ssing Aug 16, 2026
0abf4ae
chore: prep for v1.3.0
r0ssing Aug 19, 2026
877d7a6
Merge pull request #726 from HelloSapiens/v1.3.0-preparations
r0ssing Aug 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/auto-label.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4

- name: Label PR based on changed files
uses: actions/labeler@8558fd74291d67161a8a78ce36a881fa63b766a9 # v5
Expand Down
10 changes: 5 additions & 5 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ jobs:
synkronus-cli: ${{ steps.filter.outputs.synkronus-cli }}
steps:
- name: Checkout repository
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
with:
fetch-depth: 0

Expand Down Expand Up @@ -68,7 +68,7 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4

- name: Setup pnpm
uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4
Expand Down Expand Up @@ -111,7 +111,7 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4

- name: Setup pnpm
uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4
Expand Down Expand Up @@ -160,7 +160,7 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4

- name: Setup Go
uses: actions/setup-go@40f1582b2485089dde7abd97c1529aa768e1baff # v5
Expand Down Expand Up @@ -212,7 +212,7 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4

- name: Setup Go
uses: actions/setup-go@40f1582b2485089dde7abd97c1529aa768e1baff # v5
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/e2e-attachments.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4

- name: Set up Go
uses: actions/setup-go@40f1582b2485089dde7abd97c1529aa768e1baff # v5
Expand Down Expand Up @@ -73,7 +73,7 @@ jobs:
timeout-minutes: 20
needs: contract
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4

- name: Setup pnpm
uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/formulus-android.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4

- name: Setup pnpm
uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4
Expand Down Expand Up @@ -83,7 +83,7 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4

- name: Download formplayer assets artifact
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7
Expand Down Expand Up @@ -132,7 +132,7 @@ jobs:
run: pnpm run generate

- name: Set up Java
uses: actions/setup-java@c1e323688fd81a25caa38c78aa6df2d33d3e20d9 # v4
uses: actions/setup-java@cf277c60eb25467037889841efdb72551f06f6c3 # v4
with:
distribution: 'temurin'
java-version: '17'
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/ode-desktop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4

- name: Setup pnpm
uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4
Expand Down Expand Up @@ -117,7 +117,7 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4

- name: Setup pnpm
uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4
Expand Down Expand Up @@ -194,7 +194,7 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4

- name: Download embedded formplayer
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7
Expand Down Expand Up @@ -355,7 +355,7 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4

- name: Download embedded formplayer
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/sbom-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ jobs:
contents: write
steps:
- name: Checkout repository
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4

- name: Setup pnpm
# scripts/sbom/generate-sboms.mjs shells out to `pnpm list`; needs pnpm on PATH.
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/synkronus-cli.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4

- name: Set up Go
uses: actions/setup-go@40f1582b2485089dde7abd97c1529aa768e1baff # v5
Expand Down Expand Up @@ -81,7 +81,7 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4

- name: Set up Go
uses: actions/setup-go@40f1582b2485089dde7abd97c1529aa768e1baff # v5
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/synkronus-docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ jobs:
version: ${{ steps.version.outputs.version }}
steps:
- name: Checkout repository
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
with:
fetch-depth: 0

Expand Down Expand Up @@ -78,7 +78,7 @@ jobs:
packages/components/pnpm-lock.yaml

- name: Set up Java (OpenAPI Generator)
uses: actions/setup-java@c1e323688fd81a25caa38c78aa6df2d33d3e20d9 # v4
uses: actions/setup-java@cf277c60eb25467037889841efdb72551f06f6c3 # v4
with:
distribution: temurin
java-version: '21'
Expand Down Expand Up @@ -126,7 +126,7 @@ jobs:
digest: ${{ steps.push.outputs.digest }}
steps:
- name: Checkout repository
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4

- name: Download docker build context
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
Expand Down Expand Up @@ -192,7 +192,7 @@ jobs:
digest: ${{ steps.push.outputs.digest }}
steps:
- name: Checkout repository
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4

- name: Download docker build context
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
Expand Down
11 changes: 11 additions & 0 deletions PRIVACYPOLICY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Privacy Policy

Your privacy is very important to us. Therefore we consider al your personal information yours and yours alone. No data is stored or transmitted and we do no include any advertising or analytics software that talks to third parties.

## What information is collected?

Formulus does not collect any personal information. All login information is only stored locally on your device.

## Contact

If you have questions or concerns about this Privacy Policy, please [contact us](https://forum.opendataensemble.org/).
2 changes: 1 addition & 1 deletion desktop/AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# ODE Desktop — AI and developer guide

**ODE Desktop** (`desktop/`) is the Tauri + React + Rust app for **Data management** (observations, sync, import) and the **Forms / app workbench** (bundles, form preview, custom app embed). User-facing overview: [desktop/README.md](README.md).
**ODE Desktop** (`desktop/`) is the Tauri + React + Rust app for **Data management** (observations, sync, import, **export**) and the **Forms / app workbench** (bundles, form preview, custom app embed). User-facing overview: [desktop/README.md](README.md).

Published docs: [ODE Desktop developer mode](https://opendataensemble.org/docs/guides/ode-desktop-developer-mode) (local custom app iteration).

Expand Down
13 changes: 13 additions & 0 deletions desktop/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,23 @@ The internal Rust crate may still be named `custodian`; user-facing strings use
## Who it is for

- **Field and data staff** managing observations and sync (Data management).
- **Analysts** exporting local Parquet from Data → **Export** for offline analysis (R, Python, etc.).
- **Form and app authors** testing bundles and custom apps against Synkronus before mobile deploy (Workbench).

Relationship to other ODE components: **Synkronus** (API), **Formulus** + **formplayer** (runtime parity), **Portal** and **CLI** (same public API — no privileged desktop channel). Long-form prose here is intended to be **copy-friendly** for [opendataensemble.org](https://opendataensemble.org/) documentation; keep user-facing sections free of repo-only trivia (put contributor notes under **Development**).

## Data management — Export

From **Data → Export**, ODE Desktop writes analyst-oriented Parquet from the **active profile’s local workspace** (not from Synkronus over the network):

1. Choose a destination parent folder (last location is remembered for the session, like Import).
2. Desktop creates a leaf folder named **`YYYYMMDD`** under that parent (overwrite confirmation if it already exists).
3. One **`<form_type>.parquet`** per form type, plus **`export_manifest.json`**, and **`snippets/`** load scripts (R, Python, Stata, Julia).
4. Optional **Include pending observations** (local rows not yet synced).
5. Optional **Include attachments** — copies referenced files into `attachments/` under the export folder. Observation data stores attachment **basenames**; prefix them with the workspace attachments path shown on Profiles / Export (or the export `attachments/` path when copied) to open files on disk.

The Export page also shows copyable load snippets with variables named after each form type. Transforms and study-specific ETL stay **outside** Desktop. For a full **server** dump as a ZIP, use Portal or `synk data export`.

## Install

Official builds are produced with **`pnpm tauri build`** (artifacts vary by OS: `.msi`, `.dmg`, `.app`, AppImage, `.deb`, etc.). When releases are published, attach those bundles to **GitHub Releases** and link them from project docs.
Expand Down
8 changes: 5 additions & 3 deletions desktop/docs/UI_FEEDBACK.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,13 @@ Single source of truth for how the shell surfaces status, errors, and confirmati

## Progress banner (full-width)

**Use for:** long-running sync, import, and **app bundle download/apply** jobs.
**Use for:** long-running sync, import, **export**, and **app bundle download/apply** jobs.

- Renders below the mode switch / dev bar in `Shell`.
- Shows spinner + status text; optional determinate progress bar when `bundleActivity.total > 0`.
- Dismissible but reappears on next activity.
- Bundle apply: Rust emits `bundle/apply-progress` and `bundle/index-rebuild`; `bundleActivity` in `useCustodianStore` drives the banner.
- Sync completion: keep the banner for short **summary** lines when a downloadable `syncDetailReport` is attached (e.g. missing-attachment push details). Offer **Save report** instead of dumping long ID lists into the banner.
- Do not use for quick actions (save, auth, dev mirror refresh).

## Toasts (bottom-right stack)
Expand All @@ -32,7 +33,7 @@ Single source of truth for how the shell surfaces status, errors, and confirmati

## Native confirm (Tauri)

**Use for:** destructive actions, import-with-issues, closing unsaved observation tabs.
**Use for:** destructive actions, skip already-synced import rows, closing unsaved observation tabs.

- `confirmDestructiveAction()` for destructive flows (clear, profile-scoped wording).
- `confirm()` from `@tauri-apps/plugin-dialog` for save-anyway / import-anyway / tab discard (Save / Don't save / Cancel via separate flows).
Expand All @@ -41,7 +42,8 @@ Single source of truth for how the shell surfaces status, errors, and confirmati

- `window.alert` — replace with toast or inline notice.
- `window.confirm` — replace with Tauri `confirm`.
- Duplicate sync success in both banner and toast — prefer toast for short messages; keep banner only for multi-line sync summaries.
- Dumping long per-observation lists into the sync banner — use a short highlight + **Save report** (`syncDetailReport`).
- Duplicate sync success in both banner and toast — prefer toast for short messages; keep banner when a detail report is available or the message is multi-line.

## Dev mode bar

Expand Down
21 changes: 13 additions & 8 deletions desktop/docs/screens/import.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,10 @@ Bring external JSON observation files into the active profile’s local reposito
## What to include

- Drag-and-drop and multi-file picker for `.json`
- Pre-flight summary (counts, form types, attachment hints)
- Per-file parse/normalization issues
- Import action and clear/reset
- **Validate** then review results in-page (no “import anyway?” popup)
- Import action on the validation results panel (available with or without errors)
- Clear label when validation finds no errors
- Optional skip of Formulus-export rows that already appear synced (`syncedAt` ≥ `updatedAt`) — confirm dialog at staging time

## What to exclude

Expand All @@ -23,17 +24,21 @@ Bring external JSON observation files into the active profile’s local reposito

## Key actions

- Stage files, review summary, import, clear
- Stage files → **Validate** → review results → **Import into local store** (or clear)
- When import JSON carries Formulus `syncedAt` metadata, confirm whether to skip already-synced observations and write only unsynced ones

## Data dependencies

- Store: `import` flow via `tauriClient.importObservations`, refresh `loadObservations` / `loadHealth` after import
- Active profile determines target SQLite repository
- Sync appearance: Formulus hail-mary export includes `syncedAt`; Desktop treats a row as already synced when `syncedAt` is meaningful and `updatedAt <= syncedAt` (same rule as Formulus pending detection)

## Observation indexes

When the active app bundle declares `observationIndexes` in `app.config.json`:
When the active app bundle declares `observationIndexes` in `app.config.json`, local file import updates indexes **incrementally** for the written rows (same as sync pull). A full background rebuild is reserved for bundle apply / empty index / explicit rebuild — not for import.

1. Import writes observations in batches (default 2000 rows per IPC call); intermediate batches skip index work.
2. After the final batch commits, Rust schedules **one** coalesced background full index rebuild (`bundle/index-rebuild` progress events). Overlapping rebuild requests while one is running are merged into a single follow-up pass.
3. Sync pull uses incremental indexing per page instead (no full rebuild after each pull).
## Large Formulus exports

After staging JSON (folder / drop / Add JSON), Desktop runs a lightweight host scan of `syncedAt` / `updatedAt` and may offer to drop already-synced files **before** full parse + schema validation. Staging lists truncate after ~50 rows so tens of thousands of files do not freeze the UI.

Import parse + JSON Schema validation + attachment reference checks run in **Rust (Rayon)** in one pass (`parse_and_validate_import_json_paths`), with form schemas loaded once from the active bundle.
1 change: 1 addition & 0 deletions desktop/docs/screens/profiles.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ Define units of custody: each profile has its own Synkronus server, credentials,
- Edit: display name, server URL, username, password (OS keyring when available)
- Local repository file picker, workspace folder, optional attachments folder
- Reload, save profile, clear saved password
- Authenticate button: auto-recovers session (refresh token / saved password) on load and profile switch; shows **Authenticated** only after a successful check, otherwise **Authenticate**
- Warnings when secure storage is unavailable (password not persisted)

## What to exclude
Expand Down
2 changes: 2 additions & 0 deletions desktop/docs/screens/sync.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ Operational console to authenticate with Synkronus and exchange data: pull into
- Pull and push actions
- Recent operation log (per-session, on this screen)
- Store-level `syncMessage` / `error` after operations
- Danger zone: reset local data (full, or **pending-only** so synced rows + sync offsets stay for a continued pull), re-create index, reset server repository

## What to exclude

Expand All @@ -28,6 +29,7 @@ Operational console to authenticate with Synkronus and exchange data: pull into
## Key actions

- Login, pull, push
- Reset local data (optional: pending observations only)

## Data dependencies

Expand Down
2 changes: 1 addition & 1 deletion desktop/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "ode-desktop",
"private": true,
"version": "1.2.0",
"version": "1.3.0",
"packageManager": "pnpm@10.33.2",
"type": "module",
"scripts": {
Expand Down
Loading
Loading