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:
parent
872bb00666
commit
19ad0057c8
10 changed files with 654 additions and 186 deletions
292
README.md
292
README.md
|
|
@ -1,142 +1,258 @@
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
<img src="./assets/header.svg" alt="Atlas OS" width="100%"/>
|

|
||||||
|
|
||||||
**A sovereign, browser-native AI operating system.**
|
# Atlas OS
|
||||||
Log in with your identity → your entire operation as apps on one desktop. No install. Any device. One login.
|
|
||||||
|
|
||||||
[](https://command.atlascorporation.nl/os/)
|
[](https://command.atlascorporation.nl/os/)
|
||||||
[](#-the-app-catalog)
|
[](./SERVICES.md)
|
||||||
[](./docs/security.md)
|
[](./SERVICES.md)
|
||||||
[](https://auth.atlascorporation.nl)
|
[](./ARCHITECTURE.md)
|
||||||
[](./LICENSE)
|
[](./docs/ai-stack.md)
|
||||||
|
[](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>
|
</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">
|
<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>
|

|
||||||
|
|
||||||
|
<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>
|
</div>
|
||||||
|
|
||||||
---
|
**What runs on it:**
|
||||||
|
- 🏢 Odoo 19 ERP/CRM — full business operations
|
||||||
## ✦ The experience
|
- 💶 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
|
||||||
| <img src="./assets/screenshots/hero.png" width="100%"/> | <img src="./assets/screenshots/platform.png" width="100%"/> |
|
- 🕌 Islamic layer — Adhan at salah times, Quran at logon, family-safe DNS
|
||||||
| **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. |
|
- 🖥️ 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">
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
</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
|
```mermaid
|
||||||
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#0c1428','primaryTextColor':'#cfe2ff','primaryBorderColor':'#1F6FE0','lineColor':'#4EA0FF','fontFamily':'monospace'}}}%%
|
graph LR
|
||||||
graph TB
|
subgraph Internet
|
||||||
User([Any device]):::u --> Caddy[Caddy · TLS + edge]:::edge
|
U([User Browser])
|
||||||
Caddy --> Auth{{Authentik SSO}}:::id
|
iOS([iOS / Mobile])
|
||||||
Auth --> OS[Atlas OS desktop]:::os
|
end
|
||||||
Auth --> Apps[39 apps]:::os
|
subgraph atlas-01["atlas-01 · Hetzner CPX32"]
|
||||||
OS --> Mind[The Mind · cockpit + spine]:::ai
|
direction TB
|
||||||
Mind --> Brain[Atlas Brain · reviewed execution]:::ai
|
C[Caddy TLS]
|
||||||
Brain --> Router[LLM router · local → Groq → Claude]:::ai
|
A[Authentik SSO]
|
||||||
Apps --> Stack[Odoo · Nextcloud · Firefly · Paperless · n8n · Forgejo · Vault · Stalwart]:::svc
|
C -->|forward_auth| A
|
||||||
Caddy --> Fleet[Fleet · MeshCentral + Tailscale + NATS mesh]:::fleet
|
A -->|verified| OS[Atlas OS Desktop]
|
||||||
Caddy --> Sites[Client sites · WordPress · POS · Academy]:::site
|
A -->|verified| OD[Odoo ERP]
|
||||||
|
A -->|verified| NC[Nextcloud]
|
||||||
classDef u fill:#050810,stroke:#4EA0FF,color:#8EC2FF
|
A -->|verified| AI[AI Gateway LiteLLM]
|
||||||
classDef edge fill:#0c1428,stroke:#1F6FE0,color:#cfe2ff
|
A -->|verified| FG[Forgejo Git]
|
||||||
classDef id fill:#145ED2,stroke:#4EA0FF,color:#fff
|
A -->|verified| MC[MeshCentral]
|
||||||
classDef os fill:#0c1428,stroke:#4EA0FF,color:#cfe2ff
|
subgraph AIStack["AI Stack"]
|
||||||
classDef ai fill:#0c1428,stroke:#8EC2FF,color:#cfe2ff
|
AI --> OL[Ollama Local]
|
||||||
classDef svc fill:#080c18,stroke:#1F6FE0,color:#9fb8e0
|
AI --> GR[Groq / Cerebras]
|
||||||
classDef fleet fill:#080c18,stroke:#1F6FE0,color:#9fb8e0
|
AI --> CL[Claude API]
|
||||||
classDef site fill:#080c18,stroke:#145ED2,color:#9fb8e0
|
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 |
|
### 🛡️ Identity
|
||||||
|---|---|
|
| App | Description | URL |
|
||||||
| **Cockpit** | Today · Money · Inbox · Pipeline · Fleet · Control |
|
|-----|-------------|-----|
|
||||||
| **Identity** | Authentik SSO · Vaultwarden |
|
| Authentik | SSO, OIDC, MFA — gates all services | [auth.atlascorporation.nl](https://auth.atlascorporation.nl) |
|
||||||
| **AI** | Atlas Chat (Open WebUI) · AI Gateway · Mindmap · Leeragent |
|
| Vaultwarden | Self-hosted Bitwarden (iOS app works) | [vault.atlascorporation.nl](https://vault.atlascorporation.nl) |
|
||||||
| **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)
|
### 🤖 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.
|
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)**.
|
||||||
- **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).
|
| Tier | Example | Use |
|
||||||
- **EU-sovereign** — Hetzner (NL/DE), no US Cloud Act exposure, MFA, nightly backups. → [docs/security.md](./docs/security.md)
|
|------|---------|-----|
|
||||||
|
| 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.
|
> **Requirements:** Debian 12 or Ubuntu 24.04, a domain with DNS pointed at the server, a Tailscale account.
|
||||||
|
|
||||||
## 🕌 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
|
```bash
|
||||||
git clone https://git.atlascorporation.nl/chaib/atlas-os.git
|
git clone https://git.atlascorporation.nl/chaib/atlas-os
|
||||||
cd 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
|
||||||
|
|
||||||
| | |
|
```
|
||||||
|---|---|
|
atlas-os/
|
||||||
| [ARCHITECTURE.md](./ARCHITECTURE.md) | One-box philosophy, topology, data flows |
|
├── assets/ # Animated header, desktop preview, architecture SVGs
|
||||||
| [SERVICES.md](./SERVICES.md) | All 55 containers + systemd services |
|
├── web/os/index.html # The browser OS desktop (production copy)
|
||||||
| [docs/ai-stack.md](./docs/ai-stack.md) | The Mind, the Brain, the LLM router |
|
├── server/ # Sanitized production Python (atlas_brain, meridian, ...)
|
||||||
| [docs/remote-desktop.md](./docs/remote-desktop.md) | Webtop desktop + Claude inside |
|
│ └── systemd/ # Service unit files
|
||||||
| [docs/security.md](./docs/security.md) | SSO gate, sovereignty, secrets model |
|
├── scripts/ # Export + automation scripts
|
||||||
| [docs/deployment.md](./docs/deployment.md) | Stand up the whole stack |
|
├── deploy/
|
||||||
| **[Wiki ↗](https://git.atlascorporation.nl/chaib/atlas-os/wiki)** | Browsable, page-per-topic |
|
│ ├── 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">
|
<div align="center">
|
||||||
|
|
||||||
**Built by [Chaib Aarab](https://atlascorporation.nl) — Atlas Corporation, Tilburg NL**
|
Built with obsession by **Chaib Aarab** · Atlas Corporation · Tilburg, NL
|
||||||
Built incrementally, on the go, while running real client projects. The architecture emerged from constraints, not slides.
|
|
||||||
|
|
||||||
<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>
|
</div>
|
||||||
|
|
|
||||||
18
SERVICES.md
18
SERVICES.md
|
|
@ -91,3 +91,21 @@ jouwenergieadvies.nl, reclamemans.nl
|
||||||
| atlas-backup-ak | Authentik daily backup |
|
| atlas-backup-ak | Authentik daily backup |
|
||||||
| atlas-disk-api | Disk status API |
|
| atlas-disk-api | Disk status API |
|
||||||
| atlas-eb-callback | Enable Banking PSD2 callback |
|
| 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
95
assets/architecture.svg
Normal 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 & 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 & 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 & 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
109
assets/desktop-preview.svg
Normal 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 |
|
|
@ -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>
|
<defs>
|
||||||
<radialGradient id="space" cx="50%" cy="42%" r="75%">
|
<radialGradient id="bg" cx="50%" cy="42%" r="75%">
|
||||||
<stop offset="0%" stop-color="#0c1428"/>
|
<stop offset="0%" stop-color="#0e2350"/>
|
||||||
<stop offset="55%" stop-color="#080c18"/>
|
<stop offset="45%" stop-color="#081637"/>
|
||||||
<stop offset="100%" stop-color="#050810"/>
|
<stop offset="100%" stop-color="#020812"/>
|
||||||
</radialGradient>
|
</radialGradient>
|
||||||
<radialGradient id="coreGlow" cx="50%" cy="50%" r="50%">
|
<radialGradient id="neb1" cx="50%" cy="50%" r="50%">
|
||||||
<stop offset="0%" stop-color="#4EA0FF" stop-opacity="0.95"/>
|
<stop offset="0%" stop-color="#2f6fd0" stop-opacity="0.55"/>
|
||||||
<stop offset="45%" stop-color="#1F6FE0" stop-opacity="0.55"/>
|
<stop offset="100%" stop-color="#2f6fd0" stop-opacity="0"/>
|
||||||
<stop offset="100%" stop-color="#145ED2" stop-opacity="0"/>
|
|
||||||
</radialGradient>
|
</radialGradient>
|
||||||
<linearGradient id="word" x1="0" y1="0" x2="1" y2="0">
|
<radialGradient id="neb2" cx="50%" cy="50%" r="50%">
|
||||||
<stop offset="0%" stop-color="#8EC2FF"/>
|
<stop offset="0%" stop-color="#1c4fae" stop-opacity="0.5"/>
|
||||||
<stop offset="55%" stop-color="#4EA0FF"/>
|
<stop offset="100%" stop-color="#1c4fae" stop-opacity="0"/>
|
||||||
<stop offset="100%" stop-color="#1F6FE0"/>
|
</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>
|
</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>
|
</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 -->
|
<!-- starfield -->
|
||||||
<g fill="#cfe2ff">
|
<g fill="#dce9ff">
|
||||||
<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 class="s1" cx="80" cy="60" r="1.6"/><circle class="s3" cx="150" cy="120" r="1.1"/>
|
||||||
<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 class="s2" cx="210" cy="40" r="1.4"/><circle class="s4" cx="300" cy="90" r="1"/>
|
||||||
<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 class="s1" cx="120" cy="200" r="1.2"/><circle class="s3" cx="60" cy="300" r="1.5"/>
|
||||||
<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 class="s2" cx="180" cy="330" r="1.1"/><circle class="s4" cx="260" cy="270" r="1.3"/>
|
||||||
<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 class="s1" cx="360" cy="320" r="1"/><circle class="s3" cx="420" cy="60" r="1.4"/>
|
||||||
<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 class="s2" cx="480" cy="130" r="1.1"/><circle class="s4" cx="520" cy="300" r="1.2"/>
|
||||||
<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 class="s1" cx="700" cy="50" r="1.3"/><circle class="s3" cx="760" cy="110" r="1"/>
|
||||||
<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 class="s2" cx="820" cy="60" r="1.5"/><circle class="s4" cx="880" cy="120" r="1.1"/>
|
||||||
<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 class="s1" cx="950" cy="70" r="1.2"/><circle class="s3" cx="1020" cy="130" r="1.4"/>
|
||||||
<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>
|
<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>
|
</g>
|
||||||
|
|
||||||
<!-- orbital system, centered on the core -->
|
<!-- orbit rings -->
|
||||||
<g transform="translate(600,190)" fill="none">
|
<circle cx="600" cy="196" r="102" fill="none" stroke="#4a9fe2" stroke-opacity="0.28" stroke-width="1"/>
|
||||||
<ellipse rx="250" ry="92" stroke="#1F6FE0" stroke-width="1" opacity="0.30"/>
|
<circle cx="600" cy="196" r="150" fill="none" stroke="#79b6ff" stroke-opacity="0.16" stroke-width="1"/>
|
||||||
<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"/>
|
|
||||||
|
|
||||||
<!-- orbiting app nodes (blue), one gold accent -->
|
<!-- orbiting dots (blue, one gold accent) -->
|
||||||
<g>
|
<g class="orb o1"><circle cx="702" cy="196" r="3.2" fill="#79b6ff" filter="url(#softglow)"/></g>
|
||||||
<circle cx="250" cy="0" r="4" fill="#4EA0FF"/>
|
<g class="orb o2"><circle cx="702" cy="196" r="2.4" fill="#4a9fe2"/></g>
|
||||||
<animateTransform attributeName="transform" type="rotate" from="0 0 0" to="360 0 0" dur="26s" repeatCount="indefinite"/>
|
<g class="orb o3"><circle cx="750" cy="196" r="3.6" fill="#e0a234" filter="url(#softglow)"/></g>
|
||||||
</g>
|
<g class="orb o4"><circle cx="750" cy="196" r="2.6" fill="#acd2ff"/></g>
|
||||||
<g>
|
<g class="orb o5"><circle cx="750" cy="196" r="2.2" fill="#4a9fe2"/></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>
|
|
||||||
|
|
||||||
<!-- glowing blue core -->
|
<!-- Atlas A logo -->
|
||||||
<circle r="70" fill="url(#coreGlow)" filter="url(#blur)"/>
|
<g filter="url(#glow)">
|
||||||
<circle r="30" fill="#0c1428" stroke="#4EA0FF" stroke-width="1.5"/>
|
<path d="M600 116 L664 218 L634 218 L626 198 L574 198 L566 218 L536 218 Z" fill="url(#aGrad)"/>
|
||||||
<circle r="30" fill="none" stroke="#4EA0FF" stroke-width="1.5" opacity="0.6">
|
<path d="M600 142 L619 192 L581 192 Z" fill="#081637"/>
|
||||||
<animate attributeName="r" values="30;46;30" dur="4s" repeatCount="indefinite"/>
|
<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"/>
|
||||||
<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>
|
</g>
|
||||||
|
<circle class="pulse" cx="600" cy="196" r="3" fill="#eaf3ff"/>
|
||||||
|
|
||||||
<!-- wordmark -->
|
<!-- wordmark -->
|
||||||
<text x="600" y="316" text-anchor="middle" font-size="50" font-weight="800" letter-spacing="6" fill="url(#word)">ATLAS OS</text>
|
<g class="title">
|
||||||
<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>
|
<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>
|
</svg>
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 6.3 KiB |
BIN
assets/os-screenshot.png
Normal file
BIN
assets/os-screenshot.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 157 KiB |
40
docs/academy.md
Normal file
40
docs/academy.md
Normal 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.
|
||||||
|
|
@ -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
|
## Tier 0 — Zero-cost local (`localhost:8888/v1`, RTX A2000)
|
||||||
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#0c1428','primaryTextColor':'#cfe2ff','primaryBorderColor':'#1F6FE0','lineColor':'#4EA0FF','fontFamily':'monospace'}}}%%
|
|
||||||
flowchart TB
|
An OpenAI-compatible router exposes local Ollama models. Used for all non-critical subagent work, copy, summaries, translations, and classification.
|
||||||
Senses[Senses · email · news · WhatsApp · bank]:::a --> Spine[(kernel.sqlite · the spine)]:::b
|
|
||||||
Spine --> Brain[Atlas Brain · autonomous core]:::a
|
| Alias | Backing | Use for |
|
||||||
Brain --> Gate{Policy gate}:::g
|
|-------|---------|---------|
|
||||||
Gate -->|money / comms / self-modify| Human[Human approval · Control screen]:::h
|
| `atlas-fast` | LLaMA 1B | Ultra-fast classification, routing, labels |
|
||||||
Gate -->|safe| Router[LLM router :8888]:::a
|
| `atlas-free` | Hermes3 | Dutch copy, summaries, FAQ, product descriptions |
|
||||||
Router --> Local[Local · LLaMA · hermes3 · Qwen]:::c
|
| `atlas-code` | Qwen Coder | Code completion, simple fixes, boilerplate |
|
||||||
Router --> Cloud[Free cloud · Groq · Cerebras · OpenRouter]:::c
|
| `atlas-qwen` | qwen2.5 | General Dutch content, emails |
|
||||||
Router --> Claude[Claude · paid · last resort]:::c
|
| `atlas-phi3` | qwen2.5:7b | Reasoning, analysis, comparisons |
|
||||||
classDef a fill:#0c1428,stroke:#4EA0FF,color:#cfe2ff
|
| `atlas-auto` | smart router | Auto-picks the best free local model |
|
||||||
classDef b fill:#145ED2,stroke:#8EC2FF,color:#fff
|
|
||||||
classDef c fill:#080c18,stroke:#1F6FE0,color:#9fb8e0
|
```python
|
||||||
classDef g fill:#0c1428,stroke:#D4A24C,color:#D4A24C
|
import openai
|
||||||
classDef h fill:#080c18,stroke:#4EA0FF,color:#cfe2ff
|
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 |
|
## Always-on AI services
|
||||||
|---|---|---|
|
|
||||||
| **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.
|
| 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
|
All model calls flow through the LiteLLM proxy so cost and latency are traced centrally in Langfuse, regardless of which tier served the request.
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
|
||||||
31
docs/islamic-layer.md
Normal file
31
docs/islamic-layer.md
Normal 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.
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
|
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
|
||||||
<meta name="theme-color" content="#0b1020">
|
<meta name="theme-color" content="#0b1020">
|
||||||
<title>Atlas OS</title>
|
<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>
|
<style>
|
||||||
*{box-sizing:border-box;margin:0;padding:0}
|
*{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}
|
html,body{height:100%;background:#0b1020;color:#e8edf7;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;overflow:hidden;user-select:none}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue