Repository navigation
Batch: 29 PRs tested together (calendar, cloud server setup, sync, AI chat, search, CI) - #2060
Merged
Merged
Conversation
Resource history is read from the Loro oplog client-side now. The History route (`routes/History/`) calls `resource.getLoroHistory()` directly and gets signers from `/history-attribution`; no network round trip, no paging. These two endpoints were the older server-side path to the same data, and the only thing left reaching them was one "All versions" link at the bottom of the version scroller, which led from that view to a worse rendering of what it was already showing. `lib/src/history.rs` itself stays -- it is already Loro-backed, and `versions()` / `at_version()` are what the WASM and Flutter bridges read through `Resource::get_history` and `Resource::view_at`. Only `encode_version_id` / `decode_version_id` go: they existed to carry an opaque VersionID through an HTTP query parameter, which nothing does now. That is a breaking change to the published `atomic_lib` surface, on a beta version, for two functions whose only caller was the deleted endpoint. The archived verifiable-credentials doc pointed at `/all-versions` for finding who signed a version; `/history-attribution` answers exactly that question, so it now points there. Verified: `cargo test -p atomic-server --lib` (84 passed), `cargo test -p atomic_lib --features db-redb --lib` (543 passed), data-browser typecheck + lint, and the pre-commit hook's own `cargo clippy --workspace --exclude atomic-server-tauri --no-deps --all-targets --no-default-features --features light -- -D warnings` (exit 0). The hook itself could not run here: it snapshots via `git checkout-index`, so the gitignored `dist` / `assets_tmp` are absent and `server/build.rs` attempts a network JS build. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YUL3EPFVmaDAok34JPev3F
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YUL3EPFVmaDAok34JPev3F
`ForkBar` renders above every resource view -- that is its job, to say you are looking at a fork rather than the original. For anything that is not a fork it returns null, but React runs the hooks first, so `useResource(original ?? '')` fired on every resource page. An empty subject resolves against the page origin, and nothing serves a resource there: `AppState::init` deliberately creates no Drive at `/`, so `handle_not_found` answers 404 (lib/src/storelike.rs). Every page load spent a request on that and logged a console error. It now asks for `unknownSubject`, which `Store.getResourceLoading` short-circuits to an in-memory placeholder without any fetch. Only the non-fork path changes, and that path renders nothing; a real fork has `originalSubject` set and behaves as before. This is what failed the `offline-persistence` and `offline-tables` e2e specs. Both assert that a test produces no unexpected browser console errors, and both reload with the WebSocket disconnected -- which is the only reason the miss was visible: over WS it is a protocol answer with nothing logged, over HTTP it is a 404 the browser reports. The fetch was happening online too, just silently. Verified by reproducing the CI failure locally and re-running against it: `pnpm test-e2e:local offline-persistence` and then both specs together, 2 passed. Typecheck, lint and format-check clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YUL3EPFVmaDAok34JPev3F
…on-ubt5pe # Conflicts: # browser/CHANGELOG.md
…on-ubt5pe # Conflicts: # CHANGELOG.md
…on-ubt5pe # Conflicts: # CHANGELOG.md # browser/CHANGELOG.md
…p server queries without a server The demo workspace (and any drive on an origin with no node) no longer asks /query for its connections, which on app.atomic.place returned the app's HTML and showed "Connection query failed". A note at the top says the feature is new. The "Show experimental plugins" toggle is only offered to users who already turned it on, or who unlocked it on this device through /integrations?preview=plugins during a user-testing session. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The demo spec now serves `/query` the SPA's HTML, the way the hosted origin with no node answers it, waits for the page to go quiet, and checks there is no error alert, no query was sent, the new-feature note shows and the experimental toggle does not. On develop it fails on the "Connection query failed" alert. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
newResource reads the parent's drive from memory. When the Team table was not loaded, the new member row claimed the table itself as its drive, so the store stopped treating it as local-only and posted its genesis commit to the server. The server has never seen the local demo drive and answered 404 on every outbox retry, logging "[Demo] could not add the user to the team table". The director now loads the table (from the local database) before creating a row or board card under it, and skips the beat when the table is gone.
Conflicts only in the translation catalogs, where both sides appended entries at the end; kept both and confirmed with a vite run that the result is the extractor's fixed point. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The row dialog opened from a calendar view shows a Repeat field instead of the raw recurrence JSON: none, daily, weekly on chosen days, monthly by date or nth weekday, or yearly, ending never, on a date or after N times, with a summary in words. It writes the payload the view already expands; a payload it cannot show reads as Custom, kept as is, with its JSON one click away. A table without a recurrence property gets one (shortname atomic-calendar-recurrence, as in the Event ontology) when a row first repeats. A row's own series (calendarId "atomic") follows the row's date columns, so moving the row moves the series; imported payloads stay the provider's. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A Playwright test makes an event repeat weekly from the row dialog and checks it appears on the following weeks. The Custom hint moves into its own component: inside its guard the extractor dropped it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Setting undefined through Resource.set failed validation, so turning a repeat off raised an error. Remove the value instead. The e2e test now turns the repeat off again. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Unchecking All day in a calendar row's dialog reveals a start and end
time. They are stored in atomic-calendar-start / atomic-calendar-end,
the exact-instant properties the atomic-plugins Event ontology already
defines (RFC 3339 strings with their offset), added to the class when a
row first gets a time. Day, End day and All day keep their meaning: Day
still says which date, the exclusive End day is untouched, and an
all-day row stays date-only.
Timed events, rows and imported timed recurrences alike, are placed on
the viewer's local day and show local times on their chips ("09:30
Dentist"); a Tuesday 19:30 New York meeting is Wednesday 01:30 in
Amsterdam.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The table view's row dialog now shows the calendar's Repeat field for the recurrence property instead of its raw JSON, with the JSON behind Show JSON. It uses the calendar's detection (`atomic-calendar-recurrence` or the imported `lt-google-calendar-property-` one) and repeats from the calendar's Day, else the class's first date column. A table creates no property: a class without a recurrence or date column, or a row without a day, keeps the JSON editor. The recurrence cell shows the Repeat summary, read-only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Brings in the table view's Repeat field (#1801). Resolves the CalendarView import conflict (calendarRangeColumns now finds All day / End day), moves useTableCalendarRow to useCalendarRowProps, and keeps the table's row dialog to the Repeat field only (`repeatOnly`): Start and End are table columns of their own, and the table creates no property. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Setup switched servers without copying an already-synced drive and reported success without waiting for the reconcile, so the node lacked the drive root and every commit was refused as "Parent of ... not found", retried forever. - Sync the drive to the node and verify its inventory before reporting connected - Park "Parent ... not found" as a blocking refusal instead of retrying over HTTP - Stop the sync page request storm (compare polled info, narrow effect deps, throttle /api/me) - Cache avatar object URLs so remounts are instant - Send store errors to Sentry and fix the Bugsnag isDev gate that never fired
…ead-u8vgm0-hosted-signin
…ead-u8vgm0-cloud-server-step
This was referenced Oct 5, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Combines 29 open PRs, tested in one full Mancave run on the exact head (run 4999, green).
Included: #1530 (remove /version endpoints), #1638 (mobile resource menu stays visible), #1663 (CI prioritises the latest develop pipeline), #1835 (integrations soft launch), #1869 (CONTRIBUTING: trekmeester rebases), #1896 and #1898 (calendar repeat field and local-day times), #1911 (hosted builds open on sign-in), #1912 and #1919 and #1981 (Cloud Server setup fixes), #1913 (avatar URLs kept between mounts), #1914 (sync page stops repeating requests), #1918 (report failing writes to Sentry), #1929 (React Compiler check hook), #1931 (pnpm 11), #1949 (live updates for shared resources), #1958 (vanity hosts), #1959 (fewer peer sessions), #1961 and #1963 (AI chat keeps running, Try again), #1968 (search preview on tablets), #1975 (search never lists destroyed subjects), #1985 (discard a stuck upload), #1988 (AI status on hosted builds), #2038 (on-screen keyboard resize), #2041 (Nix flake), #2047 (two Sentry fixes), #2050 (dashboard Table block).
The source PRs are closed as included once this lands.
Generated by Claude Code