Busabase
Busabase is an open-source (MIT) database and workspace for AI agents — data, docs, skills, and apps in one place. Run it locally, self-host it inside your network, or use Busabase Cloud, and turn age
Build Groups from an Event Log with filters, then compare their variants, graphs and statistics side by side.
DataSvelte · TypeScriptGitHub @nicoabarcaOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Local analysis tool for detecting process differences between variants.
Translation pending
Loading the full README.
Read the full README ↗Desktop app built with Tauri, SvelteKit and TypeScript.
Install dependencies first with pnpm install.
pnpm tauri dev # desktop app on the default port (1420)
pnpm dev:port 1430 # desktop app on another port, with per-branch app data
pnpm dev # frontend only, in the browser
pnpm tauri build # release binary and installers in src-tauri/target/release/bundle, dev identifier
pnpm tauri build --config src-tauri/tauri.release.conf.json # same, with the release identifier
pnpm tauri build --debug # debug build in src-tauri/target/debug
pnpm release minor # or patch, major, x.y.z: bump, commit, tag, push
git checkout v0.2.0 && pnpm release:mac # once CI has built Windows into the draft
gh release edit v0.2.0 --draft=false --latest # go live
The tag push builds the Windows installer into a draft release (.github/workflows/build.yml). pnpm release:mac builds Apple Silicon locally, adds it to the draft's latest.json and uploads it. Publishing the draft is what the download page and the in-app updater see. pnpm release:mac needs the updater key in ~/.tauri/prodiff.key (or TAURI_SIGNING_PRIVATE_KEY) and TAURI_SIGNING_PRIVATE_KEY_PASSWORD.
The download page is web/index.html, deployed to GitHub Pages by .github/workflows/pages.yml when web/ changes on main.
pnpm db:generate add_group_notes # after editing src/lib/db/schema.ts
drizzle-kit compares schema.ts with its last snapshot and writes src/lib/db/migrations/<NNNN>_<name>.sql plus the files under meta/. Review the SQL and commit all of it. pnpm drizzle-kit generate --custom --name <name> gives an empty migration for SQL drizzle-kit cannot infer, such as reshaping JSON in a column.
The app runs pending migrations at startup, and pnpm seed runs them before writing. Never edit or delete a migration that has shipped; add a new one.
pnpm seed # seed every log in scripts/seed_log/
pnpm seed road_traffic_fine_10k # seed one log by its slug
pnpm seed --app-id com.nicoabarca.prodiff.dev # seed the app data of `pnpm tauri dev`
pnpm seed --app-data-dir /path/to/app-data # seed any app data directory
By default the seed writes to the current branch's app data (com.nicoabarca.prodiff.dev-<branch>), which is what pnpm dev:port opens. Reload the app if it is open. The first run compiles the seed-project binary in release mode, which takes a few minutes.
Each seed log is a pair of files in scripts/seed_log/: <slug>.csv holds the Event Log and <slug>.json holds its manifest.
{
"name": "Road traffic fine 10k (seed)",
"columns": [
{
"name": "Case ID",
"role": "case_id",
"scope": "case",
"caseResolution": "constant",
"type": "string"
},
{ "name": "Activity", "role": "activity_name", "scope": "event", "type": "string" }
],
"hiddenColumns": ["Variant"],
"groups": [
{
"name": "Not dismissed",
"color": "group-2",
"filters": [
{ "kind": "attribute", "column": "dismissal", "mode": "mandatory", "values": ["NIL"] }
]
}
]
}
columns is the Column Mapping. It must map every column in the CSV header exactly once.hiddenColumns lists the columns hidden from the event data table, the Filter editor and the tree's attribute choices.groups is optional. Each Group is applied in array order, which is also its position. color is optional and defaults to the palette color for that position. filters is a Filter List in the same JSON the app stores. case_not_in_group is not supported.To add a seed log, drop a new CSV and manifest pair into scripts/seed_log/. No code changes are needed.
Seeding a slug again resets its Project: the files are replaced, and its Groups, comparison and tree settings are deleted. If the import or any Group fails, the seed reports the error and leaves the previous Project as it was.
pnpm test # run Vitest once
pnpm test:watch # watch mode
pnpm test src/lib/filters # only tests under a path
pnpm check # type-check the app and the e2e suite
cargo test --manifest-path src-tauri/Cargo.toml # all tests
cargo test --manifest-path src-tauri/Cargo.toml duration # tests whose name contains "duration"
pnpm e2e # all specs against the debug e2e binary
pnpm e2e --spec e2e/specs/smoke.e2e.ts # one spec file
pnpm e2e --mochaOpts.grep "empty state" # tests whose name matches
pnpm e2e:release # all specs against a freshly built release binary
pnpm e2e:build # force a debug e2e rebuild after code changes
pnpm e2e builds the debug binary only when it is missing, so run pnpm e2e:build after changing Rust or frontend code. See docs/adr/0007-e2e-tests-with-embedded-webdriver.md.
Frontend tests (pnpm test) run in jsdom and write nothing outside Vitest's cache in node_modules/.vite/vitest.
Rust tests (cargo test):
| Path | What happens |
|---|---|
src-tauri/target/debug/ | Test binaries are compiled here, shared with pnpm tauri dev. |
$TMPDIR/kiara-<name>.csv | CSV fixtures written by the timestamp parsing tests. Overwritten, never deleted. |
E2E tests (pnpm e2e, pnpm e2e:release, pnpm e2e:build):
| Path | What happens |
|---|---|
src-tauri/target/e2e/debug/ and src-tauri/target/e2e/release/ | E2E binaries are built here. Debug is built when missing or on e2e:build; release is rebuilt on every e2e:release. |
build/ and .svelte-kit/ | Overwritten by the frontend build that runs before each e2e binary build. |
~/Library/Application Support/com.nicoabarca.prodiff.e2e/ | Deleted at the start of every run, before the app launches. The app recreates prodiff.db in it (and projects/ once a spec creates a Project); all spec files in the run share them, and they stay until the next run. |
e2e/.artifacts/<suite>-<test>.png | Screenshot saved when a test fails. Never deleted by the suite; gitignored. |
The e2e suite never touches the app data of pnpm tauri dev (com.nicoabarca.prodiff.dev) or of pnpm dev:port (com.nicoabarca.prodiff.dev-<branch>).
VS Code + Svelte + Tauri + rust-analyzer.