Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
179 commits
Select commit Hold shift + click to select a range
b243b99
v2 core: JCS, input rules, content-addressed trees, version roots
isTravis Oct 3, 2026
f8e1869
v2: protocol spec draft, test vectors, chunking experiments
isTravis Oct 3, 2026
694af58
v2 server: ports and adapters (phase 3)
isTravis Oct 3, 2026
46f9b7a
v2: placements — @underlay/repo, per-collection stores, version log
isTravis Oct 3, 2026
3869282
v2 write path: commit engine and CAS publish
isTravis Oct 3, 2026
8bdf52f
v2 write path: push sessions, delta push, negotiate compatibility
isTravis Oct 3, 2026
a2895e0
v2 auth: better-auth on SQLite with KF Auth, orgs and API keys
isTravis Oct 3, 2026
387ca6d
v2 on workerd: D1-safe publish batch, wrangler config, smoke test
isTravis Oct 3, 2026
0126b2e
v2 read path: collections, versions, records, manifest, diff, files
isTravis Oct 3, 2026
5c8f621
v2 files: direct uploads with verification, presigned downloads
isTravis Oct 3, 2026
bc4aeb4
v2 webhooks: v1 payload and signature, delivered and retried by jobs
isTravis Oct 3, 2026
2008e18
v2 server: renderPage hook for SSR with an in-process API fetch
isTravis Oct 3, 2026
46f301f
v2: validator swap (phase 2), rank/offset seeks, collection management
isTravis Oct 3, 2026
a2d05c0
v2 schemas: collection schemas, global schema search and detail, labels
isTravis Oct 3, 2026
ea3c842
v2 reference log (phase 7): provenance, records by hash, files by hash
isTravis Oct 3, 2026
ec4b2a4
v2 export: streaming tar(.gz) sized from the trees, with README.md
isTravis Oct 3, 2026
a4e247e
v2 migration (phase 9): v1 Postgres → v2 converter, tested on PGlite
isTravis Oct 3, 2026
fa0c803
v2 UI on Workers and Node (packages/web), ARK mounted
isTravis Oct 3, 2026
91ce6f0
v2: mint an ARK when a collection is created (v1 behaviour)
isTravis Oct 3, 2026
0a8ff45
v2 validator: never drop an error whose message can't be worded; suit…
isTravis Oct 3, 2026
8624fed
v2 core: parallel commit units (mergeTree range mode) and assembleTree
isTravis Oct 3, 2026
e1e2e52
v2 runs: framed blocks with range reads, split-key marks, heap merge,…
isTravis Oct 3, 2026
7fc4729
v2 server: parallel commit (planner, commit.unit, commit.assemble, co…
isTravis Oct 3, 2026
d8c1829
v2: merge @underlay/core and @underlay/repo into @underlay/protocol
isTravis Oct 3, 2026
671ea06
v2 protocol: the Store interface, r2Store, and store contract tests
isTravis Oct 3, 2026
4d16eeb
v2 protocol: loads in browsers, no import-time side effects, version …
isTravis Oct 4, 2026
dc9cb43
v2 protocol: tree sync (packVersion, receiveVersion), tar in the package
isTravis Oct 4, 2026
015faa1
v2 server: sync endpoints (pack, log) and collection.json
isTravis Oct 4, 2026
1d26230
v2 protocol: receiveVersion reports the record changes it re-derived
isTravis Oct 4, 2026
9db4ff2
v2: the commit engine's core moves into @underlay/protocol (buildVers…
isTravis Oct 4, 2026
6dec48c
v2 CLI (packages/cli): a local repository, versions by buildVersion, …
isTravis Oct 4, 2026
b8b1d67
v2 protocol: resumable sync work (versionWork, treeObjects, newNodes …
isTravis Oct 4, 2026
5ea552a
v2 bucket mirrors (phase 11): locations, placements, mirror.version
isTravis Oct 4, 2026
b234797
v2 restore: rebuild a collection from a storage location
isTravis Oct 4, 2026
a27d482
v2 spec: readers ignore keys outside the layout (the location check o…
isTravis Oct 4, 2026
e614d3c
v2 UI: mirrors in collection settings, org storage locations and defa…
isTravis Oct 4, 2026
761a9d2
v2 deploy config: staging on dev KF Auth, resources named by role, KF…
isTravis Oct 4, 2026
f426782
v2 migrate: copy v1 file objects to their v2 keys; export rows for D1
isTravis Oct 4, 2026
2c4218a
v2 staging: D1 database id, SOPS-encrypted staging secrets
isTravis Oct 4, 2026
4383d12
v2 staging: R2 access key in the staging secrets
isTravis Oct 4, 2026
c5a2d50
v2 staging secrets: CF_R2_API_Token is R2_API_TOKEN
isTravis Oct 4, 2026
850a020
v2 migrate: read v1 over SSH (docker exec psql), with cursors for ord…
isTravis Oct 4, 2026
c5043bb
v2 migrate: v1 versions holding an id twice keep one record
isTravis Oct 4, 2026
bdb0ef4
v2 tests: longer timeouts for the parallel commit and store paging tests
isTravis Oct 4, 2026
267197a
v2 B1: public-only forks no longer inherit the parent's private prese…
isTravis Oct 4, 2026
76001f8
v2 B2: a commit may reference only files the collection holds or prov…
isTravis Oct 4, 2026
55ddbb3
v2 B3: one placement per (collection, location) and per (org, location)
isTravis Oct 4, 2026
b54de9e
v2 B4: a type made private takes its file references and new schema w…
isTravis Oct 4, 2026
282318c
v2 B5: stay within D1's 100 bound parameters and 1,000 queries per in…
isTravis Oct 4, 2026
d48970d
docs: protocol-v2.md as oxfmt formats it (blank lines before lists)
isTravis Oct 4, 2026
52251d0
v2 B6: restore trusts only the deployment's own key and keys that has…
isTravis Oct 4, 2026
abe082f
v2 B7: a pulled leaf's entries must match the records in its body
isTravis Oct 4, 2026
833a7a0
v2 B8: version log entries name their collection (format change)
isTravis Oct 4, 2026
ce36b5f
v2 protocol: format 2 is final; tree parameters frozen as they are
isTravis Oct 4, 2026
47a62f2
v2 refs: a fork that removes a record and adds it back keeps its inhe…
isTravis Oct 4, 2026
f5c7173
v2 metadata and fork routes read their bodies under the input rules
isTravis Oct 4, 2026
43fa567
v2 fork: the forks row is written in the publish batch
isTravis Oct 4, 2026
4dd6cc2
v2 negotiate: chunked manifests are checked against what the commit d…
isTravis Oct 4, 2026
32da566
v2 buildVersion refuses one id in both sets
isTravis Oct 4, 2026
aaa506e
v2: count file references of records stored out of line
isTravis Oct 4, 2026
343b3c6
v2 migrate: keep v1's collection updatedAt; D1 data in foreign-key order
isTravis Oct 4, 2026
4cf8356
v2 protocol: gunzip multi-member bodies on Workers (native zlib)
isTravis Oct 4, 2026
24486be
Merge v2-fixes (alignment review fixes) into v2-edge
isTravis Oct 4, 2026
5fb2bb1
v2 migrate: read each type once, record file possession, convert name…
isTravis Oct 4, 2026
695994a
v2 migrate repair: a collection with no versions has no log to verify
isTravis Oct 4, 2026
422692a
v2 migrate: dev → staging scripts and a README
isTravis Oct 4, 2026
07324b1
v2: open a D1 export with the migration tools (TARGET_DB_MIGRATE=0)
isTravis Oct 4, 2026
9386a4f
v2: GET /login starts the KF Auth sign-in on the server
isTravis Oct 4, 2026
789c800
v2: account, org, session and invitation routes; KF Auth profile and …
isTravis Oct 4, 2026
02a8105
v2: steward explore settings, protocol discussion and /api/kf/summary
isTravis Oct 4, 2026
9e0d1cc
v2: reference counts in a version's files listing
isTravis Oct 4, 2026
aaacb69
v2: restore UI on the org Storage page
isTravis Oct 4, 2026
4a776aa
v2: run the v2 packages in CI
isTravis Oct 4, 2026
184f52d
v2: rate limiting, hash denylist and abuse reports
isTravis Oct 4, 2026
f621358
v2: move and remove types by per-type file counts, not by reading rec…
isTravis Oct 4, 2026
c76afe5
v2: diff and manifest?since pages cost their page
isTravis Oct 4, 2026
7268cb4
v2: mirror and restore copy files in parts, hashing as they go
isTravis Oct 4, 2026
e418106
v2: interactive and bulk job queues
isTravis Oct 4, 2026
4e33f49
v2: per-user caps on push sessions and queued commit units
isTravis Oct 4, 2026
308e975
v2: negotiate pushes go async by manifest size and stop at a ceiling
isTravis Oct 4, 2026
183bdfa
v2: parse record batches line by line as they arrive
isTravis Oct 4, 2026
dde6bd2
v2: anonymous reads may come from D1 read replicas
isTravis Oct 4, 2026
da5d324
v2: a load test script (scripts/load.ts)
isTravis Oct 4, 2026
e8d9e00
v2: tombstone deleted collections; compaction drops their events
isTravis Oct 4, 2026
3d4157e
v2: reconcile billing counters from their sources
isTravis Oct 4, 2026
163822b
v2: the usage log and usage rollups
isTravis Oct 4, 2026
def240a
v2: page and read performance
isTravis Oct 4, 2026
548b74d
v2: record detail, record history, first occurrence, owners' schema u…
isTravis Oct 4, 2026
c20b6b5
v2: fsck for repositories (protocol, CLI, stewards)
isTravis Oct 4, 2026
eaa8893
v2: meter response bytes as the body streams out
isTravis Oct 4, 2026
2d0c885
v2: bind the R2 bucket for repository objects (staging and prod)
isTravis Oct 4, 2026
9bb0965
v2: copy files over 5 GB with UploadPartCopy
isTravis Oct 4, 2026
8fff8fa
v2: browsers read multi-member gzip bodies
isTravis Oct 4, 2026
1cfeeb8
v2: storage locations: lifecycle rules checked, and re-checked daily
isTravis Oct 4, 2026
69f882d
staging: AUTH_INTERNAL_API_KEY in .env.staging.enc
isTravis Oct 4, 2026
3da0e51
v2: cleaning pass: remove the v1 app and dead or duplicate code
isTravis Oct 4, 2026
6f3830a
v2: collection settings save metadata again
isTravis Oct 4, 2026
c62a526
v2: webhook test deliveries (POST .../webhooks/:id/test)
isTravis Oct 4, 2026
25b5564
v2: reserved slugs cover every top-level page, /blog redirects, playg…
isTravis Oct 4, 2026
f96e70a
v2: invitation page signs in through /login with a return path
isTravis Oct 4, 2026
cc06b49
v2: remove protocol comments and their moderation
isTravis Oct 4, 2026
2804548
v2: the protocol is a docs section, rewritten for format 2
isTravis Oct 4, 2026
6c39f49
v2: steward admin rebuilt: a left rail and instance metrics
isTravis Oct 4, 2026
abcc74d
v2: reserve the words an app's nav usually needs; separate org and co…
isTravis Oct 4, 2026
a5d302f
v2 protocol: stores take a Cache-Control on put (s3, r2, memory)
isTravis Oct 4, 2026
bd04020
v2 server: public assets bucket port, configured on both entries
isTravis Oct 4, 2026
6093bb6
v2 server: org avatar upload and removal in the public assets bucket
isTravis Oct 4, 2026
d1d1a3d
v2 web: 1 MB logo cap in org settings; SSR smoke uploads a logo and r…
isTravis Oct 4, 2026
ba222af
v2 server: avatars use the account routes' owner check; deleting an o…
isTravis Oct 4, 2026
38c80e4
v2: storage fence for cleanup; store listings carry size and write time
isTravis Oct 4, 2026
71bf2a8
v2: storage cleanup steps, jobs and steward API
isTravis Oct 4, 2026
18738a1
v2 web: admin Cleanup page
isTravis Oct 4, 2026
bb7407a
v2 cleanup: fit jobs to Worker limits
isTravis Oct 4, 2026
70c44b0
v2: stage large records in the session area; the commit puts them in …
isTravis Oct 4, 2026
03eccb5
v2 cleanup: fixes from the safety review
isTravis Oct 4, 2026
95a4ab0
v2 migrate: pause storage cleanup while converting or repairing
isTravis Oct 4, 2026
190417f
v2 web: reload once when a deploy has replaced a route's code
isTravis Oct 4, 2026
0e7e943
v2: call it protocol v2, not format 2
isTravis Oct 4, 2026
ef6abed
v2 protocol: what an Underlay node serves over HTTP (spec 11.3)
isTravis Oct 4, 2026
65d09d0
v2 web: serve .txt assets with charset=utf-8 on Workers
isTravis Oct 4, 2026
7912531
v2 server: remove negotiate; delta push is the one way to publish
isTravis Oct 4, 2026
2738bb1
v2: drop v1 hash aliases
isTravis Oct 4, 2026
94ff7c8
v2 server: advertise push limits when a session opens
isTravis Oct 4, 2026
b3c8d19
v2 server: 413 for over-long batches; unknown fields by own keys
isTravis Oct 4, 2026
89d134c
v2 protocol: publishing (11.4), the manifest read, semver rules
isTravis Oct 4, 2026
275f4b7
v2 docs: delta push everywhere; negotiate and v1 aliases gone
isTravis Oct 4, 2026
b564a8f
v2 server: format migration metadata for 0016 and 0017
isTravis Oct 4, 2026
f54a4a4
v2: lockfile without @tanstack/react-query
isTravis Oct 4, 2026
d8404ae
v2: remove restore; storage locations are always read and write, regi…
isTravis Oct 4, 2026
bf0fcb5
v2: tombstone every deleted collection; close better-auth's org updat…
isTravis Oct 4, 2026
f9c786e
v2: spec keeps its change rule; multipart parts capped and presigned …
isTravis Oct 4, 2026
a2fa128
v2: background jobs in bounded steps: incremental reconcile, refs.ind…
isTravis Oct 4, 2026
a75b509
v2: metering costs less than it meters; usage rebuild in steps; keys …
isTravis Oct 4, 2026
595c76f
v2: the cron queues each finished day's usage rebuild once
isTravis Oct 4, 2026
9e6a496
v2: budgets cover pages, ARK and auth; heavy reads cost more; steward…
isTravis Oct 4, 2026
c4d26a3
v2: a key acts with at most its scope; admin keys can be made
isTravis Oct 4, 2026
3b40f20
v2: actorId stays out of the public log; a privacy change's delay is …
isTravis Oct 4, 2026
b65edd1
v2 protocol: close the spec's gaps (pattern limit, error codes, extra…
isTravis Oct 4, 2026
2571e67
v2: the purity lint covers all of @underlay/protocol; in-app protocol…
isTravis Oct 4, 2026
7e0f7a0
v2: queries and memory bounded per request; steward stats read summar…
isTravis Oct 4, 2026
146e0a3
v2: a records page is one version call with one schema; Worker subreq…
isTravis Oct 4, 2026
7ffae98
v2 docs: direct file uploads and their part pages, the records-page v…
isTravis Oct 4, 2026
a654abe
v2 protocol: tree property tests draw keys from any code point, not A…
isTravis Oct 4, 2026
ca73f88
v2 cleanup: the mark's budget holds inside a collection, on the bulk …
isTravis Oct 5, 2026
db91af8
v2 auth: one KF token refresh at a time per user; a lost refresh race…
isTravis Oct 5, 2026
86e20dd
v2: a new collection keeps its description until a version gives one;…
isTravis Oct 5, 2026
d1419f1
v2: members see who pushed a version by name, not user id (staging ch…
isTravis Oct 5, 2026
c9ec03c
v2 web: dates in UTC and numbers in en-US everywhere, so server and b…
isTravis Oct 5, 2026
bff4d8c
v2 storage: a location is kept only once its first check passes; chec…
isTravis Oct 5, 2026
721d361
v2 web: an org's key page lists keys for its collections, then the us…
isTravis Oct 5, 2026
803a295
v2 web: delete wording says stored data is kept 7 days (staging check…
isTravis Oct 5, 2026
a50bf4c
v2 web: a records page past the end says so and links the last page; …
isTravis Oct 5, 2026
8c0ba9b
v2 web: phone width — header links in a menu, collection tabs scroll …
isTravis Oct 5, 2026
b090196
v2 API: unknown export formats get 400; the bearer scheme is case-ins…
isTravis Oct 5, 2026
97ecf7e
v2 polish: records columns follow propertyOrder/required, private mar…
isTravis Oct 5, 2026
b56c5e9
v2 polish: decimal byte units as labelled; settings and admin align w…
isTravis Oct 5, 2026
114de51
v2 polish: /new-org fills the slug from the name and both forms show …
isTravis Oct 5, 2026
6c4d75a
v2 polish: cleanup and settings messages appear where the action was;…
isTravis Oct 5, 2026
6773f65
v2: who pushed a version links to their personal account page (stagin…
isTravis Oct 5, 2026
2455c89
v2 web: byte sizes in binary units labelled KiB/MiB/GiB; logo, schema…
isTravis Oct 5, 2026
d5344fa
v2 docs audit: spec in normative form and aligned with the code; llms…
isTravis Oct 5, 2026
8fb9e31
v2 docs: URLs use https://www.underlay.org
isTravis Oct 5, 2026
71191c7
v2 protocol: input rules, schema checks and pack receiving match the …
isTravis Oct 5, 2026
f778da9
v2 push: schemas fully checked at open, metadata validated, deletes u…
isTravis Oct 5, 2026
7fc56e9
v2 reads: diff defaults to the previous version, records.ndjson resum…
isTravis Oct 5, 2026
53779fa
v2 access: label deletion for stewards, 404 before 451, keys capped o…
isTravis Oct 5, 2026
c08b594
v2 docs: the access, push and read changes; spec 11.4 covers delete l…
isTravis Oct 5, 2026
461d2e9
v2 prod: next.underlay.org's D1 id and public bucket, .env.prod-v2.en…
isTravis Oct 5, 2026
2231806
v2 migrate: SYNC=1 brings an earlier conversion up to date (newer ver…
isTravis Oct 5, 2026
23c44f4
v2 migrate: a failed file copy still writes the conversion's report
isTravis Oct 5, 2026
a4471d7
v2 migrate: the file copy retries a file that fails (connect timeouts…
isTravis Oct 5, 2026
046e53c
v2 push: a commit that runs twice settles committed; "Missing files" …
isTravis Oct 5, 2026
6086e5e
v2 test: avatar uploads send the multipart body as bytes; Node 24.21'…
isTravis Oct 5, 2026
2515712
v2 spec: collection.json carries the owner, description, visibility a…
isTravis Oct 6, 2026
f873295
v2 collection.json and read API: owner, description, visibility and A…
isTravis Oct 6, 2026
72fbf3b
v2 collection.json has one form: owner always an object, every member…
isTravis Oct 6, 2026
78b498b
v2 prod serves www.underlay.org: a Worker route on www (its proxied D…
isTravis Oct 6, 2026
29b278f
v2 prod: www.underlay.org is a custom domain of the Worker (set in Cl…
isTravis Oct 6, 2026
b2132df
v2 prod: next.underlay.org removed; prod is www.underlay.org only (wr…
isTravis Oct 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
6 changes: 0 additions & 6 deletions .dockerignore

This file was deleted.

39 changes: 0 additions & 39 deletions .env.local.enc

This file was deleted.

25 changes: 25 additions & 0 deletions .env.prod-v2.enc
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#ENC[AES256_GCM,data:uyDJVNkWT0y9PTSPX15CsqPxpqCLEutWb4qjKfhtC0BN17PKeVnXeH7A+1eaAQIPjwc8Q8PhGFayFb9VGWMqAh7p9lOeabLL2NfKG8xg432tCyyAazDZFn7hpT/GNAy20SUw/nJiah+i0w+X,iv:254kJ0MBxAkYsasc+asoK5mGMofzqqw2xahqXjIuP+w=,tag:7fUACA6CPX0mbGMlREOeUA==,type:comment]
SIGNING_KEY=ENC[AES256_GCM,data:A4PAGMONiXri0uQNshY+ur2H1/DSTTkmNcEOh8EVA64PPjhqP7Kt0yuG0g==,iv:Zr0zSimpuW/+c66YO70oHgbpobdiqpbktbb4TGwfiJU=,tag:+tptSTSTlcGiHJIFf0+JcA==,type:str]
LOCATION_KEY=ENC[AES256_GCM,data:iATgADyTGtQPQznCKg65km+7r0Kw8Pg7vDFp3Bbk3CWA57GZ4M9+4N1ZeQ==,iv:906m8zdHUf5R9VGZsW8HbDaZR4lxS9Cq/1tVr+fuGhM=,tag:SBJCCdodedt2CM/AI7VnQg==,type:str]
SESSION_SECRET=ENC[AES256_GCM,data:tuILJNlEID8jYVMgQZJF8nrq4RDUfBfD1czDQu/uKVJclq+SrGwK2DYuZg==,iv:sHxO1eu0MvB1rcf1MhpoeX7r1D7jCiW82nmxNP3ovAE=,tag:wFhn34oC7wHlUtnHSfcq8w==,type:str]
OIDC_CLIENT_SECRET=ENC[AES256_GCM,data:pnIuM3zHuGaUK2eOMYiX5stV5rrd+sICNWxplZYizaLWhiMQ08LR4ftv4SbxVvBVdCb+dwsQZsfQ/tG8NJfUPg==,iv:P6xz2mR1epra8PnO0Lm88GXQsF7lxSsHOP+daa+qwvo=,tag:xghe0n8nqAM4Fjo5Nbz32w==,type:str]
R2_API_TOKEN=ENC[AES256_GCM,data:o1pmULq8mwcvSTOBWLkBVe7zKWV2CewsP85zexG3CVV1znCkHjhgSW6guqmNWapf8GtnJAg=,iv:DqhfFRBQaF6o4Sz7yRzdzbONEv/IIWPNYKrFYrbh+SQ=,tag:oep7noE6DjCoGkKuQYARvQ==,type:str]
R2_ACCESS_KEY_ID=ENC[AES256_GCM,data:3ZtWCOe9S3MPjs4cEvRwV732FmuEH5izGGgS+ImBXLg=,iv:CqSvo/Mj76NV6XEB7iqocxYD4Af2zlRJVvaN+FAyO3A=,tag:sjuYfiqngGGFh++GQbRS2Q==,type:str]
R2_SECRET_ACCESS_KEY=ENC[AES256_GCM,data:PXkrTwKFyFRQgPzJ7QFPThsPqcTmsrYwJMdwQBmDPbyW2Jjf+u8m4xYe7KFT6t0iEM4AAvWBf+DzoYsRcyRPeg==,iv:cl/LUndMCodY904gmyIr0ohoJPmGH3yZHfxj+fFYm2A=,tag:t9u+7vEzWmlmSEtaHNpX7Q==,type:str]
AUTH_INTERNAL_API_KEY=ENC[AES256_GCM,data:gLtDfJwLbEzzq/ojnn+c9ClXl6AP5oNie+XnMNfWijfzCVXbaVNxDZu35NHhkHVp2T6gRubR+jbd2b0AQC76ow==,iv:joRi9MGLWXbrkNEYpOh2x8ztsmcTxs/9+jw4R8JpFEo=,tag:k29GhDHkc6rp4P3mcpJuvg==,type:str]
sops_age__list_0__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBCSGpETTJkaFFBRTlWWGdE\nMlhGVU5SaUh4L3hQa3dDYWZleHFwTTZRdjJvClhMOCtVam5CMXJKT3BYNEpGQzVn\nUVFVZmNNbXJOODNqUXdCdzhGUHFQVmcKLS0tIDVvdDZ0MlUzaW9SNWJzcnZ5d1NX\nR1Awdk1TeGNPL0JsZjRIUk1lblBHblkKtBQfM03Ny/oKza4+p77SPE+B9H2HeHbI\njIcOsOXg3K7ZrN8Zqm146kU5A+zhPuJEuRy64g8xC35LYH+dUwbLtw==\n-----END AGE ENCRYPTED FILE-----\n
sops_age__list_0__map_recipient=age1wravpjmed26772xfjhawmnsnc4933htapg6y5xseqml0jdv8z9hqemzhcr
sops_age__list_1__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBQZXRwY3lHM2F5bCtDMFpR\ndGpDdUpCWVNwb0NWUHgwdGNSbHp4ZzgwK1c0ClBVTzJka3JzK2tsM0F0MkpObTJF\nelhTdWhLZG1tV3RRUGgxT2VNNnNEaDgKLS0tIDArM1ZDdCttSmNyVWlKdk9qTDZF\nNTF3NzdVaXBDZit4RDlXNnhUcHdMaEkKZUK3FHDGsoKJHDai75Uz2sP9ZkvB3WBU\nupiRVOcBx6qcI+8A6LMehtx3Ei41NXN0Cs/WOv7ClzbQzgy27sK+Ug==\n-----END AGE ENCRYPTED FILE-----\n
sops_age__list_1__map_recipient=age1ysddqggsx3h8zkv7xn3z26sjak5pqms6pyqhnky9ukrvpk7es5jsayz8w7
sops_age__list_2__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBHczBES0ErM0RCbmxSTFkv\nZWdvcDJqVlphSWxjaEI1cHhNUjI3ak1sK1FBCi84azdkYWZRcVR3ZEViR1B2cWdj\nMDBCeWhtN21wVXU2dURtaFAxS21rY0EKLS0tIHU5MzJGTTQ2RjA4WnBCSHJNZjk2\naWRONHBaUWJ2bk9sWnljQ01aYjdiUlUKIbhUc1duZ/Q38RZw3Ct1MLHz73HWjUx4\npCZXlpQc4ajzqzwd71FLhOuIAfRuD/kxAgOCI1rrBAuPcjJ9GWUlPQ==\n-----END AGE ENCRYPTED FILE-----\n
sops_age__list_2__map_recipient=age1pgxk292zq30wafwg03gge7hu5dlu3h7yfldp2y8kqekfaljjky7s752uwy
sops_age__list_3__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA1b1E1bEtvWXZHOCtneGl2\nUHpaRGVkTUYzR05lL1g4enRZdHI3VS9PR3dFCmV2UzhwRURTMnhwb29ZdTQrMmpv\nYnREYStvZ1pVQlQ4UFp5eThGSVhMZTgKLS0tIGc0UjV3REQzWWtJYUhIUm5TWW5R\nZGNtOUk0amdLbkcySFUvTXFMWGE1YXMKM7/x6cmsD8v3GGIeer/OnIuix9OoJTzO\n4Dn8LQhpwhiQzMGOcpb6wKH3hlVtzvaScNnP684ExgeqJVDsFPeuPg==\n-----END AGE ENCRYPTED FILE-----\n
sops_age__list_3__map_recipient=age1qn0x93jhqjpqwvx5tgxnrwq5e3vuzur9whrkdnrvapd58esm45rqfkuxqh
sops_age__list_4__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBlL0xhcWd5aGVpYmlSb095\nOGUzRStvdG5seURQMkg2L2l2Wi85dUNqb2tnCmJSTkRIRHQvZnB4c2YyTGFuOU5u\nWHBBU1VUZlpkRzRteXhNaWZuSE40aG8KLS0tIE8xdjN6cHp3N1BxM0hGVEwwVnhw\nakFmM281ZFRQT2I2dm1Zc1F3b29wWlEK6wp6sV/YqcQOvBDYw4/rGSXr+0qsNm06\nBVEKknx/zYMiYDKeQcIsLu9yIEHlURJ0atfop48BUkVsR6PbgmpgNQ==\n-----END AGE ENCRYPTED FILE-----\n
sops_age__list_4__map_recipient=age1h86dek80u5t677tsparz395uk3zvz4yuj9m5t2v2nsdfsvyjmafsra5yt7
sops_age__list_5__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBNdHpWaU0ycGgwaUcxM0JK\nWmZxWlRvZnlPOEI2c3pJMyszK1gyWENZb0ZNCnpzTUNIZGpsZ2VpUWd5V2tPQnF2\nYjZnVG84Y3B2R01uYWFFbXdsTjYxdlEKLS0tIHBlYmFpd29xT3NLV1VjUCtUVmhR\nVW1YSDg0ZzBtQTd0R0dUQ29LZVdZR3MKeSP91xyZHIt6QXr/Lz7ZhWCn0JvX8gfX\nJg9cDsHdmsVRFdn2ipWP5Acx2qp/C5MosWENB3ITrgV9TEkJ7E9Jcw==\n-----END AGE ENCRYPTED FILE-----\n
sops_age__list_5__map_recipient=age1vfhyk6wmt993dezz5wjf6n3ynkd6xptv2dr0qdl6kmttev9lh5dsfjfs3h
sops_lastmodified=2026-10-05T18:44:52Z
sops_mac=ENC[AES256_GCM,data:Cq6n0j7gJ5itoCtqhh4tRgvquH0TcgddlxgEB70wKghvNS8WPmoA55OSvOwTLbwvdGYcxjuIy/VukdJlSqZ2gu3wwaxbnlaJgSGBecIeWlgXk+1BnQu3Au+laECE+spEMSlmxh3rTBKtw26baIGivV6ojfUxOyDeByBtikt2lC4=,iv:zUbxFgvlqYHCRm2Ihp/DnBv5Fm5wV+6n1VSA8YG82tI=,tag:/bU46QR0pMaBKbCAwxuWYQ==,type:str]
sops_unencrypted_suffix=_unencrypted
sops_version=3.11.0
25 changes: 25 additions & 0 deletions .env.staging.enc
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#ENC[AES256_GCM,data:L18HvVhVLrA+ki80CVjZV9xs+DsOsEvszm+F9g2yTGZttt84xfWMIqJ3Zlo3b+3A4F/jEhZ8KPLfBqfp7ylI5QsOmfk8PR4zvrtFMHYE/AZB+Keiuin/tK+rag==,iv:x3yKH8w3vyOFcMVhvZ8/MTn0sa27vStt+x67t/YzN6E=,tag:Balm2ehHO8woo2OFrwDvHg==,type:comment]
SIGNING_KEY=ENC[AES256_GCM,data:Uf9wdQf+EhbqfbufFyyYvwyn2XbKVneF3tU23OTEmfV4e/jvnsi9a0GVEA==,iv:wvaJeETb8ryvRLRQxPILmO23JcFEgPrbVqlZt+TxB1k=,tag:dHC2GV+JhSIKxV9VetbO9A==,type:str]
LOCATION_KEY=ENC[AES256_GCM,data:srIB/K3yBVjTRd/2VivT6qaaGg83Fxa4VCd+Zk7H2O1L7xxrV1qLX1ofXQ==,iv:GqYlEr0SVb+X+EFL6Q+wszRhcUkakon3Z0TA95PKbNE=,tag:jrk9EZkixCmI8sHzSaDaxg==,type:str]
SESSION_SECRET=ENC[AES256_GCM,data:M2/TE/R4+NDKyeWBCYN0lzkadg+2MaESsOPh9EoRQYxBGAhZHP4Lt3o+OQ==,iv:ClvpJl/soXCA8fPRmPo+io8b167q7WiODLlpAN27jfY=,tag:Rjhe41njbZ6LNIEQ7J143w==,type:str]
OIDC_CLIENT_SECRET=ENC[AES256_GCM,data:qKP3W3LSShbJ6pQK0VjNWYYIab6OLha6kZoJM8sUkWXf2JHOL4ZWAtisDsVIkxjzcJWJJ55ZC/bK4sRlVDq8rQ==,iv:AWXZHqNR+jUL3+U7bLepAR6KbD9mwnNXAKuV2GiwIhU=,tag:UUhOqRg3WBhH5m7jenMYkw==,type:str]
R2_API_TOKEN=ENC[AES256_GCM,data:6xecHO7T6D7npUiqIIHo9CectjDBNwm4VlS/ZGHNwLNqxIMyoHbN5XeKVgo7Taa4B701MNE=,iv:+iNkvek2zJNloaMPZpWMkryREm0naFnQHokbqhFjemA=,tag:i4S8brDoEiBa3gKq7ZqHZA==,type:str]
R2_ACCESS_KEY_ID=ENC[AES256_GCM,data:ups38t8iyZuDi0k4X76sOh0Njd0F2SJn6ozIiTJOv3g=,iv:jxBqZBUPz81BRYCC34ZWR2heOh8N/ca0biFQab4sX/M=,tag:VlGZQ3M61bLKLhkS6isaYw==,type:str]
R2_SECRET_ACCESS_KEY=ENC[AES256_GCM,data:deaqHLFsI1dMX+daJCMhQ5FH6GkKc6Jec+ooo3tZz8nlc3HtxMYooHP0g8GbkIX7q2VBjQeOLwUraZzYWdBs2w==,iv:u/5e3cjkdeQyj7QWp7J2WBvUKE8klRYgBfxNmoQpRrs=,tag:cl3ztXz1aJjPTEPIyK7CLQ==,type:str]
AUTH_INTERNAL_API_KEY=ENC[AES256_GCM,data:tUYoRLvtDCseoEJsVfaWOWPJqS37/2Mefvme7vbIOHEhPI6nTEimCmDZbV/SsYv/1SuSIW34toqcxH1Fnl7MIg==,iv:Urp+ZTkZLvTpybFAt4MMH6o9CQGICZjSIzjrb+AA1S4=,tag:I9lCrmiIuwBwIZww26/OfQ==,type:str]
sops_age__list_0__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBaWFJTTEZFRElBckZsSEE3\na1pGQzRac2FGOE1ZSDBmZDBodGZjRjFYNjNjCk9RNVVoWVNCNU5JV2FvVnM2NzJW\nSmhPU1dCN0REdFQrUjFCaGppVlAxS3cKLS0tIGt6OGdNNFhxWGRZT0pNbHY5QWtp\nOWJMUzliSkVqZE8rTStGWFF2eUpNRDAKJMxcuM9S+RNJA6M8cOoDKu21Cd/VLm5A\niHHFWPVgcaHSHVTQnzwbo0zHkE2ue/xhdctm1QD9nRe+AtFm0ogRzA==\n-----END AGE ENCRYPTED FILE-----\n
sops_age__list_0__map_recipient=age1wravpjmed26772xfjhawmnsnc4933htapg6y5xseqml0jdv8z9hqemzhcr
sops_age__list_1__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBXek54eDFkVnBCNXkrdjMv\nalptTUVUTXAydDBJdjMwcWlKT2Izdm9GckNNCmw2L1o0dmZyWWVHTjhNd3JmVXM1\nVlVDSHk3ZXgzSmt5S0hYTytuaVEyaEkKLS0tIHpiQmU5K1BjSklYMHVLaW1yM2V6\neW4zeFJFeFEyYXBIMkZHSXFPc1JDUkEKXXzkYVfW0z5dhpRIfQYcKnNY3Z46+HDl\nSIL8E6qzYGB+Wmny0OHkhdy9/yGErCxrwJWH5RGjFt6NzjSvMwOUiw==\n-----END AGE ENCRYPTED FILE-----\n
sops_age__list_1__map_recipient=age1ysddqggsx3h8zkv7xn3z26sjak5pqms6pyqhnky9ukrvpk7es5jsayz8w7
sops_age__list_2__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBQZzRiL3YwU2pybmFVL1k3\nczJ4L3ZkQ0ZsOGlWVlhqbWRMWVN2RUNnTlZzCjJldkdFTnBTcHA1YkkxREpac2xO\nMUVwNkxGVWNydlRFNEN5cGFQck5na28KLS0tIHZEaHhNSTIxcnh2TFkxcjRDczZl\nOUY3cjE1MFBLbFhlQ3hqVXZyWmQ3K2sKyLWvRb79PjFk683XW2SPRbHMX7eZerAi\n1hhjnE8n1V+EJvu6coB+/IG+WQPgT/t8JY/332RQswn/rw+AMwGx9w==\n-----END AGE ENCRYPTED FILE-----\n
sops_age__list_2__map_recipient=age1pgxk292zq30wafwg03gge7hu5dlu3h7yfldp2y8kqekfaljjky7s752uwy
sops_age__list_3__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBTRTZDa2ZvaDcxZ2tpUTJj\nOGUrbkdkdjNJZmJQcVRkK21OTnUwbUl0d0VrCmNzQ2VOQjk4SDR1UWRrVDRHb3pa\nK0JBeHN5akd2QXhBOW9jVG5rRVRHNDgKLS0tIEFkSlRwNjZzZTdWd01mcnVQYU5h\nK0owb3V4VFZOeldmdVBndUo2NTdlQ28K3v4iS1YCiFPRsSo5fyw99l003KokQqpN\ntEMwdbtD61YPRRgFcrMmN71SkyjoNLUrX/5atBHnEaDkivRw3tCeqg==\n-----END AGE ENCRYPTED FILE-----\n
sops_age__list_3__map_recipient=age1qn0x93jhqjpqwvx5tgxnrwq5e3vuzur9whrkdnrvapd58esm45rqfkuxqh
sops_age__list_4__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB1aHJMR01jbnBpdkU3TTdn\nV2Z1dk1aRW5oY1VQdC9KUEQ3NDN6alF0aTBJCnhBcEc0dlJGTWRKZ0dDQ3loWUwz\nUDJiZG1tZzltN0wvbUUyRFpYbDJKM3MKLS0tIDZMK1BySllJeGkxNTRscysrdHJE\nRHVIc1RvMHJFc1dRd3F2SUh1Z1hKZUkKA6vg2GmwBBmGk7UHcb1sbhZIf42Ds3k+\nmg0YaSE7k4iBqm44Lh3arFrmfaosCyPeYB1wyqXlxR+k0nvvijpzvQ==\n-----END AGE ENCRYPTED FILE-----\n
sops_age__list_4__map_recipient=age1h86dek80u5t677tsparz395uk3zvz4yuj9m5t2v2nsdfsvyjmafsra5yt7
sops_age__list_5__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBMYzN2cTFMM1hDd3hyYmFp\nOWpoTEM2K3UwNnhjeEVScEVCTmlDSEJlMDBvCmsrZUEzYVhSTHBmSGZ0Mzg0QWtW\nb1YxM3N3VllYZ1VMcEJpc05KZG4xcWcKLS0tIElDT1ZGOWJxRVorNjRpRGZ5akJY\nTlloR0d1QnBMV0pxckRUVzc2bHJVa28KZYl/NOcr3pLFAn+4yaQDejqKJr5A2e0X\neDQuVacIicznbRcryp+IpGfdW8+H+BgXif6insXqjCz0lX2q/xopnw==\n-----END AGE ENCRYPTED FILE-----\n
sops_age__list_5__map_recipient=age1vfhyk6wmt993dezz5wjf6n3ynkd6xptv2dr0qdl6kmttev9lh5dsfjfs3h
sops_lastmodified=2026-10-04T16:46:10Z
sops_mac=ENC[AES256_GCM,data:v/OHKSnYStOf//dP8FAnRNfUsn5ixX9GjKBNfJP6ByL9av5MyMUS7Pd7q8lDv/RhQHFn3v+KISOk7f9Ezp5/vLW+7+Rip/FRbViMuzEqwRjCkKqZNO79hzPIzYT+mvknirtDk6BO3NqaYAan/1vnRCwTq43TTSsMoW0swCUirZI=,iv:sizhCYXhA1u0TBlg2joo2W/CpJCXw0SdGqyYycDA4KE=,tag:oGulAwmz5BCr5Zfjbx2vdQ==,type:str]
sops_unencrypted_suffix=_unencrypted
sops_version=3.11.0
14 changes: 0 additions & 14 deletions .env.test

This file was deleted.

15 changes: 12 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ run-name: >-

on:
push:
branches: [main]
branches: [main, v2-edge]
pull_request:
branches: [main]
branches: [main, v2-edge]

concurrency:
group: ci-${{ github.ref }}
Expand All @@ -21,7 +21,7 @@ jobs:
check:
name: Lint, typecheck, test
runs-on: ubuntu-latest
timeout-minutes: 10
timeout-minutes: 20

steps:
- name: Checkout
Expand Down Expand Up @@ -52,3 +52,12 @@ jobs:

- name: Test
run: pnpm test

- name: Browser bundle
run: pnpm --filter @underlay/protocol check-browser

- name: CLI build
run: pnpm --filter @underlay/cli build && node packages/cli/dist/cli.js --help

- name: Web build and SSR smoke
run: pnpm --filter @underlay/web build && pnpm --filter @underlay/web smoke
Loading
Loading