Repository navigation
Flint 0.9.0
Migration
Flint detects an existing Jan installation on first launch.
Because Flint keeps Jan's bundle identifier (jan.ai.app) and data path, an existing Jan install is found automatically, and the first-launch assistant offers four choices. Copy to Flint duplicates the selected data and preserves your original Jan installation and data untouched. Reuse Jan data shares the selected existing data in place, with concurrency protection so both apps do not corrupt it. Move to Flint copies into Flint and then removes the Jan source once every item succeeds, keeping a recoverable backup and supporting rollback. Start fresh begins with an empty Flint profile and leaves Jan untouched. You can also migrate later from Settings > General > Migrate from Jan.
You choose which categories to bring — conversations and assistants, models, settings and provider credentials, configuration, extensions and logs, and the agent workspace and rooms — and how to resolve items that already exist in Flint. A newer item already in Flint is never silently overwritten. A failed migration rolls back to the previous state, an interrupted migration resumes idempotently, partial data is quarantined, and every run records a manifest. Your existing Jan data is never deleted automatically.
Your existing settings, credentials, providers, models, threads, projects, rooms, mailboxes, and extensions are preserved where compatible. Secrets continue through the protected keychain/backend-store path and are never copied into plaintext or logs. Legacy compatibility is kept throughout: JAN_* environment variables (with FLINT_* preferred), the jan:// protocol (alongside flint://), JAN.md project files (alongside FLINT.md), the legacy data locations, and the persisted identifiers all continue to work.
Recent approval and tool updates
- Cowork now offers Bypass permissions in its work-mode menu for the current session. Settings > Permissions offers Ask, automatic approval of safe calls with prompts for dangerous calls, and Bypass until Flint closes. Folder boundaries still apply.
- Approval prompts can remember recognized single-process termination calls for the conversation or future similar calls.
Stop-Process -IdandStop-Process -Id -Forceremain separate grants; arbitrary scripts still ask. - The token usage popup stays open while hovering its information icons.
What's Changed
Local-first and privacy
- fix(tools): reject malformed MCP and RAG tool names before provider serialization, preventing "Expected 'function.name' to be a string" generation failures
- perf(inference): keep GPU-capable Vulkan as the default engine build and document throughput tuning for Flash Attention, batching, offload, and parallel sequences
- feat(app): local-only build — no telemetry, no catalog, no downloads (#10)
- feat(local-only): finish removing telemetry, update checking and model discovery, and guard the whole repo
- refactor(privacy): remove telemetry build vars, the analytics injection, the catalogue URLs and the update feed
- refactor(core): remove the updater, the CLI's telemetry, and the mirror
- fix(privacy): stop telling Google what the web search returned
- fix(docs): fetch OpenAI status directly and never report a fake "operational", and leave analytics out of a docs build that has no GTM secret
Flint identity and migration
- rebrand(ui): present the product as Flint — app name, window title, sidebar wordmark, default assistant, and every locale
- rebrand(ui): Flint in the agent identity and the remaining visible strings
- rebrand(agent): the default persona says Flint agent harness
- rebrand(packaging): rename the desktop binary to Flint-Desktop and register the
flint://deep link, keepingjan:// - rebrand(docs): Flint navigation labels, keeping the research model names
- docs(rebrand): add an original Flint logo and replace the Jan logo in the favicon, boot splash, window title, and in-app badges
- docs(readme): rewrite the README as "Flint — a fork of Jan" with provenance, migration and feature sections (#12)
- docs(license): retain Apache-2.0, the upstream copyright, acknowledgements and upstream provenance
- feat(migration): first-launch Jan to Flint data-migration core and the six Tauri commands
- feat(migration): a guided first-launch migration assistant UI
- feat(migration): Copy, Reuse, Move and Start-fresh modes, with per-category selection
- feat(migration): conflict policies — keep the newer Flint item, use the Jan item, or keep both under a suffix
- feat(migration): a recoverable backup for Move, with rollback and retry on failure
- feat(migration): idempotent resume of an interrupted migration, and quarantine of partial data
- feat(migration): a migration manifest recording mode, categories, results and status
- feat(migration): reopen the assistant any time from Settings > General > Migrate from Jan
- feat(env): prefer
FLINT_*environment variables, with aJAN_*fallback - feat(project-init): write
FLINT.mdand keep discovering legacyJAN.md(Rust) - feat(cowork): discover
FLINT.md, still reading legacyJAN.md(web) - feat(agent): the CLI/agent context reads
FLINT.mdand falls back to legacyJAN.md - fix(app): honour
JAN_DATA_FOLDEReverywhere it is meant to win - fix(app): fall back from a data folder that is gone, without moving the user's data (#8855)
- chore(compat): keep the
jan.ai.appidentifier, legacy data locations and persisted IDs so an existing Jan install upgrades in place - feat(i18n): add a Turkish locale, and fill in missing Simplified Chinese translations
Cowork workspace
- feat(cowork): "Fix this check" — named pull-request checks bound to their head commit, bounded failed logs through the user's
ghlogin, and a focused fix request in the owning session once the head is confirmed; never pushed automatically - feat(cowork): Verify in browser — drive a local app in an isolated, temporary Chrome/Edge profile confined to its exact origin, with steps, screenshots, console errors, blocked requests and pass/fail in the run summary; stops on cancel, timeout, browser exit or app-server exit
- feat(cowork): edit files in the Code panel (undo, find, Ctrl+S, conflict prompt when the file changes on disk), saved where the session's access allows and listed in Changes as your edit; widen the Output rail up to 70% of the window; click a file path in any tool card, diff or reply to open it in the Code panel at the line; the editor gutter marks added, changed and deleted lines against the repository, and inline blame shows each line's author and commit with links to the commit and its pull request
- feat(cowork): complete Cowork workspace — Code, Preview, Changes (Git), Activity, Settings search, per-chat models, temporary chats (#4)
- feat(cowork): a read-only code workspace, an Activity rail, and global settings search (#1)
- feat(cowork): make the declared coding-harness modes real (#6)
- feat(cowork): report the real context — a repository map and the payload actually sent — with a harness feature registry (#7)
- feat(cowork): the managed worktree — make it real, use the tree the run actually uses, and finish its lifecycle including recovery
- feat(cowork): parallel sessions on one folder — each new session in a Git folder works in its own worktree and branch (flint/<title>) by default, created even while the checkout has a rebase or merge in progress; merge into the base branch with a conflict report, open a pull request, or discard from the session; a pull request is claimed by the session that opened it, so other sessions on the same checkout do not show it; deleting a session asks whether to keep its worktree; plain folders can work on a copy and apply changes back file by file with conflict detection
- feat(cowork): checkpoints and two meanings of rewind, wired into Cowork with a safety point on restore
- feat(cowork): answer an opening request with a proposal, not an edit; review it by hunk and apply only what was chosen
- feat(cowork): export a managed worktree as a reviewable patch bundle, and import one back through proposal review
- feat(cowork): real read-only Git working-tree review in the Changes rail, with real diff gutters
- feat(cowork): report change origins from recorded evidence, not from the model
- feat(cowork): dispatch a team through the real run, coordinate subagents on shared work, and give a team its own row with its children under it
- feat(cowork): restart or replace a failed team member (AH-111); review team children and decide overlaps before they run
- feat(cowork): give an isolated team task a checkout of its own, and isolate Rust subagents
- feat(cowork): fork a session without forking its authority (AH-201)
- feat(proposals): a proposed change is stored, bound and applied by the backend
- feat(patch): an approval applies to the file that was reviewed, or not at all
- feat(changes): say which agent made every change, durably (AH-110)
- feat(cowork): preview the restore diff before rewinding, and stream bash output live
- feat(cowork): point out a repeated bash command in the approval dialog and on its approval card
- feat(cowork): tell the model its real environment and working directory, and which toolchains the sandbox can run
- feat(cowork): say that MCP servers from Settings are not offered
- feat(cowork): attach more than one folder to a session, each with its own access, seen by subagents too
- feat(cowork): session details estimate the context (system prompt, instructions, tool schemas) before the first run
- feat(cowork): Edit this folder on Windows, through AppContainer grants withdrawn when the grant goes
- feat(cowork): compact a long run automatically instead of stopping at the context window
- feat(cowork): a reply cut off by the output limit, a dropped stream or an empty reply is continued once, a run that ends without an answer shows Continue, and a failed request stops retrying after three minutes
- feat(cowork): stop repeating an attempt that keeps failing for the same reason, refuse a bash command over 120 seconds up front, and explain a tool the Windows sandbox cannot run with the admin command that grants access
- feat(cowork): a steering message is delivered right after the current tool call, and a pull request is only opened after the target branch, the push and a clean merge have been checked
- feat(cowork): the Windows shell works in a folder you gave edit access to, PowerShell shims and Rust tools run in the sandbox, and What changed lists only the files the session wrote, with Show all
- feat(cowork): memories a session proposes are shown for approval, new sessions are named by the model from the first prompt, reasoning effort is saved per session, and the folder menu has Describe this project
- feat(cowork): no step, spend or wall-clock cap on a run, so the context window is the only limit; with auto-compact on the token allowance scales with the window and a step's reply is charged once
- feat(cowork): the run summary says what the run did, such as Ran 20 commands, created 8 files, used 6 tools +645 -0, with one closed line per step, and an
open_in_browsertool shows a page in an Opened in Browser card - feat(cowork): Verify in browser and the screenshot tool support Chrome, Edge, Brave, Opera, Vivaldi, Arc and Chromium, with Choose a browser to pick one by hand
- fix(cowork): the Changes panel no longer reports millions of added lines for untracked files
Agent runtime and harness
- feat(agent): core execution — a run that can be reconstructed (#8)
- feat(harness): the feature registry and Phase 0 foundation, and one versioned event log per session exported through the UI
- feat(agent): the Rust agent loop writes its calls and runs to the session's execution record (AH-004, AH-050)
- feat(agent): a run interrupted mid-turn resumes with its turn, carrying its unfinished work (AH-026)
- feat(agent): one lifecycle primitive for timeouts and cancellation, propagated through the real dispatcher
- feat(agent): every tool call gets a deadline and a cancellation token, and is timed
- feat(agent): token and dollar ceilings that hold across runs (AH-017, AH-191, AH-192)
- feat(agent): a configurable turn ceiling, one retry policy, and a call that can reap its own process tree
- feat(agent): stop a run that has settled into repeating itself
- feat(ui): a reachable emergency stop (AH-051)
- feat(agent): let a dispatch start a subagent from a copy of this conversation (AH-100)
- feat(agent): durable subagents and background jobs that outlive the app that started them (AH-101, AH-102)
- feat(agent): consensus gates decided by independent read-only reviewers (AH-112)
- feat(agents): titling and compaction run as hidden, tool-free, audited utility agents
- feat(roles): ship six versioned built-in roles and enforce each role's allowlist at the call in the Rust loop (AH-094..099)
- feat(errors): restore the harness error taxonomy so a tool failure is classified once (AH-009)
- feat(record): one invocation id per request, replayed from the canonical record (AH-004, AH-032)
- feat(replay): replay a recorded run, and a Chat turn records the payload it sent (AH-032, AH-078, AH-083)
- feat(readiness): probe eight components independently and gate tools on them
- perf(agent): keep the request prefix byte-stable so providers reuse the prompt cache - append a changed system prompt instead of rewriting the head, and project a canonical accepted history apart from the wire request
- feat(agent): proactive compaction - compact before dispatch when the projected request crosses the resolved model context threshold, with in-place microcompaction of stale tool results and a refill circuit-breaker, keeping the reactive overflow path as a fallback
- feat(agent-tools):
request_access,list_plugins, and shell-aware failure hints - feat(agent): ask before destructive commands and before long auto-approved runs, using one shared rule set that judges paths against the resolved scope
- feat(agent): ask the user for guidance when a run is stuck, and remind the model of its todo list every turn
- feat(agent): tell the model when a background bash job finishes
- feat(agent): load MCP tools on demand when there are too many to send, and bound the skill catalogue in the system prompt
- feat(agent-tools): tolerant fallback matching for
editold_string, and atomic file replacement inwriteandedit - feat(agent): windows_events reads the Windows Event Log with typed filters, from outside the shell sandbox that cannot
- feat(agent): host_query answers a named question about this computer (processes, services, ports, disks, system, installed programs, one registry key, crash reports, scheduled tasks, startup items, WSL distros, GPU, network, Windows Update, battery, open windows, devices with driver problems, disk health, the firewall, environment variable names, printers), read-only with credential values hidden
- feat(agent): local_http sends a GET or HEAD to a server on this computer, loopback only and without following redirects
- feat(agent): docker runs read-only Docker commands (ps, images, logs, top, port, stats, version, info, compose reads) and hands anything that changes things back to the user
- feat(agent): host_action ends one process (by number) or starts, stops or restarts one Windows service, showing the exact target in its approval request; critical system processes and services and Flint itself are refused
- feat(agent): host_build runs gradle, gradlew, mvn, mvnw or dotnet in the project folder outside the shell sandbox that cannot run them, asked every time with the exact command shown, with a time limit and the head and tail of the log, and also go, cargo, npm, pnpm, yarn, make, cmake, uv and bun
- feat(agent): clipboard reads the current clipboard content or replaces it, with scoped approval available for later reads
- feat(agent): open_path opens a project file or folder on screen or shows it in Explorer, asked every time; programs and scripts are only shown, never opened
- feat(agent): host_powershell runs a PowerShell script as the user outside the sandbox, showing the whole script in its approval request; recognized single-process calls can use a scoped grant
- feat(agent): host_package looks at winget packages without asking (list, search, show, outdated) and asks before each install, upgrade or uninstall by exact package id
- feat(agent): host_wsl runs a command in a WSL distribution and host_ssh runs one on another machine over the user's own keys, both asked every time with the command shown; SSH never prompts and never trusts a new host
- feat(agent): notify_user shows a rate-limited desktop notification when something long finishes
- fix(agent): the command line and background jobs ask before the always-asked host tools run, naming the command, process, folder or path and offering no always; text from Windows tools keeps accents and non-Latin letters
- fix(windows): the release build no longer closes on the first tool call; the main thread reserved Windows' 1 MB stack and overflowed, it now reserves 8 MB and the release build fails if the program does not
- fix(widget): widgets no longer all show "Widget stopped responding"; the frame's load event just after the widget announced itself was taken for a navigation
- fix(installer): the Windows setup.exe ships the phone app; the installer script is generated from the base template, which now lists it
- feat(app): a fatal exception on Windows (stack overflow, access violation) is recorded in crashes/pending.txt with the exception, thread, module and offset, build, stack size, frames and the last commands the app ran, and the next start logs it; every panic is logged with a backtrace, the main thread's stack size is logged at start, and a picture or video model that cannot load in the chat engine is no longer retried at every launch
Repository intelligence and version control
- feat(agent): repository intelligence (#9)
- feat(index): a stored repository index, name lookup, and walking a function's callers and callees (AH-053..062)
- feat(agent): semantic code search over a user-named embedding model (AH-071)
- feat(agent): speak LSP to language servers and manage their lifecycle (AH-057, AH-058)
- feat(impact): what a change can affect, and which tests cover it, following imports (AH-065/066/067/151)
- feat(agent): detect project tooling and tell the model what kind of project it is in (AH-068/069/070)
- feat(tools): find the project's formatter and run it on what the agent edits (AH-149, AH-150)
- feat(agent): group a suite's failures, and tell a flake from a regression (AH-152, AH-153)
- feat(vcs): branch, commit about what is actually staged, and read a diverged branch or stopped merge (AH-159, AH-161, AH-165, AH-171)
- feat(agent): commit splitting, guided rebase and cherry-pick (AH-160, AH-166, AH-167)
- feat(agent): open pull requests and keep their descriptions in step (AH-162, AH-163)
- feat(review): work a review one comment at a time, and check that each is addressed (AH-164)
- feat(agent): the agent's commits carry a
Co-Authored-By: Flint (<model>)trailer and its pull requests end with "Generated with Flint", shown in the approval prompt and switchable in Settings → Agent tools - feat(tools): gate destructive git apart from safe git usage
- feat(agent): check dependencies against the licences a project allows (AH-158)
- feat(hooks): the project's own commands run around a tool call (AH-127/128/129), and command hooks on lifecycle events receive a redacted JSON payload
- feat(agent-tools): tool descriptions say when to use each tool, and
editgainsreplace_all - feat(agent): named per-project profiles, chosen per run (AH-186)
- feat(agent): rules about which model answers what (AH-194)
- feat(agent): answer "what should I run now", and a one-shot check that a project is in working order (AH-072)
- feat(diagnostics): the compiler's answer, in the turn that caused it (AH-063/064)
- feat(agent): native-git recovery for private GitHub repositories - a
git_inspecttool, steering togh/gitover anonymous web crawling, and a structured RecoveryReport - feat(agent): native
git_clonewith guidance in the prompt, and point git use atgit_inspect - feat(grep): group results by file and highlight matches
Discussion Rooms
- feat(rooms): the Discussion Room engine, store and controller
- feat(rooms): the Discussion Rooms UI — list, room page, editor, transcript and controls
- feat(rooms): persistence commands and a typed service
- feat(rooms): compact each speaker's history at the threshold, by that participant's own model settings
- feat(rooms): each participant can have its own assistant and work role, runs with that assistant's sampling and instructions, and is told which language to write in
- feat(rooms): a room can attach several folders with the same access, and a Like Cowork access level lets a participant read, edit, run commands, use git and call skills and plugins, asking approval for anything that changes files or runs a command
- feat(rooms): tool calls fold to one line such as Ran 10 commands, edited 1 file, with a chip per call and a Details view, and a live turn says what the participant is doing
- feat(rooms): each reply shows the tokens it wrote and how fast, a message to a participant is coloured like that participant, and
/clearforgets a room's chat, state or everything without touching its settings or folders - feat(rooms): a long turn of tool calls is charged to the room's token budget once, and the room repeats the reply-language rule in the last message of every turn
- feat(rooms): starting or resuming a room with a model that has no known context window asks for one, or the safe 8,192 default, instead of budgeting silently
- feat(rooms): compact ahead of growth with room for the participant's own tool turns, guard each step so a tool loop cannot cross the speaker's window, and retry a length refusal once against the window the server named
Cross-session messaging
- feat(agent-tools): backend mailbox for cross-session messaging
- feat(mail): one run can say something to another while both are running (AH-103)
- feat(messaging): a typed mailbox client, a queue sender and transcript attribution
- feat(messaging): mailbox presence sync and delivery into Cowork sessions
- feat(messaging): message cards, reply, and a wake-up switch
- feat(messaging):
stop_session, a permission-safe stop of a same-project peer - feat(agent-tools): confine a local MCP server to its session's authority
- feat(cowork): Cowork in the new design, with an output rail and Activity, Preview, Code and session-details panels
- feat(cowork): the run summary shows while the run is going
- feat(cowork): pull-request state and checks for a Cowork folder, read through the GitHub CLI (
agent_pr_status) with no token stored
Agent SDK
- feat(sdk): JavaScript and Python agent SDK clients, with preview documentation and examples
- feat(agent): a frozen protocol v1 with generated schemas, a completed RPC handshake, and provenance reported for every outbound provider request
- feat(agent): a host tool contract: a client declares tools it executes itself, with capabilities, validation, image results and RPC verbs
- feat(mcp): serve Flint's built-in tools over MCP, reporting bash failures as
isError - feat(agent): correlate agent requests with the provider's billing records, and read recorded usage and spend from the usage API
MCP
- feat(mcp): trust a server by fingerprint, not the name it chose, with a per-server auto-approve toggle
- feat(mcp): OAuth tokens in the secret store refreshed ahead of expiry, with declared and enforced scopes (AH-134, AH-135)
- feat(mcp): read a server's documents and prompts, and prove a listing is followed to the end (AH-137, AH-138, AH-143)
- feat(mcp): check server liveness with the protocol ping, and show per-server state, failures and explanations (AH-139)
- feat(mcp): per-server logs and budgets, and portable agent bundles (AH-140, AH-144, AH-145)
- feat(mcp): launch an imported server confined, or not at all
- feat(mcp): let filesystem and jailed MCP servers read a session's attached folders
- feat(mcp): imported servers may edit a folder on Windows under a live AppContainer grant
- fix(mcp): duplicate tool names from two servers are namespaced as
{server}_{tool}(janhq/jan#8975), and inline attachments are no longer mutated - fix(mcp): adopt tokens that another process already refreshed instead of racing it, ignore superseded auth refreshes, and ignore OAuth callbacks carrying another flow's state
- fix(mcp): open a server's card and show the failure when it cannot connect or start, including on collapsed cards
- fix(mcp): resolve
.cmdshims for bare commands on Windows and from the CLI, and pass the AppContainer helper the variables it needs - fix(mcp): stop a deactivated server's health monitor, stop treating every Bun process as an orphaned server, and stop logging other processes' command lines during port cleanup
- fix(mcp): scrub a crashed server's stderr, carry split UTF-8 bytes across reads, and keep URL secrets out of connection errors
- fix(mcp): reject duplicate server names in add-by-JSON, merge desktop saves with the file on disk, and keep an unreadable trust file instead of overwriting it
Memory
- feat(memory): one canonical record per scope, a precedence chain enforced and stated in every prompt (AH-081..085)
- feat(memory): let the model propose a memory and Flint decide; review before storing and refuse what must not be stored
- feat(memory): user-level memory with per-scope recall, clear, and a forget that leaves no text (AH-082)
- feat(memory): export and import memories with their versioned provenance, and where each was used (AH-083)
- feat(memory): a Memory settings page on the real commands, surfacing and settling conflicts (AH-085)
- feat(memory): inject remembered facts into the real system prompt, and make the automatic-save setting govern saving
- feat(memory): idle-time memory consolidation ("autoDream")
- feat(chat,context): project memory binding, request attribution and a verified context panel
Context, usage and cost
- feat(context): learn a model's real window from the server that refused it, and classify what filled it (AH-077, AH-087)
- feat(context): warn as the window fills, on every surface, and diff what the model received against the previous request (AH-077, AH-086)
- feat(usage): flag prompt-cache reuse from provider-reported counts, per request, turn and session (AH-211)
- feat(spend): what a run cost, against where costs were declared (AH-175)
- feat(agent): attribute CPU and memory to the run that used them (AH-174)
- fix(context): stop treating a missing context window as a window of zero, and stop guessing 32k for unknown models
- feat(cli):
--max-budget-usdand--max-session-tokensceilings, and--max-turns, which exits with code 53 when turns run out with tools still in flight - fix(chat): report a compaction summary only when the re-trim kept it
Activity and timeline
- feat(activity): one canonical model of what a run did, persisted as one timeline per session and shown in the conversation
- feat(timeline): a Timeline rail over the session's event log; step through a finished run and see what kind of failure it was (AH-172, AH-176)
- feat(tree): what a run started, as a tree (AH-173)
- feat(net): record what the model was sent and where every request goes, and trust custom certificate authorities (AH-190)
Skills, permissions and security
- feat(jev): optional Jev (TypeSafe) decision support — separate off/shadow/on opt-ins for skill suggestion and attachment reranking, a write-only key in the secret store, bounded time and cost, fallback to existing behaviour, decision receipts, and a labeled evaluation against Flint's own selection
- feat(sandbox): a denial inside a package cache (Go modules, Cargo registry, npm, NuGet, Maven) names the cache root, so one read grant covers every package
- feat(skills): user-level native skills in the CLI and the agent loop, declaring the tools they need and their version (AH-040, AH-121, AH-123, AH-124)
- feat(cowork): offer enabled plugin skills to Cowork's skill tools, and refresh on plugin changes
- feat(agent): a plugin lifecycle with typed errors, local installs, and enable/disable
- feat(extensions): scope plugins and skills to the workspace or make them global, with enable/disable
- feat(permissions): describe tool requests and refusals in plain language, and offer only real scopes
- feat(permissions): let a rule name the one subject it is about, without binding the others (AH-007)
- feat(policy): a permission policy as a reviewed file a project cannot loosen (AH-052, AH-187)
- feat(agent-tools): issue write authority as a grant over a root, not a path, and hold the shell to the same roots
- feat(cowork): separate where Flint may write from how freely it acts, and default a repository to review
- feat(agent-tools): offer an unsandboxed retry, through the approval prompt, when Windows' NUL device refuses the sandbox; the card shows the rerun with the first attempt collapsed, the CLI asks the same y/n question, and programs known to open NUL (
go,git, configurable with[tools].nul_programsin agent.toml) are offered up front instead of failing first; the rerun prompt also offers Allow for this conversation so later NUL refusals in the same chat rerun without asking again - feat(security): enforce the project's tool policy on the desktop path
- feat(agent): an autonomous-mode safety classifier (findings F1), off by default
- security(harness): detect credentials once, and redact them on every durable path
- fix(mcp): scrub server stderr before it reaches the application log
- fix(security): guard archive extraction paths, and keep the legacy filesystem commands inside the data folder
- fix(server): stop forwarding the caller's Origin and Referer upstream, and make the Local API Server CORS switch actually switch CORS (#8836)
- feat(agent): network is on by default in a LAN-capable sandbox, with a toggle that policy can restrict
- feat(settings): control the auto-approve pause from the Permissions page, and bring the destructive-command guard to Chat
- fix(security): keep
web_fetchoff local and private addresses, and refuse cross-origin redirects on Local API Server upstream calls - fix(secrets): serialize secret-file updates across processes, never key the fallback file with a public constant, keep the local API key and proxy password in the keyring, and wipe keyring secrets on a full reset
- fix(proxy): stop forwarding the local
X-Api-Keyto the upstream provider - feat(skills):
skill_readtakes afileargument for the templates, themes and scripts a skill ships, and installed skill and plugin folders are readable by the file tools, read-only - feat(skills):
always: true,triggers:phrases or an optional Jev pick place a skill's instructions in the turn's prompt within a size budget; skills from plugins or an opened repository are never trusted into the system prompt by their own frontmatter - feat(skills): Cowork and chat prompts list the installed skills with a read-it-first instruction, work profiles apply to normal chat, and a reply shows Used N skills
- feat(skills): importing from Claude Code keeps a live link, re-copying global skills and plugins when their source in
~/.claudechanges, with an opt-in to run Claude Code's SessionStart and UserPromptSubmit hooks - feat(hooks): a post-tool-batch hook, observe-only and detached, fires when Chat, Cowork or Rooms finish a batch of tool calls
- feat(agent): Allow all temporarily for non-destructive remote Git and GitHub operations in the current conversation, kept in memory, never persisted and never covering destructive Git
- feat(agent): Hide Secrets, the MCP config file readable only by its owner on macOS and Linux, and a secret scanner that catches dotted credentials such as
API_TOKENvalues - fix(agent-tools): a refused write outside the workspace or to a read-only folder tells the model to ask for write access with
request_access - fix(access): a click outside the access prompt no longer counts as Deny, and a folder grant on Windows also reaches subfolders with a protected permission list
CLI
- feat(cli): a headless JSON-lines API that streams a run's canonical events, with adjustable verbosity (AH-181, AH-182, AH-183)
- feat(cli): a persistent local log and a previewed, local-only diagnostic bundle
- feat(cli): benchmark the harness against a fixed task set (AH-196)
- feat(sessions): hand a session to another computer and say what did not come along
- feat(agent): search past runs and take a transcript out (AH-178)
- feat(cli):
flint doctorprints hardware info (--json), andflint cli models list-local|info|deletemanage local models
Models, providers and inference
- feat(models): Model Doctor — "Test this model" probes tool calling through the model's real transport with a synthetic tool (call, exact arguments, continuation, response time), cancellable, with the result dated and tied to the settings it was tested under
- feat(models): evidence-based model fit, a real compatibility test, and a preferred default
- feat(models): rename models, and put the list in an order (#5)
- feat(models): show a provider as offline only when a request actually failed
- feat(providers): custom request headers, with secrets kept secret (#8208)
- feat(providers): fail over to a configured provider chain when one cannot be reached (AH-193)
- feat(providers): add llmman as a predefined local provider
- feat(providers): a right-click menu on provider cards to edit, turn on or off, rename (display name only) or remove a provider you added, and a model whose provider was removed shows as unavailable
- feat(net): resolve a short hostname to the machine it names, and name certificate failures
- fix(providers): keep a still-resolving single-label LAN provider in the settings list, and keep asking until the resolver knows it
- fix(providers): treat LAN endpoints as local, say what actually failed, and stop burying the reason
- fix(models): stop dropping a provider's models from the model bar, and stop handing local providers a cloud model id
- fix(models): say why the local model list is empty when the data folder was unusable (#8374)
- chore(llamacpp): upgrade the bundled llama.cpp engine to b11146 (0.5.0)
- feat(providers): add You.com as a native web search/fetch provider (#8921)
- feat(llamacpp): per-model chat-template kwargs and backend selection improvements
- fix(llamacpp): let an explicit GPU Layers setting reach the router
- fix(mlx): kill an abandoned load's server, keep concurrent loads off one port, release the session lock during load, apply
--ctx-sizeand the KV bound correctly, set the cache limit to 20 GiB, require the API key on/v1/cancel, and stop logging context-limit stops as parse errors - fix(llamacpp): time out and bound engine worker calls, keep a streaming model busy until it drains, check HTTP status on remote GGUF fetches, and make KV and memory estimates overflow-safe
- fix(net): keep provider connections alive, retry a request that never connected, and tell an unreachable host apart from a DNS failure
- fix(tls): accept CA bundles on UNC paths, mapped drives and short names, and apply exactly the certificates that were validated
- fix(server): surface Anthropic and Gemini mid-stream errors, decode SSE bytes across chunk boundaries, and make the Verbose Server Logs switch reach the API server
- fix(reasoning): keep Anthropic thinking budgets under the output ceiling
- fix(auth): refresh an expired account token once for concurrent callers, keep a rotated Claude Code token when write-back fails, and restore the previous credential when a login's config write fails
- fix(claude-code): Reset removes custom environment variables, which are shell-quoted and cleaned up on Windows without a console flash
- fix(models): drop a model locally only after its delete succeeds, and probe vision once per dropdown open
- fix(providers): send
api_typewhen registering a provider with the backend - fix(providers): removing a provider clears a model selection that still pointed at it
- fix(anthropic): stop sending
temperature/top_pto Claude models that reject them (Opus 4.7 and later, Sonnet 5, Fable, Mythos), and fall back toautoinstead of a forcedtool_choiceon Opus 5.5, Fable 5.1 and Mythos 5.1, which answer both with a 400 - fix(vector-db): skip chunks of another dimension in linear search; move RAG to calamine 0.36 for RUSTSEC-2026-0194
- feat(models): Find models already on this computer in the import dialog lists GGUF models kept by LM Studio, Ollama, the Hugging Face cache, llama.cpp and GPT4All, runs only when asked and uses a chosen model where it lives
- feat(models): sending with no model selected picks one - your default, the last used model, a connected remote provider, then the only or lightest local model
- feat(models): per-model input and output prices in the model dialog, with replies priced from those, a table of well-known hosted models, or free for local engines, and the estimated spend on the Overview
- feat(models): refreshing a provider's model list removes models the server no longer lists, and starting a room, chat or Cowork session with a model that has gone away asks which model to use instead
- feat(llamacpp): an Additional arguments setting for llama-server, applied to every model, with options that would move the server or change the files it opens ignored
- feat(llamacpp): a tool call a local model writes as text is run - Hermes, Qwen, GLM, Mistral and Llama 3.1 formats for llama.cpp, MLX and OpenAI-compatible models, only for a tool the request offered and never twice
- feat(llamacpp): the model-fit check uses the configured KV cache type, no longer counts an integrated GPU's memory twice, and holds a quantized V cache at f16 when flash attention is off
- feat(api): the Anthropic
/messagesendpoint merges scattered system and developer messages into one leading system message, and the Local API Server answers a missing model or engine with a JSONcodeandRetry-After, explains a port the system refuses, and times out on silence rather than the whole request - feat(mcp): an image returned by an MCP tool no longer floods a local model's context as base64, and naming an MCP server that is off offers to enable it
- feat(mcp): MCP servers no longer all start at launch, an idle server stops after 15 minutes, settings show each server's state with Start, Stop and Start with Flint, and one hung server cannot freeze a send
- feat(providers): DuckDuckGo as a native web-search provider with no API key, account or instance URL
- feat(providers): the model picker searches by the remote a model sits behind and labels each row with it when several remotes offer the same model
- feat(providers): updated built-in cloud model lists, with new chats on Anthropic or OpenAI starting on the balanced model
- feat(discover): a Browse Hugging Face button on the Models page and Discover entry points from onboarding, an empty local provider and
flint://andjan://model links, with avatars, capability and fit chips, MLX fit and a recommendation for the device - feat(discover): filter by parameter size, architecture, input type, gated and downloaded-only; a model split into several GGUF files shows as one, with vision and draft files paired and downloaded automatically; installed models show Update available
- feat(discover): a download that loses its connection retries with growing waits and continues from the saved bytes, a stale partial file restarts cleanly, errors are explained in plain words, and the row shows a smoothed speed and time left
- feat(discover): a model's README is shown without its YAML block, and a repository id such as
../nameis refused - fix(models): a failed model import shows the real error, a model file name without an extension no longer comes out empty, and loading a moved, deleted or partly downloaded file names it
- fix(llamacpp): a model that fails to start shows the failure, and requests to local models and the Local API Server bypass a system or VPN proxy
- fix(llamacpp): an image over 10 MB is re-encoded to fit, a WebP image is converted to PNG for local vision models, the tool list is sorted by name so an MCP reconnect does not discard the prompt cache, and every closed
<think>block is removed before a reply is sent back - fix(providers): a self-hosted OpenAI-compatible server added by its bare address finds its models under
/v1, and pasted spaces and trailing slashes are ignored - fix(hardware): hardware probes run off the main thread, which could freeze the window on Windows, and every GPU stays in the system monitor when a driver reports no device UUID
- fix(ui): the copy buttons for API keys and secrets show copied only after the clipboard write succeeds
Chat and composer
- feat(chat): warn before sending images to a model without vision
- feat(chat): per-chat model settings and a reasoning-effort bar (#2)
- feat(chat): search the Add parameter menu by name, description or key, with keyboard navigation and a tooltip naming providers that may not support a parameter
- feat(chat): temporary chat lifecycle — keep, discard, and a leave guard (#3)
- feat(chat): split a conversation into two independent panes, with a Details inspector
- feat(split): split view holds up to four panes (configurable) — Chat threads, Cowork sessions and a room side by side, opened from any row's menu, the header's Split button or Ctrl+, switched with Ctrl+Alt+Left/Right, resizable, turning into tabs when the window is narrow, and restored after a restart; each pane shows its title once in one aligned header, with Add pane and Close split in the top header
- feat(chat): attach text and code without asking the model to see it
- feat(composer): one @ menu for files, skills, agents and aliases, and name a selection as an alias
- feat(web-search): native
web_search/web_fetchtooling and provider improvements - feat(chat): queue messages while a run works, and steer it with one at its next tool call; edit, drag to reorder or remove queued messages, in Chat and Cowork; Stop or a failed run holds the queue with Send and Discard instead of dropping it
- feat(chat): compact automatically at the threshold, show where it happened, and compact by hand with
/compact - fix(threads): keep a conversation's tail reachable when a message is removed, and never leave a torn thread file behind
- fix(threads): opening "Delete all" and pressing Enter no longer deletes every thread
- fix(chat): a tool call with unparseable arguments no longer breaks the rest of the conversation
- fix(chat): a new chat starts from the last-used model, or the first local one
- fix(messages): never persist or replay a tool call without arguments
- feat(chat): sidebar chats grouped as Pinned, one collapsible group per project, then Ungrouped, with a filter and status marks (working, recent, waiting, pull request)
- feat(chat): drag a chat onto a group, hover a row for a preview, and move between rows with the arrow keys
- feat(chat): undo a chat delete from the toast
- feat(chat): the window title leads with the number of approvals waiting
- feat(chat): a new transcript and tool timeline, chat header, model picker, Details column and split pane
- feat(composer): a new composer with an assistant menu and a tools drawer
- fix(chat): the chat list shows each thread's real time and sorts correctly
- feat(composer): a shared slash-command menu in the Home, Cowork and Rooms composers, served per surface from the desktop catalogue
- feat(reasoning): a live thinking timer
- feat(terminal): stream bash output live and render ANSI colours
- fix(chat): queue a send while the previous turn's tools are pending, and stop a superseded request from ending the newer run
- fix(chat): record why a turn failed, render message times in local time, and keep Increase Context Size working when an MLX unload fails
- fix(chat): count pages read separately from search hits in the sources badge, and recheck project documents before using the tool cache
- fix(threads): keep a thread's model when its assistant is set to None, skip an unreadable
thread.json, refuse unsafe thread ids, and remove a deleted thread's agent scratch directory - fix(messages): handle a failed backend delete, and keep updates made while a message is being saved
- fix(chat): deleting or continuing a message acts on the current transcript, so a delete no longer drops messages added since that message last rendered
- fix(websearch): strip YAML front matter from fetched pages, and cap response bodies while reading them
- fix(web): truncate long tool-card details, and keep string tracking across escaped quotes in tool-argument repair
- feat(chat): Fork chat from the sidebar or any reply, branching a conversation from any point into a new chat
- feat(chat): file attachments in Cowork messages, read inline or through embeddings as in Chat
- feat(chat): an attached image is described by a vision-capable model so a text-only model can use it, shown as one large card or a row of tiles, with a viewer that zooms, steps with the arrow keys and saves; Cowork keeps a resized copy so images reopen after a restart
- feat(chat): a context circle in Chat and Cowork - a card with a bar coloured by kind, the tokens left before auto-compact, Compact session and a breakdown down to each MCP server and tool; the last breakdown is kept with the chat, a local server's window is read from llama-server's
/props, and an unknown window fades out instead of looking full - feat(chat): a reasoning effort bar beside the model selector, with one stop per level the model supports, a Recommended mark and an Off stop where the model allows it, also for hand-added OpenAI-compatible servers whose model names show a reasoning family
- feat(chat): Chat uses Cowork's composer layout, with the assistant, sampling, tools, web search and reasoning controls behind one Options button
- feat(chat): a Reply language setting in Settings > General makes the model answer in a chosen language in chats, Cowork and rooms, leaving code, commands and paths alone
- feat(chat): Regenerate title in the sidebar menu of a chat, Cowork session or room, and a Compacting the conversation row while
/compactor automatic compaction runs - feat(chat): sidebar preview cards show a written summary of the conversation, for chats, Cowork sessions and rooms
- feat(chat): a fallback model chain in Settings > General - pick and reorder models, and a reply that fails with a server or connection error is retried on the next one, keeping a working fallback for the rest of the turn
- feat(chat): model pickers in the chat bar, Rooms, the MCP router and the CLI helper-model setting get a filter that hides models with no API key or an unresponsive provider
- fix(chat): compact before the trimmer acts, summarize once per prefix, clear stale tool results first and stop a conversation that refills right after compacting
- fix(chat): opening a chat no longer animates every message in, chat titles are made with the conversation's own model, and each split-view pane keeps its own model choice
- fix(chat): automatic compaction retries with smaller excerpts when its own request is too big, retries once on an unusually short summary, keeps finished tool calls with their results, and compacts a long session on a model with no known context window
- fix(chat): the chat no longer jumps while a reply streams, a collapsed tool trace or reasoning section stays collapsed, and Stop all stops only the current chat
- fix(chat): a short reply from a fast model shows its speed, reply actions appear on hover or focus and stay visible on touch screens, and the duplicate model picker in the Details panel is gone
- fix(chat): a chat's own settings, such as reasoning effort, reach models a provider lists without a settings block, and editing a message you sent with images keeps the images
- fix(chat): a vLLM server's context window is read from its model list, and a Flash-Next build is never sent a reasoning effort it rejects
- fix(chat): a site without a favicon tries its common icon names first, and save dialogs suggest a file name instead of Untitled
- feat(chat): compact instead of stopping - fold a long tool loop in steps with the cut allowed inside the turn, start at a harder cut when a conversation refills after compacting, keep the head and tail of a single result that fills the window, and use the same fallback for
/compact - feat(chat): Max Context Tokens gets a numeric field with a Detect from model button that tries a server refusal, the loaded runtime, the model's settings, provider metadata and the bundled family table, and reports unknown rather than guessing
- feat(chat): an image read by the
readtool reaches a model with vision in Chat and Cowork, with a note for one without and a thumbnail on the tool row - fix(chat): numeric parameter fields keep what you type, accept
.or,as the decimal separator and write a number only when the text is complete and in range
Studio, voice and local media
- feat(studio): a Studio page for making images and video on this computer with stable-diffusion.cpp - Z-Image Turbo for images and Wan 2.2 TI2V 5B for 1 to 5 second clips, a one-time engine download checked against its checksum, a gallery with Remix and delete, a stage-first layout and standard shapes with a custom width and height
- feat(studio): hosted models as well as local ones - GPT Image 2.5, Gemini 2.5 Flash Image and Gemini 3 Pro Image, Grok Imagine Image and FLUX on Together AI for each provider that has a key; the prompt goes to that provider and results land in the same gallery
- feat(studio): Discover has an Images switch that finds picture models Studio can run and adds one with the text encoder and VAE it needs, every file checked against the published size and checksum
- feat(studio): Studio shares the graphics card with chat, retries a run that ran out of graphics memory with part of the model in system memory, shows a clip's estimated time, and notifies when a result is ready while Flint is not in front
- feat(cowork): a generate_image tool lets Cowork and chat make pictures with the image model loaded in Studio, shown in the conversation and kept in the gallery; it never loads or swaps a model and answers unavailable in the CLI and background jobs
- feat(studio): picture models on your own OpenAI-compatible providers appear under Where to make it, asked at /images/generations without needing an API key
- fix(models): a picture or video model file loaded as a chat model now says to load it from Studio instead of showing the engine's tensor-name error
- feat(api): the Local API Server gains
/v1/images/generationsand the OpenAI Videos routes, with the same error shape as the rest of the API - feat(voice): voice input - a microphone beside Send dictates into the message box phrase by phrase, with speech turned into text on this computer by Voxtral Mini 3B (a one-time download that unloads when idle)
- fix(models): a model download that came out corrupt after a quick pause and resume, a download that lost its connection, disk-full and permission errors, and the download row's speed and time left
- feat(studio): a three-column workspace with model, settings, prompt, activity and generations panels, and a chat-style engine picker
- feat(studio): hosted and local results share one gallery, and the phone can make images and video, stop a run and browse the gallery with Remix and Delete
Phone and remote access
- feat(remote): the phone app reaches parity with the desktop for chat history, rooms, Cowork forks, thread actions, Studio, dictation, Hugging Face browsing and a read-only side panel with what Flint is using, the Cowork files and the live preview
- feat(remote): push notifications for a waiting approval, a finished or failed run, a merged pull request, a room that needs you and a finished reply, with no Flint-hosted server in between; approvals have Allow once and Deny buttons, quiet hours and an option to hide message content
- feat(remote): a custom host name for remote access, a QR code with a copyable pairing link, and pairing that keeps working when the phone's browser storage is blocked
- feat(remote): attach photos, camera shots and files from the phone with chunked resumable uploads, browse the Cowork folder read-only and open a live preview of an app on the desktop's localhost
- fix(remote): the tailscale calls behind remote access no longer open a console window on Windows, and a paired phone can no longer set a room's folder or tool access
Providers, models and privacy
- feat(providers): ten hosted providers - DeepSeek, Moonshot AI (Kimi), Cohere, Perplexity, Together AI, Fireworks AI, Cerebras, SambaNova, Z.ai (GLM) and Alibaba Qwen - and refreshed built-in cloud model lists, with new chats on Anthropic and OpenAI starting on the balanced model
- feat(agent): Hide Secrets replaces API keys, passwords in URLs and secret-looking environment values with placeholders before a request goes to the model, and restores them when the model's tool calls run
- feat(jev): Jev can pick the model for a message in Chat and Cowork (Off, Ask first or Always) from the models you tick, naming another only when it is clearly better and never changing your picker
- feat(mcp): MCP servers start the first time they are needed, and their tools are listed concurrently so one dead server cannot stall a send
- fix(privacy): the sidebar hover preview is summarised only by a model running on this computer, so hovering a chat never sends it to a remote provider
- fix(providers): a remote provider with no API key shows No API key instead of Connected
- fix(providers): requests to the named hosted providers (Groq, DeepSeek, Together, Fireworks, Cohere, Perplexity, Moonshot, MiniMax, Azure) carry the conversation id again, so the request log and the prompt snapshot attach to the right chat
- feat(ui): logos for the ten new hosted providers, scrollable skills and memories lists, full-width Hardware bars, and Jev settings split into Setup, Automatic and Work profiles tabs
- feat(assistants): four specialist assistants - Quartz for research, Coal for engineering, Blaze for creative work and Redstone for automation - alongside Flint, with pixel icons, sampling profiles and assistant migration v4
- feat(jev): optional routing picks the assistant once per new message and suggests a Review, Ask or Auto work style without granting permissions, with Settings > Jev switches for Route to the right assistant and Apply skills automatically
- feat(chat): a reply names the assistant that answered it with its icon, and hovering Add parameter shows the model's reported default, read from llama.cpp
/propsor a self-hosted vLLM server
Archive, export and branches
- feat(archive): deleting a chat, room, project, Cowork session, assistant or Studio result moves it to an Archive page (Support group, above Settings, and a phone screen) with a preview of its contents, Restore, a confirmed Delete permanently in the right-click menu, auto-delete after 30 days and optional auto-archive of idle threads; a Cowork session with unmerged worktree work cannot be purged
- feat(export): export a chat, a Cowork session or a message as Markdown, an Obsidian note, PDF or PNG, with the viewed branch or all versions, credentials redacted, tool output and absolute paths left out by default, and a print-ready HTML fallback where printing is unavailable
- feat(chat): the version switcher is translated, announces its position, steps with the arrow keys and keeps focus, and token counts, titles, previews, the command line and the phone use the branch you are viewing
- feat(paths): file paths written in inline code become links that open the Code panel or the system, executables are only revealed, and every file open goes through one backend command that resolves symlinks and refuses paths outside the allowed folders
- fix(code-panel): a short preview for files that are too large, a binary notice, a plain not-found message, and CRLF files no longer open as changed
Scheduled tasks
- feat(schedule): Settings > Schedules runs a saved prompt daily, on weekdays, on certain days or by a cron expression, with several times a day and a preview of the next runs, a model, a folder and a Cowork profile
- feat(schedule): unattended by design - an explicit tool list, required limits on turns, tokens and time, an optional cost limit, permission prompts denied and recorded as what the run was blocked on, read-only by default or its own worktree
- feat(schedule): a missed task runs once on the next start by default, an opt-in operating-system entry (Windows scheduled task, macOS LaunchAgent or Linux systemd timer) runs
flint cli schedule tickwhile Flint is closed, andflint cli schedulelists tasks, runs one and shows its runs, and on Windows the closed-app task runs without a console window
Agent browser
- feat(browser): an off-by-default agent browser for the built-in pane - open, read text, accessibility snapshot, click, type, press, select, scroll, and a screenshot on Windows - with a glowing pointer that glides to each element, shows a click pulse and follows Reduce motion
- feat(browser): per-site consent that shows the full address (this visit, until Flint closes, or always, with subdomains), listed and revocable in Settings > Agent tools; loopback, private, link-local and metadata addresses and redirects to unapproved hosts are blocked; page content is fenced as untrusted; actions ask for approval, submit-like controls always ask, and a run has an action limit; unattended runs only reach always-allowed sites
Windows installer and release
- feat(installer): a Flint-styled NSIS installer with welcome, options, maintenance, progress, completion and uninstall views, the real Flint icon, light and dark tokens, and install location, desktop shortcut and launch-after-install choices, compiled with warnings as errors
- feat(installer): a custom Flint MSI wizard in place of the stock WiX dialogs, with a standard folder picker, and an installer that refuses a drive root or a user folder as the install location
- fix(installer): an upgrade keeps the taskbar pin and shortcuts and repairs stale ones, and the install left by the publisher rename is retired
- build:
node scripts/build-installer.mjschecks the toolchain, builds the engine and the app and prints the installer paths with nomake, Git Bash orcorepack enableon Windows, and the Windows engine builds with LLVM 22 and newer - ci(release): a push to
mainmoves the version tag and rebuilds the release, the macOS build is Apple silicon only, and release builds use lighter optimization settings
Design, onboarding and system
- feat(groups): group Cowork sessions and rooms as well as chats, with folders on a group that every session, chat or room created in it or moved into it inherits; joining asks whether to keep, inherit, merge or add folders, and leaving asks whether to keep them
- feat(chat): attach folders to a chat, read by its tools and never written
- feat(design): a new interface design, replacing the Graphite and Atelier redesigns (#15, #11): a 250px sidebar (Workspace, Engine, Chats, Support) beside a main panel with a 52px top header and breadcrumb, and a local-status card in the sidebar footer
- feat(design): new colour tokens, a neutral Slate default accent, a Violet accent and Inter as the interface font, with a derived, contrast-checked accent; a saved Vermilion accent moves to Slate once
- feat(design): theme, accent, font size and motion apply before first paint (no white flash in dark mode), and a new start-up loader follows the theme and Reduce motion
- feat(design): a duotone icon set, brand logos for models and providers, and the flint rock as the favicon
- feat(design): motion that follows Flint's own Reduce motion setting: the sidebar selection glides between rows, pages fade in, primary buttons ripple, the theme toggle reveals the new theme from the button, and figures count up
- feat(design): redesigned components — buttons, dialogs, menus, sheets, switches, inputs, frames, segmented controls, chips and empty states — and redesigned Library, Models, provider, Tools & MCP, Extensions, Logs and System monitor pages
- feat(overview): an Overview dashboard as the start page after setup — tokens generated, average speed and tool-call success with sparklines, tokens per day, latest activity and Cowork runs — from a local store that keeps 90 days, never leaves the machine and can be reset
- feat(design): a notifications menu behind the header bell
- feat(design): phone layouts for every page with every feature kept: a navigation sheet, a header overflow menu, stacked frames, and tabs or sheets for side panels
- feat(ui): right-click context menus for plugins, skills, projects, messages, MCP servers and project files
- feat(rooms): a Rooms landing page with running, waiting, turns and models figures, a "waiting for you" section, filters, room cards and templates; a room tree in the sidebar; and a new room page
- feat(onboarding): an intention-led first run that resumes, skips and can be reopened
- feat(settings): global settings search with focusable, structural targets grouped by section
- feat(settings): a Permissions page to inspect and revoke grants, and a Memory page
- feat(search): a redesigned search dialog and command palette, with rebindable shortcuts
- feat(system): a system monitor and filterable log viewers
- feat(settings): a new settings layout; Appearance gains a Reduce motion switch, an accent picker with a custom colour picker, and a font size that scales the whole interface
- fix(a11y): name the message edit and delete buttons
- feat(system): System Monitor redesigned with a GPU switch, and the Hardware settings page removed
- feat(ui): a New group action in Move to group, a preview card on hovered Cowork sessions and rooms, and Auto and Edit labels on compact split panes
Flint is an independent fork of Jan by janhq and preserves Jan's Apache-2.0 license, copyright notices, contributor attribution, acknowledgements, and upstream provenance.
- feat(groups): a shared conversation-groups store that projects migrate into once, with folder bindings read without listing their contents
- feat(logs): the Logs page as the design draws it: search, level filter and a line count above terminal-style lines, newest first
- fix(dialogs): per-item delete dialogs cancel correctly, the busy-on-exit Cancel stops the pending quit, and a project file delete asks for confirmation
- fix(settings): really lock Local API Server fields while it runs, reject a root data folder before unloading models, and merge settings writes with the file on disk
- fix(app): write the app configuration and
projects.jsonatomically, clean up agent and MCP processes on force quit, and log an unusable store instead of crashing - fix(windows): keep an aborted upgrade usable, clean up stale
.oldbinaries, and never delete the install directory recursively - fix(build): pick sidecar downloads from the host triple, fetch AppImage tools for the host architecture, stop the AppImage repackage when a step fails, and read the pinned llama.cpp tag correctly on Windows checkouts with CRLF line endings