// 01 · Headless service
Single binary, no embedded UI. Your app never imports GFire as a library — only HTTP and curl.
GFire is a headless Go service: apps enqueue work over HTTP, workers spawn external handler binaries, state lives in PostgreSQL, Redis, or ValKey. v1.0.0 — production-ready: bulk enqueue, recurring cron, Prometheus metrics, CLI, and E2E tests included.
curl -fsSL https://get.gfire.hermesrodriguez.com/install.sh | sh
Single binary, no embedded UI. Your app never imports GFire as a library — only HTTP and curl.
PostgreSQL with SKIP LOCKED, Redis/ValKey with BRPOP and Lua scripts. Pick the backend that fits your stack.
Peer nodes, shared storage, no Raft. Add pods; they coordinate through the storage layer.
Technical notes · v1.0.0
GFire is a headless job orchestration service: any client with HTTP can enqueue work without importing a runtime-specific library. v1.0.0 ships the full stack — PostgreSQL (SKIP LOCKED), Redis, and ValKey storage backends, a REST API with bulk enqueue and idempotency keys, recurring cron jobs with distributed locks, a CLI, Prometheus metrics, and an E2E test suite. Language-agnostic by design; handlers are external binaries.
One driver for Redis and ValKey — swap the address, keep the implementation. Open-source forks and managed Redis stay compatible.
Workers block on the queue instead of polling. Less CPU and network churn; jobs wake a worker as soon as they arrive.
N peer GFire nodes share storage — no Raft between pods. Lua atomically moves jobs (e.g. enqueued → processing) so race-free claims live in the data layer.
Delayed and scheduled jobs use scores = Unix timestamps. The scheduler pulls only work that is due — scales with large backlogs.
| Tool | Interaction model | Storage | Language coupling |
|---|---|---|---|
| GFire | HTTP / headless service | PostgreSQL, Redis, ValKey | High — language agnostic |
| Faktory | Protocol / headless | Redis | High — custom TCP protocol |
| Asynq | Go library (embedded) | Redis | Low — Go only |
| River | Go library (embedded) | PostgreSQL | Low — Go only |
| Sidekiq | Ruby gem (embedded) | Redis | Low — Ruby only |
| Celery | Python library (embedded) | Redis, RabbitMQ, SQL | Medium — Python-first |
GFire is sidecar-ready and standalone: enqueue with curl or any HTTP/JSON client — no vendor SDK inside your app. Unlike Faktory’s TCP protocol or in-process libraries (Sidekiq, Asynq, River), handlers stay external binaries.
Full compare matrix in the repo
GFire does not run your business logic in-process. Workers dequeue from storage, then spawn a subprocess per job (`cmd` in YAML). Handlers can be Go, Python, Node, shell — GFire tracks exit status, retries, and continuations. Handlers never talk to Redis/PostgreSQL directly; the service owns the storage contract.
Jobs are small triggers, not fat payloads. Heavy data lives in S3 or your database; GFire carries the instruction. Keeps Redis memory predictable and avoids large-message instability.
Install the CLI and verify the binary (today: gfire version).
$ curl -fsSL https://get.gfire.hermesrodriguez.com/install.sh | sh $ gfire version
v1.0.0 — stable release. Full REST API, worker engine, and CLI included.
Planned milestones:ROADMAP.md
| Repo | Role |
|---|---|
| hrodrig/gfire | Service, storage backends, releases |
| SPECIFICATIONS.md | Behavior contract and design |