Skip to content

Commit 6bf1d18

Browse files
committed
Merge branch 'develop'
2 parents ceb50a4 + f2eb26d commit 6bf1d18

71 files changed

Lines changed: 640 additions & 318 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,24 @@
33
Generated by `npm run set:version`.
44
The local changelog is rebuilt from the available `v*` release tags and the current `HEAD` range.
55
The script does not create tags locally.
6-
## v0.48.1 - 2026-04-20
6+
## v0.48.1 - 2026-04-22
77

88
- Release source: local versioning run
9+
- Base ref: `v0.48.1`
10+
- Range: `v0.48.1..HEAD`
11+
- Included commits: 2
12+
13+
### Other (2)
14+
15+
- Refactor CLI layout and polish Atlas dashboard UX (`9dac4ef`)
16+
- Simplify project scaffolding layout (`5b998ff`)
17+
18+
## v0.48.1 - 2026-04-21
19+
20+
- Release tag: `v0.48.1`
921
- Base ref: `v0.45.2`
10-
- Range: `v0.45.2..HEAD`
11-
- Included commits: 7
22+
- Range: `v0.45.2..v0.48.1`
23+
- Included commits: 8
1224

1325
### Features (3)
1426

@@ -24,10 +36,11 @@ The script does not create tags locally.
2436

2537
- [atlas-dashboard] add layered dashboard foundations (`90b6e58`)
2638

27-
### CI / Maintenance (2)
39+
### CI / Maintenance (3)
2840

2941
- [atlas-dashboard] harden local vite dashboard runtime (`a890979`)
3042
- [release] split build and publish workflows (`7e42f8e`)
43+
- [release] v0.48.1 (`0f4343c`)
3144

3245
## v0.45.2 - 2026-04-20
3346

README.md

Lines changed: 48 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
![Persistence](https://img.shields.io/badge/Persistence-Docker%20Volumes-CA8A04)
1212

1313
> 🧭 **Atlas Lab** is a localhost-first self-hosted platform made of a Node.js/TypeScript CLI, a layered Docker Compose stack, and an operational React dashboard served by the gateway.
14-
> It is designed to provide Git hosting, project and design collaboration, internal documentation, collaborative markdown notes, optional local AI services with Open WebUI, Ollama, and n8n, browser-based development workbenches, and structured image/volume backup workflows on a single machine.
14+
> It is designed to provide Git hosting, project and design collaboration, internal documentation, collaborative markdown notes, browser-delivered Obsidian vaults, optional local AI services with Open WebUI, Ollama, and n8n, browser-based development workbenches, and structured image/volume backup workflows on a single machine.
1515
1616
---
1717

@@ -21,7 +21,7 @@ Atlas Lab is built for a practical goal: run a repeatable local engineering plat
2121

2222
### What it gives you
2323

24-
- 🧱 An always-on **core layer** with Atlas Dashboard, Gitea, Plane, Penpot, BookStack, and HedgeDoc
24+
- 🧱 An always-on **core layer** with Atlas Dashboard, Gitea, Plane, Penpot, BookStack, HedgeDoc, and Obsidian
2525
- 🧠 An optional **AI LLM layer** with Open WebUI, Ollama, and n8n
2626
- 🛠️ An optional **workbench layer** with browser-based Node and Python environments plus shared PostgreSQL
2727
- 🔐 HTTPS-only ingress on `localhost`
@@ -66,7 +66,7 @@ Atlas Lab is split into **three explicit layers**:
6666

6767
| Layer | Status | Includes | Purpose |
6868
| --- | --- | --- | --- |
69-
| `core` | always on | gateway, Atlas Dashboard, Gitea, Plane, Penpot, BookStack, HedgeDoc, and their backing data services | baseline platform |
69+
| `core` | always on | gateway, Atlas Dashboard, Gitea, Plane, Penpot, BookStack, HedgeDoc, Obsidian, and their backing data services | baseline platform |
7070
| `ai-llm` | optional | Open WebUI, Ollama, n8n, AI gateway | local AI workflows and automation |
7171
| `workbench` | optional | Node Forge, Python Grid, shared PostgreSQL, workbench gateway | browser-based development |
7272

@@ -121,6 +121,7 @@ The only host-level TCP service exposed directly is PostgreSQL from the workbenc
121121
| Python Grid | `workbench` | `https://localhost:8451/` | Python workspace |
122122
| HedgeDoc | `core` | `https://localhost:8452/` | collaborative markdown notes |
123123
| n8n | `ai-llm` | `https://localhost:8453/` | workflow automation and agent orchestration |
124+
| Obsidian | `core` | `https://localhost:8454/` | browser knowledge vault |
124125
| PostgreSQL | `workbench` | `localhost:15432` | host-side desktop access |
125126

126127
### Operational rules
@@ -136,7 +137,7 @@ The only host-level TCP service exposed directly is PostgreSQL from the workbenc
136137
| Network | Type | Purpose |
137138
| --- | --- | --- |
138139
| `edge-net` | exposed | published ingress ports |
139-
| `apps-net` | internal | Gitea, BookStack, HedgeDoc, and shared browser-facing core services |
140+
| `apps-net` | internal | Gitea, BookStack, HedgeDoc, Obsidian, and shared browser-facing core services |
140141
| `ai-llm-net` | internal | Open WebUI, Ollama, and n8n |
141142
| `data-net` | internal | data services and infrastructure databases |
142143
| `workbench-net` | internal | workbenches and PostgreSQL |
@@ -168,6 +169,7 @@ Key volumes include:
168169
- `bookstack-db`
169170
- `hedgedoc-db`
170171
- `hedgedoc-uploads`
172+
- `obsidian-config`
171173
- `ollama-data`
172174
- `n8n-data`
173175
- `open-webui-data`
@@ -214,6 +216,7 @@ The AI LLM layer requires:
214216
- `8451`
215217
- `8452`
216218
- `8453`
219+
- `8454`
217220
- `15432` when `workbench` is enabled
218221

219222
### Windows PowerShell note
@@ -392,10 +395,10 @@ The dashboard frontend lives in:
392395

393396
- [`apps/atlas-dashboard`](./apps/atlas-dashboard)
394397

395-
Its toolchain config lives in:
398+
Its toolchain config now lives alongside the app:
396399

397-
- [`config/atlas-dashboard/vite.config.ts`](./config/atlas-dashboard/vite.config.ts)
398-
- [`config/atlas-dashboard/tsconfig.json`](./config/atlas-dashboard/tsconfig.json)
400+
- [`apps/atlas-dashboard/vite.config.ts`](./apps/atlas-dashboard/vite.config.ts)
401+
- [`apps/atlas-dashboard/tsconfig.json`](./apps/atlas-dashboard/tsconfig.json)
399402

400403
### Responsibilities
401404

@@ -460,6 +463,7 @@ Bootstrap is idempotent and reconciles Gitea, BookStack, Plane, Penpot, and, whe
460463
| BookStack | `https://localhost:8449/` | `root@bookstack.local / RootBookStack!2026` |
461464
| HedgeDoc | `https://localhost:8452/` | local email accounts enabled; create the first account in-app |
462465
| n8n | `https://localhost:8453/` | owner bootstrap `root@n8n.local / RootN8NApp!2026` |
466+
| Obsidian | `https://localhost:8454/` | basic auth `atlas / RootObsidian!2026` |
463467
| PostgreSQL host-side | `localhost:15432` | `postgres / RootPostgresDev!2026` |
464468

465469
For DBeaver and other desktop PostgreSQL clients:
@@ -476,13 +480,32 @@ For DBeaver and other desktop PostgreSQL clients:
476480

477481
| Area | Purpose | Paths |
478482
| --- | --- | --- |
479-
| CLI | application logic and commands | `src/`, `bin/` |
480-
| dashboard | React frontend | `apps/atlas-dashboard`, `config/atlas-dashboard/` |
481-
| Compose | layer orchestration | `infra/docker/compose*.yml` |
482-
| images | Dockerfiles and startup scripts | `infra/docker/images/` |
483-
| gateway | runtime templates and briefings | `config/gateway/templates/` |
484-
| env | operational configuration | `env/lab.env` |
485-
| repo scripts | versioning and support tooling | `scripts/` |
483+
| CLI shell | entrypoint, command registration, terminal rendering | `src/cli/`, `bin/` |
484+
| domain services | runtime orchestration, diagnostics, integrations, archive workflows | `src/services/` |
485+
| shared contracts | config schemas, Docker helpers, utilities, shared types | `src/config/`, `src/lib/`, `src/types/`, `src/utils/` |
486+
| dashboard | React frontend plus local Vite and TS config | `apps/atlas-dashboard/` |
487+
| runtime assets | packaged env files and gateway templates | `env/`, `config/gateway/templates/` |
488+
| infrastructure | Compose layers, Dockerfiles, startup scripts | `infra/docker/` |
489+
| verification and tooling | unit tests, release helpers, CI support | `tests/`, `scripts/`, `.github/` |
490+
491+
Source tree:
492+
493+
```text
494+
src/
495+
cli/
496+
commands/
497+
ui/
498+
config/
499+
lib/
500+
services/
501+
archive/
502+
diagnostics/
503+
integrations/
504+
orchestration/
505+
runtime/
506+
types/
507+
utils/
508+
```
486509

487510
Key files:
488511

@@ -492,9 +515,11 @@ Key files:
492515
- [`infra/docker/compose.yml`](./infra/docker/compose.yml)
493516
- [`infra/docker/compose.ai-llm.yml`](./infra/docker/compose.ai-llm.yml)
494517
- [`infra/docker/compose.workbench.yml`](./infra/docker/compose.workbench.yml)
495-
- [`src/bin/atlas-lab.ts`](./src/bin/atlas-lab.ts)
496-
- [`src/app/create-cli-app.ts`](./src/app/create-cli-app.ts)
497-
- [`src/services/`](./src/services)
518+
- [`src/cli/atlas-lab.ts`](./src/cli/atlas-lab.ts)
519+
- [`src/cli/create-cli-app.ts`](./src/cli/create-cli-app.ts)
520+
- [`src/services/orchestration/stack.service.ts`](./src/services/orchestration/stack.service.ts)
521+
- [`src/services/runtime/project.service.ts`](./src/services/runtime/project.service.ts)
522+
- [`src/lib/compose.ts`](./src/lib/compose.ts)
498523
- [`config/gateway/templates/Caddyfile.template`](./config/gateway/templates/Caddyfile.template)
499524
- [`config/gateway/templates/runtime/lab-config.json.template`](./config/gateway/templates/runtime/lab-config.json.template)
500525
- [`infra/docker/images/gateway/bootstrap-gateway.sh`](./infra/docker/images/gateway/bootstrap-gateway.sh)
@@ -509,7 +534,7 @@ Expected behavior. The lab uses a self-signed certificate.
509534

510535
### `atlas-lab up` fails during port preflight
511536

512-
One of the configured lab ports (`8443-8449`, `8450-8453`, or `15432`) is occupied or excluded by the system.
537+
One of the configured lab ports (`8443-8454` or `15432`) is occupied or excluded by the system.
513538

514539
```powershell
515540
atlas-lab status
@@ -609,6 +634,11 @@ This project is distributed under the **MIT** license.
609634
- Docker image: https://docs.hedgedoc.org/setup/docker/
610635
- Configuration: https://docs.hedgedoc.org/configuration/
611636

637+
### Obsidian
638+
639+
- Docker Hub image: https://hub.docker.com/r/linuxserver/obsidian
640+
- Source repository: https://github.com/linuxserver/docker-obsidian
641+
612642
### Open WebUI
613643

614644
- Environment configuration: https://docs.openwebui.com/getting-started/env-configuration/

apps/atlas-dashboard/src/entities/dashboard/model/builders/dashboard-ai.builder.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,13 @@ export function createAiServices(
6666
},
6767
{
6868
label: labels.rootEmail,
69-
value: config.services.openWebUi.rootEmail
69+
value: config.services.openWebUi.rootEmail,
70+
concealed: true
7071
},
7172
{
7273
label: labels.password,
73-
value: config.services.openWebUi.rootPassword
74+
value: config.services.openWebUi.rootPassword,
75+
concealed: true
7476
}
7577
],
7678
description: t('dashboard.aiServices.openWebUi.description'),
@@ -92,11 +94,13 @@ export function createAiServices(
9294
},
9395
{
9496
label: labels.gatewayUser,
95-
value: config.services.ollama.gatewayUser
97+
value: config.services.ollama.gatewayUser,
98+
concealed: true
9699
},
97100
{
98101
label: labels.gatewayPassword,
99-
value: config.services.ollama.gatewayPassword
102+
value: config.services.ollama.gatewayPassword,
103+
concealed: true
100104
},
101105
{
102106
label: labels.usage,
@@ -130,11 +134,13 @@ export function createAiServices(
130134
},
131135
{
132136
label: labels.ownerEmail,
133-
value: config.services.n8n.ownerEmail
137+
value: config.services.n8n.ownerEmail,
138+
concealed: true
134139
},
135140
{
136141
label: labels.ownerPassword,
137-
value: config.services.n8n.ownerPassword
142+
value: config.services.n8n.ownerPassword,
143+
concealed: true
138144
}
139145
],
140146
description: t('dashboard.aiServices.n8n.description'),

apps/atlas-dashboard/src/entities/dashboard/model/builders/dashboard-core.builder.ts

Lines changed: 55 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,18 @@ export function createCoreServices(
3434
},
3535
{
3636
label: labels.rootUser,
37-
value: config.services.gitea.rootUsername
37+
value: config.services.gitea.rootUsername,
38+
concealed: true
3839
},
3940
{
4041
label: labels.password,
41-
value: config.services.gitea.rootPassword
42+
value: config.services.gitea.rootPassword,
43+
concealed: true
4244
},
4345
{
4446
label: labels.email,
45-
value: config.services.gitea.rootEmail
47+
value: config.services.gitea.rootEmail,
48+
concealed: true
4649
}
4750
],
4851
description: t('dashboard.services.gitea.description'),
@@ -68,11 +71,13 @@ export function createCoreServices(
6871
},
6972
{
7073
label: labels.rootEmail,
71-
value: config.services.bookStack.rootEmail
74+
value: config.services.bookStack.rootEmail,
75+
concealed: true
7276
},
7377
{
7478
label: labels.password,
75-
value: config.services.bookStack.rootPassword
79+
value: config.services.bookStack.rootPassword,
80+
concealed: true
7681
},
7782
{
7883
label: labels.accessMode,
@@ -102,11 +107,13 @@ export function createCoreServices(
102107
},
103108
{
104109
label: labels.rootEmail,
105-
value: config.services.plane.rootEmail
110+
value: config.services.plane.rootEmail,
111+
concealed: true
106112
},
107113
{
108114
label: labels.password,
109-
value: config.services.plane.rootPassword
115+
value: config.services.plane.rootPassword,
116+
concealed: true
110117
},
111118
{
112119
label: labels.accessMode,
@@ -136,11 +143,13 @@ export function createCoreServices(
136143
},
137144
{
138145
label: labels.rootEmail,
139-
value: config.services.penpot.rootEmail
146+
value: config.services.penpot.rootEmail,
147+
concealed: true
140148
},
141149
{
142150
label: labels.password,
143-
value: config.services.penpot.rootPassword
151+
value: config.services.penpot.rootPassword,
152+
concealed: true
144153
},
145154
{
146155
label: labels.accessMode,
@@ -164,10 +173,6 @@ export function createCoreServices(
164173
label: labels.endpoint,
165174
value: config.services.hedgeDoc.url
166175
},
167-
{
168-
label: labels.accessMode,
169-
value: t('values.directAppOnboarding')
170-
},
171176
{
172177
label: labels.usage,
173178
value: t('values.collaborativeMarkdown')
@@ -180,6 +185,43 @@ export function createCoreServices(
180185
status: t('values.collaborativeNotes'),
181186
title: t('dashboard.services.hedgeDoc.title'),
182187
tone: 'core'
188+
},
189+
{
190+
action: {
191+
href: config.services.obsidian.url,
192+
label: t('dashboard.services.obsidian.action')
193+
},
194+
credentials: [
195+
{
196+
label: labels.endpoint,
197+
value: config.services.obsidian.url
198+
},
199+
{
200+
label: labels.username,
201+
value: config.services.obsidian.username,
202+
concealed: true
203+
},
204+
{
205+
label: labels.password,
206+
value: config.services.obsidian.password,
207+
concealed: true
208+
},
209+
{
210+
label: labels.authMode,
211+
value: t('values.basicAuth')
212+
},
213+
{
214+
label: labels.usage,
215+
value: t('values.knowledgeVault')
216+
}
217+
],
218+
description: t('dashboard.services.obsidian.description'),
219+
icon: 'host',
220+
id: 'obsidian',
221+
note: t('dashboard.services.obsidian.note'),
222+
status: t('values.knowledgeVault'),
223+
title: t('dashboard.services.obsidian.title'),
224+
tone: 'core'
183225
}
184226
];
185227
}

apps/atlas-dashboard/src/entities/dashboard/model/builders/dashboard-credential-labels.builder.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export interface DashboardCredentialLabels {
2121
rootPassword: string;
2222
rootUser: string;
2323
superuser: string;
24+
username: string;
2425
usage: string;
2526
}
2627

@@ -48,6 +49,7 @@ export function createCredentialLabels(
4849
rootPassword: t('credentials.rootPassword'),
4950
rootUser: t('credentials.rootUser'),
5051
superuser: t('credentials.superuser'),
52+
username: t('credentials.username'),
5153
usage: t('credentials.usage')
5254
};
5355
}

0 commit comments

Comments
 (0)