{"id":51417976,"url":"https://github.com/leomartindev/diavola","last_synced_at":"2026-07-04T22:00:28.939Z","repository":{"id":369312045,"uuid":"1288989874","full_name":"LeoMartinDev/diavola","owner":"LeoMartinDev","description":null,"archived":false,"fork":false,"pushed_at":"2026-07-04T16:13:06.000Z","size":1158,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-04T17:11:38.229Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/LeoMartinDev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-07-04T07:47:55.000Z","updated_at":"2026-07-04T16:07:10.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/LeoMartinDev/diavola","commit_stats":null,"previous_names":["leomartindev/diavola"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/LeoMartinDev/diavola","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LeoMartinDev%2Fdiavola","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LeoMartinDev%2Fdiavola/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LeoMartinDev%2Fdiavola/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LeoMartinDev%2Fdiavola/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/LeoMartinDev","download_url":"https://codeload.github.com/LeoMartinDev/diavola/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LeoMartinDev%2Fdiavola/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35136712,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-04T02:00:05.987Z","response_time":113,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-07-04T22:00:19.076Z","updated_at":"2026-07-04T22:00:28.892Z","avatar_url":"https://github.com/LeoMartinDev.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Diavola\n\n**Diavola** is a desktop app that launches and supervises your project's\ndevelopment commands. Describe your processes in a `diavola.yml` file, and Diavola\nstarts everything in the right order, checks that each service is ready, and\nshuts it all down cleanly.\n\nNo more scattered terminal tabs and sticky notes to remember startup order. One\nfile, one click, everything runs.\n\n---\n\n## How It Works\n\n1. Create a `diavola.yml` in your project root\n2. List your commands (API, database, worker, etc.)\n3. Open Diavola, import your project\n4. Click **Start** — Diavola launches everything in dependency order, waits for\n   each service to be ready, then moves to the next\n5. Watch logs per process, use the integrated terminal, and click **Stop** to\n   shut everything down\n\n---\n\n## Configuration Reference\n\nThe config file is plain YAML. Edit it with any text editor or directly inside\nDiavola using the built-in form editor.\n\n### Structure\n\n```yaml\nenv:                 # optional — shared env vars\n  NODE_ENV: development\n  DATABASE_URL: postgres://localhost:5432/myproject\n\nprocesses:           # required — at least one process\n  \u003cname\u003e:\n    kind: task | service              # required\n    cmd: \u003cshell command\u003e              # required\n    env:                              # optional — per-process overrides\n      PORT: \"3000\"\n    dependsOn:                        # optional\n      \u003cother_process\u003e: success | ready\n    ready:                            # optional (services only)\n      type: log | http | delay | command\n      # ... type-specific fields\n```\n\n### Process Kinds\n\n| Kind | Behavior |\n|------|----------|\n| `task` | Runs a command that finishes on its own (install, migrate, compile). Diavola waits for it to exit. If it fails (non-zero exit), everything stops. |\n| `service` | Runs a long-lived process (server, worker). Diavola starts it and monitors its readiness. If it stops unexpectedly, everything stops. |\n\n### Dependencies (`dependsOn`)\n\nProcesses start in dependency order. Diavola resolves the graph, detects cycles,\nand reports them as errors.\n\n| Condition | Use with | Meaning |\n|-----------|----------|---------|\n| `success` | `task` | Wait for the task to exit with code 0 |\n| `ready` | `service` | Wait for the service to pass its readiness check |\n\n```yaml\napi:\n  kind: service\n  cmd: npm run dev\n  dependsOn:\n    setup: success     # wait for setup task to finish\n    database: ready    # wait for database service to be ready\n```\n\n### Readiness Checks (`ready`)\n\nFor `service` processes, Diavola needs to know when the service is actually ready.\nThere are four check types:\n\n#### Log\n\nWait for a log line to appear in the process output.\n\n```yaml\nready:\n  type: log\n  pattern: \"listening on port 3000\"\n  timeoutMs: 30000    # optional, default: 60000\n\n# or with regex:\nready:\n  type: log\n  pattern: \"listening on (port )?\\\\d+\"\n  regex: true\n```\n\n#### HTTP\n\nPoll a URL until it returns a 2xx response.\n\n```yaml\nready:\n  type: http\n  url: http://localhost:3000/health\n  intervalMs: 1000    # optional, default: 1000\n  timeoutMs: 30000    # optional, default: 60000\n```\n\n#### Delay\n\nWait a fixed duration after the process starts.\n\n```yaml\nready:\n  type: delay\n  durationMs: 2000\n```\n\n#### Command\n\nRun a command repeatedly until it exits with code 0. The command must be\nidempotent (safe to run multiple times).\n\n```yaml\nready:\n  type: command\n  cmd: curl -sS http://localhost:3000/health\n  intervalMs: 1000    # optional, default: 1000\n  timeoutMs: 30000    # optional, default: 60000\n```\n\n### Environment Variables\n\nGlobal `env` applies to all processes. Per-process `env` overrides global values\nfor that process only. Readiness check commands also receive these variables.\n\n```yaml\nenv:\n  NODE_ENV: development\n\nprocesses:\n  api:\n    kind: service\n    cmd: npm run dev\n    env:\n      PORT: \"3000\"     # overrides NODE_ENV? No — merged on top\n```\n\n### Multi-line Commands\n\nUse YAML's `|` for multi-line scripts:\n\n```yaml\napi:\n  kind: service\n  cmd: |\n    echo \"starting API...\"\n    cd ./packages/api\n    npm run dev\n```\n\n---\n\n## Examples\n\n### Web Project\n\n```yaml\nprocesses:\n  install:\n    kind: task\n    cmd: npm install\n\n  migrate:\n    kind: task\n    cmd: npx prisma migrate dev\n    dependsOn:\n      install: success\n\n  api:\n    kind: service\n    cmd: npm run dev\n    dependsOn:\n      migrate: success\n    ready:\n      type: log\n      pattern: \"Server is listening\"\n\n  frontend:\n    kind: service\n    cmd: npm run dev --workspace=frontend\n    dependsOn:\n      api: ready\n    ready:\n      type: http\n      url: http://localhost:5173\n```\n\n### Python + Redis\n\n```yaml\nenv:\n  PYTHONUNBUFFERED: \"1\"\n\nprocesses:\n  install:\n    kind: task\n    cmd: pip install -r requirements.txt\n\n  redis:\n    kind: service\n    cmd: redis-server\n    ready:\n      type: command\n      cmd: redis-cli ping\n\n  api:\n    kind: service\n    cmd: uvicorn main:app --reload --port 8000\n    dependsOn:\n      install: success\n      redis: ready\n    ready:\n      type: http\n      url: http://localhost:8000/health\n\n  worker:\n    kind: service\n    cmd: celery -A tasks worker --loglevel=info\n    dependsOn:\n      redis: ready\n    ready:\n      type: log\n      pattern: \"celery@.* ready\"\n      regex: true\n```\n\n---\n\n## Integrated Terminal\n\nEach project window includes an integrated terminal opened in the project\ndirectory for running one-off commands (tests, linting, scripts) without leaving\nthe app.\n\n## Editing Configs\n\nDiavola offers two modes for editing `diavola.yml`:\n\n- **Form mode** — structured fields for each option; no YAML knowledge needed\n- **Raw YAML mode** — built-in text editor with full YAML support and\n  validation\n\n## Launching\n\n```bash\ndeno task app path/to/diavola.yml   # launch with a config\ndeno task app                     # launch, then import a project from the UI\n```\n\nFrom the desktop window you can import project directories, create configs from\nscratch, and start/stop your project.\n\n## Tips\n\n- Always use a `ready` check for services — without one, Diavola moves on\n  immediately\n- Prefer `type: log` when your service prints a startup message; use `type:\n  http` for services with a health endpoint\n- `timeoutMs` defaults to **60 seconds**; increase it if your service starts\n  slowly\n- Failed tasks stop everything; fix the error and restart\n- Multi-project: open multiple Diavola windows for separate projects\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleomartindev%2Fdiavola","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fleomartindev%2Fdiavola","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleomartindev%2Fdiavola/lists"}