Skip to main content

What if PostgreSQL was enough?

Build full-stack apps with real-time sync, background jobs, cron schedules, durable workflows, and auth.

One framework. One database. One binary to deploy.

curl -fsSL https://tryforge.dev/install.sh | sh
forge new my-app --demo
cd my-app
forge dev

Write Rust. Get TypeScript.

#[forge::query]
pub async fn list_todos(ctx: &QueryContext) -> Result<Vec<Todo>> {
sqlx::query_as("SELECT * FROM todos")
.fetch_all(ctx.db())
.await
.map_err(Into::into)
}
// Auto-generated, type-safe
import { listTodos$ } from '$lib/forge';

const todos = listTodos$(); // Real-time subscription

Change the database, every connected client updates. No WebSocket code. No polling.


Background jobs without Redis

#[forge::job(
priority = "high",
retry(max_attempts = 5, backoff = "exponential")
)]
pub async fn send_email(ctx: &JobContext, args: EmailArgs) -> Result<()> {
ctx.progress(0, "Sending...")?;
// ...
ctx.progress(100, "Sent")?;
Ok(())
}

Priority queues. Exponential backoff. Progress tracking. Dead letter queue.

All in PostgreSQL with FOR UPDATE SKIP LOCKED.


Webhooks with one macro

#[forge::webhook(
path = "/hooks/stripe",
signature = WebhookSignature::hmac_sha256("Stripe-Signature", "STRIPE_WEBHOOK_SECRET"),
idempotency = "header:Idempotency-Key",
)]
pub async fn stripe(ctx: &WebhookContext, payload: Value) -> Result<WebhookResult> {
ctx.dispatch_job("process_payment", payload.clone()).await?;
Ok(WebhookResult::Accepted)
}

Signature verification. Idempotency. Async dispatch. No middleware.


Workflows that survive restarts

#[forge::workflow]
pub async fn onboarding(ctx: &WorkflowContext, user_id: Uuid) -> Result<()> {
ctx.step("welcome_email", || send_welcome(user_id)).await?;

ctx.sleep(Duration::from_days(3)).await?; // Durable sleep

ctx.step("check_activation", || check_user_active(user_id))
.compensate(|_| send_reminder(user_id))
.await?;

Ok(())
}

Event sourcing. Saga pattern. Durable timers. No external orchestrator.


What you don't need

Redis Kafka BullMQ RabbitMQ SQS Temporal Celery

PostgreSQL handles it all:

  • SKIP LOCKED for job queues
  • LISTEN/NOTIFY for real-time
  • Advisory locks for leader election
  • WAL for durability

Ship one binary

cargo build --release
./target/release/my-app

Migrations run automatically. Frontend embeds optionally. Health checks included.


MIT License. No telemetry. PostgreSQL 18+.

Get Started →