pgx
PGX — Lightweight Postgres for AI agents. Written in Rust. Thousands of isolated databases in one runtime. 🐘
翻譯準備中
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Vibration analysis for decanter centrifuges, in 3D: .odx speed sweeps as interactive waterfalls with order lines, resonance zones and a condition rating.
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
Vibration analysis for decanter centrifuges, in 3D. Upload a VIBXPERT /
Omnitrend .odx speed sweep and CentriMinds draws it as an interactive
waterfall with the machine's order lines on it. It suggests resonance zones,
tells mains-related lines from the machine's own, and rates the machine
against the permissible vibration levels for decanters. Everything it knows
about a machine is data: a machine profile that experts import, check
against their commissioning sheets and edit.
A product by Protominds. Version 0.1.
Live: centriminds.de (invite-only demo with
synthetic data) · deployments檢視完整 README ↗Vibration analysis for decanter centrifuges, in 3D. Upload a VIBXPERT /
Omnitrend .odx speed sweep and CentriMinds draws it as an interactive
waterfall with the machine's order lines on it. It suggests resonance zones,
tells mains-related lines from the machine's own, and rates the machine
against the permissible vibration levels for decanters. Everything it knows
about a machine is data: a machine profile that experts import, check
against their commissioning sheets and edit.
A product by Protominds. Version 0.1.
Live: centriminds.de (invite-only demo with synthetic data) · deployments
Screenshots show a synthetic sweep with made-up numbers; customer measurements never leave their owners' instances.
| Condition rating | Overall RMS velocity (10–1000 Hz, Parseval sum of the spectrum lines) for every spectrum, rated at operating speed (≥ 90 % of the sweep's top speed) against the ANDRITZ permissible-level set points for the bowl-diameter class: good, usable, alarm, shutdown. ISO 10816-3 zones do not apply to decanters. The vibration over speed chart shows the whole sweep against the zones and the FAT reference levels. |
| 3D waterfall | Frequency × speed × amplitude, linear or log scale, perspective or top (spectrogram) view, full screen. Point at the surface to read a value; the hovered speed's spectrum opens as a 2D slice; frequency and speed windows zoom in. Overlays: order lines, resonance zones, speed-independent lines, structural modes, source peaks, alarm/shutdown planes and annotations. Save image downloads the annotated view. |
| Colour schemes | Viridis, Magma, Ocean, Teal and Graphite, each in a dark and a light version. On the linear scale the colour can follow a logarithmic spread (60 or 80 dB) while heights stay true, with a colour legend. |
| Machine profiles | A machine's drive train as parameters (gear ratios, pulleys, belt lengths, differential speed, mains frequency) and components whose speeds are formulas of the bowl speed, plus operating points, structural modes, known resonance zones and the text that identifies the machine in an export's path. Imported from a machine speeds workbook (.xlsx) or a profile file (.json), started from a template, edited with live formula checks. Uploads pick their profile automatically. Format: docs/machine-profiles.md. |
| Order analysis | Every component order drawn across the sweep, lines the resolution cannot separate merged, the amplitude tracked along each; possible resonance zones where several lines swell at one frequency, ranked; speed-independent lines classified as mains, a known structural mode or unexplained; peaks matched to component orders. |
| Annotations | Frequency and speed lines, frequency zones, notes pinned to a point on the surface and order lines, saved with the project; a suggested zone is kept with one click. |
| Accounts | Email/password sign-in; projects are private to their owner. Per-account settings: theme (dark, light, device), language, 3D view defaults, name, password. A password change or ends the other sessions. |
Built as a production system, not a prototype. Every claim below points at the code that backs it.
| Automated checks on every push and PR | Backend: ruff (lint and format) and pytest. Frontend: TypeScript, ESLint, knip (no unused code or dependencies), Prettier, Vitest, production build. Infrastructure: cfn-lint, shellcheck. Docker images built and smoke-tested through nginx. (ci.yml) |
| One command, same as CI | make check runs the same checks in Docker, so a contributor needs nothing but Docker. (Makefile) |
| Tests without customer data | The tests generate synthetic .odx files and workbooks; checks against real commissioning data run separately with the data mounted read-only (make check-reference). (conftest.py) |
| Schema under control | Alembic migrations applied at startup; a test fails if the models and the migrated schema ever drift apart. (test_migrations.py) |
| Secret scanning | gitleaks scans the whole history in CI, and fails loudly if it could not read all of it instead of reporting "no leaks". (Makefile, .gitleaks.toml) |
| Supply chain | GitHub Actions pinned to commit SHAs, the gitleaks image pinned by digest, lockfiles for npm and uv, CI with read-only permissions, weekly Dependabot updates. (ci.yml, dependabot.yml) |
To report a vulnerability, see SECURITY.md, which also has advice for running your own instance.
X-Forwarded-For and trusts only proxies it is told about
(deploy/aws/real-ip.conf for Caddy).nosniff, referrer and permissions policies on
every response (frontend/security-headers.conf); HSTS from Caddy..gitleaks.toml).Two containers and a data volume. The frontend container's nginx serves the
single-page app and proxies /api to the backend; the backend is a FastAPI
app that keeps everything in one SQLite database plus the uploaded files. In
production Caddy sits in front for TLS.
flowchart LR
browser(["Browser<br/>React SPA + three.js"])
subgraph host["Docker host"]
caddy["Caddy<br/>TLS, HSTS<br/><i>production only</i>"]
subgraph frontend["frontend container"]
nginx["nginx<br/>static SPA · security headers<br/>/api reverse proxy"]
end
subgraph backend["backend container"]
api["FastAPI routers<br/>auth · projects · spectrograms<br/>analyses · machines"]
parser["io/<br/>.odx parser · .xlsx import"]
cache["spectrogram cache<br/>LRU of parsed arrays"]
pipeline["analysis/<br/>pipeline"]
physics["physics/ + profiles.py<br/>machine profiles, formulas"]
end
subgraph data["data volume"]
db[("SQLite<br/>WAL")]
files[("uploads<br/>*.odx")]
end
end
s3[("S3<br/>weekly backups")]
browser -- HTTPS --> caddy --> nginx
browser -. "local: http://localhost:3000" .-> nginx
nginx -- "/api" --> api
api --> parser --> files
api --> cache --> parser
api --> pipeline
pipeline --> cache
pipeline --> physics
api --> db
db -. "backup.py, systemd timer" .-> s3
analysis/pipeline.py runs one sweep against one machine profile, in about
0.1–0.2 s for a typical sweep (234 spectra × 3200 lines):
flowchart TD
odx[".odx spectra<br/>(spectrogram cache)"] --> peaks["peak_detection<br/>peaks per spectrum"]
profile["machine profile"] --> machine["physics/kinematics<br/>compile component speed formulas"]
peaks --> stationary["stationary<br/>speed-independent lines:<br/>mains · structural · unexplained"]
peaks --> attribution["attribution<br/>peaks matched to component orders"]
machine --> attribution
stationary --> attribution
machine --> orders["orders<br/>order lines across the sweep,<br/>amplitude tracked along each"]
odx --> orders
orders --> zones["orders<br/>possible resonance zones"]
odx --> severity["decanter_severity<br/>overall velocity, rating at<br/>operating speed"]
profile --> modes["structural modes<br/>checked against the sweep"]
attribution & orders & zones & stationary & severity & modes --> run[("AnalysisRun<br/>results JSON")]
More diagrams (request flow, data model, frontend structure) are in docs/architecture.md.
Everything runs in Docker (Compose v2); the host needs nothing else.
make up # build and start → http://localhost:3000
make dev # hot-reloading UI on http://localhost:5173 (uses the stack's API)
make check # what CI runs: ruff, pytest, tsc, ESLint, knip, Prettier, Vitest, build
make format # apply ruff and Prettier
make down # stop (data stays in the centriminds_data volume)
make # list every target
Register an account on the sign-in page, import your machine profiles
(Machines), upload an .odx file, and the analysis runs when the project
opens. Measurement files and machine data are customer data and never part
of the repository: the tests generate synthetic ones, and
make check-reference REFERENCE_DIR=… checks the analysis against real data
kept elsewhere. The development workflow is in
CONTRIBUTING.md.
Contributions are welcome: see CONTRIBUTING.md and the
Code of Conduct. Issues and pull requests use the
templates in .github/.
| Layer | |
|---|---|
| Frontend | React 19, React Router 8, TanStack Query 5, zustand 5, three.js r186 with react-three-fiber 9 / drei 10, Tailwind CSS 4, Vite 8, TypeScript 6 |
| Backend | Python 3.14, FastAPI 0.142, Pydantic 2, SQLAlchemy 2.1 (typed ORM), Alembic, NumPy 2.5, SciPy 1.18 |
| Storage | SQLite (WAL, foreign keys enforced) + uploaded .odx files on a Docker volume |
| Serving | nginx 1.30 (unprivileged) → uvicorn; Caddy 2.11 for TLS on AWS |
| Quality | Vitest + Testing Library, pytest, ESLint 10, ruff, Prettier, knip, cfn-lint, shellcheck, gitleaks, GitHub Actions, Dependabot |
TypeScript stays on 6.0 until typescript-eslint supports the TypeScript 7
native compiler.
Contributions are welcome: see CONTRIBUTING.md and the
Code of Conduct. Issues and pull requests use the
templates in .github/.
MIT © 2026 Protominds – Maximilian Hummel und Abdullah Shams GbR.
| English and German | The whole interface, including numbers, dates and units (decimal comma, U/min). |
| Typed end to end | Pydantic schemas are the API contract, mirrored by TypeScript types; SQLAlchemy's typed ORM; German translations typed against the English source. |
| Operable | Verified weekly backups to S3 with Object Lock, a backup before every deploy, alarms for stale backups and a filling disk, automatic recovery of a failed host, infrastructure as one CloudFormation stack. (docs/self-hosting.md) |
| Approved, visible deploys | Every green push to main deploys after an approval in the production environment; the history and logs are public, the account's identifiers masked, and AWS is reached through OIDC with no stored keys. (deploy.yml) |