{"id":50391007,"url":"https://github.com/hallelx2/flowstate","last_synced_at":"2026-05-30T18:01:35.592Z","repository":{"id":355189728,"uuid":"1222847357","full_name":"hallelx2/flowstate","owner":"hallelx2","description":"Markdown-driven process automation. Talk to your agents like you talk to a person.","archived":false,"fork":false,"pushed_at":"2026-05-02T09:36:34.000Z","size":849,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-02T11:19:24.704Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hallelx2.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-27T19:09:39.000Z","updated_at":"2026-05-02T09:36:38.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/hallelx2/flowstate","commit_stats":null,"previous_names":["hallelx2/flowstate"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/hallelx2/flowstate","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hallelx2%2Fflowstate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hallelx2%2Fflowstate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hallelx2%2Fflowstate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hallelx2%2Fflowstate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hallelx2","download_url":"https://codeload.github.com/hallelx2/flowstate/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hallelx2%2Fflowstate/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33703065,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-30T02:00:06.278Z","response_time":92,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-05-30T18:01:34.656Z","updated_at":"2026-05-30T18:01:35.577Z","avatar_url":"https://github.com/hallelx2.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# flowstate\n\n\u003e Talk to your agents like you talk to a person.\n\nflowstate is a **markdown-driven process automation system**. Define agents in plain `.md` or `.yaml` files, give them tools (CLIs, MCP servers, skills, HTTP APIs, Composio integrations), and watch them work — with full visibility into every step they take, the ability to pause for human approval, and a permission gate that actually enforces what you declared.\n\nIt's the n8n alternative for people who'd rather write a runbook than wire a node graph.\n\n---\n\n## The thesis\n\n\u003e **An agent is a runbook a human can read, a markdown file git can diff, a permission contract you can audit, and a program Claude can execute — all the same artifact.**\n\nFive things that follow from that:\n\n1. **Conversation is the surface.** Describe the work the way you'd describe it to a teammate.\n2. **Markdown is the source of truth.** Processes are literate documents — reviewable, shareable on GitHub, version-controlled like code.\n3. **The visual flow is the proof.** Every tool call, every decision, every retry — laid out spatially so nothing happens behind your back.\n4. **Tools come from where they already live.** Your authenticated CLIs (`gcloud`, `gh`, `stripe`, `kubectl`), MCP servers, and the skills you've written — flowstate finds them and binds them at runtime.\n5. **Local-first, BYO subscription.** Your data stays on your machine. The runtime uses the Claude Agent SDK with whatever credentials you already have (Claude Code subscription / API key / local LLM). flowstate sells nothing — it conducts what you already pay for.\n\n---\n\n## Architecture\n\n```\n ┌────────────────────────────────────────────────────────────────┐\n │                       Desktop client                           │\n │                Electron · React 18 · Tailwind 4                │\n │                                                                │\n │       Splash → Home · Agents · Tools · Runs · Settings         │\n └─────────────────────────────────┬──────────────────────────────┘\n                                   │\n                ┌──────────────────▼──────────────────┐\n                │       @flowstate/core (shared)      │\n                │                                     │\n                │   Agent IR · Spec v1.0 (Zod)        │\n                │   Capability ontology · ToolAdapter │\n                │   Resolver · Permission gate        │\n                │   CLI tool registry + bash gate     │\n                │   .md / .yaml loader                │\n                └──────────────────┬──────────────────┘\n                                   │\n        ┌──────────────────────────┼──────────────────────────┐\n        ▼                          ▼                          ▼\n ┌─────────────┐         ┌──────────────────┐         ┌────────────┐\n │   Tool      │         │   Claude SDK     │         │   IPC      │\n │  Registry   │ ◄──────►│  agent-runtime   │◄────────│  bridge    │\n │ (MCP·CLI·…) │         │   in main proc   │         │ (preload)  │\n └─────────────┘         └────────┬─────────┘         └────────────┘\n                                   │\n                                   ▼\n                         ┌────────────────────┐\n                         │ Permission gate    │\n                         │  + canUseTool      │\n                         │  + HITL banner     │\n                         └────────────────────┘\n```\n\n---\n\n## Quickstart\n\n```bash\npnpm install\npnpm dev\n```\n\nThat'll launch the Electron window with HMR. Six pillar surfaces in the left rail:\n\n- **Home** — conversational composer; ad-hoc agent runs from natural-language prompts\n- **Agents** — directory of `.md` / `.yaml` agents with Inspector + Source + Edit tabs\n- **Tools** — every MCP / CLI / Skill / HTTP / Composio adapter, brand-iconized\n- **Runs** — live React-Flow trace of every run, with HITL approval banners\n- **Settings** — model picker (Claude Opus 4.7 → Haiku 4.5), provider, paths, telemetry\n- **Settings → About** — version + stack\n\n### Other commands\n\n```bash\npnpm typecheck     # tsc across the whole workspace\npnpm build         # production builds\npnpm --filter @flowstate/desktop make    # package as platform installer\n```\n\n---\n\n## What's wired today\n\n| Capability | State | Notes |\n|---|---|---|\n| Agent file loader (`.md` + `.yaml`, with linked sections) | ✅ working | Browser-safe, Zod-validated, custom frontmatter splitter |\n| Spec v1.0 with marketplace metadata | ✅ shipped | `specVersion`, `publisher`, `version`, `license`, `inputs`, `secrets`, `dependencies`, `guardrails` |\n| Capability ontology (~80 tags / 14 domains) | ✅ shipped | `KNOWN_CAPABILITIES` set + `unknownCapabilities()` validator |\n| ToolAdapter contract (7 kinds, 1 interface) | ✅ shipped | Full per-kind config types in `tool-adapter.ts` |\n| Capability resolver (`needs:` → tool refs) | ✅ working | Pure function; UI shows resolved ✓ / unresolved ⚠ chips |\n| Permission gate (network / fs / approvalRequired / bash allowlist) | ✅ enforced | Inside `canUseTool` before HITL |\n| Real Claude Agent SDK execution | ✅ wired | `query()` in main process, falls back to mock if no auth |\n| Human-in-the-loop approvals | ✅ working | SDK `canUseTool` → IPC → Cohere-purple approval banner → resume |\n| CLI tool registry + bash regex gate | ✅ shipped | 15 starter commands across `gh` / `git` / `gcloud` / `stripe` / `kubectl` |\n| In-app create / edit / save agent files | ✅ working | Form modal + CodeMirror edit + IPC writeAgentFile |\n| Run history with React Flow visualization | ✅ working | Per-run trace with status colors + live ticker |\n| MCP server pool + lifecycle | ✅ shipped | `mcp:*` refs resolve via `resolveMcpServers` → SDK MCP server config; system prompt advertises tools |\n| MCP marketplace (search / install / uninstall) | ✅ shipped | Official + Glama registries, 6h cache, secrets in OS keychain |\n| CLI marketplace (detect / install / authenticate) | ✅ shipped | 15-brand catalog with install + auth metadata, OS-shell launcher |\n| Settings persistence to disk | ✅ shipped | `~/.flowstate/settings.json`, atomic write, Zod-validated read |\n| SQLite-backed workspaces + title-bar switcher | ✅ shipped | Multi-workspace via `flowstate.db` (WAL); `agents_dir` / `runs_dir` / `tools_dir` per workspace |\n| Conductor — intent-routing orchestrator | ✅ shipped | Home composer talks to a router agent that delegates to planner / installer / authenticator / agent-writer sub-agents |\n| Home composer chat UI | ✅ shipped | Conductor thread, prompt cards, toasts |\n| shadcn/ui primitives mapped onto Cohere tokens | ✅ shipped | `\u003cButton\u003e` ported across `btn-ghost` / `btn-dark` / `btn-outline` call sites |\n| Per-run JSONL journals + SQLite run store | ⏳ M1 | Replace in-memory 100-run cap with durable storage |\n| `~/.flowstate/agents/` live-reload watcher | ⏳ M1 | chokidar → IPC `agents:changed` |\n| Webhook / cron / watch trigger listeners | ⏳ M2 | Turn agents into daemons; `manual` works today, the other four don't |\n| `flowstate add github:publisher/agent` install | ⏳ M3 | Agent-side of the marketplace; MCP + CLI sides are already shipped |\n| Run analytics (latency / cost / failure-rate / diff) | ⏳ M4 | Depends on M1's run store |\n\n---\n\n## The agent file format\n\nTwo surface forms — Markdown with YAML frontmatter, and pure YAML — both compile to the **same canonical AST** (defined in [`packages/core/src/schema.ts`](packages/core/src/schema.ts)). Full reference in [`SPEC.md`](SPEC.md).\n\n### Marketplace-publishable agent\n\n```yaml\n---\nspecVersion: \"1.0\"\nid: refund-handler\nname: Refund handler\ndescription: Process customer refund requests within the 30-day window.\n\npublisher: flowstate-examples\nversion: 1.0.0\nlicense: MIT\nrepository: github:flowstate/examples\ntags: [stripe, refunds, billing, hitl]\n\ntrigger:\n  kind: webhook\n  config: { path: /refund, method: POST }\n\ntools:\n  - mcp:stripe.refunds.create\n  - mcp:gmail.messages.send\n  - cli:gh.pr.create\n\nneeds:\n  - communication.email.send\n  - payment.refund.create\n\ninputs:\n  order_id: { type: string, required: true }\n  amount_cents: { type: integer, required: true }\n\nsecrets: [STRIPE_API_KEY, GMAIL_TOKEN]\n\nbudget: { tokens: 50000, usd: 0.50, runtimeMs: 300000 }\n\npermissions:\n  network: [api.stripe.com, gmail.googleapis.com]\n  approvalRequired:\n    - mcp:stripe.refunds.create\n\nguardrails:\n  permissionMode: default\n  maxTurns: 30\n  effort: medium\n\nsections:\n  goal: { include: ./refund-handler/goal.md }\n  steps:\n    - { title: Verify, body: { include: ./refund-handler/steps/01-verify.md } }\n    - { title: Refund, body: { include: ./refund-handler/steps/02-refund.md } }\n  rules:\n    - { title: 30-day window, body: { include: ./refund-handler/rules/timing.md } }\n  onFailure: { include: ./refund-handler/on-failure.md }\n---\n```\n\nThat single file is the runbook, the Claude system prompt, the permission contract, the audit log, and the marketplace listing. Same source, four jobs.\n\n---\n\n## The seven tool kinds\n\nTools are addressed as `provider:id.action`. Same `ToolAdapter` contract, seven transports:\n\n| Kind | Source | Auth | Best for |\n|---|---|---|---|\n| `mcp` | Local MCP server (stdio or HTTP) | Per-server | Structured I/O, typed schemas |\n| `cli` | `gh`, `gcloud`, `stripe`, `kubectl`, etc. | **Ambient** (your existing `gh auth login`) | Anything DevOps — zero integration tax |\n| `http` | Direct REST/GraphQL | API key in keychain | One-off integrations |\n| `composio` | Composio SaaS | Their managed OAuth | Long tail with annoying OAuth |\n| `skill` | Markdown recipe (your own) | Inherited | Reusable procedures |\n| `shell` | Custom script / built-in | Whatever the script needs | Company-specific logic |\n| `sdk` | Native lib | API key | When type safety matters |\n\n**Capability mode** (`needs:`) is the killer move: declare what the agent needs to *accomplish* (`communication.email.send`), and the resolver picks the best tool the user has installed at bind time. Same agent works for users with Gmail or Outlook, Stripe or Paddle.\n\n---\n\n## Claude Agent SDK guardrails\n\nThe `guardrails:` block in agent frontmatter maps directly to SDK options:\n\n| `guardrails.permissionMode` | Behavior |\n|---|---|\n| `default` | Each tool call → `canUseTool` → HITL banner |\n| `acceptEdits` | File edits auto-approve, other tools gate |\n| `plan` | Agent only proposes — never executes any tool |\n| `bypassPermissions` | All tools auto-approve (sandbox only) |\n\nPlus `maxTurns`, `allowedTools`, `disallowedTools`, `effort` (`low | medium | high | xhigh | max | \u003cint\u003e`).\n\nThe runtime enforces a **two-layer permission gate** before any tool call:\n\n```\n1. checkPermissions(toolName, input, permissions, guardrails, bashAllowPatterns)\n   → deny             : { behavior: 'deny', message }      // SDK gives up\n   → requires_approval: route to HITL banner               // forced ask\n   → allow            : continue to layer 2\n\n2. permissionMode flow (default → HITL banner; bypass → auto-allow)\n```\n\nThe same gate runs for the SDK's built-in tools (`Read`, `Write`, `Edit`, `Bash`, `WebFetch`) and any future MCP-backed tools.\n\n---\n\n## CLI tools = real shell access, safely\n\nWhen an agent declares `tools: [cli:gh.pr.create, cli:git.status]`, two things happen:\n\n1. **The system prompt** gets a `## Available shell commands` section listing each command with its template + inputs — Claude knows exactly what's available\n2. **The bash gate** gets a regex allowlist — anything not matching one of the declared `cli:*` tool templates is denied with an actionable message\n\nThe starter registry in [`packages/core/src/cli-tools.ts`](packages/core/src/cli-tools.ts) ships 15 commands across `gh` / `git` / `gcloud` / `stripe` / `kubectl`. Community publishers extend it via `~/.flowstate/tools/cli/*.yaml` (loader follows in a later commit).\n\n---\n\n## Project structure\n\n```\nflow-state/\n├── apps/\n│   └── desktop/                       Electron 33 + React 18 + Vite 5 + Tailwind 4\n│       ├── electron/\n│       │   ├── main/index.ts          Window, IPC, agent runtime + permission gate wiring\n│       │   ├── main/agent-runtime.ts  Claude Agent SDK query() wrapper\n│       │   ├── main/agent-orchestrator.ts   Drives a single AgentRun lifecycle\n│       │   ├── main/run-registry.ts   In-memory run store (M1 swaps for SQLite)\n│       │   ├── main/workspace-db.ts   better-sqlite3 — workspaces + app_state tables\n│       │   ├── main/paths.ts          ~/.flowstate path resolution (prod + dev)\n│       │   ├── main/conductor/        Intent-routing orchestrator over the SDK\n│       │   │   ├── runtime.ts         query() loop, tool dispatch, redaction\n│       │   │   ├── server.ts          IPC server for conductor sessions\n│       │   │   ├── sessions.ts        Per-thread session state\n│       │   │   ├── system-prompt.ts   Router system prompt\n│       │   │   ├── tools.ts           Built-in tools the router can call\n│       │   │   ├── hooks.ts           Lifecycle hooks\n│       │   │   ├── redaction.ts       Secret scrubbing on transcripts\n│       │   │   └── subagents/         planner · installer · authenticator · agent-writer\n│       │   └── preload/index.ts       Typed window.flowstate bridge\n│       ├── src/\n│       │   ├── App.tsx                Boot → Shell → view router\n│       │   ├── agents/                Bundled example agents (.md + .yaml + nested folders)\n│       │   ├── lib/\n│       │   │   ├── agent-prompt.ts    assembleSystemPrompt + bashAllowPatternsFor\n│       │   │   ├── sdk-runner.ts      Renderer → IPC adapter (with mock fallback)\n│       │   │   ├── mock-runner.ts     Realistic-trace generator for offline demo\n│       │   │   └── run-store.ts       useSyncExternalStore + HITL approvals\n│       │   ├── components/\n│       │   │   ├── splash/            Loading screen with purple hero band\n│       │   │   ├── shell/             Title bar + workspace switcher + left rail nav\n│       │   │   ├── home/              Conductor composer + thread + prompt cards\n│       │   │   ├── agents/            Directory + Inspector + Source + Edit + Create modal\n│       │   │   ├── tools/             Tool directory + MCP marketplace + CLI marketplace\n│       │   │   ├── runs/              List + flow detail + approval banner\n│       │   │   ├── settings/          Provider + ModelPicker + workspace + privacy\n│       │   │   ├── prose/             Markdown renderer + CodeMirror editor + Prism\n│       │   │   ├── ui/                shadcn/ui primitives (Button, etc.) on Cohere tokens\n│       │   │   └── brand/             FlowstateMark + ClaudeMark\n│       │   └── styles/globals.css     Cohere design tokens + shadcn semantic vars\n│       └── DESIGN.md                  ← from `npx getdesign add cohere` + shadcn mapping\n├── packages/\n│   └── core/                          Shared spec + IR\n│       └── src/\n│           ├── schema.ts              Zod schemas — Agent v1.0 + Trigger + Permissions + Guardrails\n│           ├── types/                 Agent · ToolManifest · AgentRun · RunStep · Workspace\n│           ├── loader.ts              parseAgentMarkdown / parseAgentYaml / FileRegistry\n│           ├── capabilities.ts        ~80-tag controlled vocabulary across 14 domains\n│           ├── tool-adapter.ts        ToolAdapter interface + per-kind configs\n│           ├── resolver.ts            resolveCapabilities + checkPermissions\n│           ├── settings.ts            Settings schema + atomic read/write helpers\n│           ├── cli-tools.ts           CliToolDef + STARTER_CLI_TOOLS + resolveCliTools\n│           ├── cli-catalog.ts         CLI tool family catalog (15 brands, install + auth metadata)\n│           ├── mcp-servers.ts         MCP server registry + resolveMcpServers\n│           └── mcp-marketplace.ts     Official + Glama registry fetch / normalize / cache\n├── SPEC.md                            The canonical agent + tool + guardrails contract\n├── pnpm-workspace.yaml\n└── tsconfig.base.json\n```\n\n---\n\n## Stack\n\n| Layer | Choice | Why |\n|---|---|---|\n| Runtime | Electron 33 + Node 20 | Local-first, OS integration, real CLI access |\n| UI | React 18 + Vite 5 + TypeScript 5 (strict, `noUncheckedIndexedAccess`) | Fast HMR, strict types |\n| Styling | Tailwind 4 (CSS-first `@theme`) | 10× faster than v3, no PostCSS dance |\n| Design system | Cohere via `getdesign` | Pure white, Interaction Blue, 22px signature radius |\n| Component primitives | `radix-ui` + shadcn/ui (mapped onto Cohere tokens) | Accessible primitives, project-owned variants |\n| Fonts | Space Grotesk · Inter · JetBrains Mono | DESIGN.md-prescribed fallbacks |\n| Brand icons | `simple-icons` (3.4k brand SVGs) | Real brand assets, tree-shaken |\n| Flow viz | `@xyflow/react` (React Flow 12) | Customizable nodes, fast canvas |\n| Editor | `@uiw/react-codemirror` + `@codemirror/lang-markdown` + `@codemirror/lang-yaml` | In-app editing of agent files |\n| Markdown | `react-markdown` + `remark-gfm` | Beautiful agent body rendering |\n| Highlighting | `prism-react-renderer` with custom Cohere theme | Source view + read-only inspector |\n| Motion | `motion` (formerly framer-motion) | Spring physics, layout animation |\n| Schema | `zod` 4 | Runtime validation + TS type inference |\n| YAML | `yaml` (eemeli) | Spec-compliant, browser-safe |\n| Local persistence | `better-sqlite3` (WAL) | Sync API, native perf, zero server |\n| Agent runtime | `@anthropic-ai/claude-agent-sdk` | Claude Code subscription · API key · local LLM |\n\n---\n\n## Roadmap\n\n**Done** — agent IR, design system, six views, real SDK execution with mock fallback, settings persistence, in-app create + edit + save, capability ontology v1, permission gate (network / fs / bash allowlist), HITL approvals (mock + real SDK), CLI tool registry + bash gate, spec v1.0, MCP server pool + lifecycle, MCP marketplace, CLI marketplace, SQLite-backed workspaces, Conductor intent-routing orchestrator, shadcn/ui primitives, [SPEC.md](SPEC.md).\n\n**Path to v0.2** (in dependency order):\n\n**M1 — Finish persistence.** Replace the in-memory 100-run cap with `runs` + `run_steps` tables in `flowstate.db`, append-only JSONL journals at `~/.flowstate/runs/\u003crun-id\u003e.jsonl`, and a chokidar watcher on `~/.flowstate/agents/` that pushes `agents:changed` to the renderer for live reload.\n\n**M2 — Triggers fire.** New `electron/main/triggers/` module with `webhook.ts` (Fastify), `cron.ts` (node-cron + persisted catch-up), `watch.ts` (chokidar). Trigger registry hooks into agent save/delete; on app boot, hydrate all triggers from disk. `manual` already works; `event` ships as a stub for cross-agent events later.\n\n**M3 — Agent marketplace.** `flowstate add github:publisher/agent` clones, validates against Spec v1.0, renders the SPEC.md §6 pre-install screen (permissions / capabilities / secrets / budget), writes to `~/.flowstate/agents/\u003cpublisher\u003e/\u003cid\u003e/`. Third tab in the tools pane alongside MCP + CLI.\n\n**M4 — Run analytics.** Now that runs live on disk: latency baselines by tool, cost trend by day, failure-rate ranking, p50/p95 durations. Per-step tokens + costUsd surface on React Flow nodes. Run diff viewer for two runs of the same agent.\n\n**M5 — v0.2 release cut.** Bump versions, write CHANGELOG, refresh this table, drop the \"wait for v0.2\" license caveat, tag + GitHub release.\n\n**Beyond v0.2** — multi-machine federation (control plane + runners), self-improving agents (every failure becomes a PR to its own `.md`), sub-agent orchestration via the SDK's AgentDefinition (the Conductor proves the pattern internally — opening it up to user-authored sub-agents is the next step).\n\n---\n\n## Design notes\n\nThe visual identity follows [`apps/desktop/DESIGN.md`](apps/desktop/DESIGN.md), generated by `npx getdesign add cohere`. Key signatures preserved from Cohere:\n\n- Pure white canvas with cool gray hairline borders\n- Cohere Black (`#000000`) for primary text, Near Black for body\n- Interaction Blue (`#1863dc`) as the **sole** chromatic accent — hover/focus only\n- Focus Purple (`#9b60aa`) for input focus borders (the composer turns purple when you click in)\n- 22px signature card radius on every primary surface\n- Almost shadow-free — depth from contrast and 1px borders\n- Single body weight (400); size + spacing carry hierarchy\n- Mono uppercase eyebrows with `0.18em` tracking for section markers\n- Deep purple-violet hero bands for dramatic full-width sections (the splash)\n\nWhat flowstate adds on top: the italic light `flow` + roman `state` wordmark, a sigmoid flow curve as the app icon, an editorial-magazine layout philosophy (asymmetric grids, marginalia, generous negative space), and Cohere-purple as the accent color for the HITL approval surface.\n\n---\n\n## License\n\nMIT — but please wait for the v0.2 cut before depending on it. The spec is at v1.0 and stable; the runtime is still moving.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhallelx2%2Fflowstate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhallelx2%2Fflowstate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhallelx2%2Fflowstate/lists"}