rebrand: Atlas-blue space header, real OS screenshots, fix broken AI link
- assets/header.svg: rebuilt in true Atlas blue (#4EA0FF/#1F6FE0/#145ED2) on deep-space gradient, animated starfield + orbital system; gold demoted to 1 accent - assets/screenshots/: 3 real captures (hero, Atlas Workspace, platform diagram) - README.md: blue-branded, embeds header + screenshots + blue Mermaid diagrams, full 39-app catalog, Fleet/Mesh/Tailscale, Academy + Islamic layer, wiki links - docs/ai-stack.md: NEW — fixes the dead AI badge link (spine/Brain/router)
This commit is contained in:
parent
8c1efe6e30
commit
872bb00666
6 changed files with 214 additions and 447 deletions
385
README.md
385
README.md
|
|
@ -1,335 +1,142 @@
|
|||
<div align="center">
|
||||
|
||||

|
||||
<img src="./assets/header.svg" alt="Atlas OS" width="100%"/>
|
||||
|
||||
# Atlas OS
|
||||
**A sovereign, browser-native AI operating system.**
|
||||
Log in with your identity → your entire operation as apps on one desktop. No install. Any device. One login.
|
||||
|
||||
[](https://command.atlascorporation.nl/os/)
|
||||
[](./SERVICES.md)
|
||||
[](./SERVICES.md)
|
||||
[](./ARCHITECTURE.md)
|
||||
[](./docs/ai-stack.md)
|
||||
|
||||
**Your entire business running on one hardened Linux server.**
|
||||
**One SSO identity. One browser login. One OS.**
|
||||
|
||||
[🚀 Live Desktop](https://command.atlascorporation.nl/os/) · [📐 Architecture](./ARCHITECTURE.md) · [📦 Services](./SERVICES.md) · [🛠 Deploy](./deploy/) · [🤖 AI Stack](./docs/ai-stack.md)
|
||||
[](https://command.atlascorporation.nl/os/)
|
||||
[](#-the-app-catalog)
|
||||
[](./docs/security.md)
|
||||
[](https://auth.atlascorporation.nl)
|
||||
[](./LICENSE)
|
||||
|
||||
</div>
|
||||
|
||||
---
|
||||
|
||||
## What is Atlas OS?
|
||||
## What it is
|
||||
|
||||
Atlas OS is a self-hosted business operating system running on a single Hetzner VPS. One [Authentik](https://goauthentik.io) SSO identity unlocks **39 services** spanning CRM, finance, communications, AI, fleet management, document storage, and a full Linux remote desktop — all served behind [Caddy](https://caddyserver.com) with automatic HTTPS.
|
||||
Atlas OS is what happens when one operator builds an entire private cloud and then puts **one front door** on it. Log in once with [Authentik](https://goauthentik.io) SSO and a desktop boots in your browser — your bank feed, CRM, mail, files, documents, fleet of POS terminals, automation engine and a real Linux remote desktop, all as apps on a single screen.
|
||||
|
||||
It's the operational spine of **Atlas Corporation** (Tilburg, NL) — built by and for a solo founder who needed a private cloud they actually own, styled like a space-grade command console.
|
||||
Not a SaaS. Not a dashboard mockup. A **reviewed execution layer** above the tools you already run — sovereign by design, hostable in our EU cloud **or fully on-premise on your own server**, in the spirit of Citrix / ServiceNow but built for the solo founder and the small team.
|
||||
|
||||
> Think of it as a Citrix-style desktop, but it's your own server, your own identity, your own data.
|
||||
|
||||
**What runs on it:**
|
||||
- 🏢 Odoo 19 ERP/CRM — full business operations
|
||||
- 💶 Firefly III + Enable Banking — bank sync and financial intelligence
|
||||
- 📧 Stalwart — self-hosted mail (all domains)
|
||||
- 🤖 Atlas Brain — AI that reads your mail, CRM, and bank every 15 minutes
|
||||
- 🖥️ Remote Linux desktop — Webtop (XFCE + Claude Code + Chromium inside)
|
||||
- 🔒 Authentik — SSO that gates every single service
|
||||
- ...and 33 more
|
||||
<div align="center">
|
||||
<img src="./assets/screenshots/workspace.png" alt="Atlas Workspace — every department, one screen" width="80%"/>
|
||||
<br/><em>Every department, one screen — apps on a sovereign desktop.</em>
|
||||
</div>
|
||||
|
||||
---
|
||||
|
||||
## 🖥️ The Desktop
|
||||
## ✦ The experience
|
||||
|
||||
Open `https://command.atlascorporation.nl/os/` on any device. You get:
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ ⌂ Atlas OS 🛡 ✓ 21:47 Chaib ∨ │
|
||||
├──────────────────────────────────────────────────────│
|
||||
│ Cockpit │ Identity │ AI │ Work │
|
||||
│ ───────── │ ──────── │ ────── │ ──── │
|
||||
│ 📊 Today │ 🛡 Auth │ 💬 Chat │ 🏪 Odoo │
|
||||
│ 💰 Money │ 🔒 Vault │ 🧠 AI GW │ 💼 CFO │
|
||||
│ 📬 Inbox │ │ 🗺 Mind │ 🏦 Bank │
|
||||
│ 📈 Pipeline│ │ 🎓 Leer │ 📄 Paperless │
|
||||
│ 🚀 Fleet │ │ │ 📝 Office │
|
||||
│ ⚙ Control │ │ │ 📅 Calendar │
|
||||
│─────────────────────────────────────────────────────│
|
||||
│ Files & Comms │ Ops │ Sites │
|
||||
│ ───────────── │ ───────────── │ ───── │
|
||||
│ ☁ Nextcloud │ 🔀 Git (Forgejo) │ 11 websites │
|
||||
│ 📮 Mail Admin │ ⚡ n8n │ │
|
||||
│ 📡 Relay │ 📈 Uptime │ │
|
||||
│ │ 🌐 MeshCentral │ │
|
||||
│ │ 🖥 Desktop │ │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
**Boot sequence:** space-themed boot screen → Authentik SSO login → live desktop with your real data.
|
||||
|
||||
**Remote Linux desktop** (tailnet-only):
|
||||
```
|
||||
http://atlas-01.tailab40ed.ts.net:8497
|
||||
```
|
||||
A real XFCE desktop in the browser. Claude Code and Chromium are pre-installed — OAuth login works because the browser is *inside* the desktop. Requires Tailscale to be active on your device.
|
||||
| | |
|
||||
|---|---|
|
||||
| <img src="./assets/screenshots/hero.png" width="100%"/> | <img src="./assets/screenshots/platform.png" width="100%"/> |
|
||||
| **One partner for every system** — ERP, POS, webshop, hardware, AI as one seamless whole. | **The Atlas platform** — surfaces → workspace → data sources, one reviewed control layer. |
|
||||
|
||||
---
|
||||
|
||||
## 📦 Service Catalog
|
||||
## 🗺️ Architecture
|
||||
|
||||
### 🎯 Cockpit (live data panels)
|
||||
| App | Description | URL |
|
||||
|-----|-------------|-----|
|
||||
| Today | AI daily brief + accountability level | `command.atlascorporation.nl/os/` |
|
||||
| Money | Bank transactions via Enable Banking PSD2 | `command.atlascorporation.nl/os/` |
|
||||
| Inbox | Email + WhatsApp drafts, flagged items | `command.atlascorporation.nl/os/` |
|
||||
| Pipeline | Odoo CRM leads and deal status | `command.atlascorporation.nl/os/` |
|
||||
| Fleet | POS terminals, health, last-seen (MeshCentral) | `command.atlascorporation.nl/os/` |
|
||||
| Control | AI kill-switch, autonomy level, daily spend cap | `command.atlascorporation.nl/os/` |
|
||||
|
||||
### 🛡️ Identity
|
||||
| App | Description | URL |
|
||||
|-----|-------------|-----|
|
||||
| Authentik | SSO, OIDC, MFA — gates all services | [auth.atlascorporation.nl](https://auth.atlascorporation.nl) |
|
||||
| Vaultwarden | Self-hosted Bitwarden (iOS Bitwarden app works) | [vault.atlascorporation.nl](https://vault.atlascorporation.nl) |
|
||||
|
||||
### 🤖 AI
|
||||
| App | Description | URL |
|
||||
|-----|-------------|-----|
|
||||
| Atlas Chat | Open-WebUI — ChatGPT-style on local + cloud models | [chat.atlascorporation.nl](https://chat.atlascorporation.nl) |
|
||||
| AI Gateway | LiteLLM proxy — unified OpenAI-compat API | [llm.atlascorporation.nl](https://llm.atlascorporation.nl) |
|
||||
| Mindmap | AI-powered visual thinking | [mindmap.atlascorporation.nl](https://mindmap.atlascorporation.nl) |
|
||||
| Leeragent | Learning & knowledge agent | [leeragent.atlascorporation.nl](https://leeragent.atlascorporation.nl) |
|
||||
|
||||
### 💼 Work
|
||||
| App | Description | URL |
|
||||
|-----|-------------|-----|
|
||||
| Odoo | ERP + CRM (leads, invoices, customers) | [odoo.atlascorporation.nl](https://odoo.atlascorporation.nl) |
|
||||
| CFO / Firefly III | Double-entry bookkeeping + budget intelligence | [cfo.atlascorporation.nl](https://cfo.atlascorporation.nl) |
|
||||
| Bank / Enable Banking | PSD2 bank sync (ING, Knab, etc.) | [fidi.atlascorporation.nl](https://fidi.atlascorporation.nl) |
|
||||
| Paperless-ngx | Document management + OCR | [paperless.atlascorporation.nl](https://paperless.atlascorporation.nl) |
|
||||
| OnlyOffice | Full office suite (Writer, Sheets, Slides) | [office.atlascorporation.nl](https://office.atlascorporation.nl) |
|
||||
| Calendar | Nextcloud Calendar (DAV sync to iOS) | [cloud.atlascorporation.nl/apps/calendar](https://cloud.atlascorporation.nl/apps/calendar) |
|
||||
|
||||
### 📁 Files & Comms
|
||||
| App | Description | URL |
|
||||
|-----|-------------|-----|
|
||||
| Nextcloud | File storage, DAV, photos | [cloud.atlascorporation.nl](https://cloud.atlascorporation.nl) |
|
||||
| Stalwart Mail | Self-hosted email (SMTP/IMAP/JMAP) | [stalwart.atlascorporation.nl](https://stalwart.atlascorporation.nl) |
|
||||
| Relay | Internal message relay service | [relay.atlascorporation.nl](https://relay.atlascorporation.nl) |
|
||||
|
||||
### ⚙️ Ops
|
||||
| App | Description | URL |
|
||||
|-----|-------------|-----|
|
||||
| Forgejo | Self-hosted Git — this very repo | [git.atlascorporation.nl](https://git.atlascorporation.nl) |
|
||||
| n8n | Workflow automation | [n8n.atlascorporation.nl](https://n8n.atlascorporation.nl) |
|
||||
| Uptime Kuma | Service health monitoring | [uptime.atlascorporation.nl](https://uptime.atlascorporation.nl) |
|
||||
| MeshCentral | Fleet management + remote access | [mesh.atlascorporation.nl](https://mesh.atlascorporation.nl) |
|
||||
| Command | Atlas command dashboard | [command.atlascorporation.nl](https://command.atlascorporation.nl) |
|
||||
| Remote Desktop | Webtop full Linux desktop (tailnet-only) | `atlas-01.tailab40ed.ts.net:8497` |
|
||||
| Architecture | Live system map | `/os/sitemap.html` |
|
||||
|
||||
### 🌐 Managed Sites
|
||||
`atlasworks.nl` · `atlascorporation.nl` · `atlasagency.nl` · `atlasacademy.nl` · `atlaspos.nl` · `atlashub.nl` · `bicosagency.nl` · `budgetenergiecoach.nl` · `hkintercare.nl` · `jouwenergieadvies.nl` · `reclamemans.nl`
|
||||
|
||||
---
|
||||
|
||||
## 🏗️ Architecture
|
||||
One box. One identity. Everything behind it.
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph Internet
|
||||
U([User Browser])
|
||||
iOS([iOS / Mobile])
|
||||
end
|
||||
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#0c1428','primaryTextColor':'#cfe2ff','primaryBorderColor':'#1F6FE0','lineColor':'#4EA0FF','fontFamily':'monospace'}}}%%
|
||||
graph TB
|
||||
User([Any device]):::u --> Caddy[Caddy · TLS + edge]:::edge
|
||||
Caddy --> Auth{{Authentik SSO}}:::id
|
||||
Auth --> OS[Atlas OS desktop]:::os
|
||||
Auth --> Apps[39 apps]:::os
|
||||
OS --> Mind[The Mind · cockpit + spine]:::ai
|
||||
Mind --> Brain[Atlas Brain · reviewed execution]:::ai
|
||||
Brain --> Router[LLM router · local → Groq → Claude]:::ai
|
||||
Apps --> Stack[Odoo · Nextcloud · Firefly · Paperless · n8n · Forgejo · Vault · Stalwart]:::svc
|
||||
Caddy --> Fleet[Fleet · MeshCentral + Tailscale + NATS mesh]:::fleet
|
||||
Caddy --> Sites[Client sites · WordPress · POS · Academy]:::site
|
||||
|
||||
subgraph atlas-01["atlas-01 · Hetzner CPX32"]
|
||||
direction TB
|
||||
C[Caddy TLS]
|
||||
A[Authentik SSO]
|
||||
C -->|forward_auth| A
|
||||
A -->|verified| OS[Atlas OS Desktop]
|
||||
A -->|verified| OD[Odoo ERP]
|
||||
A -->|verified| NC[Nextcloud]
|
||||
A -->|verified| AI[AI Gateway LiteLLM]
|
||||
A -->|verified| FG[Forgejo Git]
|
||||
A -->|verified| N8[n8n]
|
||||
A -->|verified| MC[MeshCentral]
|
||||
A -->|verified| UP[Uptime Kuma]
|
||||
|
||||
subgraph AI Stack
|
||||
AI --> OL[Ollama Local Models]
|
||||
AI --> GR[Groq Cloud]
|
||||
AI --> CL[Claude API]
|
||||
AB[Atlas Brain] -->|15min cycle| AI
|
||||
AB --> ST[atlas-state.json]
|
||||
ST --> OS
|
||||
end
|
||||
|
||||
subgraph Mesh
|
||||
NATS[NATS Event Bus]
|
||||
NATS --> TS[Tailscale Devices]
|
||||
end
|
||||
end
|
||||
|
||||
U -->|HTTPS| C
|
||||
iOS -->|Tailscale| TS
|
||||
classDef u fill:#050810,stroke:#4EA0FF,color:#8EC2FF
|
||||
classDef edge fill:#0c1428,stroke:#1F6FE0,color:#cfe2ff
|
||||
classDef id fill:#145ED2,stroke:#4EA0FF,color:#fff
|
||||
classDef os fill:#0c1428,stroke:#4EA0FF,color:#cfe2ff
|
||||
classDef ai fill:#0c1428,stroke:#8EC2FF,color:#cfe2ff
|
||||
classDef svc fill:#080c18,stroke:#1F6FE0,color:#9fb8e0
|
||||
classDef fleet fill:#080c18,stroke:#1F6FE0,color:#9fb8e0
|
||||
classDef site fill:#080c18,stroke:#145ED2,color:#9fb8e0
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🤖 AI Stack
|
||||
|
||||
Atlas OS has a 4-tier AI routing stack — zero-cost local first, paid cloud only when needed:
|
||||
|
||||
| Tier | Model / Alias | Backing | Use |
|
||||
|------|--------------|---------|-----|
|
||||
| 0 — Local | `atlas-fast` | LLaMA 1B (RTX A2000) | Classification, routing, labels |
|
||||
| 0 — Local | `atlas-free` | Hermes3 7B | Dutch copy, FAQ, product descriptions |
|
||||
| 0 — Local | `atlas-code` | Qwen Coder | Code completion, simple fixes |
|
||||
| 0 — Local | `atlas-auto` | Smart router | Picks best free local model |
|
||||
| 1 — Free Cloud | `groq/llama-3.3-70b` | Groq | Fast 70B reasoning, bulk tasks |
|
||||
| 1 — Free Cloud | `cerebras/llama-3.1-70b` | Cerebras | Fastest inference, free tier |
|
||||
| 1 — Free Cloud | `gemini-2.5-pro` | OpenRouter | 1M context, vision, PDF |
|
||||
| 2 — Paid | `claude-haiku-4-5` | Anthropic | Short copy, classification |
|
||||
| 2 — Paid | `claude-sonnet-4-6` | Anthropic | Code, multi-step reasoning |
|
||||
| 2 — Paid | `claude-opus-4-8` | Anthropic | Deep research, architecture |
|
||||
|
||||
**Key AI services running 24/7:**
|
||||
|
||||
| Service | What it does |
|
||||
|---------|-------------|
|
||||
| `atlas-brain` | Collects mail + CRM + bank every 15 min → synthesizes daily brief |
|
||||
| `atlas-loop` | Background signal loop — publishes nudges to NATS |
|
||||
| `atlas-meridian` | Autonomous decision engine / battle responder |
|
||||
| `atlas-litellm` | Unified LLM proxy (OpenAI-compat API for all above models) |
|
||||
| NATS mesh | Real-time event bus across all devices on the tailnet |
|
||||
| Langfuse | Full LLM observability — every call traced |
|
||||
Full write-up → **[ARCHITECTURE.md](./ARCHITECTURE.md)** · every container & service → **[SERVICES.md](./SERVICES.md)** · the AI layer → **[docs/ai-stack.md](./docs/ai-stack.md)**
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Quick Deploy
|
||||
## 🧩 The app catalog
|
||||
|
||||
> **Requirements:** Debian 12 or Ubuntu 24.04, a domain with DNS pointed at the server, a Tailscale account.
|
||||
39 apps, live-verified (no dead tiles), grouped into a categorized launcher:
|
||||
|
||||
| Group | Apps |
|
||||
|---|---|
|
||||
| **Cockpit** | Today · Money · Inbox · Pipeline · Fleet · Control |
|
||||
| **Identity** | Authentik SSO · Vaultwarden |
|
||||
| **AI** | Atlas Chat (Open WebUI) · AI Gateway · Mindmap · Leeragent |
|
||||
| **Work** | Odoo 19 · CFO · Bank (Firefly) · Paperless · Office · Calendar |
|
||||
| **Files & Comms** | Nextcloud · Mail Admin (Stalwart) · Relay |
|
||||
| **Ops** | Git (Forgejo) · n8n · Uptime Kuma · MeshCentral · Command · **Remote Desktop** · Architecture |
|
||||
| **Sites** | AtlasWorks · Atlas Corp · Agency · **Academy** · AtlasPOS · Hub + client sites |
|
||||
|
||||
> **Remote Desktop** is a genuine Ubuntu XFCE desktop in the browser (Webtop) with Claude Code + Chromium pre-installed — boot Claude or any app, on a sovereign desktop. → [docs/remote-desktop.md](./docs/remote-desktop.md)
|
||||
|
||||
---
|
||||
|
||||
## 🛰️ Fleet, mesh & sovereignty
|
||||
|
||||
- **MeshCentral** — remote management of every client POS terminal and device.
|
||||
- **Tailscale** — the private spine; internal services (`tailscale serve`) never touch the public internet.
|
||||
- **NATS mesh** — node-to-node messaging across the Atlas estate (round-trip proven).
|
||||
- **EU-sovereign** — Hetzner (NL/DE), no US Cloud Act exposure, MFA, nightly backups. → [docs/security.md](./docs/security.md)
|
||||
|
||||
---
|
||||
|
||||
## 🎓 Atlas Academy
|
||||
|
||||
[atlasacademy.nl](https://atlasacademy.nl) — the training arm. BiSL, startup, AI and ESF-funded tracks, coaching and a course catalog, with leads relayed straight into Odoo CRM. Part of the same one-identity estate; surfaced as a desktop app.
|
||||
|
||||
## 🕌 Atlas Islamic layer
|
||||
|
||||
A personal-sovereignty layer for the operator: Adhan at El Feth (Tilburg) salah times, Qur'an at logon, AdGuard Family DNS + content filtering, and sunnah reminders — proof that "sovereign" includes values, not just data residency.
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Deploy your own
|
||||
|
||||
```bash
|
||||
git clone https://git.atlascorporation.nl/chaib/atlas-os
|
||||
git clone https://git.atlascorporation.nl/chaib/atlas-os.git
|
||||
cd atlas-os
|
||||
chmod +x deploy/install.sh
|
||||
./deploy/install.sh --domain yourdomain.com --email admin@yourdomain.com
|
||||
sudo bash deploy/install.sh # Debian/Ubuntu, Docker + Caddy
|
||||
```
|
||||
|
||||
The installer sets up Docker, Caddy, Tailscale, and the core compose stacks. After install, configure Authentik at `https://auth.yourdomain.com` to create your admin user, then log in to `https://command.yourdomain.com/os/`.
|
||||
|
||||
See [deploy/README.md](./deploy/README.md) for full instructions.
|
||||
Bring your own domain; point it at the box; Caddy issues certs and Authentik gates everything. Core stack compose lives in [`deploy/compose/atlas-core.yml`](./deploy/compose/atlas-core.yml). Full guide → **[docs/deployment.md](./docs/deployment.md)**.
|
||||
|
||||
---
|
||||
|
||||
## 📁 Repository Structure
|
||||
## 📚 Docs & wiki
|
||||
|
||||
```
|
||||
atlas-os/
|
||||
├── assets/
|
||||
│ ├── header.svg # Animated space header (used in README)
|
||||
│ └── logo.svg # Atlas A logo
|
||||
├── web/
|
||||
│ ├── os/
|
||||
│ │ └── index.html # The browser OS desktop (production copy)
|
||||
│ ├── sitemap.html # Live architecture map
|
||||
│ ├── atlas-chat.html # Atlas Chat UI
|
||||
│ ├── atlas-command.html # Command dashboard
|
||||
│ └── atlas-hud.html # HUD overlay
|
||||
├── server/
|
||||
│ ├── atlas_brain.py # Signal collector + AI brief synthesizer
|
||||
│ ├── cockpit_shim.py # Feed API adapter
|
||||
│ ├── intelligence.py # Intelligence layer
|
||||
│ ├── meridian.py # Autonomous decision engine
|
||||
│ ├── atlas_router_api.py # Local model router (port 8888)
|
||||
│ ├── cli-atlas.py # Atlas CLI
|
||||
│ └── systemd/ # Service unit files
|
||||
├── scripts/
|
||||
│ ├── atlas_brain.py # Brain export scripts
|
||||
│ ├── atlas_self_prompting_loop.py
|
||||
│ ├── enis_monitor.py # WhatsApp auto-reply monitor
|
||||
│ └── ...
|
||||
├── deploy/
|
||||
│ ├── install.sh # One-command installer
|
||||
│ ├── compose/
|
||||
│ │ ├── atlas-core.yml # Core services (Authentik, Nextcloud, Mail, Git, Vault)
|
||||
│ │ └── atlas-ai.yml # AI stack (LiteLLM, Open-WebUI, Langfuse)
|
||||
│ ├── caddy/
|
||||
│ │ └── Caddyfile.template
|
||||
│ └── README.md
|
||||
├── docs/
|
||||
│ ├── getting-started.md
|
||||
│ ├── ai-stack.md
|
||||
│ ├── security.md
|
||||
│ ├── services.md
|
||||
│ └── system-of-record.md
|
||||
├── patterns/
|
||||
│ ├── ANTI_IMPULSE_RULES.md
|
||||
│ └── CLUSTER_THEN_POLISH.md
|
||||
├── ARCHITECTURE.md
|
||||
├── SERVICES.md
|
||||
├── CHANGELOG.md
|
||||
└── README.md # This file
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔒 Security Model
|
||||
|
||||
| Layer | Implementation |
|
||||
|-------|---------------|
|
||||
| Identity | Authentik SSO — single source of truth for all services |
|
||||
| TLS | Caddy automatic HTTPS on every public endpoint |
|
||||
| Network | Public services behind SSO · internal services on Tailscale only |
|
||||
| Secrets | Vaultwarden (end-to-end encrypted) · age-encrypted vault for sync |
|
||||
| File permissions | 600 on all secret files on atlas-01 |
|
||||
| Remote desktop | Webtop is tailnet-only — never exposed to public internet |
|
||||
| Backups | `atlas-backup-*` systemd services for Forgejo, Nextcloud, Authentik |
|
||||
|
||||
**Rule:** anything root-level (remote desktop, server SSH) stays tailnet-only. Public services must pass through Authentik `forward_auth`. No bare basic-auth on the public internet.
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ Tech Stack
|
||||
|
||||
| Component | Technology |
|
||||
|-----------|------------|
|
||||
| Reverse proxy + TLS | [Caddy](https://caddyserver.com) |
|
||||
| Identity & SSO | [Authentik](https://goauthentik.io) |
|
||||
| Containers | Docker + Docker Compose |
|
||||
| Private mesh | [Tailscale](https://tailscale.com) |
|
||||
| Event bus | [NATS](https://nats.io) |
|
||||
| CRM / ERP | [Odoo 19](https://odoo.com) |
|
||||
| File storage | [Nextcloud 31](https://nextcloud.com) |
|
||||
| Finance | [Firefly III](https://firefly-iii.org) |
|
||||
| Documents | [Paperless-ngx](https://docs.paperless-ngx.com) |
|
||||
| Mail server | [Stalwart](https://stalw.art) |
|
||||
| Git hosting | [Forgejo](https://forgejo.org) |
|
||||
| Automation | [n8n](https://n8n.io) |
|
||||
| Password manager | [Vaultwarden](https://github.com/dani-garcia/vaultwarden) |
|
||||
| AI proxy | [LiteLLM](https://litellm.ai) |
|
||||
| AI chat UI | [Open-WebUI](https://openwebui.com) |
|
||||
| LLM observability | [Langfuse](https://langfuse.com) |
|
||||
| Remote desktop | [Webtop](https://docs.linuxserver.io/images/docker-webtop/) (KasmVNC + XFCE) |
|
||||
| Fleet management | [MeshCentral](https://meshcentral.com) |
|
||||
| Monitoring | [Uptime Kuma](https://uptime.kuma.pet) |
|
||||
| AI models (local) | [Ollama](https://ollama.com) on RTX A2000 |
|
||||
| Brain / orchestrator | Python 3.12 + httpx + NATS.py |
|
||||
| OS desktop | Vanilla JS (single HTML file, zero build step) |
|
||||
| | |
|
||||
|---|---|
|
||||
| [ARCHITECTURE.md](./ARCHITECTURE.md) | One-box philosophy, topology, data flows |
|
||||
| [SERVICES.md](./SERVICES.md) | All 55 containers + systemd services |
|
||||
| [docs/ai-stack.md](./docs/ai-stack.md) | The Mind, the Brain, the LLM router |
|
||||
| [docs/remote-desktop.md](./docs/remote-desktop.md) | Webtop desktop + Claude inside |
|
||||
| [docs/security.md](./docs/security.md) | SSO gate, sovereignty, secrets model |
|
||||
| [docs/deployment.md](./docs/deployment.md) | Stand up the whole stack |
|
||||
| **[Wiki ↗](https://git.atlascorporation.nl/chaib/atlas-os/wiki)** | Browsable, page-per-topic |
|
||||
|
||||
---
|
||||
|
||||
<div align="center">
|
||||
|
||||
---
|
||||
**Built by [Chaib Aarab](https://atlascorporation.nl) — Atlas Corporation, Tilburg NL**
|
||||
Built incrementally, on the go, while running real client projects. The architecture emerged from constraints, not slides.
|
||||
|
||||
Built with obsession by **Chaib Aarab** · Atlas Corporation · Tilburg, NL
|
||||
|
||||
⟡ [atlascorporation.nl](https://atlascorporation.nl) · [atlasworks.nl](https://atlasworks.nl) · [atlaspos.nl](https://atlaspos.nl) ⟡
|
||||
|
||||
*"Your business on one box — space grade."*
|
||||
<sub>MIT licensed · EU-sovereign · one login for all of it</sub>
|
||||
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,165 +1,71 @@
|
|||
<svg width="1200" height="400" viewBox="0 0 1200 400" xmlns="http://www.w3.org/2000/svg">
|
||||
<svg width="1200" height="380" viewBox="0 0 1200 380" xmlns="http://www.w3.org/2000/svg" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif">
|
||||
<defs>
|
||||
<radialGradient id="bg" cx="50%" cy="45%">
|
||||
<stop offset="0%" stop-color="#0d1528"/>
|
||||
<stop offset="55%" stop-color="#08101e"/>
|
||||
<stop offset="100%" stop-color="#020408"/>
|
||||
<radialGradient id="space" cx="50%" cy="42%" r="75%">
|
||||
<stop offset="0%" stop-color="#0c1428"/>
|
||||
<stop offset="55%" stop-color="#080c18"/>
|
||||
<stop offset="100%" stop-color="#050810"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="neb1" cx="25%" cy="55%">
|
||||
<stop offset="0%" stop-color="#2d1a5e" stop-opacity="0.45"/>
|
||||
<stop offset="100%" stop-color="#2d1a5e" stop-opacity="0"/>
|
||||
<radialGradient id="coreGlow" cx="50%" cy="50%" r="50%">
|
||||
<stop offset="0%" stop-color="#4EA0FF" stop-opacity="0.95"/>
|
||||
<stop offset="45%" stop-color="#1F6FE0" stop-opacity="0.55"/>
|
||||
<stop offset="100%" stop-color="#145ED2" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="neb2" cx="75%" cy="40%">
|
||||
<stop offset="0%" stop-color="#0e3a6e" stop-opacity="0.38"/>
|
||||
<stop offset="100%" stop-color="#0e3a6e" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="neb3" cx="50%" cy="50%">
|
||||
<stop offset="0%" stop-color="#1a2e5e" stop-opacity="0.28"/>
|
||||
<stop offset="100%" stop-color="#1a2e5e" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="logoglow" cx="50%" cy="50%">
|
||||
<stop offset="0%" stop-color="#e0a234" stop-opacity="0.22"/>
|
||||
<stop offset="100%" stop-color="#e0a234" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<filter id="gf" x="-50%" y="-50%" width="200%" height="200%">
|
||||
<feGaussianBlur stdDeviation="5" result="b"/>
|
||||
<feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge>
|
||||
</filter>
|
||||
<filter id="sf">
|
||||
<feGaussianBlur stdDeviation="1.2"/>
|
||||
</filter>
|
||||
<style>
|
||||
@keyframes t1{0%,100%{opacity:.15}50%{opacity:.95}}
|
||||
@keyframes t2{0%,100%{opacity:.6}40%{opacity:.1}80%{opacity:.9}}
|
||||
@keyframes t3{0%,100%{opacity:.3}60%{opacity:1}}
|
||||
@keyframes t4{0%,100%{opacity:.8}25%{opacity:.2}75%{opacity:.7}}
|
||||
@keyframes orb1{from{transform:rotate(0deg) translateX(100px) rotate(0deg)}to{transform:rotate(360deg) translateX(100px) rotate(-360deg)}}
|
||||
@keyframes orb2{from{transform:rotate(72deg) translateX(100px) rotate(-72deg)}to{transform:rotate(432deg) translateX(100px) rotate(-432deg)}}
|
||||
@keyframes orb3{from{transform:rotate(144deg) translateX(100px) rotate(-144deg)}to{transform:rotate(504deg) translateX(100px) rotate(-504deg)}}
|
||||
@keyframes orb4{from{transform:rotate(30deg) translateX(148px) rotate(-30deg)}to{transform:rotate(390deg) translateX(148px) rotate(-390deg)}}
|
||||
@keyframes orb5{from{transform:rotate(210deg) translateX(148px) rotate(-210deg)}to{transform:rotate(570deg) translateX(148px) rotate(-570deg)}}
|
||||
@keyframes pulse{0%,100%{opacity:.7}50%{opacity:1}}
|
||||
@keyframes float{0%,100%{transform:translateY(0)}50%{transform:translateY(-7px)}}
|
||||
@keyframes glow{0%,100%{opacity:.55}50%{opacity:.9}}
|
||||
.s1{animation:t1 3.1s ease-in-out infinite}
|
||||
.s2{animation:t2 4.7s ease-in-out infinite}
|
||||
.s3{animation:t3 2.3s ease-in-out infinite}
|
||||
.s4{animation:t4 5.9s ease-in-out infinite}
|
||||
.o1{animation:orb1 22s linear infinite;transform-origin:600px 195px}
|
||||
.o2{animation:orb2 22s linear infinite;transform-origin:600px 195px}
|
||||
.o3{animation:orb3 22s linear infinite;transform-origin:600px 195px}
|
||||
.o4{animation:orb4 38s linear infinite;transform-origin:600px 195px}
|
||||
.o5{animation:orb5 38s linear infinite;transform-origin:600px 195px}
|
||||
.lg{animation:pulse 4s ease-in-out infinite}
|
||||
.ti{animation:float 6s ease-in-out infinite}
|
||||
.gl{animation:glow 3s ease-in-out infinite}
|
||||
</style>
|
||||
<linearGradient id="word" x1="0" y1="0" x2="1" y2="0">
|
||||
<stop offset="0%" stop-color="#8EC2FF"/>
|
||||
<stop offset="55%" stop-color="#4EA0FF"/>
|
||||
<stop offset="100%" stop-color="#1F6FE0"/>
|
||||
</linearGradient>
|
||||
<filter id="blur"><feGaussianBlur stdDeviation="6"/></filter>
|
||||
</defs>
|
||||
|
||||
<!-- Space background -->
|
||||
<rect width="1200" height="400" fill="url(#bg)"/>
|
||||
<rect width="1200" height="380" fill="url(#space)"/>
|
||||
|
||||
<!-- Nebulae -->
|
||||
<ellipse cx="270" cy="220" rx="480" ry="260" fill="url(#neb1)"/>
|
||||
<ellipse cx="950" cy="180" rx="420" ry="240" fill="url(#neb2)"/>
|
||||
<ellipse cx="600" cy="200" rx="320" ry="200" fill="url(#neb3)"/>
|
||||
|
||||
<!-- Stars layer 1 -->
|
||||
<circle class="s1" cx="45" cy="28" r="0.9" fill="#fff"/>
|
||||
<circle class="s3" cx="112" cy="61" r="1.2" fill="#fff"/>
|
||||
<circle class="s2" cx="78" cy="145" r="0.7" fill="#cdf"/>
|
||||
<circle class="s4" cx="23" cy="190" r="1.0" fill="#fff"/>
|
||||
<circle class="s1" cx="167" cy="47" r="0.8" fill="#ddf"/>
|
||||
<circle class="s3" cx="204" cy="312" r="1.3" fill="#fff"/>
|
||||
<circle class="s2" cx="55" cy="342" r="0.9" fill="#fff"/>
|
||||
<circle class="s4" cx="130" cy="375" r="0.7" fill="#ccf"/>
|
||||
<circle class="s1" cx="310" cy="19" r="1.1" fill="#fff"/>
|
||||
<circle class="s2" cx="388" cy="55" r="0.8" fill="#ddf"/>
|
||||
<circle class="s3" cx="340" cy="352" r="1.0" fill="#fff"/>
|
||||
<circle class="s1" cx="275" cy="280" r="0.7" fill="#fff"/>
|
||||
<circle class="s4" cx="95" cy="88" r="1.4" fill="#fff"/>
|
||||
<circle class="s2" cx="188" cy="220" r="0.9" fill="#ccf"/>
|
||||
<circle class="s3" cx="450" cy="20" r="1.2" fill="#fff"/>
|
||||
<circle class="s1" cx="520" cy="38" r="0.8" fill="#ddf"/>
|
||||
<circle class="s4" cx="490" cy="365" r="1.1" fill="#fff"/>
|
||||
<circle class="s2" cx="415" cy="390" r="0.7" fill="#fff"/>
|
||||
<circle class="s3" cx="355" cy="160" r="1.0" fill="#ccf"/>
|
||||
<circle class="s1" cx="240" cy="130" r="0.9" fill="#fff"/>
|
||||
<circle class="s2" cx="680" cy="25" r="1.2" fill="#fff"/>
|
||||
<circle class="s3" cx="740" cy="48" r="0.8" fill="#ddf"/>
|
||||
<circle class="s1" cx="810" cy="19" r="1.0" fill="#fff"/>
|
||||
<circle class="s4" cx="870" cy="62" r="1.3" fill="#fff"/>
|
||||
<circle class="s2" cx="935" cy="34" r="0.7" fill="#ccf"/>
|
||||
<circle class="s3" cx="990" cy="88" r="1.1" fill="#fff"/>
|
||||
<circle class="s1" cx="1055" cy="45" r="0.9" fill="#ddf"/>
|
||||
<circle class="s4" cx="1120" cy="28" r="1.2" fill="#fff"/>
|
||||
<circle class="s2" cx="1165" cy="110" r="0.8" fill="#fff"/>
|
||||
<circle class="s3" cx="1080" cy="170" r="1.0" fill="#ccf"/>
|
||||
<circle class="s1" cx="1140" cy="250" r="0.7" fill="#fff"/>
|
||||
<circle class="s4" cx="1010" cy="300" r="1.3" fill="#fff"/>
|
||||
<circle class="s2" cx="940" cy="360" r="0.9" fill="#ddf"/>
|
||||
<circle class="s3" cx="820" cy="385" r="1.1" fill="#fff"/>
|
||||
<circle class="s1" cx="750" cy="340" r="0.8" fill="#fff"/>
|
||||
<circle class="s4" cx="680" cy="370" r="1.0" fill="#ccf"/>
|
||||
<circle class="s2" cx="1180" cy="350" r="0.7" fill="#fff"/>
|
||||
<circle class="s3" cx="1100" cy="390" r="1.2" fill="#fff"/>
|
||||
<!-- Bright accent stars -->
|
||||
<circle class="s3" cx="152" cy="52" r="1.8" fill="#fff" filter="url(#sf)"/>
|
||||
<circle class="s1" cx="1048" cy="128" r="1.6" fill="#fff" filter="url(#sf)"/>
|
||||
<circle class="s4" cx="380" cy="320" r="1.5" fill="#e0e8ff" filter="url(#sf)"/>
|
||||
<circle class="s2" cx="870" cy="310" r="1.7" fill="#fff" filter="url(#sf)"/>
|
||||
<circle class="s3" cx="60" cy="295" r="1.5" fill="#f0f4ff" filter="url(#sf)"/>
|
||||
<!-- Center region stars -->
|
||||
<circle class="s2" cx="445" cy="185" r="0.8" fill="#fff"/>
|
||||
<circle class="s1" cx="412" cy="240" r="1.0" fill="#ccf"/>
|
||||
<circle class="s4" cx="755" cy="170" r="0.9" fill="#fff"/>
|
||||
<circle class="s3" cx="788" cy="228" r="0.7" fill="#ddf"/>
|
||||
<circle class="s1" cx="505" cy="320" r="1.1" fill="#fff"/>
|
||||
<circle class="s2" cx="700" cy="325" r="0.8" fill="#fff"/>
|
||||
|
||||
<!-- Orbit rings -->
|
||||
<circle cx="600" cy="195" r="100" fill="none" stroke="#e0a234" stroke-width="0.6" stroke-opacity="0.18"/>
|
||||
<circle cx="600" cy="195" r="148" fill="none" stroke="#4a9fe2" stroke-width="0.5" stroke-opacity="0.12"/>
|
||||
|
||||
<!-- Logo glow halo -->
|
||||
<ellipse class="gl" cx="600" cy="195" rx="115" ry="80" fill="url(#logoglow)"/>
|
||||
|
||||
<!-- Atlas A logo -->
|
||||
<g class="lg" filter="url(#gf)">
|
||||
<path d="M600 118 L662 218 L634 218 L626 198 L574 198 L566 218 L538 218 Z" fill="#e0a234"/>
|
||||
<path d="M600 143 L619 192 L581 192 Z" fill="#08101e"/>
|
||||
<!-- starfield -->
|
||||
<g fill="#cfe2ff">
|
||||
<circle cx="120" cy="60" r="1.4" opacity="0.7"><animate attributeName="opacity" values="0.2;0.9;0.2" dur="3.5s" repeatCount="indefinite"/></circle>
|
||||
<circle cx="300" cy="40" r="1" opacity="0.5"><animate attributeName="opacity" values="0.1;0.7;0.1" dur="4.2s" repeatCount="indefinite"/></circle>
|
||||
<circle cx="500" cy="70" r="1.2" opacity="0.6"><animate attributeName="opacity" values="0.2;0.8;0.2" dur="2.8s" repeatCount="indefinite"/></circle>
|
||||
<circle cx="760" cy="50" r="1" opacity="0.5"><animate attributeName="opacity" values="0.15;0.75;0.15" dur="3.9s" repeatCount="indefinite"/></circle>
|
||||
<circle cx="980" cy="80" r="1.5" opacity="0.7"><animate attributeName="opacity" values="0.2;0.9;0.2" dur="3.1s" repeatCount="indefinite"/></circle>
|
||||
<circle cx="1100" cy="55" r="1" opacity="0.5"><animate attributeName="opacity" values="0.1;0.7;0.1" dur="4.6s" repeatCount="indefinite"/></circle>
|
||||
<circle cx="180" cy="320" r="1.2" opacity="0.6"><animate attributeName="opacity" values="0.2;0.8;0.2" dur="3.3s" repeatCount="indefinite"/></circle>
|
||||
<circle cx="420" cy="340" r="1" opacity="0.5"><animate attributeName="opacity" values="0.1;0.6;0.1" dur="4.0s" repeatCount="indefinite"/></circle>
|
||||
<circle cx="880" cy="330" r="1.3" opacity="0.6"><animate attributeName="opacity" values="0.2;0.85;0.2" dur="2.9s" repeatCount="indefinite"/></circle>
|
||||
<circle cx="1060" cy="320" r="1" opacity="0.5"><animate attributeName="opacity" values="0.15;0.7;0.15" dur="3.7s" repeatCount="indefinite"/></circle>
|
||||
</g>
|
||||
|
||||
<!-- Orbiting service dots inner ring -->
|
||||
<circle class="o1" cx="600" cy="195" r="5" fill="#4ec98a" opacity="0.9"/>
|
||||
<circle class="o2" cx="600" cy="195" r="4.5" fill="#4a9fe2" opacity="0.9"/>
|
||||
<circle class="o3" cx="600" cy="195" r="5" fill="#9b8cf0" opacity="0.9"/>
|
||||
<!-- Outer ring -->
|
||||
<circle class="o4" cx="600" cy="195" r="4" fill="#e2655f" opacity="0.85"/>
|
||||
<circle class="o5" cx="600" cy="195" r="4.5" fill="#e0a234" opacity="0.85"/>
|
||||
<!-- orbital system, centered on the core -->
|
||||
<g transform="translate(600,190)" fill="none">
|
||||
<ellipse rx="250" ry="92" stroke="#1F6FE0" stroke-width="1" opacity="0.30"/>
|
||||
<ellipse rx="180" ry="66" stroke="#4EA0FF" stroke-width="1" opacity="0.40"/>
|
||||
<ellipse rx="120" ry="44" stroke="#4EA0FF" stroke-width="1.2" opacity="0.55"/>
|
||||
|
||||
<!-- Title -->
|
||||
<g class="ti">
|
||||
<text x="600" y="302" text-anchor="middle"
|
||||
font-family="-apple-system,BlinkMacSystemFont,'Segoe UI',system-ui,sans-serif"
|
||||
font-size="48" font-weight="700" letter-spacing="14" fill="#e8edf7">ATLAS OS</text>
|
||||
<!-- orbiting app nodes (blue), one gold accent -->
|
||||
<g>
|
||||
<circle cx="250" cy="0" r="4" fill="#4EA0FF"/>
|
||||
<animateTransform attributeName="transform" type="rotate" from="0 0 0" to="360 0 0" dur="26s" repeatCount="indefinite"/>
|
||||
</g>
|
||||
<g>
|
||||
<circle cx="180" cy="0" r="3.5" fill="#8EC2FF"/>
|
||||
<animateTransform attributeName="transform" type="rotate" from="120 0 0" to="480 0 0" dur="20s" repeatCount="indefinite"/>
|
||||
</g>
|
||||
<g>
|
||||
<circle cx="120" cy="0" r="3" fill="#D4A24C"/>
|
||||
<animateTransform attributeName="transform" type="rotate" from="240 0 0" to="600 0 0" dur="15s" repeatCount="indefinite"/>
|
||||
</g>
|
||||
|
||||
<!-- Subtitle -->
|
||||
<text x="600" y="336" text-anchor="middle"
|
||||
font-family="-apple-system,BlinkMacSystemFont,'Segoe UI',system-ui,sans-serif"
|
||||
font-size="13" letter-spacing="4.5" fill="#6c7a9c">YOUR BUSINESS · ONE BOX · BEYOND LIMITS</text>
|
||||
<!-- glowing blue core -->
|
||||
<circle r="70" fill="url(#coreGlow)" filter="url(#blur)"/>
|
||||
<circle r="30" fill="#0c1428" stroke="#4EA0FF" stroke-width="1.5"/>
|
||||
<circle r="30" fill="none" stroke="#4EA0FF" stroke-width="1.5" opacity="0.6">
|
||||
<animate attributeName="r" values="30;46;30" dur="4s" repeatCount="indefinite"/>
|
||||
<animate attributeName="opacity" values="0.6;0;0.6" dur="4s" repeatCount="indefinite"/>
|
||||
</circle>
|
||||
<!-- Atlas A mark -->
|
||||
<path d="M -13 14 L 0 -16 L 13 14 M -7 4 L 7 4" stroke="#8EC2FF" stroke-width="2.4" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</g>
|
||||
|
||||
<!-- Decorative line -->
|
||||
<line x1="390" y1="360" x2="810" y2="360" stroke="#e0a234" stroke-width="0.5" stroke-opacity="0.3"/>
|
||||
|
||||
<!-- Corner accents -->
|
||||
<line x1="20" y1="20" x2="60" y2="20" stroke="#e0a234" stroke-width="0.8" stroke-opacity="0.4"/>
|
||||
<line x1="20" y1="20" x2="20" y2="50" stroke="#e0a234" stroke-width="0.8" stroke-opacity="0.4"/>
|
||||
<line x1="1180" y1="20" x2="1140" y2="20" stroke="#e0a234" stroke-width="0.8" stroke-opacity="0.4"/>
|
||||
<line x1="1180" y1="20" x2="1180" y2="50" stroke="#e0a234" stroke-width="0.8" stroke-opacity="0.4"/>
|
||||
<line x1="20" y1="380" x2="60" y2="380" stroke="#e0a234" stroke-width="0.8" stroke-opacity="0.4"/>
|
||||
<line x1="20" y1="380" x2="20" y2="350" stroke="#e0a234" stroke-width="0.8" stroke-opacity="0.4"/>
|
||||
<line x1="1180" y1="380" x2="1140" y2="380" stroke="#e0a234" stroke-width="0.8" stroke-opacity="0.4"/>
|
||||
<line x1="1180" y1="380" x2="1180" y2="350" stroke="#e0a234" stroke-width="0.8" stroke-opacity="0.4"/>
|
||||
<!-- wordmark -->
|
||||
<text x="600" y="316" text-anchor="middle" font-size="50" font-weight="800" letter-spacing="6" fill="url(#word)">ATLAS OS</text>
|
||||
<text x="600" y="346" text-anchor="middle" font-size="14" font-weight="600" letter-spacing="3" fill="#7e93b8">SOVEREIGN AI COMMAND CENTER · ONE LOGIN · ANY DEVICE</text>
|
||||
</svg>
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 8.9 KiB After Width: | Height: | Size: 4.5 KiB |
BIN
assets/screenshots/hero.png
Normal file
BIN
assets/screenshots/hero.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.2 MiB |
BIN
assets/screenshots/platform.png
Normal file
BIN
assets/screenshots/platform.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 751 KiB |
BIN
assets/screenshots/workspace.png
Normal file
BIN
assets/screenshots/workspace.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 966 KiB |
54
docs/ai-stack.md
Normal file
54
docs/ai-stack.md
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
# The Atlas AI stack
|
||||
|
||||
Atlas runs AI on three principles: **route by cost** (free/local first, paid last), **review before write** (no autonomous money/comms/self-modify), and **keep a permanent spine** (every decision and event is logged and linkable).
|
||||
|
||||
```mermaid
|
||||
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#0c1428','primaryTextColor':'#cfe2ff','primaryBorderColor':'#1F6FE0','lineColor':'#4EA0FF','fontFamily':'monospace'}}}%%
|
||||
flowchart TB
|
||||
Senses[Senses · email · news · WhatsApp · bank]:::a --> Spine[(kernel.sqlite · the spine)]:::b
|
||||
Spine --> Brain[Atlas Brain · autonomous core]:::a
|
||||
Brain --> Gate{Policy gate}:::g
|
||||
Gate -->|money / comms / self-modify| Human[Human approval · Control screen]:::h
|
||||
Gate -->|safe| Router[LLM router :8888]:::a
|
||||
Router --> Local[Local · LLaMA · hermes3 · Qwen]:::c
|
||||
Router --> Cloud[Free cloud · Groq · Cerebras · OpenRouter]:::c
|
||||
Router --> Claude[Claude · paid · last resort]:::c
|
||||
classDef a fill:#0c1428,stroke:#4EA0FF,color:#cfe2ff
|
||||
classDef b fill:#145ED2,stroke:#8EC2FF,color:#fff
|
||||
classDef c fill:#080c18,stroke:#1F6FE0,color:#9fb8e0
|
||||
classDef g fill:#0c1428,stroke:#D4A24C,color:#D4A24C
|
||||
classDef h fill:#080c18,stroke:#4EA0FF,color:#cfe2ff
|
||||
```
|
||||
|
||||
## The spine — `kernel.sqlite`
|
||||
|
||||
The single source of operational memory. Senses feed it continuously; the Brain reads from it; every decision and event is appended and stays linkable across time. It is the answer to *"why did this happen?"* — one place, queryable, durable.
|
||||
|
||||
## The Brain — reviewed execution
|
||||
|
||||
The autonomous core reasons over the spine and proposes actions. It **never** writes to money, external communications, or its own configuration without explicit human approval through the Control screen. Daily brief at 07:45; accountability loop morning / midday / evening. A kill-switch lives in the app.
|
||||
|
||||
## The router — cost-tiered model selection
|
||||
|
||||
A single OpenAI-compatible endpoint (`localhost:8888`) picks the cheapest model that can do the job:
|
||||
|
||||
| Tier | Models | Used for |
|
||||
|---|---|---|
|
||||
| **Local (free)** | LLaMA 1B · hermes3 · Qwen Coder · Qwen 7B | classification, Dutch copy, code, summaries |
|
||||
| **Free cloud** | Groq `llama-3.3-70b` · Cerebras · OpenRouter | bulk 70B reasoning |
|
||||
| **Paid** | Claude (Sonnet / Opus) | multi-step reasoning, architecture — last resort |
|
||||
|
||||
The rule: never spend a paid token on a task a free model can handle.
|
||||
|
||||
## Context compression
|
||||
|
||||
A Headroom proxy sits in front of the Anthropic endpoint to compress context (fewer tokens per call) before requests leave the box — applied transparently to the Brain via `ANTHROPIC_BASE_URL`.
|
||||
|
||||
## Where AI surfaces in the OS
|
||||
|
||||
- **Atlas Chat** (Open WebUI) — ChatGPT-style UI over the local models or Claude.
|
||||
- **AI Gateway** — the router's HTTP face.
|
||||
- **Remote Desktop** — Claude Code runs inside the in-browser Linux desktop; the OAuth login works because the desktop has a real browser.
|
||||
- **Today / Inbox / Pipeline** — the Brain's briefs, drafts and lead reasoning rendered as cockpit panels.
|
||||
|
||||
> Honest status: the spine and router are live; full cross-device chat-history consolidation into the spine is a tracked follow-up, not yet complete.
|
||||
Loading…
Reference in a new issue