Skip to content

SatoshiCortex 1.3.1

Choose a tag to compare

@IkarusMK IkarusMK released this 26 Sep 18:19
· 8 commits to main since this release

Image: ghcr.io/ikarusmk/satcortex:1.3.1 · released 2026-09-26

Update: docker compose pull && docker compose up -d (with SATCORTEX_VERSION=latest in your .env). Only the application image is new — LND, Bitcoin Core and Tor keep running, only the app container restarts. Nothing to change in docker-compose.yml or .env.

Verify what you pull:

gh attestation verify oci://ghcr.io/ikarusmk/satcortex:1.3.1 --owner IkarusMK

Full history in CHANGELOG.md.


Fixed: "database is locked" and lost messages in the evaluation

Seen on a running node: sqlite3.OperationalError: database is locked, and
shortly after a gap in bitcoind's event stream.
Both had the same root in the part that records what bitcoind reports.

  • It asked the node about its sync state for every single message —
    through the full status query, five RPC calls, two of which wait for
    Bitcoin Core's main lock. With a busy mempool that is dozens of messages a
    second, and during a new block each of those calls can hang for up to
    fifteen seconds. It now asks once every thirty seconds, with one call.
  • It held the database's write lock while it waited. Rows of the last
    seconds were written but not yet committed when those calls started, so
    every other writer — the HTLC stream, the news, the interface — waited
    twenty seconds and gave up. Events are now collected in memory and written
    in one short transaction that contains database work and nothing else.
  • No answer was taken for "back in sync". When that status call timed
    out, the recorder put its connection down and reconnected — and everything
    published in between was lost. Only a clear "yes" from bitcoind pauses it
    now.
  • A locked database no longer kills the recorder. Before, the error
    ended its thread, and the evaluation stood still until the application was
    restarted. Now the collected events wait and are written on the next
    attempt, with the time they arrived. Should the database stay unwritable
    for a long time, what has to be dropped is recorded as a gap instead of
    missing silently.
  • Two more ways to the same error are closed. SQLite starts a
    transaction as a reader; one that read and then wrote — every block does —
    failed at once if anyone else had saved something in between, however long
    it was willing to wait. Transactions now take the write lock at their
    start. And a failed write no longer leaves its transaction open.
  • The daily clean-up deletes in portions, so it no longer holds the lock
    for as long as removing a whole day of transactions takes.

Fixed: the fee fields showed a default instead of your fees

After every restart or reload the fee fields read 100 ppm and 0, whatever
the channels actually charged. The fees themselves were never lost — LND
keeps them — the interface just never asked.

  • The fields are now filled with what the selected channel charges, taken
    from LND's fee report (FeeReport, checked in v0.21.3-beta), and a line
    below the channel choice says it in words. For All channels with
    different fees per channel, the line names the range and the most common
    value is filled in.
  • The channel view refreshes itself regularly. What you type is not
    overwritten by that refresh; choosing another channel or setting the fees
    shows the current state again.
  • If LND cannot say what the channels charge, the line says so instead of
    letting the default pass for your setting.

Changed: the README's diagram shows the phone

How it works now draws both routes for Zeus — over Tor, through an onion
address of its own, and over your router's VPN — and says which ports open
only when you switch them on.