neuron-explorer
Qwen3.5‑4B 전용 조향형 뉴런 탐색기, 모든 MLP 뉴런을 밀어 결과를 보관·탐색
Rust 기반 저장 엔진에 계정·프로젝트·API 키·대시보드·알림 기능이 포함된 워크스페이스를 제공하거나 직접 서버에 연결할 수 있습니다
A Rust storage engine with a hosted workspace on top: accounts, projects, API keys, dashboards and alerts. Or point it at a server you run yourself.
개발 도구Rust · TypeScriptGitHub @ShravanJanwade접속 불안정운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗A single-node time-series database written in Rust — write-ahead log, skip-list memtable, compressed typed SSTables, bloom filters, compaction, and a SQL subset with time bucketing — plus the multi-tenant console and control plane that make it usable: accounts, projects, buckets, roles, revocable API keys, saved dashboards, threshold monitors and an audit trail.
It runs as one process on one port. The same binary serves the storage engine, the control plane, the token API and the browser console.
Open the live demo → Click Explore the demo; no account needed. The demo sleeps when nobody is using it, so the first load after a quiet spell takes a few seconds.
Or run it yourself:
git clone https://github.com/ShravanJanwade/FluxDB.git
cd FluxDB
node start-all.js
Then open http://127.0.0.1:5173 and click Explore the demo — no account needed. You get a seeded production fleet with an incident in it, and one SQL query finds the failing service.
Two layers in one binary.
The engine (fluxdb-core) stores points. A point is a measurement, a
complete tag set, a nanosecond timestamp, and one or more typed fields. Writes
go to a checksummed write-ahead log and a sorted in-memory skip list; full
memtables are flushed to immutable SSTables with per-field type encoding, LZ4
block compression and bloom filters over series keys; a manifest makes each
checkpoint atomic; compaction rewrites files to drop obsolete versions and
tombstones.
The control plane (fluxdb-server::cloud) is what turns that into something
you can hand to other people: accounts with Argon2id passwords and GitHub
sign-in, organizations and projects, four roles, project-scoped API keys for
agents and SDKs, saved dashboards, monitors evaluated server-side every minute,
per-organization audit trail, and hosted-plan quotas.
Tenancy is enforced by name. Each project owns the t{project_id}_* prefix of
engine database names, and no request can name an engine database directly:
a caller addresses a bucket by id, the control plane resolves the owning project,
checks the caller's role in that organization, and only then maps to a physical
database. Guessing another tenant's ids returns 404, not their data — there are
integration tests for exactly that.
You can also point the console at a FluxDB you run yourself. The browser talks to it directly and its token stays in the browser tab; it is never sent to the host serving the console.
Everything in the demo is explicitly synthetic and generated from a seeded pseudo-random generator, so every deployment produces the same shape.
It is a small production fleet: eight hosts, six services, and — about 90
minutes before "now" — a payment dependency that starts timing out. The
payments and checkout services' p99 latency and error rate climb, and the
database host they depend on saturates. The shipped dashboard, the four shipped
monitors and the worked query examples all exist so a visitor can find that
incident:
SELECT MAX(latency_p99) AS p99, SUM(errors) AS errors
FROM http_requests
WHERE $timeFilter
GROUP BY service
ORDER BY p99 DESC
service p99 errors
payments 1,224.03 3,007
checkout 1,208.74 4,448
search 130.86 2,092
notifications 106.46 1,077
auth 85.61 1,415
catalog 67.69 1,804
A guest workspace gets a private, writable copy of a smaller sample plus read-only access to the shared showcase. It is deleted automatically, with everything in it, after 24 hours.
Needs Rust 1.89+ and Node.js 22.12+. Python 3.10+ is optional, for the SDK, the restore tool and the smoke suite.
node start-all.js
That builds the engine, installs the console's dependencies from the lockfile,
starts both, waits for readiness, and stops them together on Ctrl+C. It refuses
an occupied port rather than stopping whatever is already there.
node start-all.js --verify starts, checks the server, the browser proxy and the
control plane, then exits. Windows users can run run-fluxdb.bat; Linux and
macOS bash run-fluxdb.sh.
To run the pieces separately:
# Terminal 1 — API on http://127.0.0.1:8086
cd fluxdb && cargo run --release -p fluxdb-server --bin fluxdb
# Terminal 2 — console on http://127.0.0.1:5173, proxying /api to the server
cd fluxdb-studio && npm ci && npm run dev
The server stores time-series data in data relative to its working directory
and keeps control-plane metadata in data/control.sqlite beside it. A data
directory can be opened by exactly one process.
To serve the built console from the server instead of running Vite — which is how a deployment works:
cd fluxdb-studio && npm run build && cd ..
FLUXDB_STATIC_DIR=$PWD/fluxdb-studio/dist \
FLUXDB_SESSION_SECRET=$(python -c "import secrets; print(secrets.token_hex(32))") \
./fluxdb/target/release/fluxdb
# Everything on http://127.0.0.1:8086
One container. See docs/DEPLOYMENT.md for the full guide, including the free Render + managed Postgres path and the certificate setup for your own VM. The public demo runs on Azure Container Apps and scales to zero when idle; docs/DEPLOY_AZURE.md is that setup, end to end.
cp .env.example .env # then replace both secrets
docker compose up --build -d
# http://localhost:8080
The short version for a hosted deployment: set FLUXDB_TOKEN,
FLUXDB_SESSION_SECRET, PUBLIC_BASE_URL, and DATABASE_URL pointing at a
managed Postgres. That last one matters — a hosted container's filesystem
usually does not survive a redeploy, and without an external metadata store
every account goes with it.
Create a project API key in the console, then use either format. Both are
accepted by the hosted ingest endpoints with a project key, and by a self-hosted
server's /api/v1 with its bearer token.
# InfluxDB line protocol — what most metrics agents already emit.
curl -X POST 'https://YOUR-DEPLOYMENT/api/ingest/v1/write?bucket=production&precision=s' \
-H 'Authorization: Bearer fdbk_YOUR_KEY' \
--data-binary '
cpu,host=api-01,region=us-east-1 usage=42.8,cores=8i 1789142400
http_requests,service=checkout requests=2412i,errors=3i,latency_p99=184.2 1789142400'
# JSON batch, up to 10,000 points.
curl -X POST 'https://YOUR-DEPLOYMENT/api/ingest/v1/points?bucket=production' \
-H 'Authorization: Bearer fdbk_YOUR_KEY' \
-H 'Content-Type: application/json' \
-d '{"points":[{
"measurement":"cpu",
"tags":{"host":"api-01"},
"timestamp":"1789142400000000000",
"fields":{"usage":42.8,"cores":{"integer":"8"},"healthy":true}
}]}'
# Read it back.
curl -X POST 'https://YOUR-DEPLOYMENT/api/ingest/v1/query' \
-H 'Authorization: Bearer fdbk_YOUR_KEY' \
-H 'Content-Type: application/json' \
-d '{"bucket":"production","interval":"5m",
"query":"SELECT MEAN(usage) AS cpu FROM cpu WHERE $timeFilter GROUP BY time($interval), host"}'
Two conventions worth knowing. Timestamps are decimal nanosecond strings,
and exact 64-bit integers are {"integer": "…"}. Both exist because an
IEEE-754 double cannot represent the whole i64 range, so sending them as JSON
numbers would silently round values. Query results return them as strings for
the same reason.
Writing the same measurement, tag set and timestamp again is an upsert: supplied fields replace existing values and unsupplied fields are left alone. Changing any tag, or the timestamp, addresses a different point.
There are dependency-free clients for Python and
JavaScript, an OpenAPI document at
/api/v1/openapi.json, and an offline CLI for a data directory no server holds
open.
Supported: SELECT * and named fields;
COUNT/SUM/MEAN/MIN/MAX/FIRST/LAST with AS aliases; WHERE with AND,
OR, NOT, IN, BETWEEN, LIKE, IS NULL and comparisons on fields and
tags; GROUP BY time('5m') with optional tag columns; HAVING; DISTINCT;
ORDER BY; LIMIT; OFFSET.
Not supported: joins across measurements, subqueries, window functions,
computed SELECT expressions, PERCENTILE, now(), the Flux language,
continuous queries and downsampling tasks. Anything outside the subset returns
an error that names what it cannot do, rather than quietly meaning something
else.
Because there is no now(), a query carries no implicit notion of "recent".
The API expands four macros from the range you send, which is what lets one
saved dashboard panel serve every range:
| Macro | Becomes |
|---|---|
$timeFilter | time >= <from> AND time <= <to> |
$interval | a quoted bucket width chosen for chart readability, or the one you asked for |
$from, $to | the raw nanosecond bounds |
┌──────────── write path ────────────┐
HTTP ─────▶ WAL (CRC32, fsync) ─▶ memtable ─▶ SSTable ─▶ manifest
(skip list) (LZ4, (atomic
typed) checkpoint)
┌──────────── read path ─────────────┐ │
SQL ──▶ parse ─▶ plan ─▶ merge reader ─▶ aggregate bloom
(memtable + SSTables) filter
▲ │
└────── compaction ◀───────────┘
(drops tombstones)
A write is durable before it is acknowledged and never mutated in place afterwards; everything after that is a background rearrangement of immutable files. On recovery a truncated trailing WAL entry is dropped and anything corrupt in the middle is reported rather than silently skipped.
Control-plane metadata is a small set of typed JSON documents in one table with explicit secondary index columns, which is what lets it run unchanged on SQLite locally and on managed Postgres in a deployment. Uniqueness of email addresses, organization slugs and bucket names is enforced by that table's index rather than by checks at the call sites.
See docs/ARCHITECTURE.md for the durability and concurrency details.
HttpOnly, SameSite=Lax cookie, Secure whenever
the deployment is reached over HTTPS. Only the SHA-256 of the cookie value is
stored, so a leaked control-plane database does not hand over live sessions.
Mutating requests also have their Origin checked./api/v1) can name any engine database, so it sits
underneath project isolation. A server with accounts enabled therefore always
has a token in force — the operator's, or a generated one logged at startup./api/v1 paths, takes the target token
per request without storing it, and refuses targets that resolve inside a
private network.Missing, and worth saying plainly: there is no email verification, no password reset by mail and no multi-factor authentication, because this deployment has no mail provider. Those are the first three things a real product would add.
| Variable | Default | Purpose |
|---|---|---|
FLUXDB_ADDR | 127.0.0.1:8086 | Listen address. PORT is used instead when a platform assigns one. |
FLUXDB_DATA_DIR | data | Time-series storage directory |
FLUXDB_STATIC_DIR | unset | Built console to serve from this process |
FLUXDB_TOKEN | unset | Administration token for /api/v1. At least 32 characters is required for a non-loopback bind. |
FLUXDB_SESSION_SECRET | generated | Signs OAuth state. Set 32+ characters so sessions survive a restart. |
FLUXDB_CLOUD | on | off runs a plain single-tenant server with no accounts |
DATABASE_URL | unset | Postgres for control-plane metadata. Falls back to SQLite beside the data directory. |
PUBLIC_BASE_URL | derived | Absolute base URL, used for OAuth callbacks and cookie security |
GITHUB_CLIENT_ID / _SECRET | unset | Enables GitHub sign-in when both are present |
FLUXDB_CORS_ORIGINS | localhost 5173/4173 | Browser origins allowed to call the API |
GEMINI_API_KEY / GEMINI_MODEL | unset | Shared key for the AI agent. Served to registered accounts under an hourly cap, never to guests |
GEMINI_ENDPOINT | Gemini-compatible gateway, for egress proxies |
Never put a provider key in a VITE_* variable — those are compiled into the
browser bundle.
Retention is measured against wall-clock time and enforced by a sweep roughly every 60 seconds; zero keeps data indefinitely. Shortening a policy expires older data on the next sweep, and that is not reversible.
Flush turns the current memtable into an SSTable, which is why a freshly written bucket can report zero bytes on disk while its points are perfectly readable. Compact rewrites the SSTables to drop obsolete versions and tombstones. Both run automatically.
Backups are logical JSON snapshots — from the console, or over the API:
curl -H 'Authorization: Bearer YOUR_TOKEN' \
http://127.0.0.1:8086/api/v1/databases/observability/export > snapshot.json
python scripts/restore.py snapshot.json --database restored \
--url http://127.0.0.1:8086
Restore is not transactional across batches: if it is interrupted, inspect the partially created destination and retry into a fresh database rather than the same one. Never copy live WAL or SSTable files as a backup.
The offline CLI works on a data directory no server is holding open:
cd fluxdb
cargo run -p fluxdb-cli -- --data-dir ./data list
cargo run -p fluxdb-cli -- --data-dir ./data query observability "SELECT COUNT(*) FROM cpu"
cd fluxdb
cargo fmt --all -- --check
cargo clippy --workspace --all-targets --locked -- -D warnings
cargo test --workspace --locked # engine, SQL, and control-plane end to end
cd ..
python scripts/smoke.py # isolated authenticated server, both SDKs
cd fluxdb-studio
npm ci && npm run typecheck && npm test && npm run build
The Rust suite includes integration tests that drive the real router: one
account cannot reach another's project by any route, roles gate writes and
administration, API key scopes are enforced, the showcase project is read-only
for everyone, proxy targets inside private networks are refused, and /api/v1
is unreachable without its token whenever accounts exist.
To measure your own host, with a server running:
python scripts/benchmark.py --points 10000 --batch 500
That reports the workload size, the platform, HTTP point throughput, batch write p95, query p95 and the verified stored count. These are workload-specific measurements on your hardware, not a universal throughput claim — which is why no throughput number appears anywhere else in this README. The console's Instance health page shows the same kind of figures for the running instance, measured from the last 2,000 requests.
CI runs the Rust suite on Linux and Windows, type-checks and tests the console,
and builds the container image and boots it to confirm it serves the API, the
console and a deep link while refusing anonymous /api/v1. A workflow
definition is not evidence of a successful hosted run.
Tests reduce regressions; they cannot establish production readiness for every workload. Validate capacity, backups, restore, fault behaviour and HTTPS configuration for your own environment before trusting FluxDB with data you cannot lose.
MIT licensed.