Henceforth
A mobile forth
$9.99
Bitcoin Script's stack model came from FORTH. Henceforth lets you write in the language Script was modelled on — then sign and broadcast.
Bitcoin you can script.
Henceforth is a Bitcoin SV wallet wrapped around a complete FORTH terminal. Send,
receive, and broadcast real Bitcoin transactions from a programmable command line.
Define your own words, build raw transactions byte by byte, and visualise data with
code you write yourself.
There's nothing else like it on the App Store.
YOUR KEYS, YOUR COINS
Private keys live in the iOS Keychain — never on a server. Every send is gated by
Face ID or Touch ID. Transactions are permanent on the BSV blockchain, and fees are
typically a fraction of a cent.
For extra safety, Cold Mode signs transactions on a second offline iPhone over
AirDrop — a real air-gap setup without dedicated hardware.
A TERMINAL THAT DOES MORE THAN PRINT HELLO WORLD
Full Forth-2012 CORE compliance (133 standard words) plus 200+ Bitcoin Script and BSV
protocol extensions.
Print a string:
." Hello, World"
Define a word and run it:
: square dup * ;
5 square .
Pay someone from the command line:
1000 s" 1Q88RPbg..." send
The terminal isn't a toy shell — it's the same Forth interpreter that builds the
transactions you broadcast.
WRITE, SAVE, AND RUN YOUR OWN PROGRAMS
Save reusable code as .fs files. The built-in editor and file manager lets you write,
version, and rerun scripts. The classic FORTH way: small composable words growing
into your own personal vocabulary.
CHARTS FROM THE STACK
Bar, line, and pie charts from any values on the stack. Visualise sequences, payment
histories, or whatever data you compute — directly from FORTH code.
WHAT'S INSIDE
• BSV wallet with multi-recipient sends and raw transaction builder
• Privacy-aware UTXO selection — fresh change addresses every send
• 1Sat Ordinal awareness — protects your inscriptions from accidental spending
• SPV transaction verification — trust math, not servers
• Universal app — iPhone, iPad, and Mac
• Local-first — works offline; on-chain when you broadcast
• Forever yours — one-time purchase, no subscriptions, no ads
Powered by FORTH, the stack-based language Chuck Moore created in 1970.
more The Script engine, rebuilt
• The data stack is now the live Bitcoin Script consensus stack — what you see
on .ds is exactly what the validator sees.
• script-step walks any saved script opcode-by-opcode, rendering the stack live
at every step.
• script-tx-context loads any on-chain transaction and makes it replayable at
the prompt.
• checksig-fixture arms a real signed transaction so you can single-step a full
P2PKH / OP_CHECKSIG verification to VALID.
• >scriptnum and scriptnum> make the number↔bytes boundary explicit; 0x literals
push bytes everywhere.
Live chain data on the stack
• balance, tx-confirmations, and spv-verified? put chain state directly on the
stack — and they work inside loops and your own word definitions now.
• Broadcasting a transaction pushes its TXID onto the stack.
• THROW and CATCH let payment scripts handle failure instead of just stopping.
Clearer errors and help
• Errors name the word that failed and dump the stack.
• Mistype a word and the terminal suggests near matches.
• help and see now work on built-in words; built-ins can no longer be silently
redefined.
Faster and smoother
• Quicker launch and faster wallet sync via bulk address/UTXO/history fetching.
• Smoother terminal scrolling across long sessions.
Accessibility
• VoiceOver now announces command results and broadcast outcomes.
Wallet, vocab & navigation
• More accurate balances; the correct signing wallet is kept on payments.
• Browse the vocabulary by category and search definitions.
• macOS: back navigation works on every pushed screen.
4.44 Jun 15
Fixes and reliability.
Wallet
• First-time sync is far faster: block headers now download in bulk during initial catch-up. Every header is still verified on this device — proof-of-work, chain linkage and the checkpoint anchor are unchanged; only the download got faster.
• If the primary balance source is unreachable, a second independent source answers, so balance checks keep working through an outage.
• "Show New Address QR" in wallet details opens again.
• Seed verification: starting the quiz from wallet details no longer re-reveals the seed first, a Cancel button appears after a failed quiz, and success is confirmed clearly.
Mac
• Every pushed page now has a back button. Six pages — among them the vocabulary word definitions and the create- and restore-wallet flows — could previously strand you with no way back.
• Importing and exporting Air-Gap Tools files and choosing script files now works — the file-access permission was missing from the sandboxed build.
• The app quits when you close its last window.
Terminal & keyboards
• A line that errors no longer also prints "ok." — the error message stands alone.
• Script recording prints one output line per entry instead of running lines together.
• With a hardware keyboard, the terminal keeps focus after each command — no more pressing Return twice between commands.
• Your keyboard choice in Settings now persists across launches, and the selected-keyboard label reads correctly for all three keyboard types.
Interface
• All text now follows your chosen theme colour. Text that fell back to system colours could render dark-on-dark — most visibly in Light appearance on Mac. Field placeholders are themed too.
• Approval prompts now say "Authentication required" instead of naming Face ID on machines that don't have it.
• Settings shows the app version at the foot of the page.
Several of these were reported by testers — thank you.
4.27 Jun 10
Mac launch.
Henceforth now runs natively on Mac alongside iPhone and iPad — one app, three idioms, with iCloud wallet sync across all three. Your keys never leave the device they're on; the public side of your wallet — addresses, balances, history — stays in step.
Read any transaction
The transaction decoder is rebuilt. Paste a raw transaction, or open one you just built or sent, and read it back in plain terms: TXID, size, fee, version and locktime up top, then every input and output labelled by type. P2PKH outputs show the address, OP_RETURN outputs show the embedded message, and any script expands to its full opcode disassembly. The raw hex is one tap away, with Copy and Share.
Wallet & restore
• Sync now names the wallet it's working on and its place in the queue, above a live "X of N" address counter — you can see which wallet is being processed.
• Restore and Full Sync can scan additional BSV account numbers you declare on the Restore screen or in a wallet's details, for wallets set up under a non-zero BIP44 account.
• A burst of network blips during a restore scan no longer makes addresses look empty and cut the scan short.
Payments
• A stalled broadcast now stops after 20 seconds and tells you the payment may still have gone through, instead of spinning.
• The Pay button no longer looks ready when the amount or address is empty.
• A just-sent payment holds a steady Pending label, and a dropped phantom transaction stays gone when you reopen the wallet.
• Your balance no longer hides funds when one data source briefly can't see a transaction.
Charts & accessibility
• Bar, line and pie chart popups redesigned — clearer axes, aligned labels, distinct pie-wedge colours.
• Each chart now speaks a summary to VoiceOver.
Interface
• Consistent tinted-glass buttons throughout, a clearer back button aligned with the page title, and a native Mac toolbar and fanned wallet-card stack.
For script authors
• OP_PUSHDATA1/2/4 records the exact push width you name, hex>data decodes the bytes you actually pushed, and the RIPEMD opcode is now spelled op_ripemd160 (older op_ripmd160 scripts still load). Three HELP stack diagrams corrected.
If you've been running a prior version: open each wallet once so the new scan can pick up any addresses the older filter may have missed.
4.26 Jun 1
This update focuses on wallet reliability, with terminal and
interface refinements throughout.
Wallet
• Unconfirmed balance no longer gets stuck. A transaction that never
reached the network is now detected and its outputs cleared — and
they stay cleared after the app is reopened.
• Fixed a "malformed input" error that could block sending.
• Pending transactions now sort to the top of the UTXO list.
• More reliable balance syncing — pending transactions are re-checked
first on every refresh, partial syncs save progress instead of
discarding it, and the balance recomputes after every change.
• Cross-device sync — a wallet's public data (addresses, UTXOs) syncs
via iCloud, and wallets seen on another device are offered for import.
• Stuck outgoing transactions are detected, and can be retried or
dropped from the UTXO detail screen.
• Clearer sync status — an honest "Catching up" indicator.
Notifications
• Deposit alerts now fire only for genuinely recent payments (the last
24 hours) — no more notifications for a wallet's existing history on
first sync or import.
Terminal
• New word: chars>data. hex2data / data2hex gain arrow-form names
hex>data / data>hex (the old names still work).
• Fixed confusing errors after an unterminated string or comment
carried into the next line.
• Hold delete to repeat; the suggestion bar no longer overflows or
covers the keypad toggle.
Also
• Redesigned amount-unit control on the payment screen; a broadcast
button when decoding a transaction.
• Native macOS app icon and a range of Mac layout fixes.
4.25 May 20
Wallet & Cold Mode
• Cold Mode broadcasts now route to the wallet that signed them, even after switching
wallets in the picker.
• Pending broadcasts moved to a per-wallet badge — the count you see is the queue for
the wallet you're viewing.
• First deposit notifications now fire on fresh wallets (previously silently absorbed
on install).
• BIP39 seed handling unified between BIP44 and Type42 derivation paths.
• PAY button reflects valid state from the first frame when the recipient was
pre-filled — by the send Forth word, a URL scheme, or paste-from-clipboard.
Previously showed "invalid address" until you tapped the field.
• New terminal words: send (single recipient) and send-many (multi-recipient with
per-amount control) — open the review sheet, biometric-gated, broadcast on confirm.
• Every multi-recipient send shows the full per-payee breakdown before Face ID —
approval is over the bytes, not a label.
• Two-iPhone Cold Mode via AirDrop bundles — export receive addresses, receive
bundles, and verify SPV proofs across an air-gap without dedicated hardware.
dApp & BRC-100 integration
• Multi-output transactions honour each recipient's amount (no more equal-split
rewrites).
• Incoming transactions are owner-verified before registering UTXOs.
• signAction approval sheets show the original transaction description instead of
"wants to call signAction."
• Faster "confirmed" badges — ARC now returns Merkle proofs inline so SPV
verification runs at broadcast time.
Design
• Liquid Glass design system unified across every wallet surface — tinted action
buttons, chrome glass close X, glass section headers.
• Custom Bitcoin glyph replaces the system icon throughout.
• Files screen: symmetric inline header (search · FILES · add).
• Square add-wallet button distinguishes "create" from circular "modify" affordances.
• Refreshed wallet detail, restore-wallet, decode-transaction, and seed-verification
screens.
Accessibility
• VoiceOver reads each transaction row as a single sentence ("Sent 0.0001 BSV on 11
May, pending") instead of a glyph stream.
• Live countdown on auth approval sheets.
• Keypad keys hit Apple's 44pt touch-target minimum on every device.
• Automation IDs on payment fields for snapshot/UI tests.
Reliability & security
• SPV trust store now has a single chain-validated write path; dApps reading headers
see the bounded validated range.
• Defensive decoders on persisted state — schema additions can't crash the wallet on
update.
• Cancellation-safe networking: rate limiter and mempool monitor no longer leak slots
or crash on concurrent polls.
• Defence-in-depth biometric on decrypt; HTTPS-only auth callbacks.
• Approval cache binds to the exact recipient set + output digest — a
recently-approved 770k send to A,B won't auto-authorise a 770k send to X,Y inside the
120-second window.
• Fragmentation-aware UTXO selection — normal sends drain dust as a side effect, with
a hard transaction-size ceiling enforced before biometric.
• 1Sat Ordinal protection — UTXOs holding inscriptions are filtered from spending
across every send path.
Forth interpreter
• ?DO/LOOP and DO/+LOOP propagate body errors instead of silently swallowing them.
• 0 0 DO ... LOOP is now a clean zero-trip (matches gforth/SwiftForth behaviour).
• New script bridge words: >script, data>script, text>script, file>script — push
terminal data into the Bitcoin Script buffer for B://, 1Sat Ordinals, and MAP
protocol posts.
4.24 May 14
Wallet & Cold Mode
• Cold Mode broadcasts now route to the wallet that signed them, even after switching
wallets in the picker.
• Pending broadcasts moved to a per-wallet badge — the count you see is the queue for
the wallet you're viewing.
• First deposit notifications now fire on fresh wallets (previously silently absorbed
on install).
• BIP39 seed handling unified between BIP44 and Type42 derivation paths.
• PAY button reflects valid state from the first frame when the recipient was
pre-filled — by the send Forth word, a URL scheme, or paste-from-clipboard.
Previously showed "invalid address" until you tapped the field.
• New terminal words: send (single recipient) and send-many (multi-recipient with
per-amount control) — open the review sheet, biometric-gated, broadcast on confirm.
• Every multi-recipient send shows the full per-payee breakdown before Face ID —
approval is over the bytes, not a label.
• Two-iPhone Cold Mode via AirDrop bundles — export receive addresses, receive
bundles, and verify SPV proofs across an air-gap without dedicated hardware.
dApp & BRC-100 integration
• Multi-output transactions honour each recipient's amount (no more equal-split
rewrites).
• Incoming transactions are owner-verified before registering UTXOs.
• signAction approval sheets show the original transaction description instead of
"wants to call signAction."
• Faster "confirmed" badges — ARC now returns Merkle proofs inline so SPV
verification runs at broadcast time.
Design
• Liquid Glass design system unified across every wallet surface — tinted action
buttons, chrome glass close X, glass section headers.
• Custom Bitcoin glyph replaces the system icon throughout.
• Files screen: symmetric inline header (search · FILES · add).
• Square add-wallet button distinguishes "create" from circular "modify" affordances.
• Refreshed wallet detail, restore-wallet, decode-transaction, and seed-verification
screens.
Accessibility
• VoiceOver reads each transaction row as a single sentence ("Sent 0.0001 BSV on 11
May, pending") instead of a glyph stream.
• Live countdown on auth approval sheets.
• Keypad keys hit Apple's 44pt touch-target minimum on every device.
• Automation IDs on payment fields for snapshot/UI tests.
Reliability & security
• SPV trust store now has a single chain-validated write path; dApps reading headers
see the bounded validated range.
• Defensive decoders on persisted state — schema additions can't crash the wallet on
update.
• Cancellation-safe networking: rate limiter and mempool monitor no longer leak slots
or crash on concurrent polls.
• Defence-in-depth biometric on decrypt; HTTPS-only auth callbacks.
• Approval cache binds to the exact recipient set + output digest — a
recently-approved 770k send to A,B won't auto-authorise a 770k send to X,Y inside the
120-second window.
• Fragmentation-aware UTXO selection — normal sends drain dust as a side effect, with
a hard transaction-size ceiling enforced before biometric.
• 1Sat Ordinal protection — UTXOs holding inscriptions are filtered from spending
across every send path.
Forth interpreter
• ?DO/LOOP and DO/+LOOP propagate body errors instead of silently swallowing them.
• 0 0 DO ... LOOP is now a clean zero-trip (matches gforth/SwiftForth behaviour).
• New script bridge words: >script, data>script, text>script, file>script — push
terminal data into the Bitcoin Script buffer for B://, 1Sat Ordinals, and MAP
protocol posts.
4.23 May 13
Forth-2012 compliance:
• PAGE now clears the terminal (6.2.2030)
• MS pauses inside loops for millisecond delays
• ." and S" preserve verbatim spacing for ASCII art
• EKEY?, WORDS, and stack-diagram fixes across the vocabulary
Wallet:
• Faster address discovery on Sync (history-first scan, parallel UTXO fetch)
• Pays the miner-quoted fee exactly — no over-paying
• Seed and private keys hidden from the iOS app switcher
• SPV sync and mempool monitor pause in the background to save battery
• Concurrent-safe UTXO merging; filename-safe wallet titles
BRC-100 protocol:
• signAction completes the delayed-broadcast flow
• Replay protection on QR authentication challenges
• Hardened createAction and certificate encryption paths
Reliability:
• Idle watchdog and exponential backoff on JungleBus connections
• Stray WhatsOnChain calls now route through the shared rate limiter
• HeaderSync respects wifi-only preference at monitor install
4.22 May 3
• Bitcoin wallet is now included with the app — no in-app purchase, no unlock screen.
• Customise the FORTH terminal's "ok." response from Settings → Customise Appearance. Make it "yes sir!", an arrow, or anything you like.
• Smaller download and faster launch — removed an unused internal dependency.
• Stability and performance improvements across the wallet, SPV verification, and the FORTH interpreter.
4.21 Apr 28
- Full Forth-2012 CORE compliance (133/133 words)
- Smart suggestions and built-in number pad
- BSV wallet: send, receive, and manage Bitcoin SV
- Transaction builder from the terminal
- Customisable themes
4.20 Apr 12
Update 4.12
print words ." " work updated to work with forth print (no space required after or before the "
key word fixed
general bug fixes
4.12 07/29/2025
Vocabulary added to show the words available and its definition.
4.11 02/11/2025
Bug fixes.
restore default appearance settings added.
4.1 11/23/2024
The Script engine, rebuilt
• The data stack is now the live Bitcoin Script consensus stack — what you see
on .ds is exactly what the validator sees.
• script-step walks any saved script opcode-by-opcode, rendering the stack live
at every step.
• script-tx-context loads any on-chain transaction and makes it replayable at
the prompt.
• checksig-fixture arms a real signed transaction so you can single-step a full
P2PKH / OP_CHECKSIG verification to VALID.
• >scriptnum and scriptnum> make the number↔bytes boundary explicit; 0x literals
push bytes everywhere.
Live chain data on the stack
• balance, tx-confirmations, and spv-verified? put chain state directly on the
stack — and they work inside loops and your own word definitions now.
• Broadcasting a transaction pushes its TXID onto the stack.
• THROW and CATCH let payment scripts handle failure instead of just stopping.
Clearer errors and help
• Errors name the word that failed and dump the stack.
• Mistype a word and the terminal suggests near matches.
• help and see now work on built-in words; built-ins can no longer be silently
redefined.
Faster and smoother
• Quicker launch and faster wallet sync via bulk address/UTXO/history fetching.
• Smoother terminal scrolling across long sessions.
Accessibility
• VoiceOver now announces command results and broadcast outcomes.
Wallet, vocab & navigation
• More accurate balances; the correct signing wallet is kept on payments.
• Browse the vocabulary by category and search definitions.
• macOS: back navigation works on every pushed screen.
more Version 4.44 Jun 15
Data Not Collected The developer does not collect any data from this app.