{"id":50472442,"url":"https://github.com/semcod/dbos","last_synced_at":"2026-06-01T11:03:35.282Z","repository":{"id":353493964,"uuid":"1219657160","full_name":"semcod/dbos","owner":"semcod","description":null,"archived":false,"fork":false,"pushed_at":"2026-04-24T06:27:58.000Z","size":67,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-24T07:16:44.017Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/semcod.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","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-04-24T05:06:19.000Z","updated_at":"2026-04-24T06:28:01.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/semcod/dbos","commit_stats":null,"previous_names":["semcod/dbos"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/semcod/dbos","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semcod%2Fdbos","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semcod%2Fdbos/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semcod%2Fdbos/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semcod%2Fdbos/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/semcod","download_url":"https://codeload.github.com/semcod/dbos/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semcod%2Fdbos/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33771630,"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-06-01T02:00:06.963Z","response_time":115,"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-06-01T11:03:35.156Z","updated_at":"2026-06-01T11:03:35.267Z","avatar_url":"https://github.com/semcod.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Platform OS\n\nA schema-driven runtime for data and applications. Not a backend, not an app.\nPostgreSQL holds meaning, MIME-typed content tables hold payloads, and a set\nof small services consume them through a published contract.\n\n## What this actually is\n\nEverything — devices, articles, scenarios, images, HTML pages, protocols —\nlives as an `entities` row plus exactly one row in a `content_*` table\nchosen by MIME. There's one content table per MIME type, which means any\nservice that cares about one MIME doesn't have to know about the others,\nand you can `pg_dump -t content_markdown` to take your articles to a\ndifferent project without dragging along the rest of the database.\n\nOn top of the data there are:\n\n- **sync-engine** — watches `./data/`, parses files by extension, routes each to the right `content_*` table\n- **api-gateway** — generic `/api/entities/:id` that joins `entities` with the correct content table at runtime; plus CRUD for `storage_backends`, `protocol_gateways`, `inbound_sources`\n- **command-bus** — persists every command, routes to a worker by `schemas.target_runtime`\n- **worker-python** / **worker-php** — execute business logic\n- **gen-jinja** (Python), **gen-twig** (PHP), **gen-handlebars** (Node) — three website generators, each reading the same tables, each declaring what it can render in `schemas.renderers[]`\n- **ui-runtime** — schema-driven frontend\n- **nginx-cdn** — reverse proxy with preview caching\n- **vfs-webdav** — WebDAV skin over the same tables (mount from anywhere)\n- **vfs-fuse** — real Linux FUSE mount\n- **vfs-ftp** — FTP server (`:2121`) with passive mode support\n- **vfs-imap** — IMAP4rev1 server (`:1143`) exposing entities as mailboxes/messages\n- **vfs-pop3** — POP3 server (`:1110`) with UIDL/RETR/DELE\n- **vfs-smtp** — SMTP gateway (`:2525`) ingesting mail as `mail/*` entities\n- **storage-mirror** — tails `audit_log` and replays writes into SQLite / MySQL mirrors\n- **sync-outbound** — reads `service_mappings` and pushes matching entities to filesystem targets (e.g. `./email/*.eml`)\n- **connectors** — inbound pollers (filesystem, IMAP-pull, FTP-pull, SQL-mirror)\n\n## Layout\n\n```\nplatform/\n├─ docker-compose.yml\n├─ Makefile                       stack lifecycle, tests, runnable examples\n├─ .env.example\n├─ postgres/init/                 7 SQL files run on first boot\n│  ├─ 01_core.sql                 extensions, users, ACL, audit_log\n│  ├─ 02_registry.sql             schemas, mime_types, schema_paths, filesystem_map\n│  ├─ 03_content_tables.sql       entities + content_json/yaml/xml/html/markdown/binary\n│  ├─ 04_schemas_seed.sql         JSON Schemas + renderer declarations\n│  ├─ 05_demo_data.sql            first rows in every content table\n│  ├─ 06_connectors.sql           storage_backends, protocol_gateways, inbound_sources\n│  └─ 07_mail_schema.sql          mail schema + schema_paths seed for SMTP/IMAP/POP3\n├─ scripts/\n│  ├─ demo.sh                     end-to-end walkthrough\n│  ├─ export-service.sh           extract one service + its tables for reuse\n│  └─ db-upgrade-protocols.sh     apply registry + mail schema to existing Postgres volumes\n├─ libs/platform_storage/         shared storage contract + adapters (Pg, SQLite, MySQL)\n├─ sync-engine/                   filesystem -\u003e DB, MIME-routed\n├─ api-gateway/                   REST + ACL + schema validation + registry CRUD\n├─ command-bus/                   routes commands to workers by target_runtime\n├─ workers/\n│  ├─ python/                     FastAPI; handles create_device, etc.\n│  └─ php/                        PHP CLI server; handles render_page\n├─ generators/                    website generators (same contract, 3 techs)\n│  ├─ gen-jinja/                  Python + FastAPI + Jinja2 + markdown\n│  ├─ gen-twig/                   PHP + Twig\n│  └─ gen-handlebars/             Node + Express + Handlebars\n├─ ui-runtime/                    vanilla JS schema-driven UI\n├─ cdn/nginx.conf                 reverse proxy\n├─ vfs-webdav/                    WebDAV frontend over content_* tables\n├─ vfs-fuse/                      FUSE frontend over content_* tables\n├─ vfs-ftp/                       FTP gateway (passive mode, masquerade support)\n├─ vfs-imap/                      IMAP4rev1 gateway\n├─ vfs-pop3/                      POP3 gateway\n├─ vfs-smtp/                      SMTP ingest gateway\n├─ storage-mirror/                audit_log tailer -\u003e SQLite/MySQL mirrors\n├─ sync-outbound/                   service_mappings -\u003e filesystem export\n├─ connectors/                    inbound poller daemons\n├─ sdk/                           Python / JS / PHP clients\n├─ examples/                      runnable integration scenarios\n│  ├─ 01-write-http-read-protocols/\n│  ├─ 02-smtp-to-platform/\n│  ├─ 03-sqlite-mirror/\n│  ├─ 04-connectors-registry/\n│  └─ 05-everything/\n├─ data/                          watched by sync-engine (nested dirs supported)\n│  ├─ articles/*.md\n│  ├─ devices/*.json\n│  ├─ pages/*.html\n│  ├─ pages/page2/*.html         nested directory example\n│  ├─ scenarios/*.yaml\n│  └─ protocols/*.xml\n├─ logs/                          info.txt, warnings.txt, error.txt\n└─ mirror-data/                   SQLite mirror default path\n```\n\n## Quickstart\n\n```bash\ncp .env.example .env\nmake up-all          # core + protocols + connectors + mirrors\n```\n\nWhat happens on first boot:\n\n1. Postgres runs the 7 init SQL files (schemas, demo data, registry, mail schema)\n2. `sync-engine` picks up every file in `./data/` and writes it to the matching content table\n3. All three generators wake up and publish `/capabilities` from `schemas.renderers[]`\n4. UI at \u003chttp://localhost:5173\u003e (login `admin@platform.local` / `demo1234`)\n   - File Browser: `#files` — tree, table, manager, grid views\n   - Thumbnails: 64x64 PNG generated from file content (colors per MIME type)\n   - Icon size control: 16px–64px, row height: compact/normal/spacious\n   - Inline HTML preview + schema preview on entity pages\n   - JSON syntax highlighting\n5. CDN at \u003chttp://localhost:8081\u003e, WebDAV at `http://localhost:8090`\n6. Protocol gateways: FTP `:2121`, IMAP `:1143`, POP3 `:1110`, SMTP `:2525`\n7. Logs in `./logs/` for debugging services\n\nThen from a second terminal:\n\n```bash\nmake examples        # run all 5 integration scenarios\n./scripts/demo.sh    # end-to-end walkthrough\n```\n\nIf you already have an old Postgres volume, run `make db-upgrade-protocols` before\nstarting the new services so registry tables and the mail schema exist.\n\n## File Browser UI\n\nThe UI at `#files` provides 4 views for browsing entities:\n\n| View      | URL hash                | Description                                    |\n| --------- | ----------------------- | -----------------------------------------------|\n| Tree      | `#files/tree`           | Hierarchical tree with expandable folders        |\n| Table     | `#files/table`          | Columns: path, type, schema, MIME, updated, status |\n| Manager   | `#files/manager`        | Two-column file manager with drag-and-drop move + edit/delete |\n| Grid      | `#files/grid`           | Grouped by folder, thumbnail + filename cards  |\n\nControls:\n- **Icon Size**: 16px / 24px / 32px / 48px / 64px — adjusts thumbnails everywhere\n- **Row Height**: compact / normal / spacious — table and tree spacing\n\n## Nested filesystem paths\n\nFiles in subdirectories are supported. `data/pages/page2/welcome.html` is stored with `external_id = pages/page2/welcome` (slash-separated). The UI displays paths as on disk.\n\n```bash\n# This entity exists at the nested path\ncurl -H \"Authorization: Bearer $TOKEN\" \\\n  \"http://localhost:3000/api/entity?external_id=pages/page2/welcome\"\n```\n\n## Thumbnails\n\nEvery file change triggers 64x64 PNG thumbnail generation via `sharp`:\n- **Images**: resized actual image\n- **Text/HTML/JSON/YAML/XML**: colored squares (color per MIME) with dot pattern indicating content length\n\nThumbnails are stored in the `thumbnails` table and served from `GET /api/thumbnail?external_id=...\u0026size=64px`.\n\n## Mount the platform as a filesystem\n\n### WebDAV (easiest — works on Linux/Mac/Windows)\n\n```bash\n# Linux\nsudo apt install davfs2\nsudo mkdir -p /mnt/vfs\nsudo mount -t davfs http://localhost:8090 /mnt/vfs\n# user: admin  password: admin  (from .env)\n\nls /mnt/vfs\n#   articles/  customers/  devices/  images/  pages/  protocols/  scenarios/\n\ncat /mnt/vfs/articles/hello-platform.md      # streams content_markdown.body\necho \"# new\" \u003e /mnt/vfs/articles/test.md     # upserts into content_markdown\n```\n\nmacOS: Finder → *Go* → *Connect to Server* → `http://localhost:8090`\nWindows: Explorer → *This PC* → *Map network drive* → `http://localhost:8090`\n\n### FUSE (real Linux mount)\n\nOnly on a Linux host with `/dev/fuse`:\n\n```bash\ndocker compose --profile fuse up -d vfs-fuse\nls ./vfs-mount/                              # shares the same folder with the container\n```\n\nInside the container the mount is at `/mnt/vfs`, bind-mounted to\n`./vfs-mount/` on the host so other processes see it too.\n\n## The reusability recipe\n\nSay you want `gen-jinja` in a completely different project next week:\n\n```bash\n./scripts/export-service.sh gen-jinja\n# -\u003e ./export/gen-jinja/\n#       service/                source + Dockerfile\n#       bundle.sql              schemas + mime_types + content_markdown + content_html\n#       docker-compose.snippet  service block for the new project\n```\n\nDrop `bundle.sql` into the new project's DB, paste the compose snippet,\n`docker compose up`. On first hit the service queries `mime_types` and\n`schemas`, sees what it's registered for, starts handling requests. No code\nchange.\n\n## Developing\n\n### Watch a file go from disk to DB\n\n```bash\ncat \u003e data/articles/my-post.md \u003c\u003cEOF\n---\ntitle: My first post\nauthor: me\ntags: [hello]\n---\n# Hi\n\nThis will end up in \\`content_markdown\\` within a second.\nEOF\n\n# ~1s later:\ncurl -s http://localhost:3000/api/entities/my-post \\\n  -H \"Authorization: Bearer $TOKEN\" | jq\n```\n\n### Render an article three different ways\n\n```bash\n# Python + Jinja2\ncurl -X POST http://localhost:6001/render/my-post\n\n# Node + Handlebars (uses content_json, so pick a device)\ncurl -X POST http://localhost:6003/render/device_001\n\n# PHP + Twig (uses a template + a data entity)\ncurl -X POST http://localhost:6002/render/landing \\\n  -H 'content-type: application/json' \\\n  -d '{\"data_from\":\"device_001\"}'\n```\n\nAll three write their output to `content_html` rows tagged with\n`source = 'generator'`. Fetch the latest via the API:\n\n```bash\ncurl -H \"Authorization: Bearer $TOKEN\" \\\n  http://localhost:3000/api/entities/my-post/html\n```\n\n### Add a new MIME type without changing code\n\n```sql\n-- tell the platform about a new MIME, e.g. application/toml\nINSERT INTO mime_types (mime, category, content_table, storage_mode)\nVALUES ('application/toml', 'structured', 'content_toml', 'db');\n\n-- create the table (mirror content_yaml shape)\nCREATE TABLE content_toml (\n  id uuid PRIMARY KEY DEFAULT uuid_generate_v4(),\n  entity_id uuid NOT NULL REFERENCES entities(id) ON DELETE CASCADE,\n  raw_text text NOT NULL,\n  parsed jsonb NOT NULL,\n  checksum text NOT NULL,\n  version int NOT NULL DEFAULT 1,\n  source change_source NOT NULL DEFAULT 'system',\n  created_at timestamptz NOT NULL DEFAULT now(),\n  updated_at timestamptz NOT NULL DEFAULT now(),\n  UNIQUE(entity_id)\n);\n```\n\nThat's it from Postgres' side. `sync-engine` needs a one-line addition to its\n`EXT_TO_MIME` map to route `.toml` files, but anyone who only reads the\nregistry (generators, VFS, API) picks up the new routing automatically.\n\n## Architecture\n\n```\n           +-------------+   WebDAV   FUSE   FTP   IMAP   POP3\n           | UI / Client |     |       |      |      |      |\n           +------+------+     |       |      |      |      |\n                  |            v       v      v      v      v\n                  |    +----------+ +------+ +------+ +------+ +------+\n                  |    |vfs-webdav| |fuse  | |ftp   | |imap  | |pop3  |\n                  |    +----+-----+ +---+--+ +---+--+ +--+---+ +--+---+\n                  |         |          |        |        |        |\n           +-------------+  |          |        |        |        |\n           |  api-gateway|  |          |        |        |        |\n           +------+------+  |          |        |        |        |\n                  |         v          v        v        v        v\n                  |    +------------------------------------------------+\n                  |    |               PostgreSQL (primary)               |\n                  v    |  entities + content_* tables + schemas + audit_log |\n           +-------------+ |  storage_backends + protocol_gateways      |\n           | command-bus | |  inbound_sources                               |\n           +------+------+ +-----------------------+------------------------+\n                  |                                ^\n    +-------------+---+                            |\n    v             v   v                    +--------------------+\n worker-       gen-*    +----------------\u003e |  storage-mirror    |\n python/php                               |  SQLite / MySQL    |\n                                          +--------------------+\n                                       ^\n                                       |\n                           +---------------------+\n                           |     sync-engine     |\n                           +----------+----------+\n                                      |\n                                   ./data/*\n```\n\n## Cheat sheet\n\n| What                              | How                                                                 |\n| --------------------------------- | ------------------------------------------------------------------- |\n| Log in                            | `POST /auth/login  {email, password}` → JWT                         |\n| List entities                     | `GET /api/entities?entity_type=device\u0026limit=200`                    |\n| Fetch entity + content            | `GET /api/entities/:external_id`  or `GET /api/entity?external_id=` |\n| View rendered HTML                | `GET /api/entities/:external_id/html`                               |\n| Thumbnail (64x64 PNG)             | `GET /api/thumbnail?external_id=pages/page2/welcome\u0026size=64px`      |\n| Update entity (move/edit)         | `PATCH /api/entity?external_id=... {external_id, content}`          |\n| Delete entity                     | `DELETE /api/entity?external_id=...`                                |\n| File Browser views                | `#files/tree`, `#files/table`, `#files/manager`, `#files/grid`      |\n| Inspect routing                   | `GET /mime-types`  and  `GET /schemas`                              |\n| Who renders schema X?             | `SELECT renderers FROM schemas WHERE id = 'article_v1';`            |\n| Run a command                     | `POST /commands/create_device  {...}`                               |\n| Audit                             | `GET /audit` (admin only)                                           |\n| Registry CRUD (backends/gateways/sources) | `GET|POST|PATCH|DELETE /api/storage-backends` / `protocol-gateways` / `inbound-sources` |\n| Mount as filesystem               | `mount -t davfs http://localhost:8090 /mnt/vfs`                     |\n| Export one service                | `./scripts/export-service.sh gen-jinja`                             |\n| View logs                         | `cat ./logs/info.txt`  `./logs/warnings.txt`  `./logs/error.txt`    |\n| Run all examples                  | `make examples`                                                     |\n| Upgrade existing DB               | `make db-upgrade-protocols`                                         |\n| Install dev tools                 | `make install-dev`  (taskfile + testql)                             |\n| List taskfile tasks               | `taskfile list`                                                     |\n| Run TestQL smoke tests            | `testql run testql-scenarios/*.testql.toon.yaml`                    |\n\n## Conventions that make this work\n\n1. **Every entity declares a MIME.** `entities.primary_mime` points at\n   `mime_types` which points at a content table. No service hardcodes\n   which table holds what — they read the registry.\n2. **Schemas carry `renderers[]`.** Generators advertise compatibility via\n   data, not a central registry file.\n3. **Filesystem layout is `schemas.fs_path_template`.** Change the\n   template, the WebDAV/FUSE/sync-engine layouts all update together.\n4. **Sources are always tracked.** Every row has `source ∈\n   {filesystem, api, command, generator, system}`, and so does every\n   `audit_log` entry. You always know who wrote what.\n\n## Uniform protocols \u0026 storage plug-ins\n\nEvery protocol surface (WebDAV, FUSE, FTP, IMAP, POP3, SMTP) and every\ninbound connector (filesystem, IMAP-pull, FTP-pull, SQL-mirror) implements\nthe same `EntityStore` contract from `libs/platform_storage/`. Add a new\nprotocol by writing a thin wrapper over that class — the data contract,\nMIME routing and audit trail stay identical.\n\n### Four registry tables\n\n| Table               | What lives there                                      |\n| ------------------- | ----------------------------------------------------- |\n| `storage_backends`  | Databases/object-stores: postgres, sqlite, mysql, …   |\n| `protocol_gateways` | Outbound surfaces: webdav, ftp, imap, pop3, smtp, …   |\n| `inbound_sources`   | Pullers: filesystem, IMAP mailboxes, FTP dirs, SQL    |\n| `service_mappings`  | Data-flow routing: source → target (DB → filesystem)    |\n\nSeeded on first boot (`06_connectors.sql` + `08_service_mappings.sql`); add rows at runtime via UI or API.\n\n### SDK (Python / JavaScript / PHP)\n\nProgrammatic access to entities, registry, and config:\n\n```python\nfrom dbos_client import DBOSClient\ndb = DBOSClient('http://localhost:3000')\ndb.login('admin@platform.local', 'demo1234')\ndb.create_entity('mail/hello', 'mail', 'mail_v1', {'title':'Hello','body':'World'})\ndb.create_service_mapping('imap-to-email', 'pg-primary', 'filesystem-email',\n                          filter={'entity_type':'mail'},\n                          transform={'format':'rfc5322','extension':'.eml'})\n```\n\nSee `sdk/python/dbos_client.py`, `sdk/js/dbos_client.js`, `sdk/php/DBOSClient.php`.\n\n### Start the extra protocols\n\n```bash\ndocker compose --profile protocols up -d\n#   vfs-ftp   :2121     (FTP, user/pass from FTP_USER/FTP_PASS)\n#   vfs-imap  :1143     (IMAP4rev1)\n#   vfs-pop3  :1110     (POP3)\n#   vfs-smtp  :2525     (accepts incoming mail → entities)\n\ndocker compose --profile outbound up -d\n#   sync-outbound       (exports DB entities → ./email/*.eml via service_mappings)\n```\n\nExample — read articles over IMAP with a mail client or `openssl`:\n\n```bash\n# Any IMAP client works. Account = localhost:1143, user 'admin', pass 'admin'.\n# Mailbox \"articles\" lists every markdown entity; each message body IS the\n# markdown, with entity metadata in RFC-5322 headers.\n```\n\nExample — upload a file via FTP, see it in the same DB:\n\n```bash\nlftp -u admin,admin localhost:2121\ncd articles\nput my-post.md      # -\u003e content_markdown via platform_storage, source='ftp'\n```\n\n### Start the inbound pullers\n\n```bash\ndocker compose --profile connectors up -d\n```\n\nThen register a remote source at runtime:\n\n```sql\nINSERT INTO inbound_sources (id, driver, endpoint, credentials_ref,\n                             target_mime, id_template, config) VALUES\n('support-mail', 'imap', 'imaps://mail.example.com:993', 'SUPPORT',\n 'text/markdown', 'mail/{remote_id}',\n '{\"mailbox\":\"INBOX\",\"limit\":50}');\n```\n\nPut `SUPPORT_USER`/`SUPPORT_PASS` in the env and the `connector-imap-pull`\ndaemon will begin polling it every minute, writing messages as `mail/*`\nentities via the same `EntityStore.write()` used by `vfs-smtp`.\n\n### Mirror to a different database\n\nDeclare a secondary backend and start the mirror daemon:\n\n```sql\nINSERT INTO storage_backends (id, driver, role, dsn) VALUES\n('sqlite-mirror', 'sqlite', 'mirror', 'sqlite:///mirror-data/platform.sqlite');\n```\n\n```bash\ndocker compose --profile mirrors up -d storage-mirror\n```\n\nThe daemon tails `audit_log` and replays every write into each mirror.\nBoth MySQL (`driver='mysql'`) and SQLite (`driver='sqlite'`) are\nimplemented; adding Mongo/Redis is one adapter class.\n\n## What's deliberately not here\n\nThis is a usable dev scaffold, not a production stack. Things a production\ndeployment would add:\n\n- Redis / Kafka for real async queues (commands currently execute inline)\n- Object store (MinIO/S3) for `content_binary` when `storage_mode='object_store'`\n- Observability (OTel traces, metrics, structured logs)\n- Proper secrets management for JWT + DB credentials\n- Connection pooling beyond what the Node/Python drivers provide by default\n- Kubernetes manifests mirroring the compose topology\n\n\n## License\n\nLicensed under Apache-2.0.\n\n\u003c!-- taskill:status:start --\u003e\n\n## Status\n\n_Last updated by [taskill](https://github.com/oqlos/taskill) at 2026-04-25 13:37 UTC_\n\n| Metric | Value |\n|---|---|\n| HEAD | `d28c580` |\n| Coverage | — |\n| Failing tests | — |\n| Commits in last cycle | 5 |\n\n\u003e Added documentation for a code analysis engine and a configuration management system; also introduced example files and additional service components.\n\n\u003c!-- taskill:status:end --\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsemcod%2Fdbos","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsemcod%2Fdbos","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsemcod%2Fdbos/lists"}