{"id":48642401,"url":"https://github.com/forattini-dev/reddb","last_synced_at":"2026-04-15T10:01:17.024Z","repository":{"id":349914438,"uuid":"1202753894","full_name":"forattini-dev/reddb","owner":"forattini-dev","description":"RedDB is a multi-structure database engine for applications that need structured rows, raw payloads, linked entities, semantic retrieval, graph analytics, operational metadata and exports without splitting data across multiple systems.","archived":false,"fork":false,"pushed_at":"2026-04-13T00:29:52.000Z","size":35819,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-13T01:02:27.000Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://forattini-dev.github.io/reddb/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/forattini-dev.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":"docs/security/encryption.md","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-06T11:12:08.000Z","updated_at":"2026-04-12T23:51:07.000Z","dependencies_parsed_at":null,"dependency_job_id":"b9502593-f53f-4748-a4ba-9ae8a6c9da24","html_url":"https://github.com/forattini-dev/reddb","commit_stats":null,"previous_names":["forattini-dev/reddb"],"tags_count":66,"template":false,"template_full_name":null,"purl":"pkg:github/forattini-dev/reddb","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/forattini-dev%2Freddb","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/forattini-dev%2Freddb/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/forattini-dev%2Freddb/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/forattini-dev%2Freddb/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/forattini-dev","download_url":"https://codeload.github.com/forattini-dev/reddb/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/forattini-dev%2Freddb/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31835820,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-15T07:17:56.427Z","status":"ssl_error","status_checked_at":"2026-04-15T07:17:30.007Z","response_time":63,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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-04-09T22:03:45.277Z","updated_at":"2026-04-15T10:01:17.017Z","avatar_url":"https://github.com/forattini-dev.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ch1 align=\"center\"\u003eRedDB\u003c/h1\u003e\n  \u003cp align=\"center\"\u003e\u003cstrong\u003eThe AI-first multi-model database.\u003c/strong\u003e\u003c/p\u003e\n  \u003cp align=\"center\"\u003eTables. Documents. Graphs. Vectors. KV. One engine. Ask it anything.\u003c/p\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/forattini-dev/reddb/releases\"\u003e\u003cimg src=\"https://img.shields.io/github/v/release/forattini-dev/reddb?style=flat-square\" alt=\"Release\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.gnu.org/licenses/agpl-3.0\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-AGPL--3.0-blue?style=flat-square\" alt=\"License\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/reddb-cli\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/reddb-cli?style=flat-square\u0026label=npm\" alt=\"npm\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n## The Killer Feature: `ASK`\n\n```sql\nASK 'who owns passport AB1234567 and what services do they use?'\n```\n\nOne command. RedDB searches across tables, graphs, vectors, documents, and key-value stores -- builds context -- calls an LLM -- returns a natural-language answer. No pipelines. No glue code. No other database does this.\n\n---\n\n## 7 Data Models, 1 Engine\n\nStop running Postgres + Neo4j + Pinecone + Redis + Mongo + InfluxDB + RabbitMQ. RedDB unifies them.\n\n```sql\n-- Relational rows\nINSERT INTO users (name, email) VALUES ('Alice', 'alice@co.com')\n\n-- JSON documents\nINSERT INTO logs DOCUMENT (body) VALUES ('{\"level\":\"info\",\"msg\":\"login\"}')\n\n-- Graph edges\nINSERT INTO network EDGE (label, from, to) VALUES ('CONNECTS', 1, 2)\n\n-- Vector similarity search\nSEARCH SIMILAR TEXT 'anomaly detected' COLLECTION events\n\n-- Key-value\nPUT config.theme = 'dark'\n\n-- Time-series metrics (with retention \u0026 downsampling)\nCREATE TIMESERIES cpu_metrics RETENTION 90 d\nINSERT INTO cpu_metrics (metric, value, tags) VALUES ('cpu.idle', 95.2, '{\"host\":\"srv1\"}')\n\n-- Message queues (FIFO, priority, consumer groups)\nCREATE QUEUE tasks MAX_SIZE 10000\nQUEUE PUSH tasks '{\"job\":\"process\",\"id\":123}'\nQUEUE POP tasks\n```\n\nSame file. Same engine. Same query language.\n\n---\n\n## AI-Native From Day One\n\n```sql\n-- Semantic search without managing vectors yourself\nSEARCH SIMILAR TEXT 'suspicious login' COLLECTION logs USING groq\n\n-- Auto-embed on insert -- vectors are created for you\nINSERT INTO articles (title, body) VALUES ('AI Safety', 'Alignment research...')\n  WITH AUTO EMBED (body) USING openai\n\n-- Context search: find everything related to an entity across all models\nSEARCH CONTEXT '192.168.1.1' FIELD ip DEPTH 2\n\n-- Ask questions in plain English\nASK 'what vulnerabilities affect host 10.0.0.1?' USING anthropic\n```\n\nRedDB retrieves context from every data model, feeds it to the LLM, and gives you a grounded answer. RAG built into the database layer.\n\n---\n\n## 11 AI Providers\n\nSwap providers with a keyword. No code changes.\n\n| Provider | Keyword | API Key Required |\n|:---------|:--------|:-----------------|\n| OpenAI | `openai` | Yes |\n| Anthropic | `anthropic` | Yes |\n| Groq | `groq` | Yes |\n| OpenRouter | `openrouter` | Yes |\n| Together | `together` | Yes |\n| Venice | `venice` | Yes |\n| DeepSeek | `deepseek` | Yes |\n| HuggingFace | `huggingface` | Yes |\n| Ollama | `ollama` | No (local) |\n| Local | `local` | No |\n| Custom URL | `https://...` | Configurable |\n\n```sql\nASK 'summarize alerts' USING groq MODEL 'llama-3.3-70b-versatile'\nASK 'summarize alerts' USING ollama MODEL 'llama3'\nASK 'summarize alerts' USING anthropic\n```\n\nSet a default provider so you can drop `USING` from every query:\n\n```bash\n# Set default provider -- no more USING on every query\ncurl -X POST http://127.0.0.1:8080/ai/credentials \\\n  -d '{\"provider\":\"groq\",\"api_key\":\"gsk_xxx\",\"default\":true}'\n```\n\n```sql\n-- Now ASK uses groq by default\nASK 'what happened?'\n```\n\n```bash\n# Export/import all config as JSON\ncurl http://127.0.0.1:8080/config\n```\n\n---\n\n## Probabilistic Data Structures\n\nBuilt-in approximate data structures for real-time analytics at scale.\n\n```sql\n-- HyperLogLog: count unique visitors (~0.8% error, ~16KB memory)\nCREATE HLL visitors\nHLL ADD visitors 'user1' 'user2' 'user3'\nHLL COUNT visitors\n\n-- Count-Min Sketch: frequency estimation\nCREATE SKETCH click_counter WIDTH 2000 DEPTH 7\nSKETCH ADD click_counter 'button_a' 5\nSKETCH COUNT click_counter 'button_a'\n\n-- Cuckoo Filter: membership testing with deletion (unlike Bloom filters)\nCREATE FILTER active_sessions CAPACITY 500000\nFILTER ADD active_sessions 'session_abc'\nFILTER CHECK active_sessions 'session_abc'\nFILTER DELETE active_sessions 'session_abc'\n```\n\n---\n\n## Advanced Indexes\n\nBeyond B-tree. Create the right index for your workload.\n\n```sql\n-- Hash index: O(1) exact-match lookups\nCREATE INDEX idx_email ON users (email) USING HASH\n\n-- Bitmap index: fast analytical queries on low-cardinality columns\nCREATE INDEX idx_status ON orders (status) USING BITMAP\n\n-- R-Tree: spatial queries on geo data\nCREATE INDEX idx_loc ON sites (location) USING RTREE\nSEARCH SPATIAL RADIUS 48.8566 2.3522 10.0 COLLECTION sites COLUMN location LIMIT 50\nSEARCH SPATIAL NEAREST 48.8566 2.3522 K 5 COLLECTION sites COLUMN location\n```\n\n---\n\n## SQL Extensions\n\nRedDB extends SQL with `WITH` clauses for operational semantics:\n\n```sql\n-- TTL: auto-expire records\nINSERT INTO sessions (token) VALUES ('abc') WITH TTL 1 h\n\n-- Context indexes for cross-model search\nCREATE TABLE customers (passport TEXT) WITH CONTEXT INDEX ON (passport)\n\n-- Graph expansion inline with SELECT\nSELECT * FROM users WITH EXPAND GRAPH DEPTH 2\n\n-- Metadata on write\nINSERT INTO logs (msg) VALUES ('deploy') WITH METADATA (source = 'ci')\n\n-- Absolute expiration\nINSERT INTO events (name) VALUES ('launch') WITH EXPIRES AT 1735689600000\n```\n\n---\n\n## 6 Query Languages\n\nWrite in whatever you think in. The engine auto-detects the language.\n\n| Language | Example |\n|:---------|:--------|\n| **SQL** | `SELECT * FROM hosts WHERE os = 'linux'` |\n| **Cypher** | `MATCH (a:User)-[:FOLLOWS]-\u003e(b) RETURN b.name` |\n| **Gremlin** | `g.V().hasLabel('person').out('FOLLOWS').values('name')` |\n| **SPARQL** | `SELECT ?name WHERE { ?p :name ?name }` |\n| **Natural Language** | `show me all critical hosts` |\n| **ASK (RAG)** | `ASK 'what changed in the last 24 hours?'` |\n\nAll six hit the same engine, same data, same indexes.\n\n---\n\n## 48 Built-in Types\n\nNot just `TEXT` and `INTEGER`. RedDB understands your domain.\n\n**Network:** `IpAddr`, `Ipv4`, `Ipv6`, `MacAddr`, `Cidr`, `Subnet`, `Port`\n**Geo:** `Latitude`, `Longitude`, `GeoPoint`\n**Locale:** `Country2`, `Country3`, `Lang2`, `Lang5`, `Currency`\n**Identity:** `Uuid`, `Email`, `Url`, `Phone`, `Semver`\n**Visual:** `Color`, `ColorAlpha`\n**Cross-model refs:** `NodeRef`, `EdgeRef`, `VectorRef`, `RowRef`, `KeyRef`, `DocRef`, `TableRef`, `PageRef`\n**Primitives:** `Integer`, `UnsignedInteger`, `Float`, `Decimal`, `BigInt`, `Text`, `Blob`, `Boolean`, `Json`, `Array`, `Enum`\n**Temporal:** `Timestamp`, `TimestampMs`, `Date`, `Time`, `Duration`\n\nValidation on write. No parsing in your app.\n\n---\n\n## Backup \u0026 Recovery\n\nBuilt-in backup scheduler, WAL archiving, Change Data Capture (CDC), and Point-in-Time Recovery framework:\n\n```bash\n# Poll real-time changes\ncurl 'localhost:8080/changes?since_lsn=0'\n\n# Trigger manual backup\ncurl -X POST localhost:8080/backup/trigger\n\n# Check backup status\ncurl localhost:8080/backup/status\n```\n\nRemote backends: S3, R2, DigitalOcean Spaces, GCS, Turso, Cloudflare D1, local filesystem.\n\n---\n\n## KV REST API\n\nEvery collection doubles as a key-value store with dedicated REST endpoints:\n\n```bash\n# Write a key\ncurl -X PUT http://127.0.0.1:8080/collections/settings/kvs/theme \\\n  -H 'content-type: application/json' -d '{\"value\": \"dark\"}'\n\n# Read a key\ncurl http://127.0.0.1:8080/collections/settings/kvs/theme\n\n# Delete a key\ncurl -X DELETE http://127.0.0.1:8080/collections/settings/kvs/theme\n```\n\nConfig keys work the same way -- read, write, or delete any `red_config` setting at runtime:\n\n```bash\n# Set a config key\ncurl -X PUT http://127.0.0.1:8080/config/red.ai.default.provider \\\n  -d '{\"value\": \"groq\"}'\n\n# Read a config key\ncurl http://127.0.0.1:8080/config/red.ai.default.provider\n\n# Or manage config from SQL\nSET CONFIG red.ai.default.provider = 'groq'\nSHOW CONFIG red.ai\n```\n\n---\n\n## 3 Deployment Modes\n\n| Mode | Think of it as... | Access via |\n|:-----|:-------------------|:-----------|\n| **Embedded** | SQLite | Rust API -- `RedDB::open(\"data.rdb\")` |\n| **Server** | Postgres | HTTP + gRPC -- dual-stack |\n| **Agent** | MCP tool | `red mcp` -- AI agent integration |\n\nSame storage format across all three. Start embedded, scale to server, expose to agents -- no migration.\n\n---\n\n## Performance\n\nRedDB uses multiple optimization techniques for fast queries at scale:\n\n- **Result Cache** -- identical SELECT queries return in \u003c1ms; auto-invalidated on INSERT/UPDATE/DELETE (30s TTL, max 1000 entries)\n- **Hot Entity Cache** -- `get_any(id)` lookups served from an LRU cache (10K entries), O(1) instead of scanning all collections\n- **Binary Bulk Insert** -- gRPC `BulkInsertBinary` with zero JSON overhead, protobuf native types -- 241K ops/sec\n- **Concurrent HTTP** -- thread-per-connection model; each request handled in its own OS thread\n- **Parallel Segment Scanning** -- sealed segments scanned in parallel via `std::thread::scope`; auto-detects single-core and skips parallelism\n- **Hash Join** -- O(n+m) joins instead of O(n*m), auto-selected for large datasets\n- **Lazy Graph Materialization** -- only loads reachable nodes instead of full graph\n- **Pre-filtered Vector Search** -- metadata filters applied before HNSW indexing\n- **Index-Assisted Scans** -- bloom filter + hash index hints for WHERE clauses\n- **Column Projection Pushdown** -- only materializes SELECT columns\n- **Query Plan Caching** -- LRU cache with 1h TTL for repeated queries\n- **Batch Entity Lookup** -- multi-entity fetches resolved in a single pass\n- **Background Maintenance Thread** -- backup scheduling, retention, and checkpoint run off the hot path\n\n---\n\n## Durability \u0026 Corruption Defense\n\nRedDB uses 7 layers of protection to keep your data safe:\n\n| Layer | What it does |\n|:------|:-------------|\n| **File Lock** | Exclusive `flock` prevents two processes from writing the same `.rdb` file |\n| **Double-Write Buffer** | Pages written to `.rdb-dwb` first; survives torn writes on power loss |\n| **Header Shadow** | Copy of page 0 in `.rdb-hdr`; auto-recovers if header corrupts |\n| **Metadata Shadow** | Copy of page 1 in `.rdb-meta`; auto-recovers collection registry |\n| **fsync Discipline** | All critical writes followed by `sync_all()` (not just flush) |\n| **Two-Phase Checkpoint** | Crash-safe WAL→DB transfer with `checkpoint_in_progress` flag |\n| **Binary Store CRC32** | V3 files have CRC32 footer + atomic write-to-temp-then-rename |\n\nEvery page has a CRC32 checksum (verified on read). Every WAL record has a CRC32 checksum. The binary store format (V3) includes a full-file CRC32 footer.\n\n---\n\n## Eventual Consistency\n\nRedDB supports per-field eventual consistency via an append-only transaction log with periodic consolidation. Inspired by CRDT principles (commutative, associative reducers), it enables high-throughput write patterns while guaranteeing convergence.\n\n```bash\n# Track clicks with async consolidation (returns instantly)\ncurl -X POST localhost:8080/ec/urls/clicks/add -d '{\"id\": 1, \"value\": 1}'\n\n# Check consolidated + pending value\ncurl localhost:8080/ec/urls/clicks/status?id=1\n```\n\n| Feature | Description |\n|:--------|:------------|\n| **6 reducers** | Sum, Max, Min, Count, Average, Last (last-write-wins) |\n| **Sync mode** | Consolidates immediately (strong consistency) |\n| **Async mode** | Background worker consolidates periodically (high throughput) |\n| **Transaction log** | Immutable append-only audit trail per field |\n| **SET checkpoint** | Resets base value, discards prior operations |\n| **All modes** | Works in server, embedded (Rust API), and serverless |\n\nSee the [Eventual Consistency Guide](https://forattini-dev.github.io/reddb/#/guides/eventual-consistency) for the theory (CAP theorem, CRDTs, convergence) and full API reference.\n\n---\n\n## Geographic Operations\n\nBuilt-in geo functions with no external dependencies. Supports both spherical (Haversine) and ellipsoidal (Vincenty/WGS-84) models.\n\n```sql\n-- Distance from each store to a point (in km)\nSELECT name, GEO_DISTANCE(location, POINT(-23.55, -46.63)) AS dist\nFROM stores ORDER BY dist\n\n-- Vincenty for sub-millimeter accuracy\nSELECT name, GEO_DISTANCE_VINCENTY(location, POINT(40.71, -74.00)) AS dist\nFROM airports\n```\n\n```bash\n# HTTP API\ncurl -X POST localhost:8080/geo/distance -d '{\n  \"from\": {\"lat\": -23.55, \"lon\": -46.63},\n  \"to\": {\"lat\": -22.91, \"lon\": -43.17}\n}'\n```\n\n| Function | What it computes |\n|:---------|:-----------------|\n| `GEO_DISTANCE` | Haversine distance (km) |\n| `GEO_DISTANCE_VINCENTY` | WGS-84 geodesic distance (km) |\n| `GEO_BEARING` | Compass direction (degrees) |\n| `GEO_MIDPOINT` | Great-circle midpoint |\n\nAlso available: destination point, bounding box, polygon area, spatial search (RADIUS, BBOX, NEAREST). See the [Geo Operations Guide](https://forattini-dev.github.io/reddb/#/guides/geo-operations).\n\n---\n\n## Vector Clustering\n\nStandalone K-Means and DBSCAN clustering on vector collections, with SIMD-accelerated distance computation and automatic parallelization.\n\n```bash\n# K-Means: group products into 5 clusters\ncurl -X POST localhost:8080/vectors/cluster -d '{\n  \"collection\": \"products\", \"algorithm\": \"kmeans\", \"k\": 5\n}'\n\n# DBSCAN: discover clusters automatically (no K needed)\ncurl -X POST localhost:8080/vectors/cluster -d '{\n  \"collection\": \"products\", \"algorithm\": \"dbscan\", \"eps\": 0.5, \"min_points\": 3\n}'\n```\n\nK-Means uses parallel assignment (multi-threaded for datasets \u003e 1K vectors). DBSCAN labels unreachable points as noise (-1), useful for outlier detection. See the [Vector Clustering Guide](https://forattini-dev.github.io/reddb/#/guides/vector-clustering).\n\n---\n\n## Native Drivers\n\nOne connection-string API, four languages. Every driver accepts the same\n`connect(uri)` contract so application code ports across runtimes with zero\nceremony.\n\n| Language          | Package          | Install                        | Backends                            |\n|-------------------|------------------|--------------------------------|-------------------------------------|\n| Rust              | `reddb-client`   | `cargo add reddb-client`       | embedded ✅ · gRPC ⏳              |\n| Node / Bun / Deno | `reddb` (npm)    | `pnpm add reddb`               | stdio subprocess ✅                 |\n| Python            | `reddb` (PyPI)   | `pip install reddb` *(soon)*   | embedded ✅ · gRPC ⏳              |\n\nAll drivers accept the same URIs:\n\n```\nmemory://                   ephemeral in-memory\nfile:///absolute/path       embedded engine on disk\ngrpc://host:port            remote server (planned — tracked in PLAN_DRIVERS.md)\n```\n\nExample — the same app in three languages:\n\n```rust\n// Rust\nlet db = reddb_client::Reddb::connect(\"memory://\").await?;\ndb.insert(\"users\", \u0026JsonValue::object([(\"name\", JsonValue::string(\"Alice\"))])).await?;\nlet rows = db.query(\"SELECT * FROM users\").await?;\n```\n\n```js\n// Node, Bun, Deno\nimport { connect } from 'reddb'\nconst db = await connect('memory://')\nawait db.insert('users', { name: 'Alice' })\nconst rows = await db.query('SELECT * FROM users')\n```\n\n```python\n# Python\nimport reddb\nwith reddb.connect(\"memory://\") as db:\n    db.insert(\"users\", {\"name\": \"Alice\"})\n    print(db.query(\"SELECT * FROM users\"))\n```\n\nDriver docs live in `drivers/rust/README.md`, `drivers/js/README.md`, and\n`drivers/python/README.md`. The full protocol spec and roadmap are in\n[`PLAN_DRIVERS.md`](./PLAN_DRIVERS.md).\n\n---\n\n## Quick Start\n\n```bash\n# Install\ncurl -fsSL https://raw.githubusercontent.com/forattini-dev/reddb/main/install.sh | bash\n\n# Start the server\nred server --http-bind 127.0.0.1:8080 --path ./data.rdb\n\n# Insert data\ncurl -X POST http://127.0.0.1:8080/query \\\n  -H 'content-type: application/json' \\\n  -d '{\"query\":\"INSERT INTO hosts (ip, os) VALUES ('\\''10.0.0.1'\\'', '\\''linux'\\'')\"}'\n\n# Query it\ncurl -X POST http://127.0.0.1:8080/query \\\n  -H 'content-type: application/json' \\\n  -d '{\"query\":\"SELECT * FROM hosts\"}'\n```\n\nOr via npm:\n\n```bash\nnpx reddb-cli@latest server --http --bind 127.0.0.1:8080\n```\n\n---\n\n## Links\n\n- [Documentation](https://forattini-dev.github.io/reddb)\n- [GitHub](https://github.com/forattini-dev/reddb)\n- [npm package](https://www.npmjs.com/package/reddb-cli)\n- [Releases](https://github.com/forattini-dev/reddb/releases)\n\n---\n\n**AGPL-3.0 License** -- Built by [Filipe Forattini](https://github.com/forattini-dev)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fforattini-dev%2Freddb","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fforattini-dev%2Freddb","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fforattini-dev%2Freddb/lists"}