Atlas CC

Command Center

Anmelden

{{ authError }}

Hast du einen Einladungslink? Registrieren

Registrieren

{{ authError }}

Schon ein Konto? Anmelden

Dashboard

Overview of all {{agents.length}} agents

Total Agents

{{agents.length}}

Active

{{statusCount('idle')}}

Running

{{statusCount('running')}}

Errors

{{statusCount('error')}}

Server Resources

{{ systemStatsError }}

CPU

{{ systemStats.cpu_pct ?? '—' }}%

Auslastung

RAM

{{ systemStats.ram_pct ?? '—' }}%

{{ systemStats.ram_used_gb ?? '—' }} / {{ systemStats.ram_total_gb ?? '—' }} GB

Speicher

{{ systemStats.disk_pct ?? '—' }}%

{{ systemStats.disk_used_gb ?? '—' }} / {{ systemStats.disk_total_gb ?? '—' }} GB

All Agents

{{agent.name[0]}}

{{agent.name}}

{{agent.title}}

{{agent.sessionCount}} sessions Last: {{timeAgo(agent.lastActive)}}

Research Papers

Paper library & analysis notes

{{ researchEditPaper ? 'Edit Paper' : 'Add Paper' }}

{{ researchSelectedPaper.title }}

{{ researchSelectedPaper.status }}

{{ researchSelectedPaper.authors }}

🔗 Link 📄 arXiv:{{ researchSelectedPaper.arxiv_id }} {{ '★'.repeat(researchSelectedPaper.rating) }}{{ '☆'.repeat(5 - researchSelectedPaper.rating) }}
{{ tag }}

Abstract

{{ researchSelectedPaper.abstract }}

Notes & Analysis

{{ note.note_type.replace('_', ' ') }}

{{ note.content }}

{{ timeAgo(note.created_at) }}

No notes yet. Add your analysis above.

Loading papers...

No papers yet

Click "Add Paper" to start your research library

{{ paper.title }}

{{ paper.status }}

{{ paper.authors }}

{{ paper.abstract }}

{{ tag }} {{ '★'.repeat(paper.rating) }}

Organization Chart

Drag to pan · Scroll to zoom · Double-click to fit

Loading hierarchy...
{{Math.round(zoom * 100)}}%

Settings

Manage your profile

Profile Picture

{{(settingsProfile.display_name || settingsProfile.username || '?')[0].toUpperCase()}}

{{settingsMsg}}

Display Name

Change Password

{{settingsPwMsg}}

Username: {{settingsProfile.username}} · Role: {{settingsProfile.role}} · Member since {{settingsProfile.created_at ? new Date(settingsProfile.created_at * 1000).toLocaleDateString() : 'N/A'}}

KI-Modell & Provider

Welches KI-Modell dein Assistent nutzt

{{ providerOptionMeta[providerStatus.active_option]?.emoji || '❓' }}

{{ providerOptionMeta[providerStatus.active_option]?.name || 'Unbekannt' }}

{{ providerStatus.model || '—' }}

Aktiv
Lade Status…

Kein eigener Account nötig

🔄

Atlas Proxy

Kostenlos — wird von Atlas bereitgestellt

✓ Aktiv

OAuth Login (Browser-Anmeldung)

🔵

Claude Pro/Max

OAuth Login · Anthropic Subscription

✓ Aktiv
🤖

ChatGPT Plus/Pro

OAuth Login · OpenAI Subscription

✓ Aktiv
🔮

Nous Portal

OAuth Login · Nous Subscription

✓ Aktiv

Eigener API Key

🔵

Anthropic API Key

Direkte API · Eigener Key

✓ Aktiv
🤖

OpenAI API Key

Direkte API · Eigener Key

✓ Aktiv
🌐

OpenRouter

100+ Modelle · Eigener Key

✓ Aktiv
⚙️

Custom Endpoint

Eigene URL + optionaler Key

✓ Aktiv

Business Model Canvas

Entwickle und verfeinere dein Geschäftsmodell

Autosave aktiv

01

Key Partners

Wer sind unsere wichtigsten Partner?

🤝

{{ item.text }}

02

Key Activities

Was sind unsere wichtigsten Tätigkeiten?

{{ item.text }}

03

Value Proposition

Welchen Mehrwert schaffen wir?

💎

{{ item.text }}

Beschreibung

04

Customer Relationships

Welche Beziehungen pflegen wir?

💬

{{ item.text }}

05

Customer Segments

Für wen schaffen wir Mehrwert?

👥

{{ item.text }}

06

Key Resources

Welche Ressourcen brauchen wir?

🔧

{{ item.text }}

07

Channels

Wie erreichen wir Kunden?

📡

{{ item.text }}

08

Cost Structure

Was sind unsere wichtigsten Kosten?

💸

{{ item.text }}

09

Revenue Streams

Wofür zahlen Kunden?

💰

{{ item.text }}

Doppelklick zum Bearbeiten · Hover für Löschen · Autosave

Costs & Token Usage

Across all {{costsData?.totals?.agent_count || 0}} agents

Lade Daten...

Total Tokens

{{formatTokensBig(costsData.totals.total_tokens)}}

↑ {{formatTokensBig(costsData.totals.input_tokens)}} in · ↓ {{formatTokensBig(costsData.totals.output_tokens)}} out

Cache Read

{{formatTokensBig(costsData.totals.cache_read_tokens)}}

⚡ gespartes Reprocessing

Sessions

{{costsData.totals.session_count}}

{{costsData.totals.agent_count}} Agents

Est. Cost

${{costsData.totals.cost_usd > 0 ? costsData.totals.cost_usd.toFixed(2) : '0.00'}}

via OpenRouter Preise

Token-Verlauf ({{costsDays}} Tage)

{{formatTokensBig(costsMaxTokens)}}

{{costsHover.day}}

Input: {{formatTokensBig(costsHover.input_tokens || 0)}}

Output: {{formatTokensBig(costsHover.output_tokens || 0)}}

Cache: {{formatTokensBig(costsHover.cache_read_tokens || 0)}}

Total: {{formatTokensBig((costsHover.input_tokens||0) + (costsHover.output_tokens||0) + (costsHover.cache_read_tokens||0))}}

💬 {{costsHover.sessions}} Sessions

👤 {{costsHover.user_messages}} User-Fragen

Input Output Cache Read

Kosten nach Modell

{{m.model.replace('anthropic/','').replace('openai/','')}}

{{m.sessions}} sessions · {{formatTokensBig(m.input_tokens + m.output_tokens)}} tok

${{m.cost_usd.toFixed(2)}}

Token-Verbrauch pro Agent

{{a.name[0]}}
{{a.name}} {{a.session_count}} sessions
{{formatTokensBig(a.total_tokens)}}

Top Sessions nach Token-Verbrauch

Session Agent Input Output Total Cost Datum
{{s.title || 'Untitled'}} {{s.agent}} {{formatTokensBig(s.input_tokens)}} {{formatTokensBig(s.output_tokens)}} {{formatTokensBig(s.input_tokens + s.output_tokens)}} ${{s.cost_usd > 0 ? s.cost_usd.toFixed(3) : '—'}} {{new Date(s.started_at * 1000).toLocaleDateString('de-DE')}}

📊 Effizienz-Analyse

Wie sich Token-Verbrauch, Caching und Kosten über Zeit entwickeln

⚡ Cache Hit Rate

{{costsData.efficiency_trend[costsData.efficiency_trend.length-1].cache_hit_rate.toFixed(1)}}%

{{(() => { const first = costsData.efficiency_trend[0].cache_hit_rate; const last = costsData.efficiency_trend[costsData.efficiency_trend.length-1].cache_hit_rate; const diff = last - first; return (diff >= 0 ? '↑ +' : '↓ ') + diff.toFixed(1) + '% seit Start'; })()}}

🔧 Tools/Session

{{costsData.efficiency_trend[costsData.efficiency_trend.length-1].tools_per_session.toFixed(1)}}

Ø letzte {{costsDays}} Tage: {{(costsData.efficiency_trend.reduce((s,d) => s + d.tools_per_session, 0) / costsData.efficiency_trend.length).toFixed(1)}}

💰 Cost/Session

${{costsData.efficiency_trend[costsData.efficiency_trend.length-1].cost_per_session.toFixed(3)}}

Ø: ${{(costsData.efficiency_trend.reduce((s,d) => s + d.cost_per_session, 0) / costsData.efficiency_trend.length).toFixed(3)}}

📝 Output/Tool

{{formatTokensBig(costsData.efficiency_trend[costsData.efficiency_trend.length-1].output_per_tool)}}

Token pro Tool-Call

🎯 Cost/Task

${{costsData.efficiency_trend[costsData.efficiency_trend.length-1].cost_per_task?.toFixed(3) || '0'}}

Ø: ${{(costsData.efficiency_trend.reduce((s,d) => s + (d.cost_per_task||0), 0) / costsData.efficiency_trend.length).toFixed(3)}}

💾 Cache R/W

{{costsData.efficiency_trend[costsData.efficiency_trend.length-1].cache_read_ratio?.toFixed(1) || 0}}%

Read-Anteil am Cache

📊 Tokens/Task

{{formatTokensBig(costsData.efficiency_trend[costsData.efficiency_trend.length-1].tokens_per_task || 0)}}

Ø: {{formatTokensBig(Math.round(costsData.efficiency_trend.reduce((s,d) => s + (d.tokens_per_task||0), 0) / costsData.efficiency_trend.length))}}

Tägliche Kosten

OpenRouter-Preise · Input + Output + Cache

${{effMaxCost.toFixed(2)}}

Kosten pro User-Frage

Wie viel kostet eine einzelne Frage im Durchschnitt?

Cache Read vs Write

Read = gespartes Reprocessing · Write = neue Cache-Einträge

Cache Read Cache Write

Cache Hit Rate Trend

Anteil Cache-Reads an gesamten Input-Tokens · höher = effizienter

{{d.day.slice(5)}} 100%

Tool-Calls pro Session

Steigt = mehr Aufgaben pro Session

Kosten pro Session

Sinkt = effizienter durch Caching

Tägliche Metriken

Datum Sessions Tools Tools/Sess Output Cache Read Cache% Cost $/Sess
{{d.day}} {{d.sessions}} {{d.tool_calls}} {{d.tools_per_session.toFixed(1)}} {{formatTokensBig(d.output_tokens)}} {{formatTokensBig(d.cache_read_tokens)}} {{d.cache_hit_rate.toFixed(1)}}% ${{d.cost_usd.toFixed(2)}} ${{d.cost_per_session.toFixed(3)}}

⏰ Cron Jobs

Automatisierte Tasks verwalten und erstellen

{{ cronSchedulerStatus.running ? 'Scheduler aktiv' : 'Scheduler inaktiv' }}

Neuen Cron Job erstellen

→ {{ cronScheduleParsed.cron }} ✓ {{ cronScheduleParsed.human }} z.B. "täglich 7 Uhr", "alle 30 Minuten", "montags 9:00", "0 */4 * * *"
{{ sk }}
{{ sk.name }} {{ sk.category }}

{{ sk.description }}

{{ cronCreateMsg }}

Keine Cron Jobs vorhanden

Klicke "Neuer Job" um einen zu erstellen

{{ job.name || job.id }} {{ job.status || 'active' }}
{{ job.schedule }} → {{ job.deliver }} Letzter Lauf: {{ new Date(job.last_run).toLocaleString('de-DE') }} Nächster: {{ new Date(job.next_run).toLocaleString('de-DE') }}

{{ job.prompt }}

Noch keine Outputs vorhanden
{{ out.timestamp }} {{ (out.size / 1024).toFixed(1) }} KB
{{ cronOutputFilename[job.id] }}
{{ cronOutputContent[job.id] }}

📖 Schedule Referenz

*/30 * * * * — Alle 30 Minuten
0 * * * * — Jede Stunde
0 7 * * * — Täglich 7:00 UTC
0 9 * * 1 — Montags 9:00 UTC
0 0 1 * * — Monatlich am 1.
30m / every 2h — Intervalle

Format: Minute Stunde Tag Monat Wochentag (UTC) · Oder einfache Intervalle wie "30m", "every 2h"

Project Management

Goals, Projects und Tasks für deine Agenten

Goals

0

Noch keine Goals

Definiere übergeordnete Ziele

Projects

0

Noch keine Projects

Gruppiere Tasks in Projekte

Tasks

0

Noch keine Tasks

Weise Agenten konkrete Aufgaben zu

Admin Settings

Manage users, access control and container stats

Container Stats

CPU · RAM · Netzwerk · Disk — Echtzeit

Lade Container-Stats...
Keine Tenant-Container gefunden
User Status CPU RAM Netzwerk Disk PIDs
{{s.display_name || s.username}}
{{s.container_name}}
{{s.status || 'unknown'}}
{{s.cpu_perc}}%
{{s.mem_usage}} / {{s.mem_limit}}
{{s.mem_perc}}%
{{s.net_io}} {{s.block_io}} {{s.pids}}

Users ({{adminUsers.length}})

User Role Container Created Last Login Actions
{{(u.display_name || u.username || '?')[0].toUpperCase()}}

{{u.display_name || u.username}}

@{{u.username}}

{{u.created_at ? new Date(u.created_at * 1000).toLocaleDateString() : '—'}} {{u.last_login ? timeAgo(u.last_login) : 'Never'}} You

Invite Tokens

No invite tokens
Token Role Status Expires Actions
{{inv.token.substring(0, 12)}}... {{inv.role}} Used by {{inv.used_by}} Expired Active {{inv.expires_at ? new Date(inv.expires_at * 1000).toLocaleDateString() : 'Never'}}

Create Invite

Invite Link created!

{{newInviteLink}}

Proxy Usage

Token-Verbrauch pro Customer · Daily Limit · Sperren

Heute gesamt: {{proxyStats.total_used_today?.toLocaleString() || 0}} Tokens
Keine Proxy-Keys registriert
User Heute Daily Limit Gesamt Status Aktionen
{{s.username}}
{{(s.used_today || 0).toLocaleString()}} Tokens
{{s.today_requests || 0}} Requests
{{(s.daily_limit || 0).toLocaleString()}}
{{(s.alltime_input_tokens + s.alltime_output_tokens).toLocaleString()}} Tokens
{{s.alltime_requests || 0}} Requests
🚫 Gesperrt ✓ Aktiv

Delete User

Are you sure you want to delete {{deleteUserTarget.display_name || deleteUserTarget.username}}? This cannot be undone.

Create User

{{createUserMsg}}

{{selectedAgent.name[0]}}

{{selectedAgent.name}}

{{selectedAgent.title}}

⚠️ Agent "{{selectedAgent.name}}" wirklich löschen?
🚨 Endgültig löschen? Dieser Schritt kann NICHT rückgängig gemacht werden!

❌ {{deleteError}}

Sessions

{{agentDetail?.sessions?.length || 0}}

📭

No sessions
{{modelDisplayName(activeSessionInfo.model)}} ↑ {{formatTokens(activeSessionInfo.input_tokens || 0)}} in · ↓ {{formatTokens(activeSessionInfo.output_tokens || 0)}} out ⚡ {{formatTokens(activeSessionInfo.cache_read_tokens)}} cached Σ {{formatTokens((activeSessionInfo.input_tokens||0)+(activeSessionInfo.output_tokens||0))}} tokens
Stream wird fortgesetzt…
🤖

Neue Konversation

Wähle ein Modell, um mit {{selectedAgent?.name}} zu chatten

💬

No messages in this session

{{selectedAgent?.name?.[0] || 'A'}}

{{selectedAgent?.name || 'Assistant'}}

Thinking… {{ streamElapsed }}
{{ modelDisplayName(streamStatus.model) || streamStatus.model }} {{ streamStatus.tokens_used }} / {{ streamStatus.tokens_limit }} tokens
{{ streamStatus.progress_pct }}%
Datei hier ablegen

{{compactStatus}}

{{messageQueue[activeSessionId].length}} Nachricht{{messageQueue[activeSessionId].length > 1 ? 'en' : ''}} in Warteschlange

{{chatError}}

Datei wird hochgeladen...

Wie Hermes den Prompt bei jedem Run zusammenbaut — unabhängig vom Trigger

Basis immer: ~{{ (pfData.totals.issue_flow_tokens + 800).toLocaleString() }}t + Paperclip: ~{{ pfData.heartbeat_prompt.tokens + 200 }}t extra
Lade Prompt-Flow…
❌ {{ pfError }}
💬

Atlas CC Chat

Atlas Command Center
SSE → hermes CLI

📋

Paperclip Issue

Paperclip Scheduler
hermes_local Adapter

💓

Heartbeat

Paperclip Timer
runtimeConfig.heartbeat

Hermes CLI gestartet

hermes -p {{ selectedAgent?.name?.toLowerCase() || 'agent' }} chat -q "…"

🧊

Cached System Prompt

Einmal gebaut beim Session-Start — für die gesamte Session eingefroren

prompt_builder.py
0
promptTemplate Paperclip DB nur Paperclip-Trigger ✏️

{{ pfData.heartbeat_prompt.content ? pfData.heartbeat_prompt.content.slice(0,60)+'…' : 'Leer — kein Paperclip-Basis-Prompt konfiguriert' }}

~{{ pfData.heartbeat_prompt.tokens }}t
1
SOUL.md Hermes FS immer ✏️

{{ pfData.layers.soul.present ? pfData.layers.soul.content?.slice(0,60)+'…' : 'Nicht vorhanden — Hermes nutzt DEFAULT_AGENT_IDENTITY' }}

~{{ pfData.layers.soul.tokens }}t
2
Tool-aware guidance Hermes intern immer 🔒 nicht editierbar

Memory-Hinweise, Tool-Enforcement, Skills-Nudges — hardcoded in prompt_builder.py

~800t
3
MEMORY.md Hermes FS immer wenn befüllt ✏️

{{ pfData.layers.memory.present ? pfData.layers.memory.content?.slice(0,60)+'…' : 'Leer' }}

{{ pfData.layers.memory.chars }}/{{ pfData.layers.memory.limit_chars }}
~{{ pfData.layers.memory.tokens }}t
4
USER.md Hermes FS immer wenn befüllt ✏️

{{ pfData.layers.user_memory.present ? pfData.layers.user_memory.content?.slice(0,60)+'…' : 'Leer' }}

{{ pfData.layers.user_memory.chars }}/{{ pfData.layers.user_memory.limit_chars }}
~{{ pfData.layers.user_memory.tokens }}t
5
Skills Index Hermes FS immer 🔒 via skill-Tool {{ pfSkillsExpanded ? '▲' : '▼' }} {{ pfData.totals.skills_count }} Kategorien

DESCRIPTION.md je Skill-Kategorie aus ~/.hermes/skills/

~{{ pfData.totals.skills_total_tokens }}t
{{ s.label.replace('Skills: ', '') }} ~{{ s.tokens }}t
6
AGENTS.md Paperclip FS nur Paperclip-Trigger 🔒 nicht editierbar

Working-Directory Kontext, Task-Anweisungen, .cursorrules — liegt im Paperclip-Arbeitsverzeichnis

variabel
⚠️

Layers 0–6 werden beim Session-Start eingefroren. Änderungen via Bearbeiten wirken erst ab der nächsten Session.

↓ Ephemeral — bei jedem API-Call frisch hinzugefügt

Ephemeral Layers

run_agent.py → build_api_messages()
7
Conversation History Hermes SQLite immer 🔒 state.db

sessions + messages tables — wächst mit jedem Turn, komprimiert bei Threshold

dynamisch
8

Eingabe — je nach Trigger

💬

Deine Nachricht

Atlas Command Center

variabel

📋

Issue-Inhalt

Paperclip DB

~200–500t

💓

Heartbeat Task

Paperclip runtimeConfig

~50–200t

🤖 Claude API (Anthropic)

Modell: {{ pfData.model }} · verarbeitet Gesamtprompt, streamt Antwort

💬

SSE-Stream

Atlas Command Center
Chat-Tab

📝

Comment + Status

Paperclip API
via curl im Terminal

📊

Heartbeat Log

Paperclip DB
+ ggf. Memory-Update

Agent auswählen um den Prompt-Flow zu laden

Error Log

{{agentDetail.errorLog}}

No errors logged

💓

Heartbeat-Daten nicht verfügbar

(Nur für Paperclip-Agenten)

Heartbeat

{{ heartbeatData.heartbeat.enabled ? 'Aktiv' : 'Inaktiv' }}

Letzter Lauf: {{ timeAgo(new Date(heartbeatData.last_heartbeat_at).getTime() / 1000) }}

Noch kein Heartbeat-Lauf

{{ heartbeatSaveMsg.text }}

Heartbeat Prompt

{{ heartbeatData.prompt_template || '(kein Prompt konfiguriert)' }}

Letzte Runs (max. 20)

Noch keine Runs vorhanden
{{ run.status }} {{ run.invocation_source }} {{ Math.round((new Date(run.finished_at) - new Date(run.started_at)) / 1000) }}s {{ timeAgo(new Date(run.started_at).getTime() / 1000) }}

Fehler: {{ run.error }}

{{ run.stdout_excerpt }}

Kein Output-Excerpt verfügbar

🔧

Keine Skills für diesen Agent gefunden

{{ cat }}

{{ skill.name }}

{{ skill.description || 'Keine Beschreibung verfügbar' }}

{{ tag }}

{{ agentSkills.length }} Skills insgesamt

{{ providerOptionMeta[providerWizard.provider]?.emoji || providerOptionMeta[{ 'anthropic': 'anthropic_key', 'openai': 'openai_key', 'openai-codex': 'openai_codex' }[providerWizard.provider] || providerWizard.provider]?.emoji || '❓' }}

{{ providerWizard.provider === 'proxy' ? 'Atlas Proxy aktivieren' : providerWizard.provider === 'anthropic_oauth' ? 'Claude Pro/Max verbinden' : providerWizard.provider === 'openai-codex' ? 'ChatGPT verbinden' : providerWizard.provider === 'nous' ? 'Nous Portal verbinden' : providerWizard.provider === 'anthropic' ? 'Anthropic API Key' : providerWizard.provider === 'openai' ? 'OpenAI API Key' : providerWizard.provider === 'openrouter' ? 'OpenRouter API Key' : providerWizard.provider === 'custom' ? 'Custom Endpoint' : 'Provider Setup' }}

{{ providerWizard.provider === 'proxy' ? 'Kostenlos — keine Konfiguration noetig' : providerWizard.provider === 'anthropic_oauth' ? 'OAuth Login via Browser' : ['openai-codex','nous'].includes(providerWizard.provider) ? 'OAuth Device Code Flow' : providerWizard.provider === 'custom' ? 'Eigene URL + optionaler Key' : 'API Key eingeben' }}

Wird eingerichtet…

Schritt 1: Bei Claude anmelden

Oeffne den Link und logge dich ein. Falls du einen Max/Pro-Plan hast, klicke auf "Login with your chat account instead".

Bei Claude einloggen

{{ providerWizard.error }}

Erfolgreich!

{{ providerWizard.doneModel }}

Fehler

{{ providerWizard.error }}

{{ pfEditModal.label }}

Paperclip DB · adapterConfig.promptTemplate Hermes FS · SOUL.md Hermes FS · memories/MEMORY.md Hermes FS · memories/USER.md

{{ pfEditModal.content.length }} Zeichen · ~{{ Math.round(pfEditModal.content.length / 4) }} Tokens
/ {{ pfEditModal.limit_chars }}
❌ {{ pfEditModal.error }} ✅ Gespeichert

Agent erstellt!

{{createAgentForm.name}} wurde erfolgreich angelegt.

Neuen Agent erstellen

Agent wird in deinem Container erstellt

{{createAgentError}}

Container Logs

{{containerLogsModal.container_name}}

Lade Logs...
Keine Logs vorhanden
{{entry.source}} {{entry.line}}

Agent erstellt!

{{createdAgent.name}} wurde erfolgreich angelegt.

⚠️ API Key — Nur einmal sichtbar!

{{createdAgent.apiKey}}

Neuen Agent hinzufügen

Reportet an: {{newAgentParent?.name}}

{{createError}}

ℹ️ {{ toastMsg }}
{{ toastMessage }}