{"id":49319111,"url":"https://github.com/n0rdy/forq","last_synced_at":"2026-04-26T17:00:31.226Z","repository":{"id":312439342,"uuid":"1046536867","full_name":"n0rdy/forq","owner":"n0rdy","description":"Simple (but highly opinionated) MQ server powered by SQLite. Single binary. No extra dependencies needed.","archived":false,"fork":false,"pushed_at":"2026-04-19T16:03:00.000Z","size":14443,"stargazers_count":9,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-19T18:08:26.786Z","etag":null,"topics":["daisyui","foss","go","golang","htmx","htmx-go","message-queue","mq","self-hosted","sqlite","sqlite3"],"latest_commit_sha":null,"homepage":"https://forq.sh","language":"Go","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/n0rdy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","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":"2025-08-28T20:43:09.000Z","updated_at":"2026-04-19T16:03:03.000Z","dependencies_parsed_at":"2025-08-30T17:32:41.064Z","dependency_job_id":"0fa4adc2-5a4d-4a74-94d5-f68a33dc974b","html_url":"https://github.com/n0rdy/forq","commit_stats":null,"previous_names":["n0rdy/forq"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/n0rdy/forq","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/n0rdy%2Fforq","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/n0rdy%2Fforq/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/n0rdy%2Fforq/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/n0rdy%2Fforq/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/n0rdy","download_url":"https://codeload.github.com/n0rdy/forq/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/n0rdy%2Fforq/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32305039,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-26T09:34:17.070Z","status":"ssl_error","status_checked_at":"2026-04-26T09:34:00.993Z","response_time":129,"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":["daisyui","foss","go","golang","htmx","htmx-go","message-queue","mq","self-hosted","sqlite","sqlite3"],"created_at":"2026-04-26T17:00:21.867Z","updated_at":"2026-04-26T17:00:31.213Z","avatar_url":"https://github.com/n0rdy.png","language":"Go","readme":"# Forq - Simple Message Queue powered by SQLite\n\nForq is a simple single-binary message queue on top of SQLite, designed for small to medium workloads. Shipped with the Admin UI for easy management.\n\n![Forq Admin UI Screenshot](https://raw.githubusercontent.com/n0rdy/forq/refs/heads/main/site/assets/images/banner-light.png)\n\nThe assumption is that you will self-host Forq on a VPS or a small cloud instance, and use it for background jobs, task queues, or inter-service communication.\n\nWhile Forq has a limited set of features compared to more complex systems like RabbitMQ or Kafka, it is extremely easy to set up and use, has a very low resource footprint, and easy to maintain. \nNo external dependencies are required, as SQLite is embedded.\n\n## Open-source but closed-contribution\n\nForq is open-source, but I do not accept external contributions.\nThis is a personal project, and I want to keep full control over the codebase and direction of the project.\nAlso, I don't feel I have enough free time to review and manage contributions (if any).\n\nTherefore, please do not open PRs.\n\nIf you find any bugs, have questions or suggestions, use the `Discussions` section for that.\n\n## Quick Start\n\n### Prerequisites\n\n- Go 1.26+ (for building from source)\n- Or use Docker\n\n### Installation\n\n#### Build from Source\n\n```bash\ngit clone https://github.com/n0rdy/forq.git\ncd forq\ngo build -o forq ./main.go\n```\n\n#### Docker\n\n```bash\ndocker run -d \\\n  --name forq \\\n  --restart unless-stopped \\\n  -e FORQ_AUTH_SECRET=your-auth-secret-min-32-chars-long \\\n  -e FORQ_DB_PATH=/app/data/forq/forq.db \\\n  -e FORQ_API_ADDR=0.0.0.0:8080 \\\n  -e FORQ_UI_ADDR=0.0.0.0:8081 \\\n  -p 8080:8080 \\\n  -p 8081:8081 \\\n  -v ~/forq-data:/app/data/forq \\\n  mykonordy/forq:latest\n```\n\n**For Docker, these env vars must be set:**\n- `FORQ_DB_PATH` - Sets explicit database location inside container\n- `FORQ_API_ADDR=0.0.0.0:8080` - Binds API to all interfaces (required for Docker port mapping)\n- `FORQ_UI_ADDR=0.0.0.0:8081` - Binds UI to all interfaces (required for Docker port mapping)\n\nPlease, note that if you are running Forq via Docker on macOS, the performance will be significantly worse due to Docker's filesystem performance issues on macOS.\nI'd advise against running Forq on macOS via Docker in production. Binary always gives the best performance.\n\n### Configuration\n\nForq uses environment variables for configuration:\n\n```bash\n# Required\nexport FORQ_AUTH_SECRET=your-auth-secret-min-32-chars-long                # to use for API and Admin UI authentication\nexport FORQ_DB_PATH=./data/forq.db                                        # path to the SQLite database file\n\n# Optional\nexport FORQ_METRICS_ENABLED=false                                         # true|false (default: false)\nexport FORQ_METRICS_AUTH_SECRET=your-metrics-secret-min-32-chars-long     # required if FORQ_METRICS_ENABLED is true\nexport FORQ_ENV=pro                                                       # local|pro (default: pro)\nexport FORQ_QUEUE_TTL_HOURS=24                                            # Default: 24 hours\nexport FORQ_DLQ_TTL_HOURS=168                                             # Default: 168 hours (7 days)\nexport FORQ_API_ADDR=localhost:8080                                       # Default: localhost:8080\nexport FORQ_UI_ADDR=localhost:8081                                        # Default: localhost:8081\n```\n\n### Running Forq\n\n```bash\n./forq\n# Server starts on :8080 (API) and :8081 (UI) by default\n```\n\n### First Message\n\nSend your first message:\n\n```bash\ncurl -X POST http://localhost:8080/api/v1/queues/emails/messages \\\n  -H \"X-API-Key: your-auth-secret-min-32-chars-long\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"content\": \"I am going on an adventure!\"}'\n```\n\nwhere `emails` is the queue name. If the queue does not exist, it will be created automatically.\n\nReceive the message:\n\n```bash\ncurl -X GET http://localhost:8080/api/v1/queues/emails/messages \\\n  -H \"X-API-Key: your-auth-secret-min-32-chars-long\"\n```\n\nAcknowledge the message:\n\n```bash\ncurl -X POST http://localhost:8080/api/v1/queues/emails/messages/{message_id}/ack \\\n  -H \"X-API-Key: your-auth-secret-min-32-chars-long\"\n```\n\nwhere `{message_id}` is the `id` of the message received in the previous step.\n\n## SDKs\n\nI implemented simple Forq SDKs for the ecosystems that I use most often:\n\n- [Go](https://github.com/n0rdy/forq-sdk-go)\n- [Java](https://github.com/n0rdy/forq-sdk-java)\n- [TypeScript](https://github.com/n0rdy/forq-sdk-typescript)\n\nThose are very simple, and basically just wrap the HTTP API.\n\nIf your platform of choice is not listed here, you can generate the client code using the [Forq OpenAPI specification](https://github.com/n0rdy/forq/blob/main/openapi.yaml),\nor just use the HTTP API directly. The whole API consists of 4 endpoint and 3 models, no big deal.\n\n## Next Steps\n\n- [Philosophy](https://forq.sh/documentation-portal/docs/guides/philosophy/) - A very short read about philosophy behind Forq. Helps to understand the design decisions.\n- [Specification](https://forq.sh/documentation-portal/docs/guides/specification/) - Overview of Forq features and design, do check it out!\n- [Configurations](https://forq.sh/documentation-portal/docs/guides/configurations/) - All configuration options\n- [Producing Messages](https://forq.sh/documentation-portal/docs/guides/producing-messages/) - How to send messages to queues\n- [Consuming Messages](https://forq.sh/documentation-portal/docs/guides/consuming-messages/) - How to receive and acknowledge messages\n- [Metrics](https://forq.sh/documentation-portal/docs/guides/metrics/) - Setting up monitoring with Prometheus\n- [Admin UI Guide](https://forq.sh/documentation-portal/docs/guides/admin-ui/) - Using the admin interface\n- [API Reference](https://forq.sh/documentation-portal/docs/reference/api/) - Complete API documentation\n- [SDKs](https://forq.sh/documentation-portal/docs/reference/sdks/) - Client libraries for various languages\n- [Forq vs Other MQs](https://forq.sh/documentation-portal/docs/guides/forq-vs-other-mqs/) - Comparison with other message queue systems\n- [Forq Internals](https://forq.sh/documentation-portal/docs/guides/internals/) - How (and why) Forq works under the hood for fellow nerds\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fn0rdy%2Fforq","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fn0rdy%2Fforq","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fn0rdy%2Fforq/lists"}