Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
ee63266
Implement logical canvas radio groups (#361)
ctate Aug 15, 2026
d575734
Fix anchored surface correctness (#363)
ctate Aug 16, 2026
5c32acc
fix(runtime): reveal autofocus targets and carets (#364)
ctate Aug 16, 2026
5d7fee8
schema and rendering fixes (#367)
ctate Aug 16, 2026
919d0e6
fix(canvas): respect link span underline flag (#368)
ctate Aug 16, 2026
23d0f59
feat(images): decode photos to fit runtime budgets (#366)
ctate Aug 16, 2026
86fecf6
fix(macos): report content rects in window frame events (#370)
ctate Aug 16, 2026
1c1fba0
fix(macos): place fresh windows correctly (#369)
ctate Aug 17, 2026
8d0da34
chore(release): prepare v0.9.2 (#372)
ctate Aug 17, 2026
659c893
Fix combobox Enter submit precedence (#373)
ctate Aug 17, 2026
e8f9e4e
Fix large TypeScript Msg union compilation (#375)
ctate Aug 17, 2026
393a0ed
fix(app-runner): load manifest menus and commands (#376)
ctate Aug 17, 2026
a33d579
fix(macos): preserve file drop targets (#374)
ctate Aug 17, 2026
465a163
feat: add model-driven theme state (#378)
ctate Aug 17, 2026
ef3ba18
Add platform-correct Command Backspace (#377)
ctate Aug 17, 2026
b25cefe
chore(release): prepare v0.9.3 (#380)
ctate Aug 17, 2026
781b7f9
feat(windows): expose model restore policy (#381)
ctate Aug 17, 2026
f6e4d99
fix(build): keep iterative app rebuilds local (#382)
ctate Aug 18, 2026
046ea27
chore(core): upgrade scriptc to 0.0.33 (#384)
ctate Aug 18, 2026
fe41864
chore(release): prepare v0.9.4 (#386)
ctate Aug 18, 2026
cb6a417
feat(tray): add typed rich rows (#383)
ctate Aug 18, 2026
a22f204
Make app.json the default manifest (#385)
ctate Aug 18, 2026
dc0f64c
fix(ts-core): resolve installed compiler and SQLite modules (#389)
ctate Aug 18, 2026
19e7942
feat(schema): redirect non-schema paths to native-sdk.dev (#388)
ctate Aug 18, 2026
dbab55d
feat(canvas): expose registered image source crops (#390)
ctate Aug 18, 2026
80d1c46
Prepare v0.9.5 release (#391)
ctate Aug 18, 2026
5157f7b
fix(canvas): restore Cockpit terminal guarantees on v0.8.1 (#2)
phall1 Aug 5, 2026
4b1efd1
fix(canvas): lift the terminal render cliff and make truncation loud
phall1 Aug 5, 2026
edf82ab
feat(canvas): add the packed cell grid, one command for a whole terminal
Aug 5, 2026
022c766
feat(canvas): decode packed cell grids on the AppKit host, per-row
Aug 6, 2026
0636377
feat(canvas): give terminal bold and italic a face to render with
Aug 6, 2026
22f2733
feat(runtime): let a secondary window paint chrome, and add the fulls…
Aug 6, 2026
e1831d6
fix(macos): enable font smoothing so glyphs render at full weight
Aug 11, 2026
d883414
fix(automation): drop closed windows from the snapshot's window list
Aug 11, 2026
03e6ad2
fix(automation): pair widget-key's press with its release
Aug 11, 2026
ee7e5b5
feat(ui-app): give web_panes the window discriminator build_window has
Aug 11, 2026
c55ce3a
feat(canvas): split decorative from hidden in widget semantics
Aug 11, 2026
72804c9
feat(effects): open a URL in the user's default handler from update
Aug 11, 2026
a31ae73
fix(canvas): hash cell_grid content in the packet fingerprint
Aug 14, 2026
e8cbf88
fix(devhost): carry the fork's automation protocol pin into the JS mi…
Aug 14, 2026
978c4c9
fix(effects): raise terminal PTY capacity to 32
Aug 17, 2026
0ca6758
fix(runtime): preserve cockpit integration compatibility
phall1 Aug 25, 2026
7e783da
feat(runtime): let an app extend the generated TypeScript runner nati…
phall1 Sep 2, 2026
4ab1ad0
feat(canvas): support vertical split axes
Sep 3, 2026
6ac53c5
feat(runtime): expose post-present refresh batching
Sep 3, 2026
5e053d1
Merge pull request #8 from phall1/feat/vertical-splitter-axis
phall1 Sep 3, 2026
78c9006
Merge pull request #9 from phall1/fix/cockpit-first-frame-a11y
phall1 Sep 3, 2026
df0c15c
test(runtime): drive deferred accessibility frame request
Sep 3, 2026
eb9cf6b
Merge pull request #10 from phall1/fix/cockpit-first-frame-a11y-fixture
phall1 Sep 3, 2026
71bbce5
fix(runtime): secure symlink-safe file writes
Sep 4, 2026
4d71fa9
perf(macos): reuse cell-grid draw resources
Sep 4, 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
  •  
  •  
  •  
19 changes: 11 additions & 8 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ jobs:
version: 0.16.0
- uses: actions/setup-node@v4
with:
node-version: 22
node-version: 24
# TypeScript cores compile through the external core compiler at
# build/test time; the compiler and the frontend's toolchain both
# arrive with this one install (without it the ts-core suites skip
Expand All @@ -44,7 +44,7 @@ jobs:
version: 0.16.0
- uses: actions/setup-node@v4
with:
node-version: 22
node-version: 24
# The exact-pinned external core compiler and the frontend's
# toolchain, one install (packages/core/package.json is the one
# place the pin lives).
Expand All @@ -65,7 +65,7 @@ jobs:
version: 0.16.0
- uses: actions/setup-node@v4
with:
node-version: 22
node-version: 24
# gpu-components is a TypeScript-core app, so its smoke build needs
# the frontend compiler and exact-pinned TypeScript toolchain.
- run: npm ci --prefix packages/core
Expand All @@ -74,6 +74,9 @@ jobs:
- run: zig build test-example-mobile-canvas-lib-ios-store
- run: zig build test-webview-system-link
- run: zig build test-webview-smoke
# The zero-config TypeScript runner must load app manifest menus before
# automation can select their registered command ids.
- run: zig build test-menu-bar-smoke
# Signed-package seal pin: an ad-hoc signed package must pass
# codesign --verify --strict (macOS runners are the only tier with
# codesign; the step skips loudly anywhere else).
Expand Down Expand Up @@ -181,7 +184,7 @@ jobs:
version: 0.16.0
- uses: actions/setup-node@v4
with:
node-version: 22
node-version: 24
# The TypeScript core suites compile through the external core
# compiler at build/test time; without the install they skip
# silently, so CI must provide it.
Expand Down Expand Up @@ -221,7 +224,7 @@ jobs:
version: 0.16.0
- uses: actions/setup-node@v4
with:
node-version: 22
node-version: 24
# The TypeScript examples compile through the external core
# compiler at build time; the compiler and the frontend toolchain
# arrive with this install.
Expand Down Expand Up @@ -355,7 +358,7 @@ jobs:
version: 0.16.0
- uses: actions/setup-node@v4
with:
node-version: 22
node-version: 24
# The scaffold default is the TypeScript core; its frontend and
# compiler run at build time from this checkout's packages/core.
- run: npm ci --prefix packages/core
Expand Down Expand Up @@ -460,7 +463,7 @@ jobs:
version: 0.16.0
- uses: actions/setup-node@v4
with:
node-version: 22
node-version: 24
# The default scaffold is a TypeScript core: its build runs the
# @native-sdk/core frontend and the external core compiler from
# this checkout's own install.
Expand Down Expand Up @@ -495,7 +498,7 @@ jobs:
app=".zig-cache/scaffold-${frontend}"
rm -rf "$app"
./zig-out/bin/native init "$app" --frontend "$frontend" --full
(cd "$app" && zig build test -Dplatform=null && ../../zig-out/bin/native validate app.zon)
(cd "$app" && zig build test -Dplatform=null && ../../zig-out/bin/native validate app.json)
# Every scaffold ships a CI workflow; parse it as real YAML.
test -s "$app/.github/workflows/ci.yml"
python3 -c 'import sys, yaml; yaml.safe_load(open(sys.argv[1]))' "$app/.github/workflows/ci.yml"
Expand Down
7 changes: 4 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Guidance for agents (and humans) working on this repository.

Native SDK itself is implemented in Zig, but Native SDK **apps are authored in TypeScript + Native markup by default**. Do not infer the app-authoring language from this repository's implementation language or from older Zig-core examples.

- For a new app, use `native init <path>` and expect `src/core.ts`, `src/app.native`, and `app.zon`. Ordinary compiled TypeScript work that needs filesystem, process, JSON, regex, classes, or other static-tier APIs belongs under optional `src/services/`, reached from the core with `Cmd.request`; do not import a service from the core. Do not add Zig app code unless the user explicitly chooses `--template zig-core` or the feature requires a toolkit extension.
- For a new app, use `native init <path>` and expect `src/core.ts`, `src/app.native`, and `app.json`. `app.zon` remains a supported legacy/alternative manifest. Ordinary compiled TypeScript work that needs filesystem, process, JSON, regex, classes, or other static-tier APIs belongs under optional `src/services/`, reached from the core with `Cmd.request`; do not import a service from the core. Do not add Zig app code unless the user explicitly chooses `--template zig-core` or the feature requires a toolkit extension.
- Before changing an existing app, inspect its tree. A `src/core.ts` app stays TypeScript; a `src/main.zig` app stays Zig unless the task is specifically a migration.
- For default app work, read `skill-data/native-ui/SKILL.md` and `skill-data/ts-core/SKILL.md`; also read `skill-data/ts-services/SKILL.md` when the tree has `src/services/` or the task needs ordinary TypeScript beyond the core subset. `skill-data/core/SKILL.md` covers shared/runtime concerns; `skill-data/zig/SKILL.md` is for Zig-core apps and SDK implementation work.
- The `-ts` suffix on a few examples only distinguishes ports from older Zig originals. New TypeScript apps need no suffix because TypeScript is the default.
Expand All @@ -15,7 +15,7 @@ Native SDK itself is implemented in Zig, but Native SDK **apps are authored in T

```bash
zig build test # root engine + runtime suites
zig build validate # sample app.zon manifest check
zig build validate # framework's legacy app.zon manifest check
zig build test-example-<name> # one example's suite (e.g. test-example-notes)
scripts/gate.sh fast [ref] # affected-only local gate for your diff (default base: main)
scripts/gate.sh full # everything CI-shaped that runs locally
Expand All @@ -34,7 +34,8 @@ Do not edit `CHANGELOG.md` as part of regular feature or fix work. The release a
## Where things live

- `src/` — the engine and runtime; `src/primitives/canvas/` holds the widget, markup, and vector core.
- `examples/` — the showcase apps, most zero-config (`app.zon` + `src/`).
- `apps/schema/` — the standalone static Vercel project for `schema.native-sdk.dev`.
- `examples/` — the showcase apps, many predating the JSON default (`app.zon` + `src/`).
- `docs/` — the documentation site; `docs/AGENTS.md` has its MDX conventions.
- `skills/` and `skill-data/` — the agent skills the CLI ships (`native skills list`).
- `tools/` and `scripts/` — dev tooling and the local gate.
Expand Down
83 changes: 80 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,91 @@

All notable changes to the Native SDK (formerly zero-native) will be documented in this file.

## 0.9.1
## 0.9.5

<!-- release:start -->

### New Features

- **JSON manifests by default**: New TypeScript, Zig, web, full, and ejected apps now scaffold with `app.json`, backed by full parsing, discovery, build conversion, validation, vendoring, a published versioned schema, and seamless `app.zon` fallback for existing projects (#385).
- **Registered-image source cropping**: Canvas image options and Native markup can now select atomic source rectangles from registered images for texture-atlas rendering, with schema, compiler, validation, documentation, and sampling-bleed coverage (#390).

### Bug Fixes

- **Reliable installed TypeScript toolchains**: Core and service builds now resolve ScriptC across nested, hoisted, and global sibling npm layouts, generate the complete SQLite SDK module family, and validate library imports against their actual directories (#389).

### Improvements

- **Focused schema hosting**: `schema.native-sdk.dev` now serves only the versioned app schema and its current-version alias, redirecting every non-schema route to the main Native SDK site (#388).

### Contributors

- @ctate

<!-- release:end -->

## 0.9.4

### New Features

- **Model-driven window restore policies**: TypeScript apps can now declare whether each model-driven window restores saved geometry or opens fresh, including center-on-primary placement, with matching defaults, validation, runtime forwarding, tests, and documentation (#381).

### Improvements

- **Faster, more predictable iterative rebuilds**: Generated core and service ABI artifacts now change only when their contents do, markup and app code compile into independently cached objects, SDK module edits invalidate the right inputs, and rebuild diagnostics expose phase timing, memory use, and cache decisions across platforms (#382).
- **Updated TypeScript compiler integration**: ScriptC advances to 0.0.33 with published compile-cache bootstrapping, explicit development and release library profiles, synchronized compiler-surface artifacts, and Node 24 throughout the TypeScript build and CI toolchain (#384).

### Contributors

- @ctate

## 0.9.3

### New Features

- **Model-driven TypeScript theme state**: Zero-config TypeScript apps can now derive the built-in pack, color scheme, and accent from committed model state while preserving manifest fallback, live system accessibility settings, deterministic replay, and the existing `themePack` helper (#378).
- **Platform-correct line deletion**: Command+Backspace on macOS now deletes to the start of a field or logical textarea line across every editable canvas control, with matching TypeScript text helpers, controlled-state behavior, undo, and replay (#377).

### Bug Fixes

- **Precise macOS file-drop routing**: AppKit drops now retain labeled canvas and WebView targets with top-left, view-local coordinates, while unlabeled window regions fall back to content coordinates (#374).
- **Manifest menus in generated runners**: Zero-config TypeScript and Zig-core apps now load `app.zon` commands, shortcuts, and menus consistently in live and replay runners, including ejected-runner fallbacks (#376).
- **Large TypeScript message unions compile reliably**: Generated shims now derive comptime scan quotas from message shape and identifier size, allowing wide unions to compile across persistence, channels, environment routing, and the full external-core pipeline (#375).
- **Correct combobox Enter precedence**: A bound `on-submit` now handles Enter before trigger activation, so query submission no longer opens the picker or dispatches the wrong command (#373).

### Contributors

- @ctate
- @MohakBajaj

## 0.9.2

### New Features

- **Flash-free accessory startup**: Apps can opt into accessory activation from `app.zon` to launch without a Dock icon or foreground flash, with tray-affordance validation, runtime composition, packaging support, and an updated menu-bar example (#358).
- **Logical canvas radio groups**: Nested radios now form accessible single-selection groups with roving focus and consistent keyboard, pointer, handler, and naming semantics (#361).
- **Budget-aware photo decoding**: Dynamic encoded images are downsampled across desktop and mobile codecs to fit a configurable registered-pixel budget, with independent source bounds, deterministic replay, and platform-level regression coverage (#366).

### Bug Fixes

- **Correct anchored surfaces**: Floating and modal surfaces now dismiss without requiring focus, relayout after scroll restoration, resolve against the correct root, and behave consistently across window contexts (#363).
- **Reliable autofocus and caret reveal**: Keyboard focus, autofocus, and automation now transactionally reveal offscreen targets while preserving collapsed end-caret selections in text editors (#364).
- **Explicit link decoration**: Linked text spans now honor their underline flag while Markdown-generated links retain conventional underlines (#368).
- **Stable macOS window geometry**: Fresh windows now distinguish restored, explicit, and default placement, while AppKit and CEF frame events consistently report content geometry without titlebar drift (#369, #370).

### Improvements

- **Consistent canvas controls and surfaces**: Checkbox and radio labels can contain markup consistently, while actionable states, disabled colors, variant accents, selection geometry, compact layouts, and zero-width strokes now render uniformly across the schema, runtime, accessibility tree, and documentation (#367).

### Contributors

- @ctate
- @sepehr-safari

## 0.9.1

### New Features

- **Multi-item macOS menu bars**: Apps can now manage independent, keyed status items with model-driven updates, events, automation, journaling, and regression coverage (#343).
- **Complete TypeScript file effects**: Secure, permission-gated effects now support bounded streaming reads, atomic writes, stat, append, and deletion while preserving deterministic record and replay behavior (#339, #350).
- **Actionable desktop notifications**: Notification replacement identifiers and actions dispatch through the ordinary command path on macOS, Windows, and Linux (#347).
Expand All @@ -31,8 +110,6 @@ All notable changes to the Native SDK (formerly zero-native) will be documented
- @ElSebas41
- @johnlindquist

<!-- release:end -->

## 0.9.0

### New Features
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ Read the full guide at [native-sdk.dev/quick-start](https://native-sdk.dev/quick

## Examples

The apps pictured above live in [examples/](./examples), most as zero-config projects — `app.zon` plus `src/`, no build filesrun straight from their directory with `native dev`. Start with the TypeScript examples when learning the primary authoring path. The `-ts` suffix on `soundboard-ts` and `system-monitor-ts` is historical because those apps are ports kept beside older Zig originals. Chatbot is TypeScript-only and follows the unsuffixed naming used by new apps created with `native init`.
The apps pictured above live in [examples/](./examples), most as zero-config projects with a manifest plus `src/` and no build files, run straight from their directory with `native dev`. Many examples predate the current `app.json` default and retain `app.zon`; both formats have the same capabilities. Start with the TypeScript examples when learning the primary authoring path. The `-ts` suffix on `soundboard-ts` and `system-monitor-ts` is historical because those apps are ports kept beside older Zig originals. Chatbot is TypeScript-only and follows the unsuffixed naming used by new apps created with `native init`.

| Example | What it shows |
| --- | --- |
Expand Down
19 changes: 19 additions & 0 deletions apps/schema/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Native SDK schemas

Static JSON Schemas published at `schema.native-sdk.dev`.

- `/app/v1.json` is the stable-major schema URL scaffolded into `app.json`.
- `/app.json` is the short-lived current-version alias.

Only those schema URLs are served from this deployment. Every other path
redirects (302) to `https://native-sdk.dev`, so the domain stays a single-
purpose home for the manifest rather than hosting arbitrary content.

Create the Vercel project as `native-schema`, set its root directory to
`apps/schema`, leave the framework preset as Other with no build command, and
attach `schema.native-sdk.dev`. `vercel.json` sets the output directory to
`public`. Add a new versioned file only for a breaking manifest contract;
backward-compatible additions update the current major.

The original `https://native-sdk.dev/schemas/app.schema.json` URL remains a
byte-identical compatibility copy owned by the docs deployment.
Loading
Loading