A blank page every time you open it. Notes stay on this device while you write and become Markdown records in the selected mdbase collection when the SDK confirms their original saves. Read previous notes in Editor or another collection app.
The existing quiet writing surface, light/dark themes, folder preference and keyboard controls remain. Ctrl/Cmd+Enter starts a page from the editor, not from settings. Undo new page restores the same draft for eight seconds. Every visit starts a new blank page without deleting previous drafts.
Journal uses the public MdbaseApplicationEntry returned by MdbaseConnect. The SDK owns sign-in, popup presentation, URL selection, collection setup, readiness, the Worker and physical close. Journal subscribes to public snapshots and borrows the exact current connection(id).records and connection(id).files; it does not build another auth or storage engine.
The dependency is the immutable dev intake at 3f417b6d, not a release-qualified runtime. Its original tar and the active original browser-safe Connect protocol c280cd194ffd tar are file-pinned with source/SRI in vendor/mdbase-sdk-dev-3f417b6d.json. The old SDK and protocol archives remain unchanged. This packet has no vendor warnings or unused historical protocol member; the older development packet's warning remains only in its original retained metadata. Consumer bundling uses already-built public SDK modules, keeps the original Worker beside its application module and preserves the packaged module directory layout.
Local writing does not depend on runtime admission. Journal surfaces SDK readiness and refusals without substituting a runtime. Its native registration and browser/runtime acceptance are separate requirements, not established by this source port or fixture tests.
npm ci --ignore-scripts
npm run verify # strict types, all tests, explicit writing-only build
npm run dev # writing-only localhost app; no native registrationnpm run build:local intentionally builds only local writing. It does not enable a mock runtime. To build the native application, give the environment and the exact origin Journal will be served from:
JOURNAL_ENVIRONMENT=lab \
JOURNAL_ORIGIN='http://127.0.0.1:48224' \
npm run buildThe build writes JOURNAL_ORIGIN into the manifest as its homepage (and icon and redirect URI), because sign-in only registers Journal from the manifest's own origin. LAB builds may use a local http:// origin (localhost, 127.0.0.1 or [::1]); production builds need https://. JOURNAL_REGISTERED_APPLICATION_ID is optional and defaults to the manifest's id, as in the other mdbase apps; sign-in self-registration supplies the registered ID. Missing environment or origin fails the native build. npm run manifest writes the committed manifest, using JOURNAL_ORIGIN when set and the pages.dev origin otherwise. A native build for another origin rewrites public/.well-known/mdbase-app.json; do not commit that copy.
The current SDK41c dev packet contains its original runtime/SQLite WASM and canonical LAB trust (native.available=true describes packaged asset availability, not registration/readiness). LAB native consumer builds now succeed with explicit build inputs; without them they still refuse. Production trust remains unavailable. Journal never supplies substitute assets or trust. Registration and any LAB refresh/deployment remain separately owned.
Tests use the SDK's createTestMdbase front door with actual SDK clients over MemoryReplica for records and files. Controlled readiness/catalog metadata is test-only, not native/runtime acceptance. Type checking retains exactOptionalPropertyTypes=true and skipLibCheck=false.
- Local drafts are persisted before any native capture. Failed persistence keeps text visible and refuses a remote write.
- Draft destinations remain pinned across collection changes. Switching starts a blank page; the original note stays with its original collection.
- Creation retains the original record UUID, mutation UUID and exact intent before capture, then settles it with the SDK's
save(). A write the log has not confirmed yet is kept on this device and the SDK write ledger settles it, also after a reload; Journal opens the record and keeps writing. A later visit reads the original record by its UUID. Only a refusal starts a new intent; Journal never retries creation at a sibling path. - Edits use the shared SDK record lease, autosave and flush. Only a confirmed record displays Saved.
- Conflicts, holds, deletion or changed remote text preserve local writing instead of recreating or overwriting another record. Closing a writing view releases only its borrowed leases, never the shared client.
- Earlier prototype
journal.note.*drafts remain byte-for-byte on the device and are counted in settings. They lack original native mutation identities, so the port does not silently migrate or replay them.
The [email protected] contract determines creation fields. Collection-owned type names and exact semantic digest/field bindings are read from the current catalog; the starter name is never a fallback. Nested field references require shared SDK support and currently refuse saving rather than using an app-side parser. npm run manifest rebuilds the managed contract/starter manifest from pack/.
No npm publication or deployment is part of this port.