30 KiB
AUDIT COMPLET — Atomic Knowledge Base
Audit generat prin analiză paralelă cu 6 agenți specializați. Versiune cod auditată:
1.19.2(clone GitHubkenforthewin/atomic) Data: 2026-04-10
0. CE ESTE ATOMIC (TL;DR)
Atomic este un personal knowledge base care transformă note Markdown ("atoms") într-un graf semantic AI-augmented. Fiecare notă este automat:
- Chunked (bucățită markdown-aware)
- Embedded (vectorizată prin LLM)
- Tagged (taguri ierarhice extrase de LLM)
- Linked (edges semantice către alte atoms similare)
Pe baza acestui graf oferă: căutare semantică, wiki articles auto-sintetizate cu citații, canvas vizual interactiv, chat agentic RAG, sincronizare offline.
Rulează ca:
- App desktop Tauri (macOS/Linux/Windows) — sidecar care pornește atomic-server local
- Server headless Docker/Fly.io — REST + WebSocket + MCP
- iOS native SwiftUI — client thin HTTP
- Browser extension (Web Clipper) — capturi web
- Plugin Obsidian — sincronizare vault
- Bot Discord — capturi mesaje/threads
- MCP server — expune knowledge base la Claude Desktop & alte AI tools
1. ARHITECTURA GENERALĂ — "Core + Thin Wrappers"
┌────────────────────┐
│ atomic-core │ ← TOATĂ logica de business
│ (Rust crate, no │ (no actix/no tauri deps)
│ framework deps) │
└─────────┬──────────┘
┌───────────────┼─────────────────┐
▼ ▼ ▼
┌────────────┐ ┌──────────────┐ ┌───────────────┐
│ src-tauri │ │atomic-server │ │ mcp-bridge │
│ (sidecar │ │(REST+WS+MCP) │ │ (stdio→HTTP │
│ launcher) │ │ actix-web │ │ pentru Claude│
└─────┬──────┘ └──────┬───────┘ │ Desktop) │
│ │ └───────┬───────┘
▼ ▼ ▼
┌──────────────────────────────┐ ┌──────────────┐
│ React UI (TypeScript+Vite) │ │ MCP clients │
│ (folosește același │ │ (Claude etc) │
│ HttpTransport în desktop │ └──────────────┘
│ și browser) │
└──────────────────────────────┘
+
┌──────────────┐ ┌─────────────┐ ┌─────────────┐
│ iOS app │ │ Browser ext │ │ Discord bot │
│ SwiftUI │ │ (MV3) │ │ Obsidian │
└──────────────┘ └─────────────┘ └─────────────┘
Principiu cheie: atomic-core este transport-agnostic. Toate evenimentele async sunt livrate prin callback-uri (Fn(EmbeddingEvent), Fn(ChatEvent)). Fiecare wrapper traduce callback-uri în mecanismul lui (Tauri app_handle.emit, sau actix broadcast::Sender → WebSocket).
2. WORKSPACE — STRUCTURA REPO
atomic/
├── Cargo.toml # Workspace Rust (5 crate-uri)
├── package.json # Frontend npm (versiune 1.19.2)
├── crates/
│ ├── atomic-core/ # ~16.4k linii Rust — toată logica
│ ├── atomic-server/ # ~7.5k linii — actix-web wrapper
│ ├── mcp-bridge/ # ~285 linii — bridge stdio↔HTTP MCP
│ └── atomic-cloud/ # Control plane SaaS (Stripe + Fly.io)
├── src-tauri/ # Tauri v2 desktop launcher
├── src/ # React 18 + TS + Tailwind v4 + Zustand
├── ios/ # SwiftUI + XcodeGen (Swift 6, iOS 17+)
├── extension/ # Manifest V3 Web Clipper
├── plugins/
│ ├── discord/ # discord.js 14 bot
│ └── obsidian-plugin/ # Obsidian plugin (TS)
├── scripts/ # 15 scripturi Node (build, import, reset)
├── docker/ # nginx, supervisord, litestream
├── docs/ # 5 spec markdown (planuri arhitecturale)
├── docker-compose.{yml,dev,test,build}.yml
├── Dockerfile # Multi-stage: server, web, all-in-one
├── server.dockerfile / web.dockerfile
└── fly.toml.example
3. atomic-core — INIMA SISTEMULUI
3.1 Module principale
| Modul | Linii | Rol |
|---|---|---|
lib.rs |
3,399 | Facade AtomicCore, orchestrare toate operațiile |
db.rs |
916 | Init SQLite, migrații v0→v10, PRAGMA tuning, schema |
manager.rs |
511 | Multi-database manager (lazy-load instance per DB) |
models.rs |
696 | Atom, Tag, WikiArticle, ChatMessage, SemanticEdge etc. |
registry.rs |
863 | Multi-database registry (cross-DB settings/tokens) |
tokens.rs |
430 | API tokens (SHA-256 hash + revocable) |
settings.rs |
191 | Key-value settings (provider, modele, thresholds) |
executor.rs |
39 | Background runtime (4 worker threads) + semafoare concurrență |
projection.rs |
287 | PCA/t-SNE pentru canvas (cache poziții) |
error.rs |
70 | AtomicCoreError enum |
3.2 Pipeline de procesare atom (fire-and-forget)
POST /api/atoms (sau core.create_atom)
│
▼ caller primește atom-ul instant (saved)
│
│ background, prin executor + callback Fn(EmbeddingEvent):
│
├─[1]─► CHUNKING (markdown-aware)
│ respectă code blocks, headers, paragraphs
│ token-aware via tiktoken-rs
│
├─[2]─► EMBEDDING (provider configurat)
│ OpenRouter / Ollama / OpenAI-compat
│ inserează în vec_chunks (sqlite-vec virtual table)
│ → emit EmbeddingEvent::Started/Complete/Failed
│
├─[3]─► AUTO-TAGGING (LLM structured outputs)
│ categorii: Topics, People, Locations,
│ Organizations, Events
│ → emit TaggingComplete/Failed/Skipped
│
├─[4]─► SEMANTIC EDGES (cosine similarity)
│ threshold: 0.5 default → tabela semantic_edges
│
└─[5]─► WIKI INCREMENTAL UPDATE (dacă tagged)
LLM integrează atom-ul nou în wiki article-ul existent
Praguri (thresholds):
- Similaritate edges/related atoms: 0.5
- Semantic search & wiki chunk selection: 0.3
- Formula:
similarity = 1.0 - (distance² / 2.0)(din Euclidean al sqlite-vec pe vectori normalizați)
3.3 Storage abstraction (SQLite + Postgres)
atomic-core are un trait StorageBackend cu două implementări:
- SQLite (
storage/sqlite/) — default, prinrusqlite 0.32(bundled) +sqlite-vec 0.1.6(vector search) - Postgres (
storage/postgres/) — feature-gated, prinsqlx 0.8+pgvector 0.4
Dispatch macro dispatch! rulează 111 metode peste backend-uri. Există un plan documentat (docs/plan-async-migration.md) pentru a face întregul AtomicCore async-native (acum Postgres face sync→async bridge prin PG_RUNTIME.block_on).
3.4 Schema bază date (data DB-uri)
Tabele cheie:
atoms— content, source_url, embedding_status, tagging_status, created/updated_atatom_chunks— chunks per atom (cu offset-uri în text)vec_chunks— virtual table sqlite-vec (vector index)tags— ierarhie (parent_id), categoryatom_tags— many-to-manysemantic_edges— pereche atom_a, atom_b, similarityatom_clusters— rezultate clusteringatom_positions— poziții persistate canvaswiki_articles— content + metadata per tagwiki_proposals— (M1+) human-in-the-loop updatesconversations,chat_messages— chat agentic- FTS virtual table pentru keyword search
registry.db (separat): settings, api_tokens, databases (UUIDs + nume).
3.5 AI Provider abstraction
Trait-uri în providers/traits.rs:
EmbeddingProvider— generare batch embeddingsLlmProvider— chat completionsStreamingLlmProvider— streaming + tool calling
Implementări:
providers/openrouter/— cloud, OAuth flow, modele separate per capability (embedding/tagging/wiki/chat)providers/ollama/— local, auto-discovery modeleproviders/openai_compat/— generic (Azure OpenAI, Groq, Together, etc.)
Selecția runtime: factory întoarce Arc<dyn Trait> în funcție de setting provider_type.
3.6 Wiki synthesis
- Generation: LLM produce articol din atomii unui tag, cu citații inline (
[atom_id]) - Centroid mode (
wiki/centroid.rs): selecție chunks după centroid embedding al tagului - Agentic mode (
wiki/agentic.rs): agent care pune query-uri pe baza de cunoștințe - Section operations (
wiki/section_ops.rs):WikiSectionOp::{NoChange, AppendToSection, ReplaceSection, InsertSection}— LLM emite operații peste secțiuni, nu rewrite total → diff-uri review-abile (M1 wiki proposals) - Versioning: tabela
wiki_versionspăstrează istoric
3.7 Chat agentic / RAG
- Conversații pot fi scoped la tag-uri
- Agent are tool-uri: search semantic, read atom, citation
- Streaming via
ChatEvent::{Delta, ToolStart, ToolComplete, Complete, CanvasAction, Error} ChatCanvasActionpermite agentului să declanșeze acțiuni vizuale în UI
3.8 Ingestion URL & RSS & Obsidian
ingest/fetch.rs— HTTP GET cu reqwestingest/extract.rs— HTML → Markdown viadom_smoothie 0.15ingest/obsidian.rs— vault Obsidian, păstrează[[wikilinks]], extrage tags din foldere + YAML frontmatter- RSS —
feed-rs 2.3, polling configurabil per feed (default 60s)
4. atomic-server — REST + WebSocket + MCP
4.1 Stack
- actix-web 4.9 + actix-cors + actix-ws
- rmcp 0.15 + rmcp-actix-web 0.11 (MCP Streamable HTTP)
- utoipa 5 + utoipa-scalar (OpenAPI auto-generat la
/api/docs) - clap 4 (CLI cu subcomenzi)
- tokio broadcast channel (256 buffer) pentru events
4.2 ~78 Endpoints REST (grupate)
| Domeniu | # | Exemple |
|---|---|---|
| Atoms | 10 | GET/POST/PUT/DELETE /api/atoms, /api/atoms/bulk, /api/atoms/{id}/embedding-status, /api/atoms/by-source-url, /api/atoms/sources |
| Tags | 5 | GET/POST/PUT/DELETE /api/tags, /api/tags/{id}/children |
| Search | 2 | POST /api/search (modes: keyword/semantic/hybrid), GET /api/atoms/{id}/similar |
| Wiki | 13 | /api/wiki/{tag_id} cu generate, update, versions, suggestions, proposal/{accept,dismiss}, related, links |
| Embeddings pipeline | 8 | process-pending, process-tagging, retry/{atom_id}, reembed-all, reset-stuck, status |
| Canvas | 5 | positions GET/PUT, atoms-with-embeddings, level, global (PCA proj) |
| Graph | 3 | edges, neighborhood/{atom_id}, rebuild-edges |
| Clustering | 3 | compute, get clusters, connection-counts |
| Chat | 8 | conversations CRUD, scope add/remove tags, send-message |
| Settings | 5 | get/set, test-openrouter, test-openai-compat, models, embedding-models |
| Databases | 7 | list, create, rename, delete, activate, set-default, stats |
| Feeds (RSS) | 6 | list/create/get/update/delete, poll |
| Ingest/Import | 3 | ingest URL (single/batch), import Obsidian vault |
| Ollama | 5 | test, models (all/embedding/llm), provider verify |
| Auth tokens | 3 | create, list, revoke |
| Setup | 2 | status, claim instance |
| OAuth 2.0 (MCP) | 7 | .well-known/*, /oauth/{register,authorize,token} cu PKCE + DCR |
| Utils & logs | 3 | sqlite-vec check, compact-tags, logs export |
| Public | 2 | /health, /api/docs/openapi.json |
4.3 WebSocket
- Endpoint:
GET /ws?token=<api_token> - Subscribe la
tokio::sync::broadcast::Sender<ServerEvent>(buffer 256) ServerEventenum (~25 variante) include:- Embedding pipeline:
EmbeddingStarted/Complete/Failed,TaggingComplete/Failed/Skipped,BatchProgress - Atom lifecycle:
AtomCreated - Ingestion:
IngestionFetchStarted/Complete/Failed/Skipped,IngestionComplete/Failed - Feeds:
FeedPollComplete/Failed - Chat streaming:
ChatStreamDelta,ChatToolStart/Complete,ChatComplete,ChatCanvasAction,ChatError - Import:
ImportProgress
- Embedding pipeline:
4.4 MCP endpoint /mcp
- Transport: Streamable HTTP (stateful, SSE keep-alive 30s)
- Auth:
McpAuthmiddleware → 401 cuWWW-Authenticatecare indică spre/.well-known/oauth-protected-resource(Claude.ai compatible) - Multi-DB:
?db=<uuid>în query - Tools expuse:
semantic_search(query, limit)— hybrid searchread_atom(atom_id, limit, offset)— paginated 500 linescreate_atom(content, source_url)— broadcasteazăAtomCreatedupdate_atom(atom_id, content, source_url)
4.5 Auth
- API tokens: SHA-256 hash în DB, prefix de 8 chars pentru lookup rapid
BearerAuthmiddleware pe/api/*,McpAuthpe/mcplast_used_atupdated fire-and-forget- OAuth 2.0 + PKCE + DCR (1139 linii în
routes/oauth.rs):- Dynamic Client Registration → genere client_secret (32 bytes random, base64url)
- Authorization endpoint cu consent HTML
- Code → 5 min expiration, hash storage
- Token exchange cu PKCE S256 verification
- Folosit pentru Claude.ai remote MCP
4.6 CLI
atomic-server [--data-dir PATH] serve --port 8080 --bind 127.0.0.1 \
--public-url https://... --storage sqlite|postgres
atomic-server token create --name "..."
atomic-server token list
atomic-server token revoke <id>
4.7 Startup behavior
- Init logging (tracing + ring buffer 1000 entries pentru
/api/logs) DatabaseManager::new()(SQLite sau Postgres)- Migrate legacy tokens
- Create broadcast channel(256)
- Recovery: reset atoms blocate în
processing, process pending embeddings/tagging - Spawn RSS poll loop (60s tick, all DBs)
- Bind HTTP server (4 workers), CORS permissive
- Graceful shutdown →
PRAGMA optimize
5. mcp-bridge — stdio↔HTTP
Binary mic (~285 linii) care se compilează cross-platform și e embedded ca sidecar Tauri + distribuit pentru Claude Desktop.
Flow:
- Citește JSON-RPC din stdin
- POST la
http://127.0.0.1:44380/mcpcu headerMcp-Protocol-Version: 2025-03-26 - Captează
mcp-session-iddin răspunsulinitialize, îl folosește pe requesturile următoare - Parsează SSE (
text/event-stream) și emite linii data: ca JSON-RPC pe stdout - Timeout HTTP: 300s (operații AI lungi)
Env vars: ATOMIC_HOST (127.0.0.1), ATOMIC_PORT (44380).
Config Claude Desktop:
{
"mcpServers": {
"atomic": { "url": "http://localhost:44380/mcp" }
}
}
6. atomic-cloud — Control Plane SaaS
Aplicație Actix separată care gestionează hosting managed pe Fly.io.
Module:
clients/fly.rs— Fly Machines API (create_app, allocate_ips, machines, volumes, delete_app)clients/stripe.rs— Checkout sessions + webhook HMAC verifyclients/mailgun.rs— magic link deliveryroutes/checkout.rs— POST /api/checkout creează Stripe session + Fly approutes/webhooks.rs—customer.subscription.{created,updated,deleted}routes/instances.rs— start/stop/restart/billing_portal (auth via management_token)routes/admin.rs— list instances, stats (MRR estimate), rollout imageroutes/auth.rs— magic link send/verifyjobs.rs— cleanup background: după 30 zile cancel →fly.delete_app()(machines + volumes + IPs)
Modele Postgres: Customer, Subscription, Instance, Event.
Env vars necesare: DATABASE_URL, STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET, STRIPE_PRICE_ID, FLY_API_TOKEN, FLY_ORG, FLY_REGION, BASE_DOMAIN, MAILGUN_API_KEY/DOMAIN/FROM, ADMIN_API_KEY, PUBLIC_URL.
7. src-tauri — Desktop wrapper
- Tauri v2 + plugins:
opener,dialog,shell,fs - Pornește
atomic-serverca sidecar process (binar pre-built însrc-tauri/binaries/{target_triple}/) - Expune o singură comandă IPC:
get_local_server_config()→{ url, token } - Frontend folosește apoi același
HttpTransportca în browser → conectează la sidecar - Pe exit, Tauri kill-uiește sidecar-ul
Database location auto:
- macOS:
~/Library/Application Support/com.atomic.app/ - Linux:
~/.local/share/com.atomic.app/ - Windows:
%APPDATA%/com.atomic.app/
8. Frontend React (src/)
8.1 Stack
- React 18 + TypeScript strict
- Vite 6 + Tailwind CSS v4 (
@tailwindcss/vite+@tailwindcss/typography) - Zustand 5 (state management modular)
- CodeMirror 6 (
@uiw/react-codemirror, lang-markdown, theme-one-dark) - react-markdown + remark-gfm
- Sigma.js v3 +
@sigma/edge-curve+ Graphology (canvas graph) - d3-force v3 (physics simulation)
- react-zoom-pan-pinch,
@tanstack/react-virtual - sonner (toasts), diff (diff view), qrcode
8.2 Stores Zustand (src/stores/)
atoms, tags, ui, settings, wiki, chat, databases, canvas, embedding-progress.
ui store: tag filter selectat, drawer state, view mode (canvas/grid/list — persistat în localStorage), search query.
8.3 Componente principale (src/components/)
atoms/—AtomCard,AtomGrid,AtomList,AtomViewer(markdown render + search),AtomReader,RelatedAtoms,FilterBarcanvas/—CanvasView,SigmaCanvas,HierarchicalCanvas,LocalGraphView,MiniGraphPreview,ClusterBubble,ClusterVisualization,ConnectionLines,CanvasControls,CanvasBreadcrumb,useForceSimulationhookswiki/—WikiArticleContent,CitationPopover, proposal diff viewchat/—ChatMessage, conversations listonboarding/— wizard cuAIProviderStep, OpenRouter OAuth callbacksettings/,tags/,search/
8.4 Transport abstraction
Interfața Transport { invoke(name, args), subscribe(event, handler) }.
Singura implementare: HttpTransport (folosită și în desktop, și în browser):
- Mapează nume comandă → HTTP spec (method, path, body/query transform) printr-un command map
- WebSocket pentru events
- În Tauri: înainte cheamă
get_local_server_configvia Tauri IPC → primește URL+token sidecar, apoi totul e HTTP
Codul React e transport-unaware.
8.5 Vite config (vite.config.ts)
- Desktop: fără proxy, stub-uri Tauri în
src/lib/stubs/tauri-*.ts - Web (
VITE_BUILD_TARGET=web): proxy/api,/health,/ws→http://127.0.0.1:8080
8.6 Design system
Dark theme inspirat Obsidian:
- Backgrounds:
#1e1e1e/#252525/#2d2d2d - Accent purple:
#7c3aed - Text: white /
#8c8c8c - 3-panel layout: tag tree stânga (fix) | main view (canvas/grid/list) | right drawer (editor/viewer/wiki/chat)
9. iOS App (ios/)
- SwiftUI + Swift 6 strict concurrency, iOS 17.0+
- XcodeGen (
project.yml→.xcodeprojregenerat) - Bundle:
com.atomic.mobile+ extensioncom.atomic.mobile.share(Share Extension) - App Group:
group.com.atomic.mobile(shared credentials) - Dependencies (SPM):
MarkdownUI 2.4,Runestone 0.5,TreeSitterLanguages
Fișiere cheie:
AtomicApp.swift— entry point, QR scanner setupAPIClient.swift—@ObservableHTTP client (Bearer + opționalX-Atomic-Database)AtomStore.swift— state cu DiskCache (atoms, tags) + OfflineQueueModels.swift— Codable:Atom,AtomSummary,SearchResult,TagWithCount,DatabaseInfoOfflineQueue.swift—Documents/pending_atoms.jsonSharedConfig.swift— UserDefaults suite pentru extensieTheme.swift— culori match cu desktop
Endpoint-uri folosite: /api/atoms (CRUD + sources), /api/tags, /api/search, /api/databases/{activate}.
10. Browser Extension (extension/)
- Manifest V3 (Chrome/Edge/Brave)
- Permisiuni: activeTab, scripting, contextMenus, storage, notifications, alarms
Structură:
background/service-worker.js— capture flow, queue offline, sync alarm 30s, badge statuscontent/content-script.js— extragere via Readability (Mozilla) + Turndown (HTML→Markdown), suportă full page și selectionpopup/— toolbar UI cu Capture Page / Selection / Sync Nowoptions/— server URL + API token + Test Connectionlib/config.js—chrome.storage.localcu cheiaserverConfig
Endpoint-uri: POST /api/atoms, GET /health, GET /api/atoms?limit=1 (test).
Offline queue în chrome.storage.local, drain la fiecare alarm tick (30s).
11. Plugins externe
11.1 Discord bot (plugins/discord/)
- discord.js 14.16 + better-sqlite3 + yaml
- Slash commands:
/atomic-subscribe,/atomic-unsubscribe,/atomic-config,/atomic-save,/atomic-search,/atomic-status - Reaction-based capture: emoji custom (sau fallback Unicode) pe orice mesaj → ingestie
- Settle window (default 300s): debounce per channel pentru thread-uri active (resetat la fiecare nou mesaj)
- Suportă Forum channels + Voice/Stage + Threads (cu fetch full history)
- NormalizedMessage structure unifică text/forum/voice/dm
- Local SQLite tables:
dedup_index(guild:channel:message → atom_id),channel_configs - Templates de formatting per tip (single message / thread / forum post)
- Tag resolution cu cache + auto-create pentru taguri ierarhice (
discord/<channel>)
11.2 Obsidian plugin (plugins/obsidian-plugin/)
- TypeScript + Obsidian API (
requestUrl) - Comenzi:
semantic-search,sync-current-note,sync-vault,toggle-auto-sync,open-similar-notes,open-wiki - 2 sidebar views: SimilarView (related notes), WikiView (browse wiki articles)
- Sync engine:
- File watcher cu debounce configurabil (default 2s)
- Hash SHA-256 pe content → skip dacă neschimbat
- Source URL:
obsidian://VaultName/path/to/note.md - Handle: create/modify/delete/rename
- State în
plugin-data.json:Map<path, {atomId, contentHash, lastSynced}>
- Settings: server URL, token, vault name, auto-sync, debounce, folder→tags, delete-on-remove, exclude patterns
12. Scripturi Node (scripts/)
| Script | Rol |
|---|---|
dev-server.js |
Pornește atomic-server + Vite simultan; opțional --postgres (docker pgvector) |
build-server.js |
Compile atomic-server → src-tauri/binaries/{target}/ |
build-mcp-bridge.js |
Compile mcp-bridge → același folder pentru sidecar Tauri |
build-release.js |
Bump versiune + git tag + tauri build cross-platform + GitHub upload |
import/obsidian.js |
Import vault Obsidian (folders→tags, YAML frontmatter, dedup, dry-run) |
import-rss.js |
Import feed RSS (turndown HTML→MD) |
import-wikipedia.js |
Crawl Wikipedia (BFS din 3 domenii: Computing/Philosophy/History), 100ms rate limit |
stress-test-wikipedia.js |
Volume test 1000+ articole |
stress-test-summaries.js |
Lightweight: Wikipedia summary endpoint, concurrency 10 |
reset-database.js |
Drop completă a DB |
reset-tags.js |
Reset tags + remark atoms pentru re-tagging |
reset-chunks.js |
Șterge chunks/embeddings/edges/positions, păstrează atoms |
drop-database.js |
Delete persistent (registry + databases) |
open-in-db-browser.sh |
Quick sqlite3 inspection |
13. Docker & Deployment
13.1 Dockerfile multi-stage
- planner —
cargo-chef prepare(cache deps) - rust-builder — mold linker,
cargo chef cook, buildatomic-servercu profileserver - frontend-builder —
npm ci+vite buildweb - server target —
debian:bookworm-slim, EXPOSE 8080, ENTRYPOINT atomic-server - web target —
nginx:1.28, copy dist-web - all-in-one target — supervisord rulează atomic-server (127.0.0.1:8080) + nginx (8081), VOLUME /data — folosit pentru Fly.io single-machine
13.2 docker-compose.yml (production)
Servicii:
server(ghcr.io/kenforthewin/atomic-server)web(ghcr.io/kenforthewin/atomic-web)proxy(nginx :8080→80) cu config îndocker/nginx.conflitestream(profile backup) — replicare DB → S3 (sync 10s, snapshot 1h)- volume
atomic-data:/data
13.3 nginx config
/api/→ server (proxy_buffering off pentru SSE, read_timeout 300s)/ws→ server (Upgrade headers, 86400s timeout)/.well-known/,/oauth/,/mcp→ server/→ web frontend/assets/→ cache 1y immutable- SPA fallback
try_files $uri /index.html
13.4 docker-compose.dev.yml
pgvector/pgvector:pg16pe portul 5434, healthcheckpg_isready- Folosit de
npm run dev:server:pgșinpm run db:reset:pg
13.5 Fly.io (fly.toml.example)
- Target build:
all-in-one - Mount volume
atomic_data → /data - Internal port 8081 (nginx)
- Auto-stop suspend, min 0 machines
- Health check
/health30s - VM
shared-cpu-1x512MB
14. Documentația din docs/
| Fișier | Subiect |
|---|---|
foreign-keys.md |
Plan de a activa PRAGMA foreign_keys (acum off). 6 probleme + 6 pași: virtual table cleanup, tranzacții, validare tag IDs, stale positions, wiki migration on tag merge. |
llm-wiki-gist-analysis.md |
Comparație cu gist-ul Karpathy "LLM Wiki". Top idee nouă: Lint pass (flag contradictions, orphan pages) — distinctive feature. |
plan-async-migration.md |
Plan în 6 pași pentru a face AtomicCore async-native (eliminarea sync→async bridge la Postgres prin PG_RUNTIME.block_on). |
url-ingestion-improvements.md |
Roadmap inspirat din Obsidian Web Clipper / Defuddle: wire metadata în columns, auto published_at, site-specific extractors (AI chats prioritate), MathML/footnotes/callouts. |
wiki-proposal-loop-plan.md |
Spec arhitectural M1+M2+M3 pentru wiki updates ca propuneri review-abile în loc de mutații directe. Tabela wiki_proposals, WikiSectionOp, dirty set, quiet window, supersede budget, daily caps. |
15. Tech stack — TABEL FINAL
| Layer | Tehnologii |
|---|---|
| Core (Rust) | rusqlite 0.32 (bundled) + sqlite-vec 0.1.6, sqlx 0.8 + pgvector 0.4, tokio 1, reqwest 0.12, tiktoken-rs 0.6, pulldown-cmark 0.12, dom_smoothie 0.15, feed-rs 2.3, sha2, uuid, chrono, tracing |
| Server | actix-web 4.9, actix-cors, actix-ws, rmcp 0.15 (MCP Streamable HTTP), utoipa 5 + scalar, clap 4 |
| Desktop | Tauri v2 + plugins (opener, dialog, shell, fs) |
| Frontend | React 18, TypeScript strict, Vite 6, Tailwind v4, Zustand 5, CodeMirror 6, react-markdown + remark-gfm, Sigma.js 3 + Graphology, d3-force 3, react-zoom-pan-pinch, @tanstack/react-virtual, sonner, diff, qrcode |
| iOS | SwiftUI, Swift 6, iOS 17+, MarkdownUI, Runestone, TreeSitterLanguages, XcodeGen |
| Extension | Manifest V3, Mozilla Readability, Turndown |
| Discord | discord.js 14.16, better-sqlite3, yaml |
| Obsidian | Obsidian API, Web Crypto SHA-256 |
| Cloud (SaaS) | actix-web, sqlx postgres, Stripe API, Fly Machines API, Mailgun, hmac+sha2 (webhook verify) |
| Containere | Docker multi-stage (cargo-chef + mold), nginx, supervisord, litestream backup → S3, pgvector/pgvector:pg16 dev |
| Deploy | Fly.io single-machine (volume), Docker Compose self-host, GHCR images |
| AI providers | OpenRouter (cloud, OAuth), Ollama (local, auto-discover), OpenAI-compatible (Azure/Groq/Together) |
| MCP | Streamable HTTP server + stdio bridge pentru Claude Desktop, OAuth 2.0 + PKCE + DCR pentru Claude.ai remote |
16. Integrări externe (efective)
| Integrare | Cum |
|---|---|
| OpenRouter | OAuth callback public/oauth/openrouter-callback.html, modele separate per capability, settings persistate |
| Ollama | Auto-discovery via /api/ollama/models |
| OpenAI-compatible | Base URL + API key generic |
| Stripe | Cloud only — checkout sessions + webhook signed (HMAC-SHA256) |
| Fly.io Machines API | Cloud only — provision/start/stop/destroy machines + volumes + IPs |
| Mailgun | Cloud only — magic link auth |
| Claude Desktop / Claude.ai | MCP /mcp (Streamable HTTP) + mcp-bridge (stdio) + OAuth 2.0 PKCE pentru remote |
| GitHub Releases | Auto-upload via build-release.js |
| Wikipedia REST API | Doar import scripts |
| Obsidian | Plugin oficial + import script CLI |
| Discord API | discord.js gateway + REST |
| S3 / R2 | Litestream backup opțional |
17. Tehnical debt & roadmap (din docs)
- FK constraints OFF → plan în
foreign-keys.md(cleanup virtual tables, tranzacții, validare) - AtomicCore sync→async bridge la Postgres → plan în
plan-async-migration.md(6 pași) - Wiki proposals M1/M2/M3 → spec în
wiki-proposal-loop-plan.md(M1 manual ready, M2 background scheduler planificat) - URL ingestion → metadata wiring, published_at extraction, site-specific extractors (AI chat transcripts prioritate)
- Lint pass (contradicții/orfani) → idee nouă din analiza gist Karpathy
18. CONCLUZIE
Atomic este o arhitectură excepțional curat designed:
- Single source of truth în
atomic-core(16k+ linii Rust, zero framework deps) - Storage abstraction completă SQLite ↔ Postgres
- AI provider abstraction plug-and-play (3 implementări trait-based)
- Wrappers thin pentru fiecare transport: Tauri (sidecar IPC), actix-web (REST/WS/MCP), mcp-bridge (stdio)
- Frontend transport-unaware (același cod în desktop și browser)
- Pipeline async fire-and-forget cu callback eventing → broadcast → WebSocket
- Multi-database cu registry separat
- API token + OAuth 2.0 PKCE + DCR pentru securitate enterprise
- 6 platforme client: desktop, web, iOS, Chrome ext, Discord, Obsidian
- Deployment flexibil: standalone binary, Docker Compose, Fly.io single-machine, SaaS managed (atomic-cloud)
- Documentație tehnică matură (5 spec docs cu planuri executabile)
Este un proiect production-ready cu o roadmap clară de tehnical debt și features noi.