Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
8f7f320
chore: relocate dev-only files from dream-server/ to monorepo root
evereq Mar 15, 2026
e0872a8
chore: move Makefile to monorepo root (developer validation tool)
evereq Mar 15, 2026
b1aa15e
fix: move tests back
evereq Mar 15, 2026
c77a4a6
fix: move tests back to dream-server/ (tightly coupled to source paths)
evereq Mar 15, 2026
c99d63c
fix: update docs/ references in tests and scripts for monorepo root l…
evereq Mar 15, 2026
cf84c01
chore: move dev-only scripts from dream-server/scripts/ to root scripts/
evereq Mar 15, 2026
c51a60c
fix: move user-facing scripts back to dream-server/scripts/
evereq Mar 15, 2026
5115eac
docs: add README for root scripts/ directory
evereq Mar 15, 2026
89fec45
fix: remove moved simulate-installers.sh from contract test check
evereq Mar 15, 2026
f3b6767
refactor: remove docs/ dependency from smoke tests, consolidate in ch…
evereq Mar 15, 2026
73a70df
fix: update dev scripts for upstream SUPPORT-MATRIX changes and dream…
evereq Mar 15, 2026
8ee02c4
chore: add artifacts/ to gitignore, fix dev scripts for upstream changes
evereq Mar 15, 2026
5f2bd3a
fix: update docs paths in scripts for resources/docs/ relocation
evereq Mar 18, 2026
2cdfedf
chore: add root docs/ with upstream doc content for monorepo structure
evereq Mar 18, 2026
a42ce2f
fix: correct Makefile paths for bats tests and shell lint search
evereq Mar 18, 2026
ae9b894
docs: move remaining files
evereq Mar 18, 2026
e70e189
chore: move extra README sections to docs/ files
evereq Mar 18, 2026
c81406b
Update wsl-logic.sh
evereq Mar 18, 2026
94ff436
chore: add Contributor Covenant Code of Conduct to CONTRIBUTING.md
evereq Mar 18, 2026
7d78bf5
chore: update CONTRIBUTING.md with comprehensive contributor guide
evereq Mar 18, 2026
7fe1007
chore: reference CODE_OF_CONDUCT.md instead of inlining it
evereq Mar 18, 2026
cdcedf6
chore: remove 34 duplicate docs from resources/docs/ (already in docs/)
evereq Mar 18, 2026
d77a0ed
fix: add dream-server/ prefix to ports contract path in check-compati…
evereq Mar 18, 2026
2cf20cf
fix: update 38 broken relative links in docs/ after move from dream-s…
evereq Mar 18, 2026
f9cbf18
chore: add short README.md to dream-server/ subdirectory
evereq Mar 18, 2026
a7f0089
chore: simplify dream-server/README.md, use local LICENSE path
evereq Mar 18, 2026
bd8f984
fix: update PSScriptAnalyzerSettings path for monorepo root layout
evereq Mar 18, 2026
05db92c
fix: update validate-sim-summary.py path to monorepo root scripts/
evereq Mar 18, 2026
d4e1f9c
refactor: move test-validate-sim-summary.sh to root scripts/ (tests d…
evereq Mar 18, 2026
1c79b5e
fix: correct artifact paths in test-linux.yml and remove duplicate te…
evereq Mar 18, 2026
ea13b77
fix: correct artifact path and run instructions in scripts/README.md
evereq Mar 18, 2026
57d2570
docs: add prerequisites and pyenv setup to scripts/README.md
evereq Mar 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/lint-powershell.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ jobs:
$failed = $false
foreach ($script in $scripts) {
Write-Host "Analyzing $($script.FullName)"
$results = Invoke-ScriptAnalyzer -Path $script.FullName -Settings ./PSScriptAnalyzerSettings.psd1 -Severity Error,Warning
$results = Invoke-ScriptAnalyzer -Path $script.FullName -Settings ../PSScriptAnalyzerSettings.psd1 -Severity Error,Warning
if ($results) {
$results | Format-Table RuleName, Severity, Message, ScriptName, Line -AutoSize
$failed = $true
Expand Down
30 changes: 15 additions & 15 deletions .github/workflows/test-linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ jobs:

- name: Manifest Compatibility Checks
run: |
bash scripts/check-compatibility.sh
bash scripts/check-release-claims.sh
bash ../scripts/check-compatibility.sh
bash ../scripts/check-release-claims.sh

- name: BATS Unit Tests
run: bash tests/run-bats.sh
Expand All @@ -55,7 +55,7 @@ jobs:
run: bash tests/test-validate-env.sh

- name: Validate Simulation Summary Tests
run: bash tests/test-validate-sim-summary.sh
run: bash ../scripts/test-validate-sim-summary.sh

- name: CPU-Only Path Tests
run: bash tests/test-cpu-only-path.sh
Expand All @@ -67,21 +67,21 @@ jobs:

- name: Installer Simulation Harness
run: |
bash scripts/simulate-installers.sh
test -f artifacts/installer-sim/summary.json
test -f artifacts/installer-sim/SUMMARY.md
python3 scripts/validate-sim-summary.py artifacts/installer-sim/summary.json
bash ../scripts/simulate-installers.sh
test -f ../artifacts/installer-sim/summary.json
test -f ../artifacts/installer-sim/SUMMARY.md
python3 ../scripts/validate-sim-summary.py ../artifacts/installer-sim/summary.json

- name: Upload Installer Simulation Artifacts
uses: actions/upload-artifact@v4
with:
name: installer-sim
path: |
dream-server/artifacts/installer-sim/summary.json
dream-server/artifacts/installer-sim/SUMMARY.md
dream-server/artifacts/installer-sim/linux-dryrun.log
dream-server/artifacts/installer-sim/macos-installer.log
dream-server/artifacts/installer-sim/windows-preflight-sim.json
dream-server/artifacts/installer-sim/macos-preflight.json
dream-server/artifacts/installer-sim/macos-doctor.json
dream-server/artifacts/installer-sim/doctor.json
artifacts/installer-sim/summary.json
artifacts/installer-sim/SUMMARY.md
artifacts/installer-sim/linux-dryrun.log
artifacts/installer-sim/macos-installer.log
artifacts/installer-sim/windows-preflight-sim.json
artifacts/installer-sim/macos-preflight.json
artifacts/installer-sim/macos-doctor.json
artifacts/installer-sim/doctor.json
15 changes: 12 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -48,23 +48,32 @@ token-spy/*.sqlite
dream-server/.env
dream-server/.env.*
!dream-server/.env.example
!dream-server/.env.schema.json
dream-server/.current-mode
dream-server/.profiles
dream-server/.target-model
dream-server/.target-quantization
dream-server/data/
dream-server/models/
dream-server/artifacts/
dream-server/logs/
dream-server/presets/
dream-server/**/__pycache__/
dream-server/config/openclaw/workspace/
dream-server/**/node_modules/
dream-server/**/dist/
dream-server/**/.coverage
dream-server/preflight-*.log
dream-server/.current-mode
dream-server/.profiles
dream-server/internal/
dream-server/.claude/
dream-server/.pytest_cache/
dream-server/tests/__pycache__/
dream-server/internal/
dream-server/.cache/
dream-server/tests/bats/

# ============================================
# Archived / deprecated code (pre-v2.0)
# ============================================
archive/
.claude/
artifacts/
File renamed without changes.
File renamed without changes.
File renamed without changes.
144 changes: 127 additions & 17 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,31 +1,141 @@
# Contributing to Dream Server

Thanks for wanting to contribute. Dream Server is open source and we welcome help from everyone — whether you're fixing a bug, adding a service integration, or tackling a full feature.
Dream Server is the fight to take AI back from the corporations charging you a subscription to use your own data on their servers. Every PR that lands here puts sovereign AI into someone's hands who didn't have it yesterday. This isn't a startup. This isn't a product. This is a movement — and if you're here, you're already part of it.

## Quick Start
## Getting Started

1. **Fork** this repository and **clone** your fork locally.
2. Create a **branch** for your work:
```bash
git checkout -b my-change
```
3. Make your changes, test them locally, and commit.
4. Open a **pull request** against `main`.
Fork, branch, build, PR. That's it.

No CLA, no hoops.
```bash
git checkout -b my-change
```

## Full Contributor Guide
No CLA. No committee. No waiting for permission. If it makes Dream Server better, send it.

For current priorities, validation checklists, PR expectations, and style guidelines, see the detailed guide:
If you're adding or extending services, read these first:
- [docs/EXTENSIONS.md](docs/EXTENSIONS.md) — how to add a new service in 30 minutes
- [docs/INSTALLER-ARCHITECTURE.md](docs/INSTALLER-ARCHITECTURE.md) — how the installer works under the hood

**[dream-server/CONTRIBUTING.md](dream-server/CONTRIBUTING.md)**
## What We Care About Right Now

That's where we document what we need most, what gets merged fast, and what will get bounced back. Read it before your first PR — it'll save you a review cycle.
We have 20+ contributors and the number keeps growing. These are the areas where your work hits hardest — and where PRs get merged fastest.

## Where to Ask Questions
### 1. Runs on anything

Not sure about something? Open a thread in [GitHub Discussions](https://github.com/Light-Heart-Labs/DreamServer/discussions) or an issue. We're happy to help you figure out the right approach before you write code.
A student with a $200 laptop and no GPU should be able to run Dream Server. So should someone with a 96GB Strix Halo laptop. We don't care if you have a 4090 or a hand-me-down ThinkPad — Dream Server runs on your machine or we haven't done our job.

Where to help:
- **New hardware tiers** — we have Tier 0 (4GB, no GPU) through Tier 4 (48GB+ VRAM) plus Strix Halo and Intel Arc. If your hardware isn't supported, make it supported.
- **CPU-only inference** — llama.cpp does the heavy lifting, but the installer, memory limits, and model selection all need to work without a GPU.
- **Low-RAM environments** — compose overlays that reduce memory reservations so services fit on constrained machines. See `docker-compose.tier0.yml` for how we did it.
- **ARM, Chromebooks, older GPUs** — if it runs Docker and has 4GB of RAM, we want to support it.

### 2. Clean installs

If someone runs the installer and it doesn't work first try, we failed. Not them — us. Every install failure is a person who might not come back.

Where to help:
- **Idempotent re-runs** — running the installer twice shouldn't break anything. Secrets, configs, and data should survive.
- **Error messages that actually help** — "what went wrong" and "what to do about it." No stack traces. No silent failures.
- **Preflight checks** — catch bad Docker versions, insufficient disk, port conflicts *before* the install starts.
- **The weird edge cases** — WSL2 memory limits, macOS Homebrew paths, Windows Defender, Secure Boot blocking NVIDIA. These are what actually break installs in the real world.
- **Offline installs** — pre-downloaded models, air-gapped environments, corporate firewalls. Real people deal with this.

### 3. Extensions and integrations

An LLM in a terminal is a toy. Dream Server becomes something people can't live without when it connects to everything they already use. This is how we build the ecosystem that makes sovereign AI actually useful.

Where to help:
- **New services** — wrap any Docker-based tool as a Dream Server extension. Manifest, compose file, health check — that's it. Look at `extensions/services/` for examples.
- **API bridges** — connect Dream Server to Slack, Discord, email, calendars, CRMs. n8n workflows are the fastest path.
- **Workflow templates** — pre-built n8n workflows that solve actual problems people have.
- **Manifest quality** — health checks, dependency declarations, port contracts, GPU compatibility. Run `dream audit` to validate yours.
- **Reliability between services** — correct startup ordering, graceful handling of dependencies being temporarily down. The `compose.local.yaml` pattern handles this.

### 4. Tests that catch real bugs

We want tests for code that exists. Not tests for features we haven't built. Not test suites that skip() everything and report "all passed."

Where to help:
- **Installer integration tests** — actually run installer phases in a container and verify the output.
- **Tier map validation** — every tier resolves to the right model, GGUF, URL, and context. See `tests/test-tier-map.sh`.
- **Health checks that verify real behavior** — not just "is a port open" but "does the service actually respond correctly."
- **Extension contract tests** — manifests parse, compose files are valid, ports don't conflict.
- **Platform smoke tests** — scripts parse and core functions work on Linux, macOS, Windows, and WSL2.

### 5. Installer portability

macOS, Linux (Ubuntu, Debian, Arch, Fedora, NixOS), Windows (PowerShell + WSL2). Every platform bug you fix unblocks hundreds of people you'll never meet.

Where to help:
- **POSIX compliance** — BSD sed is not GNU sed. BSD date is not GNU date. If it runs on macOS, don't use GNU-only flags. Use `_sed_i` and `_now_ms`.
- **Package managers** — apt, dnf, pacman, brew, xbps. If your distro isn't supported, add it.
- **Bash compatibility** — macOS ships Bash 3.2. No associative arrays unless you guard for Bash 4+.
- **Path handling** — Windows vs Unix, spaces, symlinks, external drives. Use `path-utils.sh`.
- **Docker flavors** — Docker Desktop, Docker Engine, Podman, Colima. Different sockets, different compose plugins, different permission models.

## Before You Submit

Don't make us find bugs you could have caught. Run this:

```bash
make gate # lint + test + smoke + simulate
```

Or if you just want a quick check:

```bash
make lint # shell syntax + Python compile
make test # tier map + installer contracts
make smoke # platform smoke tests
```

Touched the frontend? Make sure it builds:
```bash
cd dashboard && npm install && npm run lint && npm run build
```

## What Gets Merged Fast

We merge good work quickly. You'll know it's good if:

- It fixes a real bug and you can show us how to reproduce it
- It tests code that wasn't tested before
- It does exactly one thing and does it well
- It makes Dream Server run on hardware it didn't before
- It fixes a security hole and explains what was exposed

## What Gets Sent Back

We review a lot of PRs. These patterns waste everyone's time — yours and ours:

- **Bundled PRs.** One PR, one concern. A bug fix + a feature + a refactor = three PRs. Every time.
- **Code that was never run.** If your function is referenced but never defined, or your shell variable won't expand in exec form — we'll catch it. Please catch it first.
- **Breaking changes with no migration path.** Changing port defaults, tightening schemas, broadening volume mounts — these need an issue and a discussion *before* the PR. Existing installs matter.
- **Tests for imaginary features.** A test suite that skip()'s every assertion because the feature doesn't exist yet is worse than no tests — it creates false confidence.
- **Formatting-only PRs.** Running black or prettier across the whole codebase creates merge conflicts for every other contributor and ships zero functionality.
- **Over-engineering.** If the fix is three lines, don't build a framework. We value simple code that works over clever code that impresses.

## Style

We're not precious about style, but we have standards:

- **Bash** — `set -euo pipefail` at the top. Quote your variables. Run `shellcheck`. If it passes, we're happy.
- **Python** — match whatever the file already does. Don't reformat code you didn't change.
- **YAML/JSON** — stable keys, no tabs, don't get creative.
- **Commit messages** — imperative subject ("fix X", not "fixed X"). Body explains *why*, not *what* — we can read the diff.

## Questions and Bugs

**Got a question?** Open an issue or start a [GitHub Discussion](https://github.com/Light-Heart-Labs/DreamServer/discussions). Seriously — ask before you build. It's faster for everyone.

**Found a bug?** Open an issue with your hardware (GPU, RAM, OS), what you expected, what actually happened, and logs (`docker compose logs`). The more context you give us, the faster we fix it.

## License

By contributing, you agree that your work will be licensed under the [Apache License 2.0](LICENSE).
[Apache 2.0](LICENSE). Your code stays open. That's the whole point.

## Code of Conduct

Please read and follow our [Code of Conduct](CODE_OF_CONDUCT.md).

File renamed without changes.
File renamed without changes.
22 changes: 11 additions & 11 deletions dream-server/Makefile → Makefile
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Dream Server — Developer Targets
# Run `make help` to see available commands.

SHELL_FILES := $(shell find . -name '*.sh' -not -path './node_modules/*' -not -path './.git/*' -not -path './data/*' -not -path './token-spy/*')
SHELL_FILES := $(shell find dream-server/ scripts/ -name '*.sh' -not -path '*/node_modules/*' -not -path '*/.git/*' -not -path '*/data/*' -not -path '*/token-spy/*')

.PHONY: help lint test bats smoke simulate gate doctor

Expand All @@ -13,34 +13,34 @@ lint: ## Syntax check all shell scripts + Python compile check
@echo "=== Shell syntax ==="
@fail=0; for f in $(SHELL_FILES); do bash -n "$$f" || fail=1; done; [ $$fail -eq 0 ]
@echo "=== Python compile ==="
@python3 -m py_compile extensions/services/dashboard-api/main.py extensions/services/dashboard-api/agent_monitor.py
@python3 -m py_compile dream-server/extensions/services/dashboard-api/main.py dream-server/extensions/services/dashboard-api/agent_monitor.py
@echo "All lint checks passed."

test: ## Run unit and contract tests
@echo "=== Tier map tests ==="
@bash tests/test-tier-map.sh
@bash dream-server/tests/test-tier-map.sh
@echo ""
@echo "=== Installer contracts ==="
@bash tests/contracts/test-installer-contracts.sh
@bash tests/contracts/test-preflight-fixtures.sh
@bash dream-server/tests/contracts/test-installer-contracts.sh
@bash dream-server/tests/contracts/test-preflight-fixtures.sh

bats: ## Run BATS unit tests for shell libraries
@echo "=== BATS unit tests ==="
@bash tests/run-bats.sh
@bash dream-server/tests/run-bats.sh

smoke: ## Run platform smoke tests
@echo "=== Smoke tests ==="
@bash tests/smoke/linux-amd.sh
@bash tests/smoke/linux-nvidia.sh
@bash tests/smoke/wsl-logic.sh
@bash tests/smoke/macos-dispatch.sh
@bash dream-server/tests/smoke/linux-amd.sh
@bash dream-server/tests/smoke/linux-nvidia.sh
@bash dream-server/tests/smoke/wsl-logic.sh
@bash dream-server/tests/smoke/macos-dispatch.sh
@echo "All smoke tests passed."

simulate: ## Run installer simulation harness
@bash scripts/simulate-installers.sh

doctor: ## Run diagnostic report
@bash scripts/dream-doctor.sh
@bash dream-server/scripts/dream-doctor.sh

gate: lint test bats smoke simulate ## Full pre-release validation (lint + test + bats + smoke + simulate)
@echo ""
Expand Down
File renamed without changes.
20 changes: 10 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ If AI is becoming critical infrastructure, it shouldn’t be rented. Self-hostin

[![Watch the demo](https://img.shields.io/badge/Demo-Watch%20on%20YouTube-red?logo=youtube)](https://youtu.be/nO8xFNHX-HA)

**New here?** Read the [Friendly Guide](dream-server/docs/HOW-DREAM-SERVER-WORKS.md) or [listen to the audio version](https://open.spotify.com/episode/40MvqJ41bC8cEgvUyOyE3K) — a complete walkthrough of what Dream Server is, how it works, and how to make it your own. No technical background needed.
**New here?** Read the [Friendly Guide](docs/HOW-DREAM-SERVER-WORKS.md) or [listen to the audio version](https://open.spotify.com/episode/40MvqJ41bC8cEgvUyOyE3K) — a complete walkthrough of what Dream Server is, how it works, and how to make it your own. No technical background needed.

</div>

Expand All @@ -38,7 +38,7 @@ If AI is becoming critical infrastructure, it shouldn’t be rented. Self-hostin
>
> **macOS:** Requires Apple Silicon (M1+) and Docker Desktop. llama-server runs natively with Metal GPU acceleration; all other services run in Docker.
>
> See the [Support Matrix](dream-server/docs/SUPPORT-MATRIX.md) for details.
> See the [Support Matrix](docs/SUPPORT-MATRIX.md) for details.

---

Expand Down Expand Up @@ -118,7 +118,7 @@ cd DreamServer/dream-server

The installer detects your chip, picks the right model for your unified memory, launches llama-server natively with Metal acceleration, and starts all other services in Docker. Manage with `./dream-macos.sh status`.

See the [macOS Quickstart](dream-server/docs/MACOS-QUICKSTART.md) for details.
See the [macOS Quickstart](docs/MACOS-QUICKSTART.md) for details.

</details>

Expand Down Expand Up @@ -256,7 +256,7 @@ dream list # See everything

The installer itself is modular — 6 libraries and 13 phases, each in its own file. Want to add a hardware tier, swap a default model, or skip a phase? Edit one file.

[Full extension guide](dream-server/docs/EXTENSIONS.md) | [Installer architecture](dream-server/docs/INSTALLER-ARCHITECTURE.md)
[Full extension guide](docs/EXTENSIONS.md) | [Installer architecture](docs/INSTALLER-ARCHITECTURE.md)

---

Expand Down Expand Up @@ -310,12 +310,12 @@ Other tools get you part of the way. Dream Server gets you the whole way.

| | |
|---|---|
| [Quickstart](dream-server/QUICKSTART.md) | Step-by-step install guide with troubleshooting |
| [Hardware Guide](dream-server/docs/HARDWARE-GUIDE.md) | What to buy, tier recommendations |
| [FAQ](dream-server/FAQ.md) | Common questions and configuration |
| [Extensions](dream-server/docs/EXTENSIONS.md) | How to add custom services |
| [Installer Architecture](dream-server/docs/INSTALLER-ARCHITECTURE.md) | Modular installer deep dive |
| [Changelog](dream-server/CHANGELOG.md) | Version history and release notes |
| [Quickstart](QUICKSTART.md) | Step-by-step install guide with troubleshooting |
| [Hardware Guide](docs/HARDWARE-GUIDE.md) | What to buy, tier recommendations |
| [FAQ](FAQ.md) | Common questions and configuration |
| [Extensions](docs/EXTENSIONS.md) | How to add custom services |
| [Installer Architecture](docs/INSTALLER-ARCHITECTURE.md) | Modular installer deep dive |
| [Changelog](CHANGELOG.md) | Version history and release notes |
| [Contributing](CONTRIBUTING.md) | How to contribute |

---
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
Loading
Loading