<feed xmlns='http://www.w3.org/2005/Atom'>
<title>coinos-ui.git, branch v1.0.10</title>
<subtitle>coinos ui — legacy coinos.io web app (SvelteKit)</subtitle>
<id>https://git.coinos.io/coinos-ui.git/atom?h=v1.0.10</id>
<link rel='self' href='https://git.coinos.io/coinos-ui.git/atom?h=v1.0.10'/>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-ui.git/'/>
<updated>2026-09-29T22:07:41Z</updated>
<entry>
<title>Add a dismissable banner pointing to v3.coinos.io</title>
<updated>2026-09-29T22:07:41Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-29T22:07:41Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-ui.git/commit/?id=1213ac7a1f5f4f50f742aadebf970e37c186a234'/>
<id>urn:sha1:1213ac7a1f5f4f50f742aadebf970e37c186a234</id>
<content type='text'>
Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>ecash: carry pasted tokens in the URL instead of storing them server-side</title>
<updated>2026-09-27T21:46:30Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-27T21:46:30Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-ui.git/commit/?id=64f510692cd53873cf9a95ac0a2bcd00a6a0e6be'/>
<id>urn:sha1:64f510692cd53873cf9a95ac0a2bcd00a6a0e6be</id>
<content type='text'>
The server no longer accepts anonymous token uploads. A pasted token now
redirects straight to /ecash/&lt;token&gt;, and the page asks the server for the
token's status statelessly. Ids from previously shared links still resolve.

Co-Authored-By: Claude Fable 5.1 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>invoice: a reusable bolt12 offer has no terminal paid state</title>
<updated>2026-09-22T18:27:15Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-22T18:23:19Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-ui.git/commit/?id=802eea628fb77fed305de555995cf323174b0394'/>
<id>urn:sha1:802eea628fb77fed305de555995cf323174b0394</id>
<content type='text'>
A bolt12 offer is a standing payment code. CLN derives the same offer_id
from the same (amount, description), so re-creating one hands back the
original record, whose `received` has accumulated over the offer's whole
lifetime. The invoice layout read that as "this invoice was paid" and
redirected to the success screen, so reopening a long-lived offer never
showed the QR and left no way to copy the lno.

Treat a payment as celebratory only when it arrives while the page is
open: the socket handler now passes the amount of that payment as
`?paid=&lt;amount&gt;`, and the layout uses it in place of the lifetime total
for reusable offers. Single-use invoices keep the existing logic, so a
partly-paid invoice still stays on the QR rather than celebrating early.

The success screen showed lifetime `received` for the same reason, which
misreported a single payment to a long-lived offer; it now renders the
amount the socket reported, which is already net of tip.

Co-Authored-By: Claude Opus 5 (1M context) &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Web flasher moves from /pos to /flash; /pos redirects there.</title>
<updated>2026-09-22T05:49:19Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-22T05:49:19Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-ui.git/commit/?id=6735d9ec73949046932716dba90ebd9cd63b513d'/>
<id>urn:sha1:6735d9ec73949046932716dba90ebd9cd63b513d</id>
<content type='text'>
coinos v3 takes /pos for the point-of-sale till, so the terminal flasher
needs its own address. Old links keep working through the redirect.

Co-Authored-By: Claude Fable 5.1 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01Tmfg8k5f3TbNJS34qiqHAp
</content>
</entry>
<entry>
<title>send: stop the Max buttons from cancelling their own submit, show LNURL action errors</title>
<updated>2026-09-22T02:41:39Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-22T02:41:37Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-ui.git/commit/?id=2e98fba55d572186f39d00235db1024791ba1561'/>
<id>urn:sha1:2e98fba55d572186f39d00235db1024791ba1561</id>
<content type='text'>
Choosing Max on the LNURL-pay page left the button spinning forever. Two
things combined:

The Max buttons set `loading` from their click handler. Svelte flushes
`disabled={loading}` to the DOM before the browser runs the button's
submit activation, and a disabled button submits nothing. Set loading
from the form's onsubmit instead, the way the Send button always did.

The /ln page never passed `form` into the Lnurlp and Lnurlw components,
so any action failure (pay, max or withdraw) rendered nothing and never
reset the spinner. Pass it through, and reset loading when a result
arrives.

Verified in headless Chrome against the dev stack: the bolt11 Max lands
on the fee view, and the LNURL Max surfaces the server's error and
re-enables the buttons.

Co-Authored-By: Claude Fable 5.1 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>funds: remove the create, deposit, withdraw and gift buttons</title>
<updated>2026-09-22T02:40:21Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-22T02:40:21Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-ui.git/commit/?id=efeab01cd99c5f57e7c904df96030fc518371fa2'/>
<id>urn:sha1:efeab01cd99c5f57e7c904df96030fc518371fa2</id>
<content type='text'>
Funds are retired, and the server now refuses deposits, withdrawals and
pre-authorizations outright, so every one of these buttons led to an
error. Gone: "Create a fund" on the send screen, and Add/Take funds plus
the gift link on a fund's page.

A fund's page still shows its balance, managers, share link and payment
history, so existing funds stay readable while they are settled out of
band.

Co-Authored-By: Claude Opus 5 (1M context) &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>send: quote the lightning routing fee up front and add Max to lightning sends</title>
<updated>2026-09-22T02:21:43Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-22T02:21:29Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-ui.git/commit/?id=671cdb3af944b5e6d39361f4a208547d0e9f7291'/>
<id>urn:sha1:671cdb3af944b5e6d39361f4a208547d0e9f7291</id>
<content type='text'>
The lightning send page now asks the server what the payment will cost
before showing the Send button: the exact routing fee from the route
query, the platform fee, and the total. The quoted fee is submitted as
the maxfee, so what the user sees is what gets debited; advanced
settings still let them override it, and if the quote fails the page
falls back to the old 2% reserve.

Max on the amount step asks the server for the largest amount whose
amount + routing fee + platform fee lands exactly on the balance, and
for an offer picks up the invoice fetched for that exact amount.

LNURL-pay gets a Max button too. The invoice only exists once we name an
amount, so the action fetches a probe invoice at the ceiling, lets the
server solve for the amount, then fetches the real invoice for it.

Co-Authored-By: Claude Fable 5.1 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>ecash: drop the mint account special-case and the mint route</title>
<updated>2026-09-16T11:53:22Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-16T11:53:22Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-ui.git/commit/?id=dcca73434f93e8cf8a912e55a6e098791277a976'/>
<id>urn:sha1:dcca73434f93e8cf8a912e55a6e098791277a976</id>
<content type='text'>
The server no longer keeps a house ecash pool, so there is no mint
account to skip when parsing a payment and no /ecash/mint endpoint.

Co-Authored-By: Claude Fable 5.1 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>register: start the session from the register response</title>
<updated>2026-09-14T19:54:23Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-14T19:54:23Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-ui.git/commit/?id=1d87d0d36feea526f8f6bf4a62b012132bd36128'/>
<id>urn:sha1:1d87d0d36feea526f8f6bf4a62b012132bd36128</id>
<content type='text'>
/register now verifies the recaptcha token itself, and Google tokens are
single-use — so the follow-up /login that reused the same token came back
"failed captcha" for an account that had just been created. The register
response already carries the JWT; set the session cookies from it and only
fall back to /login when registration itself failed.

Co-Authored-By: Claude Fable 5.1 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_0166Ci2XdCair1B9ych7w8dq
</content>
</entry>
<entry>
<title>pos: reset the device and release the serial port when leaving the flasher</title>
<updated>2026-09-14T15:24:48Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-09-05T03:32:43Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-ui.git/commit/?id=57191e941016f15a9c52de7e95e7bb2a04c9de13'/>
<id>urn:sha1:57191e941016f15a9c52de7e95e7bb2a04c9de13</id>
<content type='text'>
Connecting loads the esptool stub and parks the chip in the ROM download
mode; only a successful flash reset it and closed the port. Navigating
away, a failed connect, or a failed flash left the device looking frozen
(OLED keeps its last frame, LED pin pulled up, keypad dead) with the
browser still holding the port. Reset + release on component destroy and
pagehide, on connect failure, and from a new Disconnect button.

Co-Authored-By: Claude Fable 5.1 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01VMi2Y1oKPZ3TeeFmLej47y
</content>
</entry>
</feed>
