Last updated: 2026-06-07
Frontier is being brought back to life. This project is modernizing the classic UserTalk scripting environment and object database into a contemporary cross-platform tool. The headless CLI is now fully functional — you can explore databases, write scripts, debug UserTalk programs, and serve web applications, all from the command line. Two debugger interfaces ship in the same binary: a machine-driven NDJSON protocol that any IDE or external tool can drive (--protocol), and a full-screen terminal UI (--debug-tui) for direct interactive use. A portable terminal window-manager substrate (boxen) underlies the TUI and is the foundation for the upcoming Phase C native REPL. A native GUI application with a documented API is being planned in parallel. The goal: preserve everything that made Frontier powerful while making it accessible to a new generation of developers, tinkerers, bloggers, writers, podcasters, and product builders.
Download: GitHub Releases
Zero test failures, real threading, and parallel test execution. This release brings major infrastructure improvements:
- 0 Integration Test Failures – 1,881 tests, all passing (was 755 failures two weeks ago)
- GIL-Based Threading – Real POSIX threads with a global interpreter lock and cooperative yield points
- NDJSON Protocol Mode – Persistent subprocess communication via
--protocolflag; foundation for future GUI - 8-Worker Parallel Tests – Full test suite runs in ~40 seconds (was 5+ minutes sequential)
- Per-Component Logging – Fine-grained control via
FRONTIER_LOG=comp:leveland--logflag - Ranger-Style File Browser – Two-pane file browser with arrow key navigation for
file.getFileDialog
Quick start:
[root]> user.inetd.config.http.port = 8080
[root]> user.webserver.responders.helloWorld.enabled = true
[root]> inetd.startOne (@user.inetd.config.http)
# Visit http://localhost:8080/helloworld in your browser
Overall Progress: 68% verb coverage (482/710 verbs), 22 processors fully implemented, 302 unit tests + 1,920 integration tests — 0 failures.
For comprehensive status details, see STATUS.md. For release details, see the v1.0.0-alpha.7 release notes.
Through the alpha.7 release window:
- Protocol-Based UserTalk Debugger (7 phases) — Full debugger accessible via the NDJSON protocol: set/clear/list breakpoints, step into/over/out, watchpoints with fire-on-change, conditional breakpoints with UserTalk expressions, multi-thread debugging with thread listing, and variable inspection at any scope. Enables any GUI or IDE to provide a debugging experience.
- Data-Loss Risk Hardening — Duplicate open guards prevent concurrent modification of the same database file, fread size validation catches truncated reads, migration locking prevents partial writes during v6→v7 conversion.
- databasedata Global Elimination (Phases 1-10) — All runtime save/swap/restore of the
databasedataglobal eliminated from pack/unpack/save/load paths. Explicit DB handle threading throughout the wrapper layer. Zero runtime mutation achieved. - Startup & Threading Fixes — GIL deadlock blocking HTTP callbacks resolved, 19 consistently-failing integration tests fixed, guest DB script execution stabilized.
- CLI Enhancements —
system.environment.argsexposes CLI arguments to scripts,sys.openUrlkernel verb,--browserflag for automation tools. - Lint Infrastructure — clang-tidy (bug-finding checks), ruff (Python), shellcheck (bash) configs with Makefile targets.
The two months since alpha.7 have focused on interactive debugging and the substrate for a native REPL. Headlines:
- Boxen — portable terminal window manager (Phase A) — A
termbox2-based window/pane substrate with modal windows, cursor positioning, mouse events (including Cmd-double-click), and a stable input/draw callback model. Shared between the TUI debugger today and the planned Phase C REPL. Lives inportable/boxen/. - TUI Debugger —
--debug-tui(Phase B) — A full-screen interactive debugger for UserTalk scripts. Two-pane source/state view with a keybind footer, F-key step/continue/breakpoint controls, conditional breakpoints (Shift-F9), watchpoints (modal + Cmd-double-click on a local identifier), and a:scratch-eval pane that runsscript/evalagainst the suspended frame. Hooks the lazy-attach transport so menu-triggered code that runs onthread.callScriptthreads (previously invisible to LLDB) is now debuggable inline. Seedocs/TUI_DEBUGGER_GUIDE.mdfor usage anddocs/TUI_DEBUGGER_ARCHITECTURE.mdfor internals. - Lazy-attach debugger transport (PR #722) — Global atomic transport pointer with a drain-before-free teardown contract. Lets the TUI (and any future in-process attacher) hook the debugger runtime safely, without the use-after-free surface that prevented WebSocket-attached debugging.
- String safety —
copyctopstringclamp — Length-validated copy-to-Pascal-string with explicit truncation surfaced at user-facing callsites. Closes a class of latent overflow bugs in the legacy C surface. - Test infrastructure — Test staging via
cp -Rwith md5 drift check protects the canonicaldatabases/from test mutation. File-level YAML metadata (sequential,needs_guest_dbs,protocol_mode) drives parallel runner behavior. PTY-driven Python lifecycle tests for TUI clean-exit verification.
Current Test Status: ~753 unit tests + 2,186 integration tests passing (21 known-baseline integration failures in html/tcp/startup, unchanged across the window).
- macOS (12.0 Monterey or later recommended)
- Xcode Command Line Tools: Install with
xcode-select --install
# 1. Clone the repository
git clone https://github.com/jsavin/Frontier.git
cd Frontier
# 2. Build the CLI (creates universal binary for arm64 + x86_64)
make -C frontier-cli
# 3. Verify the build works
./frontier-cli/frontier-cli -e "1 + 1"
# Output: 2
# 4. Launch the interactive REPL
./frontier-cli/frontier-cli
# Type UserTalk expressions, use /help for commands, /exit to quit# Unit tests (C test suite)
./tools/run_headless_tests.sh
# Integration tests (Python/YAML-based UserTalk tests)
cd tests && make test-integration
# Both unit and integration tests
cd tests && make test-allFrontier ships two debugger interfaces in the same binary:
# Interactive: full-screen terminal UI with F-key controls
./frontier-cli/frontier-cli --debug-tui
# Machine-driven: NDJSON over stdio for IDEs and external tools
./frontier-cli/frontier-cli --protocolThe two modes are mutually exclusive — pick one per session. The TUI is TTY-only (it opens /dev/tty directly); --protocol runs over piped stdio.
TUI keybinds at a glance: F5 continue, F9 toggle breakpoint, Shift-F9 conditional breakpoint, F10 step-over, F11 step-into, Shift-F11 step-out, : open scratch-eval pane, q quit. Cmd-double-click a local identifier in the script pane to set a watchpoint or inspect its value.
Full reference: docs/TUI_DEBUGGER_GUIDE.md. For the NDJSON protocol surface, see docs/CLI_USAGE_GUIDE.md.
- Getting Started Guide - Complete newcomer guide with detailed setup
- CLI Usage Guide - Comprehensive CLI and REPL documentation
- TUI Debugger Guide - Interactive
--debug-tuireference (keybinds, workflows, limitations) - Testing Guide - Writing and running tests
- Palette Test Harness - Four-layer (L1-L4) test model for the REPL slash-menu palette
Frontier links against the MySQL/MariaDB C client library for legacy database integration. Prebuilt binaries are no longer stored in the repo.
- macOS / Linux: run
scripts/build_mysql_client.shto fetch and compile MariaDB Connector/C intoCommon/MySQL/(or override the install location viaMYSQL_CLIENT_PREFIX). The script builds botharm64andx86_64static libraries and drops compatibility symlinks (libmysqlclient.aandinclude/mysql/). - Windows: legacy Visual Studio project files have been removed. Updated instructions will accompany the next iteration of Windows support.
See docs/mysql_client_setup.md for detailed guidance.
Frontier/
├── app_resources/ # App bundles/resources (Frontier, OPML, Radio)
├── Common/ # Legacy Frontier sources/headers
├── databases/ # Frontier.root + guest databases (test fixtures)
├── docs/ # Extensive documentation of Frontier's design and the UserTalk language and verbs
├── portable/ # Portable runtime layer + stubs
├── frontier-cli/ # Multi-arch CLI build
├── tests/ # Cross-platform C test suite
├── tools/ # Build tools (kernelverbs_parser, strings_compiler)
├── planning/ # Roadmap, ADRs, decisions, quickstarts
├── codex_sessions/ # README pointer (actual logs in codex-sessions branch, no longer used)
├── reports/ # Static analysis and progress reports (generated)
└── usertalk-scripts/ # Text file export of all the core UserTalk scripts in Frontier.root
planning/INDEX.md– roadmap, active workstreams, ownershipplanning/phase_overview.md– overview of all phasesplanning/architectural_decision_records/– ADRs for key technical decisionsplanning/Frontier_Refactoring_Plan.md– original modernisation plan
For in-flight work/status, see STATUS.md. Historical session context lives in planning/progress_reports/README.md.
Frontier development follows a structured workflow designed to maintain code quality and enable parallel development:
- Read
CONTRIBUTING.mdfor branching, commit, and testing expectations. - Branch from
developand keep changes small. Use feature branches in separate worktrees for non-trivial work:cd /Users/jake/dev/jsavin/Frontier git worktree add ../Frontier-<feature-name> -b feature/<feature-name> cd ../Frontier-<feature-name>
- Update/consult planning docs before coding (PRs reference the appropriate ADR/decision where possible).
- Run targeted tests locally; note known failures when applicable:
./tools/run_headless_tests.sh # Unit tests cd tests && make test-integration # Integration tests
- Update docs and tests alongside code; add Codex notes if significant.
- Open PRs against
develop(multi-arch + headless tests should remain green). Use the/doitworkflow for feature development:- Creates feature branch in worktree
- Designs implementation plan (with user approval)
- Implements with specialized agents (in parallel where possible)
- Writes and runs tests
- Creates PR with background monitoring
For detailed workflow guidance, see docs/WORKTREE_WORKFLOW.md and docs/PR_MONITOR_BLOCKING_ISSUE.md.
Security and Testing:
- Security hardening built in from start (SSRF protection, DNS rebinding, data-loss guards, length-clamped Pascal-string conversion)
- ~2,940 tests (~753 unit + 2,186 integration) running in 8-worker parallel, with 21 known-baseline integration failures tracked character-for-character
- Integration tests required for all verb implementations; PTY-driven lifecycle tests for TTY interfaces
Thread Safety and Database Integrity:
- GIL-based cooperative threading with real POSIX threads
- databasedata global elimination complete — zero runtime mutation
- v6→v7 migration validated, Y2038-safe 64-bit timestamps throughout
- Context guard pattern for safe concurrent database operations
For comprehensive status details, verb coverage, and milestone snapshots, see STATUS.md.
Historical session summaries live under planning/progress_reports/README.md.