Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
84 commits
Select commit Hold shift + click to select a range
0da4de1
Add an MCP server so LLM clients can read and edit Atomic Data
joepio Sep 28, 2026
6e606ff
Note the MCP server in the changelog
joepio Sep 28, 2026
9cd7af1
Connect the MCP server with its own key instead of your secret
joepio Sep 28, 2026
50a8646
Make connecting an app with its own key a general lib API
joepio Sep 28, 2026
f5d0cdf
Let both CLIs connect with their own key instead of your secret
joepio Sep 28, 2026
ab12e09
MCP: write document text from Markdown, resolve class names in get_sc…
joepio Sep 29, 2026
0f9b5f4
Hosted MCP endpoint: OAuth authorization server and read-only /mcp
joepio Sep 29, 2026
a621d4e
Use one profile form for signup, share and invite
joepio Oct 1, 2026
cf65218
Faster branch runs: run-branch.sh, content-hashed frontend skip, priv…
joepio Oct 1, 2026
df5fb82
Link the device's identity to the signed-in account
joepio Oct 1, 2026
c85f4ae
Tables: tick rows and delete them in one go
joepio Oct 1, 2026
42c4a93
Tables: row header context menu, multi-cell menu, draggable view tabs
joepio Oct 1, 2026
bfa02e2
Top bar notification and sync icons, clickable share profiles, shorte…
joepio Oct 1, 2026
f40e051
Sidebar: notification and sync icon buttons next to settings, no divi…
joepio Oct 1, 2026
0e6986a
End-to-end encrypted conversations (DMs)
joepio Oct 1, 2026
0e9d79e
Send the passkey ceremony id back in a header
joepio Oct 2, 2026
6da9bba
Extract Canvas user settings into shared atomic_flutter package
joepio Oct 3, 2026
ce46edc
Include private-home drives in the native drive picker
joepio Oct 3, 2026
5146d30
Add shared Flutter account linking and request live audio blobs
joepio Oct 3, 2026
798f6b0
Lock the shared account cryptography dependency for Canvas
joepio Oct 3, 2026
995c74a
Make canvas undo cheap: patch the stroke list, persist history lazily
joepio Oct 4, 2026
495be4e
Name the app atomic.place in the tab, and title every page
joepio Oct 4, 2026
7c0a4e9
Table resource cell: accept pasted subjects and offer drive members
joepio Oct 4, 2026
c831810
Small table fixes: tiny totals, equal numbers in filters, table view …
joepio Oct 4, 2026
202ecb5
Cloud Vault: Manage storage panel with a breakdown and Free up space
joepio Oct 5, 2026
564697a
Where space goes: per-resource usage endpoint and a size map view
joepio Oct 5, 2026
723b2c0
Merge develop into claude/atomic-mcp-r4jdjj
joepio Oct 5, 2026
11ed40a
Merge branch 'pr-1948' into batch/2026-10-05
joepio Oct 5, 2026
388a4d4
Merge branch 'pr-1972' into batch/2026-10-05
joepio Oct 5, 2026
56e2b36
Merge branch 'pr-1971' into batch/2026-10-05
joepio Oct 5, 2026
30aa060
Merge branch 'pr-1953' into batch/2026-10-05
joepio Oct 5, 2026
382398e
Merge branch 'pr-1956' into batch/2026-10-05
joepio Oct 5, 2026
52c9edc
Merge branch 'pr-2035' into batch/2026-10-05
joepio Oct 5, 2026
89579dc
Merge branch 'pr-2053' into batch/2026-10-05
joepio Oct 5, 2026
a0d402d
Merge branch 'pr-2056' into batch/2026-10-05
joepio Oct 5, 2026
04377ac
Merge branch 'pr-2057' into batch/2026-10-05
joepio Oct 5, 2026
c7c20ca
Merge branch 'pr-2058' into batch/2026-10-05
joepio Oct 5, 2026
ed1abfd
Merge branch 'pr-2061' into batch/2026-10-05
joepio Oct 5, 2026
9225d47
cargo fmt after merging the batch
joepio Oct 5, 2026
e85fb12
Merge develop into the multi-select branch
joepio Oct 5, 2026
12af490
Small table fixes: tiny totals, equal numbers in filters, table view …
joepio Oct 4, 2026
56aa8a5
Link the device's identity to the signed-in account
joepio Oct 1, 2026
ea543e1
Name the app atomic.place in the tab, and title every page
joepio Oct 4, 2026
4a5bf32
Show a drive's Cloud Server to every member; skip WebRTC for hosted d…
joepio Oct 5, 2026
45691e2
Sync page: word the Cloud Server plan as this drive's, not the account's
joepio Oct 5, 2026
a108a7f
Vault delta packs ship only envelopes newer than the lane's cursor
joepio Oct 5, 2026
67ca4e3
Label the columns of a table's grouped summary
joepio Oct 5, 2026
2010dac
MetaSetter: the /all-versions route is gone
joepio Oct 5, 2026
bb21917
MCP: one implementation on the node, consent page checks the server, …
joepio Oct 5, 2026
b2f4176
Merge develop into claude/atomic-mcp-r4jdjj
claude Oct 5, 2026
3e66718
Treat a drive as hosted by its node only after this device synced it …
joepio Oct 5, 2026
90e3f26
Fix TableViewTabs test props: pass reorderViews
joepio Oct 5, 2026
f50bd72
Open an invite on the node named by its link, with a clear error when…
joepio Oct 5, 2026
972afbd
Changelog: invite opens on the link's server
joepio Oct 5, 2026
cb114c3
Show one sign-in choice per account on the unlock screen
joepio Oct 5, 2026
be9631d
MCP: approve in the desktop app with atomic-mcp connect --desktop
joepio Oct 5, 2026
6cac934
Dagger: mount packages/ next to flutter/ so atomic_flutter resolves
joepio Oct 5, 2026
d67333d
Merge develop into claude/atomic-mcp-r4jdjj
joepio Oct 5, 2026
86b8deb
Let --served-domain-suffix take several domains
joepio Oct 5, 2026
660bc28
One sign-in for the app and the account
joepio Oct 5, 2026
9003007
Merge develop into combined batch
joepio Oct 5, 2026
961289d
Merge 1948 into combined batch
joepio Oct 5, 2026
c3cc074
Merge 2056 into combined batch
joepio Oct 5, 2026
1bb3dbc
Merge 2058 into combined batch
joepio Oct 5, 2026
15ce3fd
Merge 2068 into combined batch
joepio Oct 5, 2026
81cb718
Merge 1969 into combined batch
joepio Oct 5, 2026
a011be7
Merge 2065 into combined batch
joepio Oct 5, 2026
d6e0e4e
Merge branch 'claude/project-thread-zq0dq1' of https://github.com/ont…
joepio Oct 5, 2026
4cba9f6
Merge 2070 into combined batch
joepio Oct 5, 2026
e421dcb
Merge 2071 into combined batch
joepio Oct 5, 2026
53ddfbe
Merge branch 'node-domain-suffixes' of https://github.com/ontola/atom…
joepio Oct 5, 2026
d2214a7
Merge 2074 into combined batch
joepio Oct 5, 2026
9969577
Merge 1870 into combined batch
joepio Oct 5, 2026
44dc6e4
Settle the catalogs of the combined batch with wuchale
joepio Oct 5, 2026
0ff41d6
Size map: tiles with things inside look like folders, and drilling in…
joepio Oct 5, 2026
690a370
Merge branch 'claude/project-thread-xezgvb' of https://github.com/ont…
joepio Oct 5, 2026
261d3c5
Size map: four colours (resource, resource with resources, mixed, files)
joepio Oct 5, 2026
c358084
Merge branch 'claude/project-thread-xezgvb' of https://github.com/ont…
joepio Oct 5, 2026
57a0731
Sync page: the size-map link sits behind the space count, Synced ago …
joepio Oct 5, 2026
b2aacff
Merge size map and sync page changes into the combined batch
joepio Oct 5, 2026
2e52ab6
Size map: the colour legend sits under the map, smaller and without b…
joepio Oct 5, 2026
ca78a40
Merge size map legend into the combined batch
joepio Oct 5, 2026
e9e8b96
Resource menu: Space usage opens the size map inside that resource
joepio Oct 5, 2026
ab1fa7c
Merge branch 'claude/project-thread-xezgvb' of https://github.com/ont…
joepio Oct 5, 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
10 changes: 10 additions & 0 deletions .dagger/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -542,6 +542,11 @@ export class AtomicServer {
dag.cacheVolume('flutter-pub-cache'),
)
.withDirectory('/workspace/flutter', this.source.directory('flutter'))
// `flutter/pubspec.yaml` points at ../packages/atomic_flutter.
.withDirectory(
'/workspace/packages',
this.source.directory('packages'),
)
.withWorkdir('/workspace/flutter')
.withExec([
'bash',
Expand Down Expand Up @@ -818,6 +823,11 @@ export class AtomicServer {
])
.withDirectory('/workspace/lib', this.source.directory('lib'))
.withDirectory('/workspace/flutter', this.source.directory('flutter'))
// `flutter/pubspec.yaml` points at ../packages/atomic_flutter.
.withDirectory(
'/workspace/packages',
this.source.directory('packages'),
)
.withMountedCache('/workspace/flutter/rust/target', flutterRustTarget, {
sharing: CacheSharingMode.Locked,
})
Expand Down
22 changes: 22 additions & 0 deletions .github/workflows/atomic-flutter.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
name: Atomic Flutter package
on:
pull_request:
paths: ['packages/atomic_flutter/**', 'flutter/**', '.github/workflows/atomic-flutter.yml']
push:
paths: ['packages/atomic_flutter/**', 'flutter/**', '.github/workflows/atomic-flutter.yml']
jobs:
package:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: subosito/flutter-action@v2
with:
flutter-version: '3.44.7'
channel: stable
cache: true
- run: flutter pub get
working-directory: packages/atomic_flutter
- run: flutter analyze
working-directory: packages/atomic_flutter
- run: flutter test
working-directory: packages/atomic_flutter
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ server/assets_tmp
# Same, for the plugin assets `build.rs` stages before embedding them.
server/integrations_assets_tmp
server/js-build.log
server/js-inputs.hash
.netlify
scratchpad
# Local Claude Code state stays out; the shared cloud-session hook is tracked.
Expand Down
9 changes: 9 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,15 @@ After touching anything that renders text, read the `.po` diff by hand: a
guarded element can silently drop sibling strings, and entries re-key when an
icon moves into a message.

## Running a branch for another device

`scripts/run-branch.sh <branch> [--tunnel]` builds a branch in its own worktree and target dir and serves it on 0.0.0.0.

- The app needs a secure origin (OPFS). Plain http works on `http://localhost` only; from a phone or tablet over `http://<lan-ip>` it fails with "This browser could not open local storage". Use `--tunnel` (cloudflared quick tunnel, public while it runs) or the Chrome flag `unsafely-treat-insecure-origin-as-secure`.
- The server derives the origin it accepts logins for from `ATOMIC_DOMAIN` (+ port, http). Behind a tunnel set `ATOMIC_DOMAIN` to the public host, otherwise the websocket auth fails with "does not name this server". `ATOMIC_SERVER_URL` is not read.
- Do not use tunnelto: it drops the websocket and the app stays on "Loading".
- A global `build-dir` in `~/.cargo/config.toml` is shared by every repo and carries one lock. A running `cargo run` then blocks every other cargo (also the one inside `wasm-pack`) silently at 0% CPU, which looks like a hung build. Set `CARGO_BUILD_BUILD_DIR` to a private dir, as the script and `build:wasm` do.

## Quick Dev Setup

Use the Charlotte MCP server and navigate to `http://localhost:6747/app/dev-drive` to instantly create a fresh agent.
Expand Down
32 changes: 32 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,31 @@ See [STATUS.md](server/STATUS.md) to learn more about which features will remain

## UNRELEASED

- `--served-domain-suffix` / `ATOMIC_SERVED_DOMAIN_SUFFIX` takes a comma-separated list (`atomicserver.eu,atomic.place`), so a node can answer under two domains while it moves from one to the other.
- MCP endpoint: `POST /mcp` (Streamable HTTP) is the one implementation of the
MCP tools, for clients that cannot run a local process, such as claude.ai, and
for the local `@tomic/mcp`, which now only bridges to it. It is an OAuth 2.1
resource server (RFC 9728 metadata at `/.well-known/oauth-protected-resource`)
with the node as authorization server (`/oauth/register`, `/oauth/authorize`,
`/oauth/token`, PKCE S256, dynamic client registration, `resource` checked).
The person approves in the app (`/app/authorize-mcp`): which drives, and read
only or read and edit. Reading is as an issued agent under the normal rights
checks. If editing was allowed, `edit_resource`, `create_resource` (documents
take Markdown as `_documentText`) and `delete_resource` exist, and the node
signs those commits as that issued agent, never as the person. Revoking is
removing it under Connected apps. `list_drives`, `get_resource`, `search`,
`query`, `get_user_classes` and `get_schema` are the read tools.
`--app-url` / `ATOMIC_APP_URL` says where the approval page lives when the app
is not served by this node.
- The approval page only works with a node the person is already using: a link
naming another server is refused, and the redirect back to the client must be
exactly the one registered, so a crafted link cannot grant access to someone
else's key or run script in the app.

- `atomic-cli connect`: connect the CLI with a key made on this machine,
approved in the app (`/app/connect-agent`), instead of pasting your agent
secret. Without a config file, the CLI now points you to it rather than
asking for the secret.
- Forms (beta): guests can fill in a form without an account, and each answer
becomes a row in a Table. New default ontology `forms`
(`lib/defaults/forms.json`: `Form`, `FormPage`, `FormField`, `FormHeading`,
Expand Down Expand Up @@ -38,6 +63,13 @@ See [STATUS.md](server/STATUS.md) to learn more about which features will remain
recipient could hold. Read rights are checked per subscriber against the
resource when it is sent, and a connection already reached through the
resource or its drive doesn't get it twice.
- End-to-end encrypted conversations. `atomic_lib::conversation` derives an
agent's X25519 `encryptionKey`, keeps a conversation's keys in a keyring
wrapped to each member, and seals and opens messages; the WASM build exports
it. New default ontology `conversations` (`lib/defaults/conversations.json`)
with the `Conversation` and `SealedMessage` classes. New endpoint
`/conversations` lists the conversations on the server the requesting agent
is a member of. See `planning/encrypted-conversations.md`.

- New default ontology `notifications` (`lib/defaults/notifications.json`):
the `Inbox` and `Notification` classes, and an `inbox` property the private
Expand Down
28 changes: 28 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions TESTING_COVERAGE.md
Original file line number Diff line number Diff line change
Expand Up @@ -2580,3 +2580,13 @@ refused subscribe is dropped.
- The paired SaaS `portal/e2e/onboarding.spec.ts` closes the original context,
downloads the vault into a fresh browser, verifies the saved document and
profile, requires a clean console, and budgets metadata reads after reload.

## Flutter account package (draft)

`packages/atomic_flutter/test/account_test.dart` covers device approval, provider
origin binding, redirect refusal, account/backup mismatch, authenticated discovery,
AES-GCM envelope compatibility with an independently generated Node fixture,
tamper rejection, and closing during a pending request. Atomic Audio additionally
checks isolated native identity installation and actual bidirectional iroh/Loro
with BLAKE3 files introduced after pairing. Production account approval, Vault
transport and recovery on a physical device are not covered by these tests.
Loading
Loading