For tech leads · v0.2.0 (prototype)

Technical schematic

How Aether is built: what it does, where it calls AI models in the OpenAI format, where it uses MCP, how agents reach their tools, and every endpoint the app serves.

OpenAI-format model callsMCPMCP, not yet started or connectedlocal HTTP inside the app
Aether architecture Browsers and scripts call Mission Control on 127.0.0.1. Its gateway checks host and origin, then sign-in and permissions, and routes to Chat, Sprints, Missions and Roadmaps, Staff, the Memory viewer and Settings. Those surfaces offer tools to agents. Agents call AI models through one OpenAI-format client, and reach organization MCP services through the Data Sources client. LM Studio can use Aether's own read-only MCP server. Database access goes through a database MCP service the organization runs, a placeholder not yet connected. Data, credentials and control files are stored locally. BrowserMission Control pages (Chat, Missions, Sprints, Staff...) Scripts and AI assistantssame JSON API · session cookie · Origin header on changes LM Studio (or another MCP host)spawns Aether's MCP server stdio Mission Control · 127.0.0.1:8484 gateway: exact Host, same Origin, 105 declared routes → sign-in, 12 permissions, Admin → handlers Emergency Halt blocks new work · binds to this computer only Aether MCP server aether_bridge mcp-serve · stdio list_roots · list_dir · read_file · glob · search (read-only) Chatmodel-only chatTalk with (Admin)files · sources Sprintslead · staffTimer · checksreview · accept Missionsroadmapstrackercommissions Staffleads · staffcatalog · editorLibrarian KnowledgeMemory viewerTeach FramesCreations Settingsmodels · keysdata sourcesbackup · halt ToolBelt and its registry approve · withdraw · undo, with who and why every call admitted, with an fsynced receipt named roots · write gates · journaled undo Tools offered to agents: a fixed list per surface, checked by its handlers sprint staff: tasker_read · task_start/close/block · read_file · list_dir · write_file (own outputs) · run_tests · run_command · identity_close sprint lead: plan, hire, briefcases, timer, roadmap · Memory Fabric owner tools (memory_*) · give_closing_words · Librarian Chat: folder tools (list, read, search, propose edit) · data_sources · Talk with: memory tools only every model call data_sources tool One OpenAI-format model client aether/backends/model.py · standard library, no SDK POST {base}/chat/completions · GET {base}/models · Bearer key tools as functions · not streamed · DeepSeek text calls converted Data Sources MCP client Streamable HTTP (HTTPS) or stdio initialize → tools/list → tools/call fresh session per call · pinned fingerprints ToolBelt MCP client would add external tools as unapproved built and tested · nothing starts it setting toolbelt.mcp_servers (shown read-only) DeepSeekapi.deepseek.com Claudeapi.anthropic.com/v1 OpenAIapi.openai.com/v1 LM Studio127.0.0.1:1234/v1 llama.cpp127.0.0.1:8080/v1 Database MCP serviceplaceholder · run by you, connected laterholds drivers + a DBA read-only account Your databasesSQL Server · Oracle · MySQL · PostgreSQL STORED ON THIS COMPUTER: DATA FOLDER sprints (Tasker SQLite) · roadmaps · missions · chats (SQLite per account) Staff Homes (one identity file each) · Memory Fabric cartridges (SQLite, sealed) data sources, runs and reports (SQLite) · Teach Frames · Creations CREDENTIALS FOLDER API key vault: Windows DPAPI + management password · runtime copy keys granted per account, per request CONTROL FOLDER installation settings (journaled, undoable) tool registry · admission receipts accounts, roles, sessions

1. Features

Chat

  • Model-only chat with any connection your account may use; stop, search, tags
  • Transforms and artifacts (summary, bullets, task list, To Aether, Teach Frame)
  • Talk with a heavyweight that has a cartridge; End files its own closing words (Admin)
  • Chat folder or personal scratchpad; reviewed edit proposals; PDF/Office reading and Windows OCR
  • Personal knowledge cartridge; data sources with @mentions

Work: missions, roadmaps, sprints

  • Missions → roadmaps → sprints → tasks; an example roadmap seeded on first run
  • Prepare a sprint (no model call): lead, connection, cost cap, turns, wanted file, output checks
  • Start, stop, continue, resume, raise budget; one Timer per sprint
  • Outputs checked against declared files; review tied to the exact bytes; Accept, or Accept anyway with a reason (Admin)
  • The lead records each sprint's outcome on the roadmap

Agents and staff

  • Leads (heavyweight, with Memory Fabric) and staff (lightweight, one identity file each); 40 staff in the catalog
  • Meridian, the app's own lead, set up on first run
  • Create a specialist in plain words; specialist catalog; Agent Editor for custom templates
  • Librarian the lead can consult; ultralight helpers if a connection named ultralight exists

Memory and teaching

  • One Memory Fabric cartridge per lead; the mind manages its own memory with 12 owner tools
  • Memory viewer: graph, time slider, table, Recorded dates, seal status (read-only)
  • Teach Frames: author, import, export; the School's frames for staff; the Lexicon reference

Outputs and dashboards

  • Creations: summaries, notes, HTML, SVG (drawn as images), import and export, Draft/Published
  • Save an accepted sprint output to Creations
  • Dashboards for Chat, Missions, Roadmaps, Sprints, Staff, Teach Frames, Creations

Models and keys

  • Hosted presets (DeepSeek, Claude, OpenAI); local servers found on :1234 and :8080; any OpenAI-compatible server
  • API Keys: management password, DPAPI-encrypted vault, add/reveal/rename/replace/delete, reset, lock
  • Keys granted per account; Suspend API use; secrets redacted from errors and records

Data sources and tools

  • MCP Data Sources: register a service, discover tools, choose what to expose, roles per source
  • Run tools, results as tables, CSV/JSON export, saved reports
  • Databases through a database MCP service your organization runs: the placeholder middle layer, not yet connected
  • Aether's own read-only MCP server for LM Studio

Accounts and safety

  • Sign-in; default Admin with a one-time welcome (own password, provider, key)
  • Human accounts, named roles, 12 permissions
  • Emergency Halt; Backup & Recovery (coverage, path check, recovery report); readiness chips
  • Networks: several computers host the older commission flow

Install and headless use

  • Install.cmd, Aether.cmd, Uninstall.cmd, Maintenance.cmd; Python bundled; app, data and credentials kept apart
  • Backup, verify, restore (staged), upgrade keeping data
  • Every action is a JSON API on 127.0.0.1, so scripts and AI assistants can drive it

2. Where the OpenAI API format is used

Every model call in the app goes through one client, LMStudio in aether/backends/model.py. Despite its name it speaks the OpenAI chat-completions format to any provider, using only the Python standard library: no OpenAI or Anthropic SDK.

Outbound endpoints

CallWhenSource
POST {base}/chat/completionsEvery agent and chat turn. Body: model, messages, stream:false, tools (OpenAI function schemas), max_tokens, temperature 0.2 except to api.anthropic.com and api.openai.com, thinking for DeepSeek only. No tool_choice is ever sent.model.py
GET {base}/modelsConnection check after saving, "Load models from server", local discovery of :1234 and :8080. Never runs the model.deployment_probe.py
HeaderAuthorization: Bearer <key> for every provider; keys only to HTTPS or this computer; no proxy and no redirects for saved keys.model.py

Who calls the model

CallerLoop and limitsSource
Sprint lead (Overseer) turnTasker loop: up to 40 rounds, then one final request without tools; cost cap checked before each calloverseer/turn.py, tasker/model.py
Sprint staff turnSame loop; at most 2 JSON correctionstasker/staff_turn.py
LibrarianAt most 8 rounds; the lead may consult it twice per turnoverseer/librarian.py
Chat, model-only7 requests, tools while under 12 calls and before the 7thatelier/model_chat.py
Chat, Talk with a heavyweight7 requests: 6 with memory tools, the 7th asks for the answer without toolsatelier/model_chat.py, overseer/chat.py
Ultralight helpersOne request, no tools, 1,024 tokens, 60 stasker/ultralight.py
Commission turnsUp to 40 rounds within the call budgetatelier/turn.py
The welcomeNo model call: it saves the key and the connection onlyatelier/welcome.py

Provider presets

PresetBase URLModelRules
DeepSeekhttps://api.deepseek.comdeepseek-flashDeepSeek dialect: text tool calls (DSML) converted to standard calls; malformed markup quarantined, nothing runs
Claude (Anthropic)https://api.anthropic.com/v1claude-opus-5-5Anthropic's OpenAI-compatible endpoint; no temperature sent; not yet checked live
OpenAIhttps://api.openai.com/v1gpt-5.5No temperature sent; the Responses API is not implemented; not yet checked live
LM Studiohttp://127.0.0.1:1234/v1chosenNo key
llama.cpphttp://127.0.0.1:8080/v1chosenNo key
Other OpenAI-compatibleenteredenteredDialect openai, deepseek or auto

Presets are defined twice and kept equal: model_connections.html and aether/atelier/welcome.py.

3. Where MCP is used

RoleStatusWhat it doesSource
Data Sources: Aether as MCP clientliveAn Admin registers an organization's MCP reporting service (Streamable HTTP over HTTPS, or a local stdio process), discovers its tools and chooses which to expose. Protocol 2025-11-25 offered; 2025-06-18, 2025-03-26, 2024-11-05 accepted. Each use opens a fresh session: initialize → tools/list (fingerprint must still match) → tools/call; no retries; timeout 1–300 s; replies capped at 4 MiB. Tokens DPAPI-encrypted. Results become tables (≤5,000 rows) with CSV/JSON export and saved reports.aether/data_sources/mcp.py, service.py, store.py, http.py
Who reaches itModel-only Chat and commission agents, through one function named data_sources (list, tools, call, reports, notes), always with the requesting person's access and the source's roles. Models see at most 50 rows plus a link. Sprint leads, sprint staff and Talk with do not have it.service.py, model_chat.py
The middle layer: a database MCP serviceplaceholderBy design, Aether holds no database drivers or database passwords. A database MCP service that the organization runs, for example DBHub or MCP Toolbox for Databases, sits between Aether and SQL Server, Oracle, MySQL or PostgreSQL. It holds the drivers and a DBA's restricted read-only account, which is what limits the data. None has been chosen or connected yet: Aether's side is complete and tested against a stand-in MCP service. A real service may need a small result mapping, because MCP does not fix the shape of tables. Everyone allowed on a source shares that account's view; per-person row limits come later.design of 2026-10-27
Aether's MCP serverlivepython -m aether_bridge mcp-serve --root NAME=PATH over stdio for LM Studio or another MCP host. Five read-only tools: list_roots, list_dir, read_file, glob, search. Every root is mounted read-only; calls go through the ToolBelt registry and leave receipts. No network listener and no authentication: it runs only when a local host spawns it.aether/toolbelt/mcp_server.py, examples/mcp.json
ToolBelt MCP clientbuilt, not startedWould attach an external MCP server's tools to the ToolBelt as unapproved tools named server__tool, to be approved by an operator. Configured in toolbelt.mcp_servers and listed read-only on the tool registry page, but no production code starts a server or attaches its tools.aether/toolbelt/mcp_client.py, config/settings.py

4. The tool belt: how tools are designed and reached

Aether has two layers of tools. The ToolBelt is the governed general-purpose layer with a registry; each product surface also has its own fixed list of tools, enforced by its own handlers.

ToolBelt and registry

  • Built-in tools: list_roots, list_dir, read_file, glob, search, write_file, edit_file, calculate, delete_file (opt-in), run_command (only with an allowlist)
  • Registry states: approved, unapproved, withdrawn. Built-ins are approved from source; anything external starts unapproved. Approving binds the full definition: a changed schema needs approval again.
  • Offered equals runnable. Every call is admitted against the registry and gets an fsynced receipt before it runs.
  • Files: named roots (read-write, read-only or sealed), write gates by operator manifest, writes journaled for undo, 24,000-character results
  • run_command: absolute executable plus argv prefix per project, no shells or pipes, 7 environment variables, 1–300 s, process tree killed on timeout
  • calculate: exact fractions, whitelisted syntax, isolated child process, hash receipt
  • Used by the MCP server; managed with python -m aether.toolbelt.registry

aether/toolbelt/registry.py, toolbelt.py, execution.py, calc.py, LIFECYCLE.md

Tools each agent gets in the app

  • Sprint staff: tasker_read, task_start, task_close, task_block, read_file, list_dir, write_file (only under its task's outputs), run_tests, run_command (argv only, no credentials), identity_close, delegate_ultralight
  • Sprint lead: task_add/edit/unblock/drop, staff_list, staff_hire, briefcase_create, teachframe_list, timer_start, message_agent, sprint_finish, operator_note, read_file, write_file (solo sprints), roadmap_update, Librarian, Memory Fabric tools, give_closing_words
  • Memory Fabric owner tools (12): memory_recall, memory_load, memory_remember, memory_link, memory_bury, memory_raise, memory_settings, memory_discover, memory_maintain, memory_preflight, memory_workspace, memory_query, only on the agent's own cartridge
  • Chat: list_files, read_file, search_files, retrieve_files, propose_file_edit (the person applies it), data_sources
  • Talk with: memory tools and give_closing_words only
  • Librarian: search_sources, read_source, memory tools; knowledge_add when building

aether/tasker/tools.py, overseer/turn.py, overseer/owner_memory.py, atelier/chat_files.py, overseer/librarian.py

How a tool call travels

  1. The surface builds the tool list for this agent and this turn, as OpenAI function schemas.
  2. The model client sends the request; the model replies with tool calls (DeepSeek text calls are converted first; anything malformed is quarantined and nothing runs).
  3. The loop checks stop conditions before each call: STOP, cost cap, Emergency Halt, connection access.
  4. Arguments are parsed; invalid JSON or a reply cut off at the output limit runs nothing, and the model is told so.
  5. The handler checks scope (its readable set, its write folder, its cartridge) and runs the tool. ToolBelt calls are admitted and receipted first.
  6. The result goes back as a tool message. After the round limit, one last request without tools asks for the final words.

Safety boundaries

  • Kept from agents' programs: credentials. Commands and tests get only the operating system's bootstrap variables; key files and credential folders are refused to read_file.
  • Confined: file tools to their roots or folders; writes to the agent's own outputs; memory writes to its own cartridge; the roadmap path comes from configuration, never from the model.
  • Not a sandbox: programs an agent runs with run_tests or run_command have the person's user rights; only the working folder is confined. Give agents work you would run yourself.

5. Every endpoint the app serves

The shipped edition declares 105 routes (116 method and path pairs, 11 of them path prefixes that cover several actions, 17 pages), all on 127.0.0.1. Anything undeclared answers 404. Before any handler runs, the gateway requires the exact Host 127.0.0.1:<port> and refuses another site's Origin (gateway.py); every change must carry this app's own Origin, and sign-in uses an HttpOnly, SameSite=Strict cookie (operator_access_http.py). There is no MCP or ToolBelt endpoint over HTTP.

Accounts & access 1

MethodPathPurposeWho may call
GET POST/api/access/*session, register, login, logout, password, welcome, roles, accounts, key assignmentspublic: session, register, login · others signed in · changes need manage_roles / manage_accounts / manage_key_assignments

Chat 4

MethodPathPurposeWho may call
GET/api/model-chatlist chats and models; one chat; search; heavyweights to talk withsigned in (Talk with: Admin)
POST/api/model-chat/*new, send, transform, end, stop, delete, restore, chat settings, folder files, apply/dismiss editssigned in (Talk with: Admin)
GET/api/model-chat/cartridgepersonal knowledge cartridge (snapshot, export, briefing)signed in (Talk with: Admin)
GET/api/model-chat/files/previewimage preview from the chat foldersigned in (Talk with: Admin)

Sprints 21

MethodPathPurposeWho may call
POST/api/tasker/acceptrecord a review / accept outputsmanage_missions
POST/api/tasker/accept-anywayaccept over a failed check, with a reason (Admin)Admin
POST/api/tasker/budgetraise the budgetmanage_missions
POST/api/tasker/continueanswer a pausemanage_missions
POST/api/tasker/createprepare a sprint (no model call)manage_missions
POST/api/tasker/leadadd or create a leadmanage_missions
GET/api/tasker/optionsform options for a new sprintmanage_missions
GET/api/tasker/outputdownload an output filemanage_missions
GET/api/tasker/planroadmap sprints joined with their runsmanage_missions
GET/api/tasker/projectone sprint runmanage_missions
GET/api/tasker/projectssprint runsmanage_missions
POST/api/tasker/resumeresume after a stopmanage_missions
GET/api/tasker/schoolSchool Teach Framesmanage_missions
GET/api/tasker/school-frameone School framemanage_missions
POST/api/tasker/specialistcreate a specialistmanage_missions
POST/api/tasker/specialist-previewpreview a new specialistmanage_missions
POST/api/tasker/staffadd standard staffmanage_missions
POST/api/tasker/startstart a sprintmanage_missions
POST/api/tasker/stopstop a sprintmanage_missions
GET/api/tasker/teamleads and staffmanage_missions
GET/projects/tasker pagesprint pagemanage_missions

Roadmaps 2

MethodPathPurposeWho may call
GET POST PUT/api/project-folders*roadmap folders: list, create, read, updateread: signed in · change: Admin
GET POST PUT/project-folders/* pageroadmap tracker page and its data API (revision-checked saves)read: signed in · change: Admin

Missions & commissions 14

MethodPathPurposeWho may call
GET/api/ateliercommissionssigned in
GET/api/atelier/filea delivered file by hashsigned in
POST/api/atelier/openopen a commissionmanage_missions
POST/api/atelier/postpost a notemanage_missions
GET/api/atelier/readread a commission threadsigned in
POST/api/atelier/wakewake the teammanage_missions
GET/api/campaign-receiptscommission receipts (read-only)signed in
GET POST/api/campaign-rostercommission rostermanage_missions
GET/api/campaign-statecommission state (read-only)signed in
GET POST/api/campaignsmissions: list; create, update, delete, restoremanage_missions
GET/projects/atelier pagecommission pagesigned in
GET/projects/campaign pagecommission pagesigned in
GET/projects/campaign-receipts pagereceipts pagesigned in
GET/projects/roster pageroster pagesigned in

Staff & specialists 14

MethodPathPurposeWho may call
GET/agent-editor/* pageAgent Editor page and assetssigned in
GET/api/agent-availabilityagent registrysigned in
POST/api/agent-availability/*availability, starter team, foldersmanage_agents
GET/api/agent-catalogspecialist catalogsigned in
GET/api/agent-catalog/customcustom templatessigned in
POST/api/agent-catalog/custom/installcreate from a templatemanage_agents
POST/api/agent-catalog/custom/savesave a templatemanage_agents
GET/api/agent-catalog/custom/templateone custom templatesigned in
POST/api/agent-catalog/installinstall specialistsmanage_agents
GET/api/agent-catalog/learningtechnical learningsigned in
GET/api/agent-catalog/learning/historylearning historysigned in
POST/api/agent-catalog/learning/transitionlearning storage changemanage_agents
POST/api/agent-editor/exportexport a templatemanage_agents
POST/api/agent-editor/validatecheck a template draftmanage_agents

Agents & memory viewer 4

MethodPathPurposeWho may call
GET/agents pageAI Staff pagesigned in (read-only)
GET/agents/insights pageagent insights and Memory Fabric viewersigned in (read-only)
GET/api/agentsagent listsigned in (read-only)
GET/api/agents/*card, sessions, dashboard, history, note, memory (read-only)signed in (read-only)

Data Sources (MCP) 11

MethodPathPurposeWho may call
GET/api/data-sourcessources visible to the calleruse_data_sources + role on the source
POST/api/data-sources/discoverMCP tools/listmanage_data_sources
GET/api/data-sources/exportexport a result (CSV/JSON)use_data_sources + role on the source
GET/api/data-sources/jobsrunning jobsuse_data_sources + role on the source
POST/api/data-sources/remove-reportremove a reportuse_data_sources + role on the source
POST/api/data-sources/runrun a selected tool (MCP tools/call)use_data_sources + role on the source
POST/api/data-sources/run-reportre-run a reportuse_data_sources + role on the source
GET/api/data-sources/runsmy runsuse_data_sources + role on the source
POST/api/data-sources/save-reportsave a reportuse_data_sources + role on the source
POST/api/data-sources/settingsadd or edit a sourcemanage_data_sources
POST/api/data-sources/stopstop a runuse_data_sources + role on the source

Models & API keys 7

MethodPathPurposeWho may call
GET/settings/api-keysredirectread: signed in · change: manage_settings
GET POST/settings/api-keys/*API Keys page and vault API (create, unlock, add, reveal, lock...)read: signed in · change: manage_api_keys (unlocked)
GET/settings/models-contextredirectread: signed in · change: manage_settings
DELETE GET POST/settings/models-context/*Models page and API (presets, save, probe, list models, repair)read: signed in · change: manage_settings
POST/settings/models-context/api/admitgoverned deployments only (409 here)not served in this edition
POST/settings/models-context/api/deployment/*governed deployments only (409 here)not served in this edition
POST/settings/models-context/api/observegoverned deployments only (409 here)not served in this edition

Workspace: dashboards, Teach, Creations, Halt 2

MethodPathPurposeWho may call
GET POST/api/workspaceworkspace document; actions: dashboards, guides, Teach, Creations, people, halt/resumeread: signed in · actions: by permission
GET/api/workspace/installationinstallation recordread: signed in · actions: by permission

Networks (several computers) 11

MethodPathPurposeWho may call
GET/api/placeshosting statussigned in
POST/api/places/choose-foldernative folder pickermanage_settings
POST/api/places/joinjoin a placemanage_settings
POST/api/places/join-networkjoin a networkmanage_settings
POST/api/places/name-networkname a networkmanage_settings
GET/api/places/networksnetworkssigned in
POST/api/places/prepare-libraryprepare the librarymanage_settings
POST/api/places/startstart hostingmanage_settings
POST/api/places/start-herehost on this computermanage_settings
POST/api/places/stopstop hostingmanage_settings
GET/projects/places pageredirects to /networksigned in

Backup & recovery 3

MethodPathPurposeWho may call
POST/api/maintenance/checkbackup path checkAdmin
GET/api/maintenance/coveragebackup coverageAdmin
POST/api/maintenance/recovery-reportrecovery reportAdmin

Pages, health and assets 11

MethodPathPurposeWho may call
GET/ pageChat pagesigned in
GET/api/healthhealth checkpublic
GET/api/readinessreadiness (advisory)signed in
GET/api/workspace/storagestorage locationssigned in
GET/chat pageChat pagesigned in
GET/login pagesign-in pagepublic
GET/missions pageMissions pagesigned in
GET/network pageNetworks pagesigned in
GET/roadmaps pageRoadmaps pagesigned in
GET/workspace pageworkspace views (Staff, Teach, Creations, Dashboards, Settings, Data Sources)signed in
GET/workspace-assets/*45 allow-listed scripts and stylespublic

Generated from the v0.2.0 source code on 2026-11-08. The endpoint tables are built from the app's own route list, so they match the code. File names refer to the app's aether Python package.