frontpage.
newsnewestaskshowjobs

Open Source @Github

fp.

Open in hackernews

Show HN: Paganel – Data migration with a receipt you can verify later

https://github.com/stanstork/paganel
2•stan_stork•2h ago
Paganel comes from an old work problem: I had a large schema migration with lots of transformations and several environments to check. One of the main requirements was to validate whether the data had moved correctly, and I was not allowed to use any SaaS tools because it was forbidden for data to leave our network. Since I couldn't find any air-gapped tool that could do both the transformation and the verification (basic row counts aren't enough for transformed data), I had to write custom scripts for the entire process.

Ever since then, the idea of automating complex migrations has stuck in my head, which led me to start building Paganel a year and a half ago.

In Paganel, a migration is just a single declarative file. You specify where the data comes from and where it's going, and the rest goes in the same file: joins, filters, computed fields, and validation rules.

If you are missing a specific source, sink, transform, or filter, you can easily extend Paganel by writing your own WASM plugin in Rust or JS. These execute inside a strict sandbox, so they don't have any filesystem or network access unless you allow it in the migration config.

I also wanted to make large migrations simple, so before running a real migration, you can run pag plan to review the output schema, the DDL, and the time and memory estimates. You can also use the plan to see a sample of real rows. They get processed through the whole pipeline, which gives you absolute clarity on what will actually be inserted.

One of the biggest challenges isn't just doing the migration, but verifying that everything actually moved correctly. For that, there is the --integrity flag. Pass it, and Paganel hashes the rows on the fly as they migrate, storing those hashes on disk, keyed by primary key. After the run, it uses them to spit out a 32-byte root hash for the table. Together with the row hashes, this gives you a complete 'migration receipt.'

Minutes or weeks later, you can run pag verify, and it re-reads the destination, recomputes the hashes and compares them with the receipt, without connecting to the source. When the root doesn't match, you know something changed, and then verify goes through the row hashes and tells you which rows it was.

It tells you that the destination still contains what Paganel wrote, but it can't tell you whether the transformation itself was correct.

Another huge factor is migration speed. I created a small benchmark to measure Paganel's speed and tested it on a 100M-row migration from MySQL to PostgreSQL (with the databases on separate servers). With the default config, which is a single stream, I got about 390k rows a second. Splitting the table into four parallel streams got it to almost 940k. The number of streams is configurable for tables with an integer primary key. Enabling the --integrity flag does add some overhead, dropping those numbers to 340k and 670k, respectively.

Paganel is still pre-v1.0, so there are some rough edges to be aware of:

- No CDC yet: Currently, it only handles batch processing. Continuous sync with verification is the ultimate goal, but nailing the batch engine comes first.

- Limited databases: Right now, Paganel only natively supports MySQL and PostgreSQL.

- API changes: The project is under heavy development, meaning the config syntax might change slightly from release to release.

- One-man team: I'm developing this solo. You will likely run into edge cases I haven't caught yet.

- Platform testing: The full integration suite and all my own manual testing run on Linux. macOS and Windows get pre-built binaries too, but they only go through a basic smoke test.

If you want to try it out, the quickstart in the README will spin up some sample databases in Docker for you.

How do you verify migrations today? I'd like to know whether a receipt like this would fit into how you work.

Show HN: Parseable, an open observability datalake, handles 100M time-series/min

https://www.parseable.com
9•yashdotrv•1h ago•2 comments

Show HN: Jotbus – a shared encrypted scratchpad for coding agents

https://jotbus.com/
8•shake-n-fries•47m ago•2 comments

Show HN: I turned my iPhone and a $20 smart plug into an f-stop timer

https://peterszentkiralyi.eu/darkplug/
2•pentakkusu•34m ago•0 comments

Show HN: Frutjam – Accessible UI components in pure CSS, no JavaScript

https://frutjam.com
2•nezanuha•35m ago•0 comments

Show HN: Kahawai – An open source, modular media system

https://kahawai.net/
5•berm_•55m ago•0 comments

Show HN: Vev – Ask questions about a screenshot, get a probability per answer

https://github.com/Xiaooolong/vev
2•CountingSheeep•56m ago•0 comments

Show HN: Azurade, image and video generation with MCP, credits never expire

https://azurade.com/developers/
2•delneg•1h ago•0 comments

Show HN: Connect-it, a browser node canvas with timers, logic gates, and music

https://connect-it-app.pages.dev/
2•zubink•1h ago•0 comments

Show HN: A replacement motherboard for the iPod mini, 3G and 4G

https://certainthings.studio/sprout/
2•seanpod•1h ago•0 comments

Show HN: OpenScreen 2.0 – open-source Screen Studio alternative (Win/Mac/Linux)

https://getopenscreen.com/
3•etienne_l•1h ago•0 comments

Show HN: Aldo Coach, a workout log with an AI coach that sees every set

https://aldo-coach.app/?ct=hackernews
2•jackchillemi•1h ago•0 comments

Show HN: Bio ML Tools in the Browser

https://athanortools.com/
2•the__alchemist•1h ago•0 comments

Show HN: Entombed in a Raycaster

https://www.stelabouras.com/blog/entombed-raycaster/
35•stelabouras•3d ago•6 comments

Show HN: Paganel – Data migration with a receipt you can verify later

https://github.com/stanstork/paganel
2•stan_stork•2h ago•0 comments

Show HN: Photoc – Command-line tools for photographers

https://github.com/ahmetomerv/photoc
54•ahmetomer•3d ago•9 comments

Show HN: ChatGPT answers calls on a normal SIM. No Twilio, just a $6 ESP32

https://www.youtube.com/watch?v=zIVXu6g8qdY
3•nadam54321•47m ago•0 comments

Show HN: Nightwatch – a Mac menu-bar app that tells you when tonight is clear

https://github.com/rsutcliffe/nightwatch
82•delphidolphin•2d ago•26 comments

Show HN: Mashy – Nine short holes of pixel golf

https://playmashy.com/
5•marcperel•4h ago•4 comments

Show HN: AI search for every photo and every frame of video on macOS

https://github.com/allenv0/SCM
171•allenleee•2d ago•73 comments

Show HN: Pumpkins.sh – claim, carve, and display a pumpkin to the world

https://pumpkins.sh/
27•linesofcode•1d ago•8 comments

Show HN: Minigraf – An embedded, bi-temporal graph database in Rust

https://github.com/project-minigraf/minigraf
36•adityamukho•1d ago•28 comments

Show HN: Thyme – A New AI-Based App Reverse Engineering Tool

https://apppipeline.online/
4•neocanable•7h ago•1 comments

Show HN: PolyRoll – A 3D Marble Game for Mobile/Desktop

https://polyroll.neocities.org
2•macwhisperer•3h ago•0 comments

Show HN: Glashütte Trash Clock – A 30-minute pendulum clock made from trash

https://niklasroy.com/gtc/
233•r0r0•4d ago•41 comments

Show HN: Build with Python – a beginner course where your code draws

https://scimigo.com/en/learn/build-with-python/01-draw-with-python
47•davidwshao•1d ago•18 comments

Show HN: Sideloop – Re-sign sideloaded iOS apps over Wi-Fi before they expire

https://github.com/filippofinke/sideloop
3•filippofinke•17h ago•0 comments

Show HN: Pi pod – Run your pi coding agent in sandboxes on your own server

https://pipod.dev/
120•edverma2•3d ago•47 comments

Show HN: Thoreau BASIC – What if BASIC hadn't gone out of fashion?

https://thoreaubasic.com/
95•Gorsefound•3d ago•58 comments

Show HN: Our space game has a built-in RISC-V emulator that runs Linux

https://againstallodds.games/blog/2026/10/03/our-risc-v-emulator-pasriscv/
94•nor-and-or-not•4d ago•36 comments

Show HN: Headline Arena – public forecasting records for AI agents

https://headlinearena.com
3•kopei•14h ago•0 comments