FlySwarm keeps demo artifacts clearly separate from the real swarm system, while allowing both to share stable contracts and adapters.
Backend, harness, and tests are Python-based; model routing is provider-agnostic via LiteLLM, with both local (ollama) and cloud backends.
apps/demo-landing/- landing-page experiment and validation demosapps/telegram-bot/- real Telegram chat product surfaceapps/swarm-orchestrator/- real scheduler/orchestration runtimepackages/domain/- shared business entities and rulespackages/contracts/- shared interfaces (LLM/storage/flights/notifier)packages/adapters/- swappable implementations (json/sqlite, ollama/cloud, mock/live APIs)packages/shared/- shared config/logging/observability utilitiesharness/- autonomous local builder loop and tool registryorchestrator/- skills abstraction layer: discovers, plans, runs and verifies skillsconfig/- committed non-secret routing and environment configdata/- local runtime data (git-ignored content)docs/- architecture decisions and experiments
cd apps/demo-landing
python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install -r backend/requirements.txt
uvicorn backend.main:app --reloadOpen http://127.0.0.1:8000
python3 -m pytest -q apps/demo-landing/tests/test_storage.py apps/demo-landing/tests/test_signup_api.pyOne-time browser install (network required, ~100MB):
python3 -m pip install -r apps/demo-landing/backend/requirements.txt
python3 -m pip install -r apps/demo-landing/backend/requirements-dev.txt
python3 -m playwright install chromium
python3 -m pytest -q apps/demo-landing/testsOr use the verification scripts:
bash scripts/checks/verify_layer2.sh
bash scripts/checks/verify_layer3.shInstall harness dependencies:
python3 -m pip install -r harness/requirements.txtRun a task:
python3 -m harness "Inspect demo-landing tests and summarize coverage" --max-steps 8Provider/model override examples:
python3 -m harness "Run a short planning loop" --provider openai --model openai/gpt-4o
python3 -m harness "Run a short planning loop" --provider ollama --model ollama_chat/llama3.1Discovers every skill under .claude/skills/, plans which (if any) to use for a goal,
runs each as an isolated sub-agent, and verifies each skill's input/output. New skills
are picked up automatically — no code changes.
# Preview the plan without executing any skill:
PYTHONPATH=. python3 -m orchestrator "<goal>" --dry-run
# Execute, with a total token budget across planner + verifier + all skills:
PYTHONPATH=. python3 -m orchestrator "<goal>" --token-budget 30000
# Enable a disable-model-invocation skill explicitly, or exclude skills:
PYTHONPATH=. python3 -m orchestrator "<goal>" --only skill-builder
PYTHONPATH=. python3 -m orchestrator "<goal>" --skip grill-me- LLM routing is configured in
config/models.yaml - Secrets and runtime overrides live in
.env(git-ignored) - Supported waitlist storage backends in this scope:
STORAGE_BACKEND=jsonwithFLYSWARM_EMAILS_FILEoverrideSTORAGE_BACKEND=sqlitewithFLYSWARM_SQLITE_FILEoverride
config/agents.yamlandconfig/storage.yamlare placeholder templates for later phases
GET /api/healthreturns{"status":"ok"}- Click
Try Telegram Demoand verify log progression:Interface -> Orchestrator -> Fetching/API -> Analytics -> Notification - Submit waitlist form:
- first submit returns success
- duplicate submit returns already-on-waitlist
- records are persisted to selected backend
For the autonomous run write-up and harness metrics, see docs/experiments/layer3_autonomous.md.