frontpage.
newsnewestaskshowjobs

Made with ♥ by @iamnishanth

Open Source @Github

fp.

Open in hackernews

Show HN: Ominipg – Local-First Postgres for Deno

2•vfssantos•2mo ago
I built Ominipg, a PostgreSQL toolkit for Deno that lets you:

1. Start with an in-memory database for quick prototyping/tests

2. Switch to a local on-disk PGlite DB

3. Move to a real remote PostgreSQL instance

…all using the same API and code, with an optional local↔remote sync mode for offline-first apps.

Why?

Most apps go through these stages:

1. Prototyping/Testing – you just want a fast, zero-setup in-memory DB.

2. Local-first – you want offline capability but still sync to the cloud.

3. Production – you want a full PostgreSQL instance, without rewriting your data layer.

Ominipg is my attempt to make that path smoother.

Modes

- url: ":memory:" – PGlite in WASM, in-memory. Great for tests, demos, or quick spikes. No Postgres install required. - url: "path/to/db" – PGlite with disk storage. Nice for desktop apps, CLIs, or local development. - url: "postgresql://..." – Direct connection to your remote/production Postgres.

Local + Remote sync (both URLs) – Use a local PGlite DB that automatically syncs with remote Postgres, so you can build offline-first apps or just get faster reads while still persisting everything remotely.

Under the hood, PGlite runs in a Web Worker automatically (when available), so heavy queries don’t block your main thread – you don’t have to think about workers yourself.

Typed CRUD with Mongo-style queries

Instead of writing SQL, you can use MongoDB-style queries with TypeScript types inferred from JSON Schema definitions:

const adults = await db.crud.users.find({ age: { $gte: 18 }, status: { $in: ["active", "premium"] }, }); // `adults` is fully typed based on your `users` schema

If you prefer, you can also use Drizzle ORM on top, or drop down to raw SQL. Ominipg doesn’t force you into one style.

Example

import { Ominipg, defineSchema } from "jsr:@oxian/ominipg";

const schemas = defineSchema({ users: { schema: { type: "object", properties: { id: { type: "string" }, name: { type: "string" }, }, required: ["id", "name"], }, keys: [{ property: "id" }], }, });

// Start in-memory, later point this to postgresql://... or ./local.db const db = await Ominipg.connect({ url: ":memory:", schemas, });

await db.crud.users.insertOne({ id: "1", name: "Alice", });

const activeUsers = await db.crud.users.find({ name: { $in: ["Alice"] }, });

Links:

- JSR: https://jsr.io/@oxian/ominipg

- GitHub: https://github.com/AxionCompany/ominipg

• A bit about me / what I’m looking for

I’m a co-founder of a software development agency in Brazil. We’ve shipped 500+ projects (many enterprise), and a lot of our success has come from investing in developer productivity and internal tooling, including early bets on the Deno ecosystem. We recently decided to open-source some of these tools. Ominipg is the first of several, I’d love to get feedback from the JS (specially Deno) ecosystem.

In particular, I’d appreciate thoughts on: - The API design (especially the CRUD + schema approach) - The local + remote sync model - Rough edges you hit trying it in a small demo or side project