feat: Atlas-blue rebrand, real desktop preview, Academy + Islamic coverage

- header.svg rebuilt blue-dominant (gold demoted to accent)
- new assets: desktop-preview.svg, architecture.svg, os-screenshot.png (real render)
- README: blue badges, embedded hero + diagram, wiki link
- fix dead Tabler icon-font CDN (cdnjs 404 -> jsdelivr) in live + repo OS desktop
- fix broken ./docs/ai-stack.md badge link (file now exists)
- add docs/academy.md, docs/islamic-layer.md, docs/ai-stack.md
- SERVICES.md: Academy + Islamic layer sections

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Atlas Developer 2026-06-22 21:55:56 +02:00
parent 872bb00666
commit 19ad0057c8
10 changed files with 654 additions and 186 deletions

292
README.md
View file

@ -1,142 +1,258 @@
<div align="center">
<img src="./assets/header.svg" alt="Atlas OS" width="100%"/>
![Atlas OS](./assets/header.svg)
**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.
# Atlas OS
[![status](https://img.shields.io/badge/status-live-1F6FE0?style=for-the-badge&labelColor=050810)](https://command.atlascorporation.nl/os/)
[![apps](https://img.shields.io/badge/apps-39-4EA0FF?style=for-the-badge&labelColor=050810)](#-the-app-catalog)
[![sovereignty](https://img.shields.io/badge/hosting-EU--sovereign-145ED2?style=for-the-badge&labelColor=050810)](./docs/security.md)
[![identity](https://img.shields.io/badge/SSO-Authentik-4EA0FF?style=for-the-badge&labelColor=050810)](https://auth.atlascorporation.nl)
[![license](https://img.shields.io/badge/license-MIT-8EC2FF?style=for-the-badge&labelColor=050810)](./LICENSE)
[![Status](https://img.shields.io/badge/status-live-4ec98a?style=flat-square&logo=checkmarx&logoColor=white)](https://command.atlascorporation.nl/os/)
[![Containers](https://img.shields.io/badge/containers-55-4a9fe2?style=flat-square&logo=docker&logoColor=white)](./SERVICES.md)
[![Apps](https://img.shields.io/badge/apps-39-4a9fe2?style=flat-square&logo=windowsterminal&logoColor=white)](./SERVICES.md)
[![Stack](https://img.shields.io/badge/stack-Caddy_·_Authentik_·_Docker-1c4fae?style=flat-square&logo=cloudflare&logoColor=white)](./ARCHITECTURE.md)
[![AI](https://img.shields.io/badge/AI-LiteLLM_·_Ollama_·_Claude-9b8cf0?style=flat-square&logo=openai&logoColor=white)](./docs/ai-stack.md)
[![Wiki](https://img.shields.io/badge/docs-wiki-4a9fe2?style=flat-square&logo=readthedocs&logoColor=white)](https://git.atlascorporation.nl/chaib/atlas-os/wiki)
**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) · [📖 Wiki](https://git.atlascorporation.nl/chaib/atlas-os/wiki)
</div>
---
## What it is
## What is Atlas OS?
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.
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.
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.
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.
> Think of it as a Citrix-style desktop, but it's your own server, your own identity, your own data.
<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>
![Atlas OS desktop](./assets/desktop-preview.svg)
<sub>The Atlas OS desktop — categorized launcher, live cockpit panels, drag-and-drop windows. Served at <code>command.atlascorporation.nl/os/</code> behind SSO.</sub>
</div>
---
## ✦ The experience
| | |
|---|---|
| <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. |
**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
- 🎓 Atlas Academy — courses + lead capture wired to Odoo CRM
- 🕌 Islamic layer — Adhan at salah times, Quran at logon, family-safe DNS
- 🖥️ Remote Linux desktop — Webtop (XFCE + Claude Code + Chromium inside)
- 🔒 Authentik — SSO that gates every single service
- ...and more
---
## 🗺️ Architecture
## 🖥️ The Desktop
One box. One identity. Everything behind it.
Open `https://command.atlascorporation.nl/os/` on any device. You get a space-themed boot screen → Authentik SSO login → a live desktop with your real data: a categorized launcher (Cockpit · Identity · AI · Work · Files · Ops · Sites), drag-and-drop windows, a taskbar, and cockpit panels that auto-refresh.
**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.
---
## 🏗️ Architecture
<div align="center">
![Atlas OS architecture](./assets/architecture.svg)
</div>
One box. Caddy is the **sole** public entry point. Every public service passes through Authentik `forward_auth` before it's reached. Root-level access (SSH, the Webtop desktop) is Tailscale-only and never exposed to the public internet.
<details>
<summary>Interactive Mermaid diagram</summary>
```mermaid
%%{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
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
graph LR
subgraph Internet
U([User Browser])
iOS([iOS / Mobile])
end
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| MC[MeshCentral]
subgraph AIStack["AI Stack"]
AI --> OL[Ollama Local]
AI --> GR[Groq / Cerebras]
AI --> CL[Claude API]
AB[Atlas Brain] -->|15min| AI
AB --> ST[atlas-state.json]
ST --> OS
end
subgraph MeshNet["Mesh"]
NATS[NATS Event Bus] --> TS[Tailscale Devices]
end
end
U -->|HTTPS| C
iOS -->|Tailscale| TS
```
</details>
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)**
Full detail in [ARCHITECTURE.md](./ARCHITECTURE.md).
---
## 🧩 The app catalog
## 📦 Service Catalog
39 apps, live-verified (no dead tiles), grouped into a categorized launcher:
### 🎯 Cockpit (live data panels)
| App | Description |
|-----|-------------|
| Today | AI daily brief + accountability level |
| Money | Bank transactions via Enable Banking PSD2 |
| Inbox | Email + WhatsApp drafts, flagged items |
| Pipeline | Odoo CRM leads and deal status |
| Fleet | POS terminals, health, last-seen (MeshCentral) |
| Control | AI kill-switch, autonomy level, daily spend cap |
| 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 |
### 🛡️ Identity
| App | Description | URL |
|-----|-------------|-----|
| Authentik | SSO, OIDC, MFA — gates all services | [auth.atlascorporation.nl](https://auth.atlascorporation.nl) |
| Vaultwarden | Self-hosted Bitwarden (iOS app works) | [vault.atlascorporation.nl](https://vault.atlascorporation.nl) |
> **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)
### 🤖 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) |
See the full AI routing stack (local → free cloud → paid) in [docs/ai-stack.md](./docs/ai-stack.md).
### 💼 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](https://cloud.atlascorporation.nl) |
### 📁 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` |
### 🎓 Atlas Academy
A full education arm running on the same box — courses, coaching, and an ESF/BiSL/AI curriculum at [atlasacademy.nl](https://atlasacademy.nl). Lead capture posts straight into Odoo CRM via the `atlas-academy-relay` service (creates `crm.lead` records), with an email fallback. Product feed is wired to WooCommerce. See [docs/academy.md](./docs/academy.md).
### 🕌 Islamic Layer
A first-class part of the OS, not an add-on: family-safe DNS (AdGuard Family), Quran at logon, Adhan playback + screen lock at El Feth Tilburg salah times, and recurring sunnah reminders across the device fleet. See [docs/islamic-layer.md](./docs/islamic-layer.md).
### 🌐 Managed Sites
`atlasworks.nl` · `atlascorporation.nl` · `atlasagency.nl` · `atlasacademy.nl` · `atlaspos.nl` · `atlashub.nl` · `bicosagency.nl` · `budgetenergiecoach.nl` · `hkintercare.nl` · `jouwenergieadvies.nl` · `reclamemans.nl`
---
## 🛰️ Fleet, mesh & sovereignty
## 🤖 AI Stack
- **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 OS has a 4-tier AI routing stack — zero-cost local first, paid cloud only when needed. Full table and routing decision tree in **[docs/ai-stack.md](./docs/ai-stack.md)**.
| Tier | Example | Use |
|------|---------|-----|
| 0 — Local | `atlas-auto` (Ollama on RTX A2000) | Classification, Dutch copy, code, summaries |
| 1 — Free Cloud | Groq / Cerebras 70B · Gemini (1M ctx) | Fast reasoning, bulk tasks, vision |
| 2 — Paid | Claude Haiku / Sonnet / Opus | Code, multi-step reasoning, architecture |
**Always-on AI services:** `atlas-brain` (15-min signal cycle), `atlas-loop` (NATS nudges), `atlas-meridian` (autonomous decisions), `atlas-litellm` (unified proxy), Langfuse (full LLM tracing).
---
## 🎓 Atlas Academy
## 🚀 Quick Deploy
[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
> **Requirements:** Debian 12 or Ubuntu 24.04, a domain with DNS pointed at the server, a Tailscale account.
```bash
git clone https://git.atlascorporation.nl/chaib/atlas-os.git
git clone https://git.atlascorporation.nl/chaib/atlas-os
cd atlas-os
sudo bash deploy/install.sh # Debian/Ubuntu, Docker + Caddy
chmod +x deploy/install.sh
./deploy/install.sh --domain yourdomain.com --email admin@yourdomain.com
```
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)**.
The installer sets up Docker, Caddy, Tailscale, and the core compose stacks. After install, configure Authentik at `https://auth.yourdomain.com`, then log in to `https://command.yourdomain.com/os/`. Full guide: [deploy/README.md](./deploy/README.md).
---
## 📚 Docs & wiki
## 📁 Repository Structure
| | |
|---|---|
| [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 |
```
atlas-os/
├── assets/ # Animated header, desktop preview, architecture SVGs
├── web/os/index.html # The browser OS desktop (production copy)
├── server/ # Sanitized production Python (atlas_brain, meridian, ...)
│ └── systemd/ # Service unit files
├── scripts/ # Export + automation scripts
├── deploy/
│ ├── install.sh # One-command installer
│ ├── compose/ # atlas-core.yml (+ ai stack)
│ └── caddy/ # Caddyfile.template (Authentik SSO pattern)
├── docs/ # ai-stack · academy · islamic-layer · security · deployment
├── ARCHITECTURE.md · SERVICES.md · CHANGELOG.md · README.md
```
---
## 🔒 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 (E2E) · age-encrypted vault for sync · chmod 600 on disk |
| Remote desktop | Webtop is tailnet-only — never exposed to the public internet |
| Backups | `atlas-backup-*` services for Forgejo, Nextcloud, Authentik |
**Rule:** anything root-level stays tailnet-only. Public services must pass Authentik `forward_auth`. No bare basic-auth on the public internet. Full model in [docs/security.md](./docs/security.md).
---
## 🛠️ Tech Stack
[Caddy](https://caddyserver.com) · [Authentik](https://goauthentik.io) · Docker Compose · [Tailscale](https://tailscale.com) · [NATS](https://nats.io) · [Odoo 19](https://odoo.com) · [Nextcloud](https://nextcloud.com) · [Firefly III](https://firefly-iii.org) · [Paperless-ngx](https://docs.paperless-ngx.com) · [Stalwart](https://stalw.art) · [Forgejo](https://forgejo.org) · [n8n](https://n8n.io) · [Vaultwarden](https://github.com/dani-garcia/vaultwarden) · [LiteLLM](https://litellm.ai) · [Open-WebUI](https://openwebui.com) · [Langfuse](https://langfuse.com) · [Webtop](https://docs.linuxserver.io/images/docker-webtop/) · [MeshCentral](https://meshcentral.com) · [Uptime Kuma](https://uptime.kuma.pet) · [Ollama](https://ollama.com)
---
<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
<sub>MIT licensed · EU-sovereign · one login for all of it</sub>
⟡ [atlascorporation.nl](https://atlascorporation.nl) · [atlasworks.nl](https://atlasworks.nl) · [atlasacademy.nl](https://atlasacademy.nl) · [atlaspos.nl](https://atlaspos.nl) ⟡
*"Your business on one box — space grade."*
</div>

View file

@ -91,3 +91,21 @@ jouwenergieadvies.nl, reclamemans.nl
| atlas-backup-ak | Authentik daily backup |
| atlas-disk-api | Disk status API |
| atlas-eb-callback | Enable Banking PSD2 callback |
## Atlas Academy
| Service | URL |
|---------|-----|
| Academy site | atlasacademy.nl |
| Lead relay (Odoo) | /academy-lead -> 127.0.0.1:7793 (atlas-academy-relay) |
| Product feed | atlasworks.nl/academy-feed.php |
## Islamic Layer
| Component | Purpose |
|-----------|---------|
| AdGuard Family DNS | Family-safe DNS + hosts blocklist |
| HaramBlur | Browser content filtering |
| Quran at logon | Recitation on workstation login |
| Adhan + lock | Adhan + screen lock at El Feth Tilburg salah times |
| Sunnah reminders | Recurring fleet-wide reminders |

95
assets/architecture.svg Normal file
View file

@ -0,0 +1,95 @@
<svg width="1200" height="640" viewBox="0 0 1200 640" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Atlas OS architecture">
<defs>
<linearGradient id="abg" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#0a1832"/>
<stop offset="100%" stop-color="#050c1e"/>
</linearGradient>
<linearGradient id="caddy" x1="0" y1="0" x2="0" y2="1"><stop offset="0%" stop-color="#2b6fc4"/><stop offset="100%" stop-color="#1c4fae"/></linearGradient>
<linearGradient id="ak" x1="0" y1="0" x2="0" y2="1"><stop offset="0%" stop-color="#3a7d57"/><stop offset="100%" stop-color="#2c6043"/></linearGradient>
<style>
.t{font-family:'Segoe UI',Helvetica,Arial,sans-serif;fill:#dbe8ff}
.h{font-family:'Segoe UI',Helvetica,Arial,sans-serif;fill:#7fa8d8;font-size:12px;letter-spacing:2px;font-weight:700}
.b{font-family:'Segoe UI',Helvetica,Arial,sans-serif;fill:#cfe0fb;font-size:13px}
.s{font-family:'Segoe UI',Helvetica,Arial,sans-serif;fill:#90aede;font-size:10.5px}
.flow{stroke:#4a9fe2;stroke-opacity:.55;fill:none;stroke-width:1.6}
.dash{stroke:#9b8cf0;stroke-opacity:.5;fill:none;stroke-width:1.4;stroke-dasharray:5 4;animation:march 1.2s linear infinite}
@keyframes march{to{stroke-dashoffset:-18}}
</style>
<marker id="arr" markerWidth="9" markerHeight="9" refX="7" refY="4.5" orient="auto"><path d="M0 0 L9 4.5 L0 9 z" fill="#4a9fe2" fill-opacity="0.7"/></marker>
</defs>
<rect width="1200" height="640" fill="url(#abg)"/>
<text x="40" y="44" class="t" font-size="20" font-weight="700">Atlas OS — One Box, One Identity</text>
<text x="40" y="66" class="s" font-size="12.5">Hetzner CPX32 · 8 vCPU · 16 GB · Nuremberg — the entire stack on a single hardened server</text>
<!-- clients -->
<text x="40" y="110" class="h">CLIENTS</text>
<g>
<rect x="40" y="124" width="150" height="52" rx="10" fill="#11244a" stroke="#4a9fe2" stroke-opacity=".35"/>
<text x="115" y="148" class="b" text-anchor="middle">🌐 Browser</text>
<text x="115" y="166" class="s" text-anchor="middle">any device, HTTPS</text>
<rect x="40" y="190" width="150" height="52" rx="10" fill="#11244a" stroke="#9b8cf0" stroke-opacity=".4"/>
<text x="115" y="214" class="b" text-anchor="middle">📱 iOS / Laptop</text>
<text x="115" y="232" class="s" text-anchor="middle">Tailscale mesh</text>
</g>
<!-- Caddy -->
<text x="250" y="110" class="h">EDGE · TLS</text>
<rect x="250" y="124" width="150" height="118" rx="10" fill="url(#caddy)"/>
<text x="325" y="172" class="t" font-size="16" font-weight="700" text-anchor="middle">Caddy</text>
<text x="325" y="194" class="s" text-anchor="middle" fill="#cfe0fb">auto HTTPS</text>
<text x="325" y="210" class="s" text-anchor="middle" fill="#cfe0fb">sole public port</text>
<!-- Authentik -->
<text x="460" y="110" class="h">IDENTITY · SSO</text>
<rect x="460" y="124" width="150" height="118" rx="10" fill="url(#ak)"/>
<text x="535" y="166" class="t" font-size="16" font-weight="700" text-anchor="middle">Authentik</text>
<text x="535" y="188" class="s" text-anchor="middle" fill="#d6ecdf">forward_auth</text>
<text x="535" y="204" class="s" text-anchor="middle" fill="#d6ecdf">OIDC · MFA</text>
<text x="535" y="220" class="s" text-anchor="middle" fill="#d6ecdf">gates everything</text>
<!-- flows -->
<path class="flow" d="M190 150 H250" marker-end="url(#arr)"/>
<path class="dash" d="M190 216 C 220 216, 220 360, 110 360"/>
<path class="flow" d="M400 183 H460" marker-end="url(#arr)"/>
<path class="flow" d="M610 183 H680" marker-end="url(#arr)"/>
<!-- service tiers -->
<text x="680" y="110" class="h">SERVICES — behind SSO</text>
<g>
<rect x="680" y="124" width="480" height="58" rx="10" fill="#13294f" stroke="#4a9fe2" stroke-opacity=".3"/>
<text x="694" y="146" class="h" fill="#5f7bb0">CORE BUSINESS</text>
<text x="694" y="168" class="b">Odoo 19 · Nextcloud · Stalwart Mail · Forgejo · Vaultwarden</text>
<rect x="680" y="192" width="480" height="58" rx="10" fill="#13294f" stroke="#4a9fe2" stroke-opacity=".3"/>
<text x="694" y="214" class="h" fill="#5f7bb0">FINANCE &amp; OPS</text>
<text x="694" y="236" class="b">Firefly III · Enable Banking · Paperless · n8n · Uptime Kuma</text>
<rect x="680" y="260" width="480" height="72" rx="10" fill="#13294f" stroke="#9b8cf0" stroke-opacity=".4"/>
<text x="694" y="282" class="h" fill="#8a7ce0">AI &amp; INTELLIGENCE</text>
<text x="694" y="304" class="b">LiteLLM · Open-WebUI · Langfuse · Atlas Brain (15-min cycle)</text>
<text x="694" y="322" class="s">local Ollama → Groq/Cerebras (free) → Claude (paid) · NATS event bus</text>
<rect x="680" y="342" width="480" height="58" rx="10" fill="#13294f" stroke="#e0a234" stroke-opacity=".4"/>
<text x="694" y="364" class="h" fill="#c9921f">FLEET &amp; DESKTOP</text>
<text x="694" y="386" class="b">MeshCentral · Webtop Linux desktop · POS terminals · heartbeats</text>
</g>
<!-- Atlas Brain cycle -->
<text x="40" y="300" class="h">ATLAS BRAIN · every 15 min</text>
<rect x="40" y="314" width="360" height="96" rx="10" fill="#101f42" stroke="#9b8cf0" stroke-opacity=".4"/>
<text x="56" y="340" class="b">📧 7 mailboxes → 🏢 Odoo CRM → 🏦 bank feed</text>
<text x="56" y="362" class="s">↓ atlas-state.json</text>
<text x="56" y="382" class="b">🤖 LLM synthesis → daily brief</text>
<text x="56" y="400" class="s">→ Today · Money · Inbox · Pipeline panels</text>
<!-- managed sites -->
<text x="40" y="452" class="h">11 MANAGED SITES</text>
<rect x="40" y="466" width="1120" height="58" rx="10" fill="#0e1d3c" stroke="#4a9fe2" stroke-opacity=".25"/>
<text x="56" y="490" class="b">atlasworks.nl · atlascorporation.nl · atlasagency.nl · atlasacademy.nl · atlaspos.nl · atlashub.nl</text>
<text x="56" y="510" class="s">bicosagency.nl · budgetenergiecoach.nl · hkintercare.nl · jouwenergieadvies.nl · reclamemans.nl — all via Caddy</text>
<!-- footer rule -->
<rect x="40" y="560" width="1120" height="44" rx="10" fill="#0c1830"/>
<text x="60" y="588" class="s" fill="#7fa8d8">🔒 Public services pass Authentik forward_auth · root-level (SSH, remote desktop) is Tailscale-only · secrets chmod 600 · no bare basic-auth on the public internet</text>
</svg>

After

Width:  |  Height:  |  Size: 6.2 KiB

109
assets/desktop-preview.svg Normal file
View file

@ -0,0 +1,109 @@
<svg width="1200" height="740" viewBox="0 0 1200 740" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Atlas OS desktop preview">
<defs>
<linearGradient id="dbg" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#0b1a3a"/>
<stop offset="100%" stop-color="#060e22"/>
</linearGradient>
<linearGradient id="bar" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#0f2348"/>
<stop offset="100%" stop-color="#0a1838"/>
</linearGradient>
<linearGradient id="tile" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#16284e"/>
<stop offset="100%" stop-color="#0e1d3c"/>
</linearGradient>
<radialGradient id="halo" cx="50%" cy="0%" r="90%">
<stop offset="0%" stop-color="#1c4fae" stop-opacity="0.45"/>
<stop offset="100%" stop-color="#1c4fae" stop-opacity="0"/>
</radialGradient>
<style>
.lbl{font-family:'Segoe UI',Helvetica,Arial,sans-serif;fill:#cfe0fb}
.cat{font-family:'Segoe UI',Helvetica,Arial,sans-serif;fill:#5f7bb0;font-size:12px;letter-spacing:2px;font-weight:600}
.tl{font-family:'Segoe UI',Helvetica,Arial,sans-serif;fill:#aec6ee;font-size:12px;text-anchor:middle}
.glyph{font-family:'Segoe UI Symbol','Segoe UI',sans-serif;font-size:22px;text-anchor:middle}
.blink{animation:bl 2.5s ease-in-out infinite}
@keyframes bl{0%,100%{opacity:1}50%{opacity:.35}}
</style>
</defs>
<rect width="1200" height="740" rx="14" fill="url(#dbg)"/>
<rect width="1200" height="300" fill="url(#halo)"/>
<!-- top bar -->
<rect width="1200" height="46" rx="14" fill="url(#bar)"/>
<rect y="32" width="1200" height="14" fill="url(#bar)"/>
<text x="24" y="29" class="lbl" font-size="15" font-weight="600">⌂ Atlas OS</text>
<circle class="blink" cx="150" cy="23" r="4" fill="#4ec98a"/>
<text x="162" y="27" class="lbl" font-size="12" fill="#4ec98a">SSO verified</text>
<text x="1060" y="27" class="lbl" font-size="13" fill="#9fb8e6">21:47</text>
<circle cx="1120" cy="23" r="11" fill="#1c4fae"/>
<text x="1120" y="27" class="lbl" font-size="11" text-anchor="middle" fill="#eaf3ff">CA</text>
<text x="1140" y="27" class="lbl" font-size="13">Chaib </text>
<!-- category: Cockpit -->
<text x="40" y="86" class="cat">COCKPIT</text>
<g>
<g transform="translate(40,98)"><rect width="62" height="62" rx="14" fill="url(#tile)" stroke="#4a9fe2" stroke-opacity="0.25"/><text x="31" y="40" class="glyph" fill="#4ec98a">💰</text></g>
<text x="71" y="178" class="tl">Money</text>
<g transform="translate(120,98)"><rect width="62" height="62" rx="14" fill="url(#tile)" stroke="#4a9fe2" stroke-opacity="0.25"/><text x="31" y="40" class="glyph" fill="#4a9fe2">📬</text></g>
<text x="151" y="178" class="tl">Inbox</text>
<g transform="translate(200,98)"><rect width="62" height="62" rx="14" fill="url(#tile)" stroke="#4a9fe2" stroke-opacity="0.25"/><text x="31" y="40" class="glyph" fill="#9b8cf0">📈</text></g>
<text x="231" y="178" class="tl">Pipeline</text>
<g transform="translate(280,98)"><rect width="62" height="62" rx="14" fill="url(#tile)" stroke="#e0a234" stroke-opacity="0.5"/><text x="31" y="40" class="glyph" fill="#e0a234">📊</text></g>
<text x="311" y="178" class="tl">Today</text>
<g transform="translate(360,98)"><rect width="62" height="62" rx="14" fill="url(#tile)" stroke="#4a9fe2" stroke-opacity="0.25"/><text x="31" y="40" class="glyph" fill="#e2655f">🚀</text></g>
<text x="391" y="178" class="tl">Fleet</text>
<g transform="translate(440,98)"><rect width="62" height="62" rx="14" fill="url(#tile)" stroke="#4a9fe2" stroke-opacity="0.25"/><text x="31" y="40" class="glyph" fill="#7fb6f0"></text></g>
<text x="471" y="178" class="tl">Control</text>
</g>
<!-- category: Identity + AI -->
<text x="40" y="222" class="cat">IDENTITY</text>
<g transform="translate(40,234)"><rect width="62" height="62" rx="14" fill="url(#tile)" stroke="#4a9fe2" stroke-opacity="0.25"/><text x="31" y="40" class="glyph" fill="#4ec98a">🛡</text></g>
<text x="71" y="314" class="tl">Authentik</text>
<g transform="translate(120,234)"><rect width="62" height="62" rx="14" fill="url(#tile)" stroke="#4a9fe2" stroke-opacity="0.25"/><text x="31" y="40" class="glyph" fill="#e0a234">🔒</text></g>
<text x="151" y="314" class="tl">Vault</text>
<text x="260" y="222" class="cat">AI</text>
<g transform="translate(260,234)"><rect width="62" height="62" rx="14" fill="url(#tile)" stroke="#4a9fe2" stroke-opacity="0.25"/><text x="31" y="40" class="glyph" fill="#4a9fe2">💬</text></g>
<text x="291" y="314" class="tl">Atlas Chat</text>
<g transform="translate(340,234)"><rect width="62" height="62" rx="14" fill="url(#tile)" stroke="#4a9fe2" stroke-opacity="0.25"/><text x="31" y="40" class="glyph" fill="#9b8cf0">🧠</text></g>
<text x="371" y="314" class="tl">AI Gateway</text>
<g transform="translate(420,234)"><rect width="62" height="62" rx="14" fill="url(#tile)" stroke="#4a9fe2" stroke-opacity="0.25"/><text x="31" y="40" class="glyph" fill="#5b8be8">🗺</text></g>
<text x="451" y="314" class="tl">Mindmap</text>
<g transform="translate(500,234)"><rect width="62" height="62" rx="14" fill="url(#tile)" stroke="#4a9fe2" stroke-opacity="0.25"/><text x="31" y="40" class="glyph" fill="#4ec98a">🎓</text></g>
<text x="531" y="314" class="tl">Leeragent</text>
<!-- sample window: Today brief -->
<g transform="translate(640,90)">
<rect width="520" height="370" rx="12" fill="#0d1d3e" stroke="#4a9fe2" stroke-opacity="0.4"/>
<rect width="520" height="38" rx="12" fill="#13294f"/>
<rect y="26" width="520" height="12" fill="#13294f"/>
<text x="16" y="25" class="lbl" font-size="13" font-weight="600">📊 Today — Daily Brief</text>
<circle cx="498" cy="19" r="5" fill="#e2655f"/>
<text x="20" y="78" class="lbl" font-size="13" fill="#7fa8d8">MONDAY 22 JUNE · 21:47</text>
<text x="20" y="108" class="lbl" font-size="16" font-weight="600">Good evening, Chaib.</text>
<text x="20" y="138" class="lbl" font-size="12.5" fill="#aec6ee">3 leads need follow-up · 2 invoices due this week</text>
<text x="20" y="158" class="lbl" font-size="12.5" fill="#aec6ee">Bank balance synced · all POS terminals online</text>
<rect x="20" y="180" width="230" height="70" rx="8" fill="#11244a"/>
<text x="34" y="206" class="lbl" font-size="11" fill="#5f7bb0">REVENUE FOCUS</text>
<text x="34" y="230" class="lbl" font-size="15" font-weight="600" fill="#4ec98a">AtlasPOS</text>
<text x="34" y="245" class="lbl" font-size="10.5" fill="#7fa8d8">€79/mo · Tilburg horeca</text>
<rect x="270" y="180" width="230" height="70" rx="8" fill="#11244a"/>
<text x="284" y="206" class="lbl" font-size="11" fill="#5f7bb0">AUTONOMY</text>
<text x="284" y="230" class="lbl" font-size="15" font-weight="600" fill="#e0a234">Level 3 — Supervised</text>
<text x="284" y="245" class="lbl" font-size="10.5" fill="#7fa8d8">spend cap active</text>
<text x="20" y="288" class="lbl" font-size="11" fill="#5f7bb0">SYNTHESIZED BY</text>
<text x="20" y="308" class="lbl" font-size="12.5" fill="#aec6ee">atlas-brain · atlas-auto → Groq 70B → Claude</text>
<rect x="20" y="326" width="120" height="28" rx="6" fill="#1c4fae"/>
<text x="80" y="345" class="tl" fill="#eaf3ff">Open Pipeline</text>
<rect x="150" y="326" width="100" height="28" rx="6" fill="#11244a" stroke="#4a9fe2" stroke-opacity="0.4"/>
<text x="200" y="345" class="tl">Refresh</text>
</g>
<!-- taskbar -->
<rect y="694" width="1200" height="46" fill="url(#bar)"/>
<rect x="24" y="706" width="120" height="22" rx="6" fill="#1c4fae"/>
<text x="84" y="721" class="tl" fill="#eaf3ff">📊 Today</text>
<text x="1000" y="721" class="lbl" font-size="11" fill="#5f7bb0">39 apps · 55 containers · one box</text>
</svg>

After

Width:  |  Height:  |  Size: 7.7 KiB

View file

@ -1,71 +1,115 @@
<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">
<svg width="1200" height="400" viewBox="0 0 1200 400" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Atlas OS">
<defs>
<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 id="bg" cx="50%" cy="42%" r="75%">
<stop offset="0%" stop-color="#0e2350"/>
<stop offset="45%" stop-color="#081637"/>
<stop offset="100%" stop-color="#020812"/>
</radialGradient>
<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 id="neb1" cx="50%" cy="50%" r="50%">
<stop offset="0%" stop-color="#2f6fd0" stop-opacity="0.55"/>
<stop offset="100%" stop-color="#2f6fd0" stop-opacity="0"/>
</radialGradient>
<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"/>
<radialGradient id="neb2" cx="50%" cy="50%" r="50%">
<stop offset="0%" stop-color="#1c4fae" stop-opacity="0.5"/>
<stop offset="100%" stop-color="#1c4fae" stop-opacity="0"/>
</radialGradient>
<radialGradient id="neb3" cx="50%" cy="50%" r="50%">
<stop offset="0%" stop-color="#5b8be8" stop-opacity="0.35"/>
<stop offset="100%" stop-color="#5b8be8" stop-opacity="0"/>
</radialGradient>
<linearGradient id="aGrad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#79b6ff"/>
<stop offset="55%" stop-color="#4a9fe2"/>
<stop offset="100%" stop-color="#2b6fc4"/>
</linearGradient>
<filter id="blur"><feGaussianBlur stdDeviation="6"/></filter>
<linearGradient id="txt" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" stop-color="#eaf3ff"/>
<stop offset="100%" stop-color="#7fb6f0"/>
</linearGradient>
<filter id="glow" x="-60%" y="-60%" width="220%" height="220%">
<feGaussianBlur stdDeviation="5" result="b"/>
<feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge>
</filter>
<filter id="softglow" x="-80%" y="-80%" width="260%" height="260%">
<feGaussianBlur stdDeviation="9"/>
</filter>
<style>
.s1{animation:t1 3.2s ease-in-out infinite}
.s2{animation:t2 4.1s ease-in-out infinite}
.s3{animation:t3 2.6s ease-in-out infinite}
.s4{animation:t4 5s ease-in-out infinite}
@keyframes t1{0%,100%{opacity:.25}50%{opacity:1}}
@keyframes t2{0%,100%{opacity:.5}50%{opacity:.15}}
@keyframes t3{0%,100%{opacity:.2}40%{opacity:.95}}
@keyframes t4{0%,100%{opacity:.7}50%{opacity:.3}}
.orb{transform-origin:600px 196px}
.o1{animation:spin 22s linear infinite}
.o2{animation:spin 22s linear infinite;animation-delay:-11s}
.o3{animation:spin 38s linear infinite}
.o4{animation:spin 38s linear infinite;animation-delay:-19s}
.o5{animation:spin 38s linear infinite;animation-delay:-28s}
@keyframes spin{to{transform:rotate(360deg)}}
.title{animation:float 6s ease-in-out infinite}
@keyframes float{0%,100%{transform:translateY(0)}50%{transform:translateY(-5px)}}
.pulse{animation:pulse 4s ease-in-out infinite}
@keyframes pulse{0%,100%{opacity:.6}50%{opacity:1}}
</style>
</defs>
<rect width="1200" height="380" fill="url(#space)"/>
<rect width="1200" height="400" fill="url(#bg)"/>
<ellipse cx="290" cy="150" rx="300" ry="220" fill="url(#neb1)"/>
<ellipse cx="940" cy="250" rx="320" ry="200" fill="url(#neb2)"/>
<ellipse cx="600" cy="196" rx="260" ry="180" fill="url(#neb3)"/>
<!-- 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 fill="#dce9ff">
<circle class="s1" cx="80" cy="60" r="1.6"/><circle class="s3" cx="150" cy="120" r="1.1"/>
<circle class="s2" cx="210" cy="40" r="1.4"/><circle class="s4" cx="300" cy="90" r="1"/>
<circle class="s1" cx="120" cy="200" r="1.2"/><circle class="s3" cx="60" cy="300" r="1.5"/>
<circle class="s2" cx="180" cy="330" r="1.1"/><circle class="s4" cx="260" cy="270" r="1.3"/>
<circle class="s1" cx="360" cy="320" r="1"/><circle class="s3" cx="420" cy="60" r="1.4"/>
<circle class="s2" cx="480" cy="130" r="1.1"/><circle class="s4" cx="520" cy="300" r="1.2"/>
<circle class="s1" cx="700" cy="50" r="1.3"/><circle class="s3" cx="760" cy="110" r="1"/>
<circle class="s2" cx="820" cy="60" r="1.5"/><circle class="s4" cx="880" cy="120" r="1.1"/>
<circle class="s1" cx="950" cy="70" r="1.2"/><circle class="s3" cx="1020" cy="130" r="1.4"/>
<circle class="s2" cx="1080" cy="70" r="1.1"/><circle class="s4" cx="1140" cy="120" r="1.3"/>
<circle class="s1" cx="980" cy="300" r="1.2"/><circle class="s3" cx="1050" cy="330" r="1"/>
<circle class="s2" cx="1110" cy="280" r="1.5"/><circle class="s4" cx="1160" cy="330" r="1.1"/>
<circle class="s1" cx="640" cy="340" r="1.2"/><circle class="s3" cx="720" cy="330" r="1.3"/>
<circle class="s2" cx="560" cy="350" r="1"/><circle class="s4" cx="900" cy="330" r="1.2"/>
<circle class="s1" cx="40" cy="160" r="1"/><circle class="s3" cx="1170" cy="200" r="1.2"/>
</g>
<!-- 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"/>
<!-- orbit rings -->
<circle cx="600" cy="196" r="102" fill="none" stroke="#4a9fe2" stroke-opacity="0.28" stroke-width="1"/>
<circle cx="600" cy="196" r="150" fill="none" stroke="#79b6ff" stroke-opacity="0.16" stroke-width="1"/>
<!-- 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>
<!-- orbiting dots (blue, one gold accent) -->
<g class="orb o1"><circle cx="702" cy="196" r="3.2" fill="#79b6ff" filter="url(#softglow)"/></g>
<g class="orb o2"><circle cx="702" cy="196" r="2.4" fill="#4a9fe2"/></g>
<g class="orb o3"><circle cx="750" cy="196" r="3.6" fill="#e0a234" filter="url(#softglow)"/></g>
<g class="orb o4"><circle cx="750" cy="196" r="2.6" fill="#acd2ff"/></g>
<g class="orb o5"><circle cx="750" cy="196" r="2.2" fill="#4a9fe2"/></g>
<!-- 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"/>
<!-- Atlas A logo -->
<g filter="url(#glow)">
<path d="M600 116 L664 218 L634 218 L626 198 L574 198 L566 218 L536 218 Z" fill="url(#aGrad)"/>
<path d="M600 142 L619 192 L581 192 Z" fill="#081637"/>
<path d="M600 116 L664 218 L634 218 L626 198 L574 198 L566 218 L536 218 Z" fill="none" stroke="#e0a234" stroke-opacity="0.6" stroke-width="1.2"/>
</g>
<circle class="pulse" cx="600" cy="196" r="3" fill="#eaf3ff"/>
<!-- wordmark -->
<text x="600" y="316" text-anchor="middle" font-size="50" font-weight="800" letter-spacing="6" fill="url(#word)">ATLAS&#160;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 &#183; ONE LOGIN &#183; ANY DEVICE</text>
<g class="title">
<text x="600" y="304" text-anchor="middle" font-family="'Segoe UI',Helvetica,Arial,sans-serif" font-size="50" font-weight="700" letter-spacing="14" fill="url(#txt)">ATLAS OS</text>
<text x="600" y="338" text-anchor="middle" font-family="'Segoe UI',Helvetica,Arial,sans-serif" font-size="13" font-weight="500" letter-spacing="5" fill="#7fa8d8">YOUR BUSINESS · ONE BOX · BEYOND LIMITS</text>
</g>
<!-- corner accents -->
<g stroke="#4a9fe2" stroke-opacity="0.5" stroke-width="1.5" fill="none">
<path d="M24 24 L24 56 M24 24 L56 24"/>
<path d="M1176 24 L1176 56 M1176 24 L1144 24"/>
<path d="M24 376 L24 344 M24 376 L56 376"/>
<path d="M1176 376 L1176 344 M1176 376 L1144 376"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

BIN
assets/os-screenshot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

40
docs/academy.md Normal file
View file

@ -0,0 +1,40 @@
# Atlas Academy
The education arm of Atlas Corporation, running on the same box: [atlasacademy.nl](https://atlasacademy.nl). Coaching, courses, and a curriculum spanning ESF-funded tracks, BiSL, startup, and AI.
## Hosting
Served as static HTML + a PHP product feed via nginx (TransIP subsite), fronted by the same brand and analytics as the rest of the stack.
**Key pages:** `index`, `coaching`, `cursussen`, `pricing`, `leerpad`, `shop`, `esf`, `bisl`, plus per-course pages (`cursussen/bisl`, `cursussen/startup`, `cursussen/ai`).
## Lead capture → Odoo CRM
Academy leads flow straight into the operator's Odoo CRM as `crm.lead` records — no manual re-entry.
```
Academy page (form)
│ POST { name, email, interest, source }
atlas-academy-relay (systemd on atlas-01, port 7793)
├─► Odoo → creates crm.lead, returns { ok: true, lead_id: N }
└─► email fallback → info@atlascorporation.nl
```
The relay is exposed via Caddy at `/academy-lead` (proxied to `127.0.0.1:7793`). It caches the Odoo UID so it doesn't re-authenticate on every lead.
## Product feed
Courses and hardware bundles are pulled from WooCommerce via a JSON feed, so the Academy shop stays in sync with the live store without duplicating product data.
```
GET https://www.atlasworks.nl/academy-feed.php
→ { ts, count, products[] } # each: { id, title, price, type, img, url, cats }
```
Product types: `laptop`, `desktop`, `monitor`, `accessory`, `bundle`, `pos`.
## Principle
Academy content follows the same hard rule as the rest of Atlas OS: **no fabricated data.** No invented student counts, testimonials, ratings, or review quotes — sections are left as placeholders or omitted until real data exists.

View file

@ -1,54 +1,69 @@
# The Atlas AI stack
# 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).
Atlas OS routes every AI task by cost and complexity. The rule: **never burn paid tokens on work a free or local model can handle.** Free tier first, escalate only when it can't cope.
```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
## Tier 0 — Zero-cost local (`localhost:8888/v1`, RTX A2000)
An OpenAI-compatible router exposes local Ollama models. Used for all non-critical subagent work, copy, summaries, translations, and classification.
| Alias | Backing | Use for |
|-------|---------|---------|
| `atlas-fast` | LLaMA 1B | Ultra-fast classification, routing, labels |
| `atlas-free` | Hermes3 | Dutch copy, summaries, FAQ, product descriptions |
| `atlas-code` | Qwen Coder | Code completion, simple fixes, boilerplate |
| `atlas-qwen` | qwen2.5 | General Dutch content, emails |
| `atlas-phi3` | qwen2.5:7b | Reasoning, analysis, comparisons |
| `atlas-auto` | smart router | Auto-picks the best free local model |
```python
import openai
client = openai.OpenAI(base_url="http://localhost:8888/v1", api_key="atlas")
client.chat.completions.create(model="atlas-auto", messages=[{"role":"user","content":"..."}])
```
## The spine — `kernel.sqlite`
## Tier 1 — Free cloud APIs
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.
| Provider | Models | Best for |
|----------|--------|----------|
| Groq | llama-3.3-70b-versatile, mixtral-8x7b | Fast 70B reasoning, bulk tasks |
| Cerebras | llama-3.1-70b | Fastest inference, free tier |
| OpenRouter | 50+ free models incl. Gemini | Multi-model fallback |
| Gemini (via OpenRouter) | gemini-2.5-pro / 3.5-flash | 1M context, vision, PDF |
## The Brain — reviewed execution
## Tier 2 — Paid Anthropic (only when free tiers can't cope)
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.
| Task | Model |
|------|-------|
| Simple classification, short copy | `claude-haiku-4-5` |
| Code, multi-step reasoning, planning | `claude-sonnet-4-6` |
| Deep research, architecture, complex builds | `claude-opus-4-8` |
## The router — cost-tiered model selection
## Routing decision tree
A single OpenAI-compatible endpoint (`localhost:8888`) picks the cheapest model that can do the job:
```
copy / text / translation / summary / Dutch content
→ atlas-free (local) or Groq llama-3.3-70b (free cloud)
simple code / boilerplate / fix
→ atlas-code (local) or Cerebras (free cloud)
non-critical workflow subagent
→ atlas-auto or Groq (never Claude)
multi-step code / planning / complex reasoning
→ claude-sonnet-4-6
deep architecture / research / competitive analysis
→ claude-opus-4-8 or gemini-2.5-pro (free)
1M context / vision / PDF
→ Gemini via OpenRouter
```
| 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 |
## Always-on AI services
The rule: never spend a paid token on a task a free model can handle.
| Service | What it does |
|---------|-------------|
| `atlas-brain` | Collects mail + CRM + bank every 15 min → synthesizes the 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 models above) |
| NATS mesh | Real-time event bus across all devices on the tailnet |
| Langfuse | Full LLM observability — every call traced with latency, cost, tokens |
## 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.
All model calls flow through the LiteLLM proxy so cost and latency are traced centrally in Langfuse, regardless of which tier served the request.

31
docs/islamic-layer.md Normal file
View file

@ -0,0 +1,31 @@
# Islamic Layer
A first-class part of Atlas OS — woven into the OS and the device fleet, not bolted on. Live since 2026-05-09.
## Components
| Layer | What it does |
|-------|-------------|
| Family-safe DNS | AdGuard Family + a hosts blocklist across the network |
| Content filtering | HaramBlur on browsers |
| Quran at logon | Recitation plays when the workstation logs in |
| Adhan + lock | At El Feth Tilburg salah times, the Adhan plays and the screen locks |
| Sunnah reminders | Recurring reminders surfaced across the device fleet |
## Salah timing
Prayer times track **El Feth Mosque, Tilburg**. At each salah time the fleet plays the Adhan and locks the active screen — a deliberate, enforced pause rather than a passive notification.
## Where it lives
All assets and scripts are under the Atlas artifacts tree:
```
Sync/atlas-artifacts/atlas-os/islamic/
```
This keeps the layer versioned and reproducible alongside the rest of the Atlas OS configuration, and syncs across devices through the same Syncthing topology as the other artifacts.
## Principle
The Islamic layer is treated as core infrastructure: it ships with the OS, runs on the fleet by default, and is documented and version-controlled like every other service.

View file

@ -5,7 +5,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<meta name="theme-color" content="#0b1020">
<title>Atlas OS</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/tabler-icons/2.47.0/iconfont/tabler-icons.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@2.47.0/tabler-icons.min.css">
<style>
*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%;background:#0b1020;color:#e8edf7;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;overflow:hidden;user-select:none}