A truth instrument for repo state, documentation drift, and AI-session continuity.
2
stars
27
commits
JavaScript
primary language
Sep 4, 2026
updated
A truth instrument for three kinds of drift: repo state that's moved since you last checked it, reference documentation that no longer describes the code it names, and continuity — whether a new working thread has what it needs to pick up cleanly, or loses everything the last one learned.
All three failure modes have the same shape — a claim was true once,
and nobody told it that it stopped being true. driftcheck exists to
catch that before you act on it.
driftcheck repo [path] [--tests] [--build]
driftcheck docs [path] [--file <path>]...
driftcheck spec [path]
driftcheck spec close [path]
driftcheck vitest [path] [--file <path>]...
Trusting a stale claim is expensive. "The PR is merged," "the tests pass," "the DB is up to date," "this function still lives where the docs say it does" — each one is cheap to assume and costly to have been wrong about, especially for an AI agent or CI job re-deriving context every session with no memory of what it checked last time.
driftcheck interrogates a repo and reports verdict-first, instead of
letting a stale assumption stand unchallenged.
npm install -g @billthegoatnotme/driftcheck
driftcheck --help
Or clone and link it locally instead:
git clone https://github.com/billthegoatnotme/driftcheck.git
cd driftcheck
npm link
driftcheck --help
Run the test suite with npm test (Node's built-in test runner —
no extra dependencies).
driftcheck repoChecks whether your picture of the repo's state is current:
driftcheck repo # git / open PRs / DB migrations (fast)
driftcheck repo --tests # + test suite, with flake-vs-real triage
driftcheck repo /path/to/other/repo --tests --build
origin/main: ahead/behind counts,
a dirty tree, stale local branches already merged upstream, any local
branch with real commits not in origin/main whose own PR already
shows MERGED/CLOSED on GitHub (work pushed after the merge
happened, invisible to both the sync check above and the PRS check
below — see the note after this list), and any agent worktrees under
.claude/worktrees that can silently pollute test or build globs.gh CLI. If a PR you believed
was merged still shows up here, it isn't merged yet."driftcheck:db" script in the target's
package.json if one exists, so any ORM can plug in: exit 0 means
no drift, nonzero means it found some. No output parsing happens;
that convention is the whole interface, and it takes priority over
the Prisma fallback below if both are present. Without that script,
falls back to Prisma migration drift via prisma migrate status
loaded through .env.local: skipped cleanly (verdict —) on any
repo without prisma/schema.prisma; skipped as inconclusive (??)
if Prisma is present but .env.local isn't.--tests) — runs the test script from the target repo's
own package.json. When that script uses Vitest, failures are
re-run in isolation and classified: fails again in isolation = REAL;
passes in isolation = FLAKY (a known class under full-suite load, not
a regression). For any other test runner, only pass/fail is reported
— per-file flake classification depends on Vitest's own output format
and file-targeting convention, and doesn't generalize safely.--build) — runs npm run build.A merged PR only means the commits it had at merge time made it into
origin/main — if a branch gets pushed to again afterward, those new
commits aren't included, even though the PR itself still shows
MERGED. That's invisible to the ahead/behind check above (it only
looks at your current branch) and to the PRS check (it only lists
open PRs), so GIT checks every other local branch for exactly this:
real commits absent from origin/main whose own PR is already closed.
Every run appends a line to <repo>/.driftcheck/repo-history.jsonl —
your own longitudinal log of that repo's health, run over run. Consider
adding .driftcheck/ to the repo's .gitignore if you don't want it
committed.
driftcheck docsChecks whether a project's own reference document — CLAUDE.md,
AGENTS.md, a README's own checklist, or anything else that names
files and functions by exact identifier — still accurately describes
the code it points at:
driftcheck docs # checks whichever of the defaults exist
driftcheck docs --file CONTRIBUTING.md # check a specific file instead
driftcheck docs --file CLAUDE.md --file docs/API.md # check several
By default it looks for CLAUDE.md, AGENTS.md, and README.md in
the target repo's root and checks whichever of those actually exist.
Pass one or more --file <path> flags to check specific files instead.
It extracts and verifies exactly two reference shapes from every backtick span in the document:
file → function() (the arrow may be written as → or ->) —
verifies the file exists, then that the named function/const/class is
still declared there. If it's not there but is declared somewhere
else in the repo, it says so — probably moved or renamed, not
deleted.path/to/file.ext — any backtick-quoted path with a real
directory component and a source-like extension. Verified with a
plain existence check.This is deliberately narrow. It does not try to check every backtick span — bare filenames with no directory component (prose shorthand, not a path claim), identifiers with no file context, enum values, JSON keys. Guessing at those trades precision for coverage, and a checker that cries wolf on ordinary prose gets ignored — an ignored truth instrument is worse than no instrument at all. If your docs use a different reference convention entirely, this tool will find nothing to check and say so plainly, rather than guess.
Every run appends a line to <repo>/.driftcheck/docs-history.jsonl.
driftcheck specScaffolds a versioned project spec — a fixed governance document (how
AI and human collaborators work together on this repo, read fresh each
run from templates/drift_check_manifesto.md
so it can never drift from what actually gets generated) plus a "What We're
Building" section populated from a live driftcheck repo/docs scan,
and a Checkpoint Log for tracking what happened over time:
driftcheck spec # creates <repo>_spec_v0_01.md — no-op if one already exists
driftcheck spec close # checkpoints forward: writes v0_0N + a paired thread-handoff doc
driftcheck spec is idempotent — safe to run any time, it only ever
creates the file once. driftcheck spec close is deliberate: it writes
the next <repo>_spec_v0_0N.md (state re-scanned, prior Checkpoint Log
entries carried forward, a new entry stubbed in) and a
<repo>_thread_handoff_v0_0N.md meant to be pasted at the start of the
next working thread.
The reflective sections — the current checkpoint's "what happened," the handoff's "what to do next" — are left as explicit prompts, not auto-written. Narrating a working session is a language-generation task, not a verification one; a deterministic script guessing at why something happened is exactly the kind of unearned confidence this tool exists to avoid elsewhere. Fill those in yourself, or have your AI collaborator do it before closing out — the same way this project's own spec and handoff docs were actually written.
The thread handoff is the actual continuity mechanism this subcommand
exists to automate: a short document meant to be pasted at the start of
the next working session so it doesn't start cold. It points back at
the spec's latest Checkpoint Log entry rather than repeating it, and
carries only what a fresh session actually needs — what to do next, and
any open questions left deliberately unresolved rather than
re-litigated. driftcheck_spec_v0_01.md in this repo's own root is a
live example, not a fixture — this project uses driftcheck spec on
itself.
<repo> in the generated filenames is the target's own name (from
package.json's name field, falling back to the directory name), not
a literal string.
close patches the existing spec in place rather than regenerating it
from the template — only the "Detected" scan snapshot gets refreshed
and a new Checkpoint Log entry gets prepended; everything else,
including any hand-edits to the governance sections or "Purpose,"
carries forward untouched. (An earlier version of this feature
regenerated the whole document from the template on every close, which
silently destroyed any real customization — filling in the Pipeline
Architecture table, writing real Purpose content — the moment the next
checkpoint ran. That's a real data-loss risk for anyone actually using
this file, not a cosmetic one, so it was corrected rather than left as
a documented limitation.) If a spec file has been edited enough that
close can't find one of the section markers it patches against, it
still checkpoints — it just reports which marker it couldn't find
instead of silently skipping the update.
spec/spec close also detect a subtler failure: the repo name that
drives the filename comes from package.json's name field, and if
that field changes (or the file disappears) between runs, the detected
name changes too — silently starting a second, orphaned version
sequence under the new name instead of continuing the first. Both
commands scan root for any other *_spec_v0_NN.md under a different
name on every run and report it, rather than letting that happen
quietly. Nothing is lost either way — it's just easy to miss without
the warning.
Each close also archives whatever it just superseded — every older
<repo>_spec_v0_NN.md moves into <repo>_spec_previous/, and every
older handoff into <repo>_thread_handoff_previous/, so the repo root
always shows exactly one current spec and one current handoff no matter
how many checkpoints have happened. Nothing is ever deleted, only
moved. The output line reports what got archived, since moving files
silently would cut against driftcheck's own verdict-first stance
everywhere else.
driftcheck vitestNot a fourth drift check — a scaffolding companion. Wires up Vitest for a project that doesn't have it yet, and optionally generates stub test files:
driftcheck vitest # config + scripts.test, no stub files
driftcheck vitest --file src/lib.js # + a stub test file for that source file
Creates vitest.config.mjs if no Vitest or Vite config already exists
(a vite.config.* with its own test: {...} block counts), and adds
"test": "vitest run" to package.json if scripts.test isn't already
set — both idempotent, both leave anything already there alone rather
than overwriting it.
--file <path> (repeatable) additionally scaffolds <file>.test.<ext>
next to that source file — one describe/test() stub per exported
function/class/const/let, plus plain export { a, b } lists,
found via the same precise, un-guessed patterns driftcheck docs
already uses. Aliases (export { a as b }) and re-exports
(export { x } from './y', naming something from a different file)
are still left alone — genuinely ambiguous, not just unhandled. Never
overwrites an existing test file.
It does not write real assertions, on purpose. Every stub throws
immediately with a "not yet implemented" message — deciding what
correct behavior looks like requires actually understanding the code,
which is a reasoning task, not something this tool should guess at.
Guessing here would manufacture false confidence, the exact failure
driftcheck docs and driftcheck repo both exist to catch elsewhere.
The stubs are a real, verified starting point — install Vitest and run
them and they genuinely fail — meant for a human or an AI collaborator
to fill in with real assertions, not something to leave as-is.
| Mark | Meaning |
|---|---|
OK | checked, matches |
⚠️ | checked, drifted — read the detail line |
❌ | checked, failed |
?? | inconclusive — couldn't verify, check by hand |
— | not applicable, cleanly skipped |
driftcheck repo's DB check has no built-in ORM-specific knowledge
beyond the Prisma fallback; every other ORM needs a "driftcheck:db"
script wired up in package.json. It surfaces up to 3 lines of the
script's own output on drift, but still can't parse migration-level
detail out of arbitrary formats the way the Prisma path does — that
detail is only as good as what the script itself prints.driftcheck repo's flake-vs-real test triage is Vitest-specific;
other runners get pass/fail only.driftcheck repo/driftcheck vitest operate on one target directory
— they don't auto-discover a monorepo's separate package.json
files. Point them at each package individually (e.g.
driftcheck repo client --tests, driftcheck repo server --tests
for a client/server split with no root-level package.json).driftcheck docs's reference matching supports the arrow-pair and
bare-path conventions described above and nothing else out of the
box. Extending it to other conventions means editing the two regexes
in src/docs.mjs for now.driftcheck docs reads the repo's own
.gitignore for simple top-level directory names to skip, on top of
a hardcoded list of common ones — not a full gitignore parser.
Wildcards, negations, and nested paths (anything with a / other
than one trailing slash) aren't handled, and are walked as normal.driftcheck spec's Pipeline Architecture table ships as a fill-in
placeholder, not auto-detected roles — it's a governance template,
not something inferable from repo state. Edit the wording for all
future specs by editing templates/drift_check_manifesto.md directly; it's read
fresh on every run, not baked into the code.driftcheck spec close only patches the "Detected" section and the
Checkpoint Log — if you restructure a spec file heavily enough that
those markers can't be found, it reports that plainly rather than
silently failing to update, but it also won't guess where to patch.driftcheck vitest's export detection covers export function/
class/const/let NAME and plain export { a, b } lists. Aliased
entries (export { a as b }) and re-exports (export { x } from './y') still aren't extracted — genuinely ambiguous which name a
stub should import under, not just unhandled.driftcheck vitest --file scaffolds one file at a time, on purpose —
it never scans and stubs an entire repo unprompted.If driftcheck saves you time, sending something this way is appreciated but never required:
| Network | Address |
|---|---|
| Solana | 2iPLEu3duHcaieLPaoVfrrk6UPurmdeT4qobtiFNd2SZ |
| Bitcoin (Taproot) | bc1p6puaec5q4gvl7fd64aefrekq4fdkh9a0rtxugdd2q4exrqswkggqzaxf42 |
| Ethereum | 0x1155F41781b0edc9F26a28438E841B3e64c31509 |
| HyperEVM | 0x1155F41781b0edc9F26a28438E841B3e64c31509 (same address — EVM-compatible) |
| Robinhood Chain | 0x1155F41781b0edc9F26a28438E841B3e64c31509 (same address — EVM-compatible) |
Double-check the network before sending. The Bitcoin address above is a
Taproot (bc1p...) address — some older wallets/exchanges can't send
to it.
Built by The Artchitect.
MIT. See LICENSE.
27 commits
JavaScript
100.0%
A truth instrument for repo state, documentation drift, and AI-session continuity.
2
stars
27
commits
JavaScript
primary language
Sep 4, 2026
updated
A truth instrument for three kinds of drift: repo state that's moved since you last checked it, reference documentation that no longer describes the code it names, and continuity — whether a new working thread has what it needs to pick up cleanly, or loses everything the last one learned.
All three failure modes have the same shape — a claim was true once,
and nobody told it that it stopped being true. driftcheck exists to
catch that before you act on it.
driftcheck repo [path] [--tests] [--build]
driftcheck docs [path] [--file <path>]...
driftcheck spec [path]
driftcheck spec close [path]
driftcheck vitest [path] [--file <path>]...
Trusting a stale claim is expensive. "The PR is merged," "the tests pass," "the DB is up to date," "this function still lives where the docs say it does" — each one is cheap to assume and costly to have been wrong about, especially for an AI agent or CI job re-deriving context every session with no memory of what it checked last time.
driftcheck interrogates a repo and reports verdict-first, instead of
letting a stale assumption stand unchallenged.
npm install -g @billthegoatnotme/driftcheck
driftcheck --help
Or clone and link it locally instead:
git clone https://github.com/billthegoatnotme/driftcheck.git
cd driftcheck
npm link
driftcheck --help
Run the test suite with npm test (Node's built-in test runner —
no extra dependencies).
driftcheck repoChecks whether your picture of the repo's state is current:
driftcheck repo # git / open PRs / DB migrations (fast)
driftcheck repo --tests # + test suite, with flake-vs-real triage
driftcheck repo /path/to/other/repo --tests --build
origin/main: ahead/behind counts,
a dirty tree, stale local branches already merged upstream, any local
branch with real commits not in origin/main whose own PR already
shows MERGED/CLOSED on GitHub (work pushed after the merge
happened, invisible to both the sync check above and the PRS check
below — see the note after this list), and any agent worktrees under
.claude/worktrees that can silently pollute test or build globs.gh CLI. If a PR you believed
was merged still shows up here, it isn't merged yet."driftcheck:db" script in the target's
package.json if one exists, so any ORM can plug in: exit 0 means
no drift, nonzero means it found some. No output parsing happens;
that convention is the whole interface, and it takes priority over
the Prisma fallback below if both are present. Without that script,
falls back to Prisma migration drift via prisma migrate status
loaded through .env.local: skipped cleanly (verdict —) on any
repo without prisma/schema.prisma; skipped as inconclusive (??)
if Prisma is present but .env.local isn't.--tests) — runs the test script from the target repo's
own package.json. When that script uses Vitest, failures are
re-run in isolation and classified: fails again in isolation = REAL;
passes in isolation = FLAKY (a known class under full-suite load, not
a regression). For any other test runner, only pass/fail is reported
— per-file flake classification depends on Vitest's own output format
and file-targeting convention, and doesn't generalize safely.--build) — runs npm run build.A merged PR only means the commits it had at merge time made it into
origin/main — if a branch gets pushed to again afterward, those new
commits aren't included, even though the PR itself still shows
MERGED. That's invisible to the ahead/behind check above (it only
looks at your current branch) and to the PRS check (it only lists
open PRs), so GIT checks every other local branch for exactly this:
real commits absent from origin/main whose own PR is already closed.
Every run appends a line to <repo>/.driftcheck/repo-history.jsonl —
your own longitudinal log of that repo's health, run over run. Consider
adding .driftcheck/ to the repo's .gitignore if you don't want it
committed.
driftcheck docsChecks whether a project's own reference document — CLAUDE.md,
AGENTS.md, a README's own checklist, or anything else that names
files and functions by exact identifier — still accurately describes
the code it points at:
driftcheck docs # checks whichever of the defaults exist
driftcheck docs --file CONTRIBUTING.md # check a specific file instead
driftcheck docs --file CLAUDE.md --file docs/API.md # check several
By default it looks for CLAUDE.md, AGENTS.md, and README.md in
the target repo's root and checks whichever of those actually exist.
Pass one or more --file <path> flags to check specific files instead.
It extracts and verifies exactly two reference shapes from every backtick span in the document:
file → function() (the arrow may be written as → or ->) —
verifies the file exists, then that the named function/const/class is
still declared there. If it's not there but is declared somewhere
else in the repo, it says so — probably moved or renamed, not
deleted.path/to/file.ext — any backtick-quoted path with a real
directory component and a source-like extension. Verified with a
plain existence check.This is deliberately narrow. It does not try to check every backtick span — bare filenames with no directory component (prose shorthand, not a path claim), identifiers with no file context, enum values, JSON keys. Guessing at those trades precision for coverage, and a checker that cries wolf on ordinary prose gets ignored — an ignored truth instrument is worse than no instrument at all. If your docs use a different reference convention entirely, this tool will find nothing to check and say so plainly, rather than guess.
Every run appends a line to <repo>/.driftcheck/docs-history.jsonl.
driftcheck specScaffolds a versioned project spec — a fixed governance document (how
AI and human collaborators work together on this repo, read fresh each
run from templates/drift_check_manifesto.md
so it can never drift from what actually gets generated) plus a "What We're
Building" section populated from a live driftcheck repo/docs scan,
and a Checkpoint Log for tracking what happened over time:
driftcheck spec # creates <repo>_spec_v0_01.md — no-op if one already exists
driftcheck spec close # checkpoints forward: writes v0_0N + a paired thread-handoff doc
driftcheck spec is idempotent — safe to run any time, it only ever
creates the file once. driftcheck spec close is deliberate: it writes
the next <repo>_spec_v0_0N.md (state re-scanned, prior Checkpoint Log
entries carried forward, a new entry stubbed in) and a
<repo>_thread_handoff_v0_0N.md meant to be pasted at the start of the
next working thread.
The reflective sections — the current checkpoint's "what happened," the handoff's "what to do next" — are left as explicit prompts, not auto-written. Narrating a working session is a language-generation task, not a verification one; a deterministic script guessing at why something happened is exactly the kind of unearned confidence this tool exists to avoid elsewhere. Fill those in yourself, or have your AI collaborator do it before closing out — the same way this project's own spec and handoff docs were actually written.
The thread handoff is the actual continuity mechanism this subcommand
exists to automate: a short document meant to be pasted at the start of
the next working session so it doesn't start cold. It points back at
the spec's latest Checkpoint Log entry rather than repeating it, and
carries only what a fresh session actually needs — what to do next, and
any open questions left deliberately unresolved rather than
re-litigated. driftcheck_spec_v0_01.md in this repo's own root is a
live example, not a fixture — this project uses driftcheck spec on
itself.
<repo> in the generated filenames is the target's own name (from
package.json's name field, falling back to the directory name), not
a literal string.
close patches the existing spec in place rather than regenerating it
from the template — only the "Detected" scan snapshot gets refreshed
and a new Checkpoint Log entry gets prepended; everything else,
including any hand-edits to the governance sections or "Purpose,"
carries forward untouched. (An earlier version of this feature
regenerated the whole document from the template on every close, which
silently destroyed any real customization — filling in the Pipeline
Architecture table, writing real Purpose content — the moment the next
checkpoint ran. That's a real data-loss risk for anyone actually using
this file, not a cosmetic one, so it was corrected rather than left as
a documented limitation.) If a spec file has been edited enough that
close can't find one of the section markers it patches against, it
still checkpoints — it just reports which marker it couldn't find
instead of silently skipping the update.
spec/spec close also detect a subtler failure: the repo name that
drives the filename comes from package.json's name field, and if
that field changes (or the file disappears) between runs, the detected
name changes too — silently starting a second, orphaned version
sequence under the new name instead of continuing the first. Both
commands scan root for any other *_spec_v0_NN.md under a different
name on every run and report it, rather than letting that happen
quietly. Nothing is lost either way — it's just easy to miss without
the warning.
Each close also archives whatever it just superseded — every older
<repo>_spec_v0_NN.md moves into <repo>_spec_previous/, and every
older handoff into <repo>_thread_handoff_previous/, so the repo root
always shows exactly one current spec and one current handoff no matter
how many checkpoints have happened. Nothing is ever deleted, only
moved. The output line reports what got archived, since moving files
silently would cut against driftcheck's own verdict-first stance
everywhere else.
driftcheck vitestNot a fourth drift check — a scaffolding companion. Wires up Vitest for a project that doesn't have it yet, and optionally generates stub test files:
driftcheck vitest # config + scripts.test, no stub files
driftcheck vitest --file src/lib.js # + a stub test file for that source file
Creates vitest.config.mjs if no Vitest or Vite config already exists
(a vite.config.* with its own test: {...} block counts), and adds
"test": "vitest run" to package.json if scripts.test isn't already
set — both idempotent, both leave anything already there alone rather
than overwriting it.
--file <path> (repeatable) additionally scaffolds <file>.test.<ext>
next to that source file — one describe/test() stub per exported
function/class/const/let, plus plain export { a, b } lists,
found via the same precise, un-guessed patterns driftcheck docs
already uses. Aliases (export { a as b }) and re-exports
(export { x } from './y', naming something from a different file)
are still left alone — genuinely ambiguous, not just unhandled. Never
overwrites an existing test file.
It does not write real assertions, on purpose. Every stub throws
immediately with a "not yet implemented" message — deciding what
correct behavior looks like requires actually understanding the code,
which is a reasoning task, not something this tool should guess at.
Guessing here would manufacture false confidence, the exact failure
driftcheck docs and driftcheck repo both exist to catch elsewhere.
The stubs are a real, verified starting point — install Vitest and run
them and they genuinely fail — meant for a human or an AI collaborator
to fill in with real assertions, not something to leave as-is.
| Mark | Meaning |
|---|---|
OK | checked, matches |
⚠️ | checked, drifted — read the detail line |
❌ | checked, failed |
?? | inconclusive — couldn't verify, check by hand |
— | not applicable, cleanly skipped |
driftcheck repo's DB check has no built-in ORM-specific knowledge
beyond the Prisma fallback; every other ORM needs a "driftcheck:db"
script wired up in package.json. It surfaces up to 3 lines of the
script's own output on drift, but still can't parse migration-level
detail out of arbitrary formats the way the Prisma path does — that
detail is only as good as what the script itself prints.driftcheck repo's flake-vs-real test triage is Vitest-specific;
other runners get pass/fail only.driftcheck repo/driftcheck vitest operate on one target directory
— they don't auto-discover a monorepo's separate package.json
files. Point them at each package individually (e.g.
driftcheck repo client --tests, driftcheck repo server --tests
for a client/server split with no root-level package.json).driftcheck docs's reference matching supports the arrow-pair and
bare-path conventions described above and nothing else out of the
box. Extending it to other conventions means editing the two regexes
in src/docs.mjs for now.driftcheck docs reads the repo's own
.gitignore for simple top-level directory names to skip, on top of
a hardcoded list of common ones — not a full gitignore parser.
Wildcards, negations, and nested paths (anything with a / other
than one trailing slash) aren't handled, and are walked as normal.driftcheck spec's Pipeline Architecture table ships as a fill-in
placeholder, not auto-detected roles — it's a governance template,
not something inferable from repo state. Edit the wording for all
future specs by editing templates/drift_check_manifesto.md directly; it's read
fresh on every run, not baked into the code.driftcheck spec close only patches the "Detected" section and the
Checkpoint Log — if you restructure a spec file heavily enough that
those markers can't be found, it reports that plainly rather than
silently failing to update, but it also won't guess where to patch.driftcheck vitest's export detection covers export function/
class/const/let NAME and plain export { a, b } lists. Aliased
entries (export { a as b }) and re-exports (export { x } from './y') still aren't extracted — genuinely ambiguous which name a
stub should import under, not just unhandled.driftcheck vitest --file scaffolds one file at a time, on purpose —
it never scans and stubs an entire repo unprompted.If driftcheck saves you time, sending something this way is appreciated but never required:
| Network | Address |
|---|---|
| Solana | 2iPLEu3duHcaieLPaoVfrrk6UPurmdeT4qobtiFNd2SZ |
| Bitcoin (Taproot) | bc1p6puaec5q4gvl7fd64aefrekq4fdkh9a0rtxugdd2q4exrqswkggqzaxf42 |
| Ethereum | 0x1155F41781b0edc9F26a28438E841B3e64c31509 |
| HyperEVM | 0x1155F41781b0edc9F26a28438E841B3e64c31509 (same address — EVM-compatible) |
| Robinhood Chain | 0x1155F41781b0edc9F26a28438E841B3e64c31509 (same address — EVM-compatible) |
Double-check the network before sending. The Bitcoin address above is a
Taproot (bc1p...) address — some older wallets/exchanges can't send
to it.
Built by The Artchitect.
MIT. See LICENSE.
27 commits
JavaScript
100.0%