Version 0.2 · 2026-11-11 · Owner: Junior Deogracias (teo1747)
Changes to this document are proposed by pull request and agreed with the owner. A decision is added to §2 with its date. Code and comments cite it as "spec section N" or "§N".
The handoff specification for EmbLink Studio's developer: what the owner has decided, what to build and in what order, and what is still open. v0.2 closes gaps found in a review of v0.1 and settles every open question (§11).
EmbLink Studio is the development system for EmbLinkRTOS. It turns a board and an idea into firmware that is proven to work, and shows the RTOS at every step. It is a long-term product, grown step by step like the RTOS.
It is two things that are one:
- A tooling system, the foundation. EmbLink Studio Core (
emblink-studio-core) does the whole job: configure, generate, build, flash, debug, decode crashes, run tests on hardware and collect the evidence. Every action is a command, so a terminal, CI or a script does exactly what the desktop does (§4). - A desktop that makes the system visible. The Qt application holds no knowledge of its own. It draws what the tools know (pins, clocks, threads, budgets, stacks, crashes, test results) and lets a person change it safely, with a preview before anything is written.
It is not a VS Code look-alike or a general-purpose editor: it understands the RTOS.
- Its boards and chips, as data.
- Its threads, objects, priorities and stacks.
- Its driver classes and devices.
- Its crash records and debug descriptor.
- Its test and hardware evidence.
What a developer can do with it, once complete:
- Create a project from a board or a template.
- See and change the board: pins, clocks, peripherals, devices, DMA channels, flash partitions.
- Add external parts (sensors, memories) from modules.
- Configure the RTOS: threads, priorities, stacks, queues, mutexes, timers, and see the RAM, flash and stack budget before building.
- Write application code.
- Build, flash, and watch the serial console.
- Debug with the RTOS visible: threads and their states, stack high-water marks, devices and their lifecycle.
- Decode a crash record into a readable report.
- Trace and time execution, and see power residency (later).
- See the project's evidence: tests run, on which board, passed or not.
The test for a feature. Does it need knowledge of EmbLinkRTOS, the hardware or the evidence?
- Yes (the pin map, the budget, RTOS-aware debugging, crash decoding, evidence): it is what EmbLink Studio is for. Build it deeply.
- No (text editing, git, file search): reuse what exists, such as an embedded editor component, clangd and git, and do not spend years on it.
The editor is one tool inside the system: good enough that nobody has to leave, but not the product's identity. Any other editor keeps working, since the generated names and the build's compile_commands.json serve it too.
Non-goals:
- A general IDE for other RTOSes or bare-metal code.
- A general-purpose code editor competing with VS Code.
- Its own compiler: it uses GCC, Clang or EmbCC, which it discovers or downloads.
- A VS Code extension. Not planned, though the core's interface (§5) would allow one later.
- Cloud features in the first releases.
A project whose YAML has things the views don't cover yet still opens. Those fields are shown read-only with their source, and are kept byte for byte when the project is saved (§6).
Nineteen decisions are taken, all dated 2026-11-11: seven from v0.1, the ten answers to §11's questions, which the owner accepted as recommended, the repository going public, and the definition of what EmbLink Studio is. A new decision is added here, with its date, once the owner agrees it.
| Date | Decision | Reason |
|---|---|---|
| 2026-11-11 | EmbLink Studio is the development system for EmbLinkRTOS: a tooling system (the core and its commands), with a desktop that makes it visible. Features that need knowledge of the RTOS, the hardware or the evidence are built deeply; the rest is reused (§1) | Keeps the project finite: it competes on what no other tool knows, not on general editing |
| 2026-11-11 | The name is EmbLink Studio | Renamed from EmbStudio on 2026-11-11: Wilcom sells embroidery software as "EmbStudio", the same word in software. The distinctive part is now the project's own name (§10) |
| 2026-11-11 | A native desktop application in Qt 6, with no VS Code base | Full control of the interface; a product of its own; the developer knows Qt well |
| 2026-11-11 | Step by step: configuration first, then build, flash and debug, then the editor grows | A useful product early, with the editor (the costliest part) grown over time |
| 2026-11-11 | The hardware model stays in EmbLinkRTOS: the SoC and board descriptions, their schemas, the validation rules and the generator (emb-hwgen) |
One hardware model, versioned and tested with the kernel it generates for. EmbLink Studio shows and edits it, and never re-implements its rules |
| 2026-11-11 | EmbLink Studio Core is a Python engine behind a CLI and a JSON-RPC server; the Qt application is its face | The RTOS's tools are Python already. Everything stays scriptable and testable without a GUI |
| 2026-11-11 | Open core under Apache-2.0, with a contributor licence agreement; paid "Pro" features possible later | The same licence as the RTOS; the agreement keeps commercial options open (§10) |
| 2026-11-11 | No VS Code extension for now | EmbLink Studio is the RTOS's own IDE |
| 2026-11-11 | Docking: Qt Advanced Docking System, linked dynamically | §11 q1 |
| 2026-11-11 | Qt Widgets for the frame, docks, tables, forms and the editor; Qt Quick for the drawn views | §11 q2 |
| 2026-11-11 | Installers: signed MSI (WiX), notarized universal DMG, AppImage; a signed release feed for updates | §11 q3 |
| 2026-11-11 | The core ships with a bundled, relocatable CPython, not PyInstaller | §11 q4 |
| 2026-11-11 | S5 (debugging) comes before S6 (modules) | §11 q5 |
| 2026-11-11 | The Pro tier is decided after S7; nothing Pro-only until then | §11 q6 |
| 2026-11-11 | A trademark search (classes 9 and 42) before any public announcement | §11 q7 |
| 2026-11-11 | Platforms: Windows 10 22H2 and 11, macOS 13 or later (universal), Ubuntu 22.04 and 24.04 | §11 q8 |
| 2026-11-11 | The repository is EmbLinkOs/EmbLinkStudio on GitHub |
§11 q9 |
| 2026-11-11 | The repository is public from 2026-11-11, before the trademark search; outside contributions wait for the CLA (§10) | The owner's choice. Making the code visible is not an announcement: no release, post or listing comes before the search (§11 q7) |
| 2026-11-11 | Semantic versioning, with the supported RTOS range stated in each release | §11 q10 |
EmbLink Studio is one new repository. It drives three groups of code it does not own, and none of them knows about EmbLink Studio.
+---------------------- EmbLink Studio (this repository) ----------------------+
| Qt 6 desktop application (C++) <-- JSON-RPC 2.0 over stdio --> the core |
| views, editor, docking, DAP client (Python: emblink-studio-core serve)|
+--------------------------------------------------------------+---------------+
| runs, reads
+-------------------------+--------------------------+-------------+
| | | |
EmbLinkRTOS EmbLinkRTOS-parts toolchains and tools
emb-hwgen: schemas, part drivers, blocks, GCC, Clang, EmbCC,
validation, generation; templates OpenOCD, pyOCD, GDB,
emb CLI, crashdec, HIL picotool, EmbSIM, QEMU
runner; kernel, CMake
| Repository | Owns | Who |
|---|---|---|
| EmbLink Studio (new) | The Qt application; EmbLink Studio Core; the protocol schemas; the schemas of the project manifest, the lock file and the module manifest; EmbLink Studio's tests and installers | EmbLink Studio developer |
| EmbLinkRTOS | The kernel, the on-chip drivers, the hardware description schemas (SPEC-014), the generator, the emb CLI, crashdec, the HIL runner and the support matrix |
Owner |
| EmbLinkRTOS-parts (new, later) | External part drivers and bindings, application blocks, project templates | Owner, then contributors |
| EmbCC | The compiler | Owner |
The R-004 design record in EmbLinkRTOS explains the module contract and the configurator in more depth (§14). This specification takes precedence where they differ on EmbLink Studio. In particular, R-004's phase E4, a VS Code extension, is replaced by EmbLink Studio.
Three layers. The rule that matters most: all knowledge lives in the core or the RTOS's tools; the Qt application only shows and edits.
| Layer | Language | Responsibility | Must not |
|---|---|---|---|
| Desktop application | C++17 or later, Qt 6 (§9) | Windows, docking, views, the editor, the debugger interface, settings, installers | Validate hardware, compute clocks, generate code, or parse the descriptions itself |
| EmbLink Studio Core | Python 3.11 or later | Projects, modules and the lock file, toolchains, build, flash, monitor, debug sessions, simulation; the editing model of the configuration; calls into the RTOS's tools | Re-implement the RTOS's rules: it runs emb-hwgen and reads its outputs |
| The RTOS's tools | Python, C | Descriptions and schemas, validation, generation, hw.json, reports, crash decoding, test runs |
Know anything about EmbLink Studio |
The core's executable is emblink-studio-core, and its server is emblink-studio-core serve. v0.1 called the server emb serve, but the emb CLI belongs to EmbLinkRTOS (§3, M4.3), so two repositories would have shipped the same command. Every RPC method also has a CLI form, such as emblink-studio-core project validate. The core calls the RTOS's emb and emb-hwgen, and never the other way round.
The core runs the project's own RTOS tools. A project pins an RTOS revision (§6), so the core runs the emb-hwgen from that pinned checkout, as a subprocess with JSON output. It never uses a copy bundled with EmbLink Studio. Then a project built in the IDE and on the command line uses the same generator, and one EmbLink Studio release can serve projects on different RTOS versions. The core states which range of the hw.json and diagnostics formats it supports, and refuses a project outside that range with a clear message.
Process model.
- The desktop starts
emblink-studio-core serveas a child process. They talk JSON-RPC 2.0 over standard input and output, framed withContent-Lengthheaders as in the Language Server Protocol. Standard error carries the core's own log, never protocol traffic. - One core process serves one open workspace. It can work on several requests at once: a build runs while the views keep asking for data.
- If the core exits unexpectedly, the desktop shows that, keeps the views read-only, and offers a restart, which reopens the project. Nothing is lost, since all state is on disk (§6).
- Debugging uses the Debug Adapter Protocol (DAP).
debug.startlaunches GDB's own DAP interpreter (gdb -i=dap, GDB 14 or later, built with Python) against the probe's GDB server (OpenOCD, pyOCD or J-Link). The core sits between them as a thin DAP proxy, and adds RTOS-aware requests (threads, stacks, devices) by reading the kernel's debug descriptor throughreadMemory. The debugger interface is written once, whatever the probe.
Why it is split this way:
- Every action is also a CLI command, so CI, scripts and tests do what the IDE does.
- The core can be tested without a GUI, and the GUI can be tested against a fake core.
- A future frontend (a VS Code extension, a web view) needs no new logic.
The interface is versioned and described by schemas in the EmbLink Studio repository: one JSON Schema per method's parameters and result, under protocol/. Both sides are tested against them. The method list below is the first version to agree, not the final one.
Lifecycle.
initialize: the desktop sends itsprotocol_version(semantic versioning) and capabilities; the core answers with its own and its version. The desktop refuses a core of another major version.initialized: a notification from the desktop; after it, the core may send notifications.shutdown: the core finishes or cancels its work and answers.exit: a notification; the core exits with code 0 aftershutdown, and 1 without it.
Methods (first version):
| Namespace | Methods | Notes |
|---|---|---|
project |
create, open, trust, validate, close, status |
validate returns every diagnostic with its file, line and path in the YAML. trust: see §9, Security |
board |
list, describe, pins, clocks, memory |
From the generator's resolved model (hw.json); nothing computed in the GUI |
config |
get, set, preview, apply, undo, redo |
Edits to the YAML through the core. preview returns the change as a diff and its diagnostics before anything is written. undo and redo step through applied changes (§6) |
devices |
list, describe, add, remove |
The board's devices: their class, binding fields, DMA channels and chip selects |
rtos |
threads, objects, budget |
system.yaml's threads and objects; the RAM, flash and stack budget from the generator's report |
modules |
list, search, add, update, remove |
Writes emb-project.yaml and the lock file |
generate |
run, diff |
Runs emb-hwgen; diff shows which generated files would change |
build |
configure, run, clean, targets |
CMake with the chosen toolchain and build configuration (§6); diagnostics as structured messages |
toolchain |
list, detect, install |
Discovers GCC, Clang and EmbCC; downloads pinned versions and checks their checksums |
flash |
probes, run |
OpenOCD, pyOCD or picotool, chosen by the board's debug_probe |
monitor |
open, close, send |
Serial console; later the RTOS's framed channels (logs, trace, crash) |
debug |
start, stop |
start returns the DAP endpoint the desktop connects to (§4) |
crash |
decode |
crashdec on a crash record or a log |
evidence |
runs, matrix |
Hardware runs and the support matrix for the boards used |
sim |
start, stop |
EmbSIM or QEMU for the board, where supported |
Notifications from the core: progress (long operations), diagnostics (a file's problems changed), log (output of a tool it runs), files_changed (the project changed on disk).
Long operations (build, flash, generate, toolchain install) take a progress_token. The core reports progress against it, and the desktop can cancel with $/cancelRequest, as in LSP. A cancelled request answers with the error cancelled.
Errors use JSON-RPC's error object. code is one of the table below, message is written for the user, and data holds the tool output that caused it and, where it applies, the file and line.
| Code | Name | When |
|---|---|---|
| -32700 to -32600 | JSON-RPC's own | Malformed message, unknown method, bad parameters |
| 1001 | not_initialized |
A call before initialize |
| 1002 | no_project |
A project call with no project open |
| 1003 | untrusted |
An action that runs project code before project.trust |
| 1004 | cancelled |
The request was cancelled |
| 1010 | tool_failed |
A tool the core ran (generator, CMake, probe) failed; its output is in data |
| 1011 | tool_missing |
A tool or toolchain is not installed |
| 1020 | conflict |
The file changed on disk since the core read it (§6) |
| 1030 | unsupported_rtos |
The project's RTOS revision is outside the range the core supports (§4) |
A project is a directory under version control, and everything EmbLink Studio shows comes from its files. The only state kept outside them is window layout, preferences and undo history, in .emblink-studio/, which is not committed.
my-project/
emb-project.yaml the project: RTOS version, modules, board, toolchain
emb-project.lock exact commits and hashes of the RTOS and the modules (written by the core)
system.yaml threads, objects, parts' use, blocks (SPEC-014 section 5)
boards/ only for a board of the project's own (laid out as A76 says)
src/ include/ the application's code
generated/ the generator's outputs: never edited, regenerated
CMakeLists.txt builds against the RTOS's CMake package
CMakePresets.json the build configurations (debug, release), shared by the IDE and the CLI
build/ build trees, one per configuration (ignored by git)
.emblink-studio/ EmbLink Studio's own preferences (ignored by git)
# emb-project.yaml
schema_version: 0
kind: project
name: my-project
rtos: { url: https://github.com/EmbLinkOs/EmbLinkRTOS, rev: v0.3.0 }
modules:
- { name: emblink-parts, url: https://github.com/EmbLinkOs/EmbLinkRTOS-parts, rev: v0.1.0 }
board: st/nucleo_f446re
toolchain: { family: gcc, version: 14.2.Rel1 }
system: system.yamlRules:
- The board and SoC descriptions follow the RTOS's schemas (SPEC-014, in
hw/schemas/). EmbLink Studio writes them through the core and never invents a field. - If the configuration views need a board split into smaller files (pins, clocks, devices), the RTOS adds an
include:to its schema. EmbLink Studio asks for it, and does not add a format of its own. - Generated files are only regenerated, never edited. User code calls the names the generator writes.
- A project created by EmbLink Studio builds from the command line with the same result. Build configurations live in
CMakePresets.json, socmake --preset debuggives the IDE's debug build.
Editing YAML that people also write by hand:
- Round-trip. The core edits YAML with a round-trip parser (ruamel.yaml), so comments, key order, quoting and blank lines survive an edit. An edit changes only the lines it must, and a change made in the IDE reads in
git diffas if a person had made it. Golden tests check this (§9). - Edits from outside. The core watches the project's files and sends
files_changedwhen one changes. Eachconfig.applycarries the content hash of the file it was previewed against. If the file changed in between, the core refuses withconflict, and the desktop re-reads it and shows the new state. An edit made in another editor is never overwritten silently. - Undo. Each
config.applyis one step in an undo history kept by the core, per workspace and per session, and stored in.emblink-studio/. An undo is itself previewed and applied, with the same conflict check. Git remains the history that matters.
The design is the developer's, within three principles:
- The RTOS is visible everywhere.
- Every number shown comes from the core, with its source one click away.
- A change shows its effect (diagnostics, budget) before it is applied.
The layout is the person's. Every view is a dock of Qt Advanced Docking System (§11 q1), the editor and the drawn views included. It can be moved, split, tabbed, floated onto another monitor, closed and reopened, and no view is fixed in place.
- The layout is saved when the window closes and restored when it opens: per project in
.emblink-studio/(§6), and in the user's settings while no project is open. - Layouts can be saved by name, such as Configure, Code and Debug, and opened from the View menu. Starting a debug session may switch to one, as a perspective does in other IDEs.
- Reset layout brings back the default.
- A view's id names it in saved layouts and never changes. A layout saved by another layout version is ignored, never half applied.
- Inside a view, the view lays out its own content.
| View | Shows and does | From |
|---|---|---|
| Start | New project from a board or a template; recent projects | project, board.list |
| Project | The project's files, modules and board; its status (valid, generated, built) | project.status |
| Problems | Every diagnostic in one list (validation, generation, build), each linked to its file and line | diagnostics notifications |
| Board | The chip and the board: memory map, peripherals, the board's devices | board.describe, devices.list |
| Pin map | The package drawn from the SoC's pin data: each pin's function, conflicts highlighted; assign by click | board.pins, config.set |
| Clock tree | Oscillators, PLL and buses, with the frequencies the generator computed and the limits marked | board.clocks |
| Devices and DMA | Each device's class, binding fields, chip selects and DMA channels; add a part from a module | devices.* |
| RTOS | Threads (priority, stack, entry), objects, priority ceilings; a budget bar for RAM, flash and stack | rtos.* |
| Memory and partitions | Regions, flash partitions, and how the image uses them after a build | board.memory, the build report |
| Build | Output, size per component, warnings | build.* |
| Flash and console | Probe, flash, the serial console | flash.*, monitor.* |
| Debugger | Breakpoints, stepping, registers, memory, RTOS threads and their states, stack high-water marks, devices and their lifecycle | DAP; the RTOS's debug descriptor (A107) |
| Crash report | A decoded crash record: fault, thread, location, registers | crash.decode |
| Evidence | This board's hardware runs, passed or failed; the support matrix | evidence.* |
| Settings | Toolchains, probes, the core's log, preferences | toolchain.*, .emblink-studio/ |
| Trace and timing (later) | Thread timeline, interrupt latency, power residency | The RTOS's trace (M4.3), timing tools |
The editor grows in three steps:
- Syntax highlighting (KSyntaxHighlighting, MIT) and an "open in your editor" action.
- C and C++ intelligence through a language-server client talking to clangd (completion, errors, go to definition), using the build's
compile_commands.json. - Search, refactoring, git.
Ten stages, each ending in something usable and demonstrated. S0 is done: CI builds and tests on Windows, Linux and macOS (2026-11-11). Acceptance is checked in CI where possible. Where a check needs real hardware, CI runs it on EmbSIM and a person runs it on the board, with the result recorded as evidence.
| Stage | Delivers | Accepted when | Needs from the RTOS | Status |
|---|---|---|---|---|
| S0 Setup | The EmbLink Studio repository, its licence files and contributor agreement, CI on Windows, Linux and macOS, a Qt application that starts and talks to a stub core | CI builds and tests on all three systems; initialize and shutdown succeed; the notices list is generated |
Nothing | Done |
| S1 Core foundation | emblink-studio-core serve, project.open and validate, board.* from hw.json, generate.run |
Opening the RTOS's nucleo_f446re and pico2_w boards shows their model; validation reports the generator's errors with their locations |
JSON diagnostics from emb-hwgen; a versioned hw.json |
Done (2026-11-12) |
| S2 Read-only views | Board, pin map, clock tree, devices, memory, RTOS, problems | For both boards, a golden test finds every value in the views equal to hw.json and to the generator's board.md and build_report.md |
Existing outputs | In progress |
| S3 Editing | config.preview, apply, undo; pins, devices and threads editable; live diagnostics |
A pin conflict is refused with the generator's message; an edit's git diff touches only the lines it must; generation stays clean |
system.yaml (E3) for threads |
Not started |
| S4 Build, flash, console | Toolchain discovery, CMake build, flash by OpenOCD and picotool, serial console | A project is created, built, flashed and seen running on the NUCLEO-F446RE and the Pico 2 W; in CI, on EmbSIM's nucleo_f446re |
The CMake package (A91) | Not started |
| S5 Debugging | DAP sessions; the RTOS-aware views; crash decoding | Breakpoints and stepping on both boards; threads and their states shown; a crash record decoded | The debug descriptor (A107), crashdec | Not started |
| S6 Modules and parts | modules.*, the parts catalog, adding a part as a device |
A BME280 added from the parts module is generated, built and read on a board | The module contract and lock file (E1); EmbLinkRTOS-parts | Not started |
| S7 Evidence and trace | The evidence view; the trace and timing views as the RTOS provides the data | The board's hardware runs listed; a trace shown | HIL records; the trace ring (M4.3) | Not started |
| S8 The editor | clangd integration, search, git | Daily work is possible without another editor | Nothing | Not started |
| S9 Release | Signed installers (Windows MSI, macOS DMG, Linux AppImage); updates; the first public release | Installs cleanly on a new machine and opens the examples | A tagged RTOS release | Not started |
What the RTOS side provides, and when:
| EmbLink Studio needs | Status in EmbLinkRTOS | First needed |
|---|---|---|
| Machine-readable diagnostics from the generator (JSON) | To add, early. Until then the core reads its documented line format (HW-002) | S1 |
A version field in hw.json and a published schema for it |
Exists: schema_version and hw/schemas/hw.schema.json |
S1 |
hw.json and the generated outputs for each board |
Exists | S1 |
emb-hwgen generate and check |
Exists | S1 |
| The CMake package for applications outside the tree | Exists (A91) | S4 |
| crashdec, the HIL runner's records, the support matrix | Exist | S5, S7 |
The debug descriptor and emb devices |
Exist (A107) | S5 |
The emb CLI |
M4.3 | S4 |
system.yaml generation: threads, objects, emb_system_init() |
Phase E3 | S3 |
| The module contract, the project manifest and the lock file | Phase E1 (R-004) | S6 |
| The trace ring and its format | M4.3 | S7 |
include: in the board schema, if the views need it |
On request | S3 |
Until the module contract and system.yaml exist, S1 to S3 work on what exists: the boards in the RTOS tree and their generated model. Threads become editable in S3 only once E3 lands; until then the RTOS view stays read-only. The core's project and module schemas are designed with the owner, and the RTOS adopts them in phase E1.
- Qt: Qt 6.8 LTS, under the LGPL-3.0, linked dynamically, with no GPL-only module (Qt Charts, Qt Graphs, Qt Virtual Keyboard and Qt Creator's code are GPL or commercial). Check which 6.8 patch releases are published under the LGPL. If later LTS patches are commercial only, track the newest 6.x minor release instead. The installers ship Qt as replaceable shared libraries (frameworks on macOS), with the LGPL text and a link to Qt's sources, as the LGPL asks.
- Widgets and Quick: Qt Widgets for the frame, docking, tables and forms. Qt Quick, in
QQuickWidgets, for the drawn views: pin map, clock tree, and later the trace timeline (§11). - Third-party libraries: only under licences compatible with the open core: MIT, BSD, Apache-2.0, LGPL linked dynamically, MPL-2.0. No GPL libraries in the application. Some terminal and docking widgets are GPL, so check each one. GPL tools (GDB, OpenOCD) run as separate programs and are never linked. Toolchains are downloaded from their publishers, not bundled.
- A notices list of every component and its licence, C++ and Python alike, generated in CI and shown in the About box. CI fails on a licence that is not on the allowed list.
- Tests: Qt Test for the application; pytest for the core; JSON Schema checks of every message in both directions; golden projects (the RTOS's boards) whose generated outputs, YAML edits and builds are compared in CI; the GUI tested against a recorded core; a test that every view can be moved, floated and closed, and that a layout saved is the layout restored (§7).
- Reproducibility: pinned dependencies, pinned toolchains with checksums, the lock file. The same project gives the same build in the IDE and on the command line.
- Code: clang-format for C++, ruff for Python; every commit signed off (
Signed-off-by, the DCO). - Accessibility and languages: keyboard navigation throughout; Qt's translation system from the start, even with only English at first.
- Privacy: no telemetry by default. Anything collected later is opt-in.
Security. Opening a project can run code: CMake scripts, module hooks, the project's pinned generator.
- Trust. A project opened for the first time is untrusted. The views read its files, but nothing in it runs (generate, build, flash, debug answer
untrusted) until the person trusts it once withproject.trust. Trust is remembered per path in the user's own settings, never in.emblink-studio/, so a project cannot ship its own trust. - Downloads. Toolchains, and the bundled Python if §11 chooses one, are checked against SHA-256 sums pinned in the core's release. A mismatch is refused, never warned.
- Modules are fetched at the exact commits in the lock file, and a hash mismatch stops the build.
- No listening sockets. The core talks over standard input and output only. A DAP endpoint listens on the loopback address, with a one-time token.
- Licence: Apache-2.0 for everything in the open core: the application, the core and the schemas. The repository carries
LICENSEand aNOTICEfile, as Apache-2.0 expects. - A commercial "Pro" tier may come later. Which features it holds is the owner's decision. Candidates are advanced trace and timing analysis, power profiling, certification-report generation, and team features. The open core must stay complete for everyday work.
- Ownership. Every contributor, the EmbLink Studio developer included, signs the contributor licence agreement before their first contribution is merged. It lets the project offer the code under other terms later, the Pro tier included. A lawyer checks it before anyone signs; the Apache Software Foundation's individual agreement is a common model. A CLA bot on pull requests records who has signed.
- The CLA and the DCO do different jobs. The CLA grants the project rights to the code, once per contributor. The DCO sign-off on each commit says the author may submit it. Both stay.
- Owner and developer. They agree in writing on credit and on any future revenue from EmbLink Studio before the developer's first merge in S0, since most of the early code is the developer's.
- The name. "EmbLink Studio", "EmbLink" and "EmbLinkRTOS" are the project's names. A trademark policy says forks may use the code but not the names. Before the repository is announced in public, a trademark search checks "EmbLink Studio" against SEGGER Embedded Studio and others in the classes for software (class 9) and software services (class 42). A web search on 2026-11-11 found Wilcom selling embroidery software as "EmbStudio", the same word in class 9, so the IDE was renamed EmbLink Studio before anything was announced. A search of the registers is still to do.
All ten questions are settled: the owner accepted each recommended answer on 2026-11-11, and §2 records them. Questions 1 to 7 came from v0.1, and 8 to 10 are new. This table keeps the reasoning.
| # | Question | Recommended answer | Why | Decision |
|---|---|---|---|---|
| 1 | The docking framework | Qt Advanced Docking System (LGPL-2.1, linked dynamically) | Tabbed, floating and split docks, and saved layouts, which Qt's own QDockWidget lacks. KDDockWidgets is GPL or commercial. If ADS ever fails, fall back to QDockWidget |
Decided |
| 2 | Where Qt Widgets and Qt Quick are used | Widgets for the frame, docks, tables, forms and the editor; Quick in QQuickWidget for the pin map, clock tree and trace timeline |
Widgets are best at dense tool UIs and text. Quick is best at drawn, zoomable, animated views | Decided |
| 3 | Installers, updates, signing | Windows: MSI built with WiX, Authenticode-signed. macOS: a universal DMG, Developer ID signed and notarized. Linux: AppImage built with linuxdeploy. Updates: an in-app check against a signed release feed at first; Sparkle and WinSparkle (both MIT) later | Standard per platform. Signing needs paid certificates (an Apple developer account, a Windows code-signing certificate), which is the owner's cost to approve | Decided |
| 4 | How the core is packaged | A bundled, relocatable CPython (python-build-standalone builds) with the core in a private environment, not PyInstaller | The core runs the project's pinned emb-hwgen (§4), and that needs a real interpreter. A frozen PyInstaller program has none. A system Python varies by machine and breaks reproducibility. Each RTOS revision's tool dependencies go in an environment keyed by the lock file's hash |
Decided |
| 5 | Which comes first after S2: debugging (S5) or modules (S6) | S5, debugging | What it needs from the RTOS exists today (A107, crashdec). S6 waits for the module contract (E1) | Decided |
| 6 | The Pro tier: which features, and when | Decide after S7. Until then, write nothing Pro-only, and keep trace, power and reporting as separable modules | By S7 it is clear what everyday work needs, and so what must stay open | Decided |
| 7 | The trademark check on "EmbLink Studio" | A search in classes 9 and 42 before the repository is announced, by a trademark attorney if the budget allows | A rename after release costs far more than one before | Decided |
| 8 | Supported platforms | Windows 10 22H2 and 11 (x64); macOS 13 or later (Apple silicon and Intel, one universal build); Ubuntu 22.04 and 24.04 (x64). Arm64 Windows and Linux later | Within Qt 6.8's supported platforms, and what CI's hosted runners provide | Decided |
| 9 | Where the repository lives | EmbLinkOs/EmbLinkStudio on GitHub, beside the RTOS |
One organisation and one CI system; issues can link across repositories | Decided |
| 10 | Versioning and RTOS compatibility | EmbLink Studio uses semantic versioning. Each release states the RTOS revisions it supports (§4), and the evidence view shows that range | Users must be able to tell whether a project will open before they open it | Decided |
The review of v0.1 found 15 gaps, the name among them. Four could have caused rework or a wrong build: the emb name clash, which generator runs, YAML round-tripping, and project trust. The rest were missing detail.
| Gap in v0.1 | Effect if left | Fix in v0.2 | Where |
|---|---|---|---|
The core's server was emb serve, but the emb CLI belongs to EmbLinkRTOS |
Two repositories shipping one command | The core is emblink-studio-core, with serve |
§4 |
Which emb-hwgen the core runs was not said |
A bundled generator would differ from the project's pinned RTOS, and IDE builds would differ from CLI builds | The core runs the project's pinned RTOS tools, within a stated range | §4, §11 q4 |
| No rule for YAML comments and formatting on edit | IDE edits would rewrite whole files, with noisy diffs and lost comments | Round-trip editing (ruamel.yaml) and golden diff tests | §6, §9 |
| Opening a project could run its code with no consent | A cloned project runs CMake or module code on open | Project trust and the untrusted error |
§9 |
| Edits made outside the IDE were not handled | An IDE edit overwrites a change made in another editor | A content hash on apply and the conflict error |
§5, §6 |
| No undo | Editing views without undo | config.undo and redo |
§5, §6 |
| No cancellation, lifecycle or error codes | Builds that can't be stopped; each side guessing at errors | $/cancelRequest, shutdown/exit, an error table |
§5 |
| No schema for the protocol | The C++ and Python sides drift apart | JSON Schemas in protocol/, tested on both sides |
§5 |
| No debug adapter was named | The developer would have to pick or write one | GDB's DAP interpreter behind a thin core proxy | §4 |
| No behaviour when the core crashes | A frozen or confusing UI | Read-only views and a restart that reopens the project | §4 |
| No build configurations | Debug and release builds set by hand | CMakePresets.json, shared with the CLI |
§6 |
| Hardware checks in S4 and S5 can't run in CI | Acceptance claims with no evidence | EmbSIM in CI, and board runs recorded as evidence | §8 |
| Qt 6.8 LTS patches may be commercial only for LGPL users | Unpatched Qt in releases | A check, and a fallback to the newest 6.x minor | §9 |
| References (A76, A91, A107, M4.3, E1, E3) were unexplained | A new developer can't follow them | Added to §13 | §13 |
| The name EmbStudio is already used by Wilcom's embroidery software | A trademark dispute, or a rename after release | Renamed EmbLink Studio, before any announcement | §2, §10 |
Smaller changes: S2's acceptance is now an automated golden test, each stage lists what it needs from the RTOS, the Problems and Settings views were added, and Python dependencies are in the notices list.
| Term | Meaning |
|---|---|
| SoC description | A YAML file describing a chip: memory, peripherals, interrupts, clocks, pins (soc/) |
| Board description | A YAML file describing a board: its chip, oscillators, pins, console, devices, partitions (boards/<vendor>/<board>/board.yaml) |
| System description | system.yaml: what a product does with the board: threads, objects, partitions |
emb-hwgen |
The generator: validates the descriptions and writes generated/, including hw.json (the resolved model, the core's main input). Lives in hw/gen/ |
| Compatible | A vendor,part string that names the driver for a peripheral or part |
| Binding | The entry in drivers/bindings.yaml saying which driver, class and configuration fields a compatible has |
| Device | A peripheral or part the board uses, with its driver, configuration and dependencies (SPEC-016) |
| Driver class | The interface a kind of device has: UART, SPI, I2C, DMA, GPIO, watchdog, flash, RTC, entropy (SPEC-017) |
| Partition | A named range of flash, such as app or storage |
| Debug descriptor | A table the kernel keeps in memory, so a debugger can find threads, objects and devices (A107) |
| Crash record | What a fault leaves in memory that survives a reset; crashdec decodes it |
| HIL | Hardware in the loop: the test suite run on a real board, its records archived as evidence |
| EmbSIM | The project's own simulator of microcontrollers and boards, used in CI |
| Evidence | The records that prove a claim: test results, hardware runs, measurements |
| An | An accepted amendment to the specs, listed in docs/specs/AMENDMENTS-M*.md |
| A76 | Boards outside the RTOS tree, found through EMB_BOARD_ROOT (SPEC-014) |
| A91 | Applications outside the tree: the RTOS's CMake package (emb_add_executable()) |
| A107 | The debug descriptor, version 1 (SPEC-015 §5), and emb_gdb.py, which lists threads and walks their stacks |
| M4.n | A milestone of the RTOS roadmap's phase M4 (docs/architecture/07-roadmap.md) |
| M4.3 | The milestone that brings the emb CLI and the trace ring (CTF) |
| E1 to E5 | The ecosystem phases of R-004. E1: the module contract, project manifest and lock file. E3: the configurator engine, generating system.yaml's threads and objects with emb_system_init(). E2, E4 and E5 cover parts, the VS Code extension (now replaced by EmbLink Studio) and RTOS-aware debugging |
docs/specs/SPEC-014-hardware-description-schema.md: the descriptions and the generator's outputs.docs/specs/SPEC-016-device-and-driver-model.mdandSPEC-017-driver-classes.md: devices and classes.docs/specs/SPEC-015-observability-formats.mdanddocs/engineering/debug-descriptor.md: the debug descriptor and the crash record.docs/specs/AMENDMENTS-M3.md: A76, A91 and A107 in full.hw/gen/,hw/schemas/: the generator and its schemas.boards/st/nucleo_f446re/,boards/rpi/pico2_w/: two real boards and theirgenerated/outputs.tools/crashdec/,tools/descriptor/(withemb_gdb.py, the base for the debugger's RTOS views),tools/hil/,tools/support/: the tools EmbLink Studio drives.docs/research/R-004-ecosystem-addons-configurator-integrations.md: modules, parts and the configurator. It is on thedocs/ecosystem-designbranch for now. This specification takes precedence where they differ on EmbLink Studio.