By alias2k
Work with flusso (Postgres → OpenSearch declarative sync) end to end: author schemas (*.schema.yml + flusso.toml), integrate/migrate a deployment, query the index from Rust with #[derive(FlussoDocument)], and contribute to the flusso codebase.
Validate a flusso deployment — run flusso check against the config + schemas and triage any errors.
Scaffold a typed Rust query struct (#[derive(FlussoDocument)]) for a flusso index.
Scaffold a new flusso index — a *.schema.yml plus its [[index]] entry in flusso.toml.
Integrate flusso into a project or migrate an existing search setup to it — stand up flusso.toml, point it at Postgres + OpenSearch, define a first index, validate, and run. Use when setting up flusso for the first time, wiring it into a deployment, or migrating from a hand-rolled indexer.
Work on the flusso Rust codebase itself — add a source/sink backend, change the engine/pipeline, touch the config or schema layers, or extend the query derive. Use when contributing to or modifying flusso's implementation (not just authoring config). Covers crate layering, the sync pipeline, engine invariants, and where things live.
Query a flusso-maintained OpenSearch index from Rust with the `flusso-query` crate and `#[derive(FlussoDocument)]`. Use when writing or editing read-side code against a flusso index — typed document structs, the compile-time-checked query surface, nested filtering, custom value types, multi-index search. Trigger on flusso-query / FlussoDocument / FlussoValue / FlussoMultiDocument work.
Author or edit a flusso index schema (*.schema.yml) or deployment config (flusso.toml). Use whenever creating, editing, or reviewing a flusso schema file — the type-first field syntax, joins, aggregates, geo points, filters, soft-delete, and how to validate. Trigger on any *.schema.yml or flusso.toml work.
Modifies files
Hook triggers on file write and edit operations
Uses power tools
Uses Bash, Write, or Edit tools
Own this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge. GitHub access is read-only (username + org membership).
Sign in to claimOwn this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge. GitHub access is read-only (username + org membership).
Sign in to claimBased on adoption, maintenance, documentation, and repository signals. Not a security audit or endorsement.
[!IMPORTANT]
🤖 Generative AI disclosure
Generative AI was used in this project to produce boilerplate and documentation. Every single line of code has been manually reviewed and revised by a human software developer who can be blamed accordingly.
Keep OpenSearch in sync with Postgres, driven by declarative config.
You write a bit of YAML describing what a search document should look like.
flusso builds the index, seeds it from your existing rows, then tails Postgres'
logical replication stream so the index stays current — no cron job, no nightly
reindex, no hand-rolled for row in rows: es.index(...) script you'll regret at
2am.
In short: you describe the what, flusso handles the keep-it-in-sync.
build, check, runjust commands — the shortcuts you'll actually useThe dev/ directory is a complete, runnable example — a docker-compose
stack (Postgres wired for logical replication, OpenSearch, Dashboards,
Prometheus, Grafana), seeded data, and a matching config. With
just installed (cargo install just --locked):
just up # bring the whole stack up and wait for it to be healthy
just check # validate the config + schemas against the database
just run # backfill OpenSearch, then follow live changes (serves /status + /metrics)
Then, in another terminal, poke it and watch changes stream through:
just psql # make some changes
curl -s localhost:9200/users/_search?pretty # see them land in OpenSearch
just status # live pipeline status
That's it. Run just on its own to see every recipe. The full walk-through —
resetting state, inspecting the slot, OpenSearch Dashboards on :5601 — lives in
dev/README.md.
No
just? Every recipe is just a thin wrapper; the rawcargo run -- …anddocker compose …commands are right there in thejustfile.
A deployment is two kinds of files. That's the whole mental model.
flusso.toml — one per deployment. Where the data comes from, where it goes,
and which indexes to build.
[source]
type = "postgres"
connection_url = { env = "DATABASE_URL" } # secrets stay as env refs, never baked in
[sinks.primary]
type = "opensearch"
url = "https://localhost:9200"
password = { env = "OS_PASSWORD" }
[sinks.audit] # sinks fan out — write the same docs to more than one place
type = "stdout"
pretty = true
[[index]]
name = "users"
schema = "users.schema.yml"
*.schema.yml — one per index. What a single search document looks like:
its table, its fields, and the related tables that fold in.
table: users
primary_key: id
soft_delete:
column: deleted # users.deleted = true → tombstone instead of upsert
fields:
- keyword: email
transforms: [lowercase, trim]
# Fold each user's recent orders in as a nested array.
- has_many: orders
table: orders
foreign_key: user_id
primary_key: id
order_by: [{ column: created_at, direction: desc }]
limit: 5
fields:
- double: total
- keyword: status
# ...or just count them. A count is always a long.
- count: orderCount
table: orders
foreign_key: user_id
Every field declares its type from a fixed set (SCHEMA.md lists
them all) that bridges a Postgres column and an OpenSearch mapping. So a schema is
self-describing: flusso derives the full index mapping — and validates your config
— without ever touching a database.
The neat part: change a user or one of their orders and flusso rebuilds the
whole users document and re-emits it. It figures out which documents a changed
row affects, reassembles each, and writes it by a deterministic id. You don't tell
it what to update; it works it out.
The engine wires pluggable edges together and runs the loop:
ChangeCapture ─▶ queue ─▶ resolve ─▶ build ─▶ Sink ─▶ flush ─▶ ack
A capture task drains the source's change stream into a bounded queue (full queue → capture blocks; back-pressure for free). A worker pulls changes, works out which document ids they touch, builds each document, and writes it. Writes are batched — N changes, or whatever shows up in a short window, flush together as one bulk round-trip.
npx claudepluginhub alias2k/flusso --plugin flussov9.44.1 — Patch release for Gemini environment/version detection and qwen auth gating. Run /octo:setup.
Harness-native ECC operator layer - 67 agents, 271 skills, 92 legacy command shims, reusable hooks, rules, selective install profiles, and production-ready workflows for Claude Code, Codex, OpenCode, Cursor, and related agent harnesses
Comprehensive skill pack with 66 specialized skills for full-stack developers: 12 language experts (Python, TypeScript, Go, Rust, C++, Swift, Kotlin, C#, PHP, Java, SQL, JavaScript), 10 backend frameworks, 6 frontend/mobile, plus infrastructure, DevOps, security, and testing. Features progressive disclosure architecture for 50% faster loading.
Upstash Context7 MCP server for up-to-date documentation lookup. Pull version-specific documentation and code examples directly from source repositories into your LLM context.
Comprehensive startup business analysis with market sizing (TAM/SAM/SOM), financial modeling, team planning, and strategic research
Binary reverse engineering, malware analysis, firmware security, and software protection research for authorized security research, CTF competitions, and defensive security