<feed xmlns='http://www.w3.org/2005/Atom'>
<title>coinos-ui.git/src/routes/(app)/migrate, branch master</title>
<subtitle>coinos ui — legacy coinos.io web app (SvelteKit)</subtitle>
<id>https://git.coinos.io/coinos-ui.git/atom?h=master</id>
<link rel='self' href='https://git.coinos.io/coinos-ui.git/atom?h=master'/>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-ui.git/'/>
<updated>2026-08-31T04:47:49Z</updated>
<entry>
<title>migrate: hand the name over to the registrar too — after flagging the account, tell names.coinos.io which v3 identity may claim it (MIGRATE_TOKEN), with retries; without the grant the registrar squat guard refused every migrated claim</title>
<updated>2026-08-31T04:47:49Z</updated>
<author>
<name>Adam Soltys</name>
<email>asoltys@gmail.com</email>
</author>
<published>2026-08-31T04:47:49Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-ui.git/commit/?id=a9ae409528219d56a9fbab5dca8a1ad3af68a106'/>
<id>urn:sha1:a9ae409528219d56a9fbab5dca8a1ad3af68a106</id>
<content type='text'>
Co-Authored-By: Claude Fable 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01MrkLsNScXe9b6BviUSdmMr
</content>
</entry>
<entry>
<title>migrate: shorter button, drop the destination row</title>
<updated>2026-08-03T20:31:31Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-08-03T20:31:31Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-ui.git/commit/?id=2d9b120e54c24c5e6703183762846b610e337801'/>
<id>urn:sha1:2d9b120e54c24c5e6703183762846b610e337801</id>
<content type='text'>
"Move my balance and address to coinos v3" wrapped on a phone; the
paragraph above already says what happens, so the button is just
"Migrate". The destination row went with it — it only ever said "your
coinos v3 wallet".

Co-Authored-By: Claude Fable 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01Wvj4aoeMZwA7VUGdJP9Swi
</content>
</entry>
<entry>
<title>migrate: flag the account instead of renaming it</title>
<updated>2026-08-03T20:04:37Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-08-03T20:04:37Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-ui.git/commit/?id=efa4a719786633ba905798cdc46e6f35ada51372'/>
<id>urn:sha1:efa4a719786633ba905798cdc46e6f35ada51372</id>
<content type='text'>
Renaming to &lt;name&gt;v2 was a hack for freeing the username, and v3/v4/v9
fallbacks made it worse. The page now sweeps the balance and sets the
new `migrated` flag: the registrar takes over receiving for the name
while the old account keeps working here, unchanged.

Co-Authored-By: Claude Fable 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01Wvj4aoeMZwA7VUGdJP9Swi
</content>
</entry>
<entry>
<title>migrate: the retired name has to be letters and numbers only</title>
<updated>2026-08-03T19:40:39Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-08-03T19:40:39Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-ui.git/commit/?id=2c9ab7a73c662e15229c340ba471fb3aeec41b70'/>
<id>urn:sha1:2c9ab7a73c662e15229c340ba471fb3aeec41b70</id>
<content type='text'>
The server enforces /^[\p{L}\p{N}]{2,24}$/u, so &lt;name&gt;_v2 was rejected
outright. Candidates are &lt;name&gt;v2, v3, … each trimmed to fit the 24-char
limit (so a long username still lands inside it), and the rename walks
to the next one if a retired name is already taken.

Co-Authored-By: Claude Fable 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01Wvj4aoeMZwA7VUGdJP9Swi
</content>
</entry>
<entry>
<title>migrate: don't show the temporary v3 address</title>
<updated>2026-08-03T19:34:16Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-08-03T19:34:16Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-ui.git/commit/?id=bcc13f148d6097f9786ed2855808c31f9a2041c2'/>
<id>urn:sha1:bcc13f148d6097f9786ed2855808c31f9a2041c2</id>
<content type='text'>
It's an npub-shaped placeholder, and the whole point of the page is that
the user keeps their real username — seeing "npub1abc@coinos.io" as the
destination just reads as a mistake. The row says "your coinos v3
wallet" instead.

Co-Authored-By: Claude Fable 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01Wvj4aoeMZwA7VUGdJP9Swi
</content>
</entry>
<entry>
<title>migrate: run the sweep server-side, and send the whole balance</title>
<updated>2026-08-03T17:44:46Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-08-03T17:44:46Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-ui.git/commit/?id=2cc244c19632e9f9f3083e6edf71649a366ba719'/>
<id>urn:sha1:2cc244c19632e9f9f3083e6edf71649a366ba719</id>
<content type='text'>
Two fixes from the first live test:

The POST went out from the browser, where $lib/utils' base is "" — so
it hit the SvelteKit page route and came back "POST method not allowed".
Payments in this app all run server-side with auth(cookies), because
that's where the session token is usable; /migrate is a form action now
like the rest of the send flows.

And the routing reserve is gone: the ASP's node has two direct channels
to ln.coinos.io, so a sweep is one hop and costs nothing. It sends the
full balance, only retrying 0.5% lighter if a payment actually comes
back short.

Co-Authored-By: Claude Fable 5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01Wvj4aoeMZwA7VUGdJP9Swi
</content>
</entry>
<entry>
<title>migrate: satisfy the type checker on the error path</title>
<updated>2026-08-03T17:06:48Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-08-03T17:06:48Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-ui.git/commit/?id=7b2335636e28f43eb8d48c5d9fa3a3945421cf34'/>
<id>urn:sha1:7b2335636e28f43eb8d48c5d9fa3a3945421cf34</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Add /migrate: hand a legacy account over to coinos v3</title>
<updated>2026-08-03T17:06:16Z</updated>
<author>
<name>Adam Soltys</name>
<email>adam@coinos.io</email>
</author>
<published>2026-08-03T17:06:16Z</published>
<link rel='alternate' type='text/html' href='https://git.coinos.io/coinos-ui.git/commit/?id=969fc0ca8041f492ebede65275890c22bd48b012'/>
<id>urn:sha1:969fc0ca8041f492ebede65275890c22bd48b012</id>
<content type='text'>
coinos v3 links here with ?to=&lt;the user's new payment address&gt;&amp;back=&lt;url&gt;.
The user is already signed in on this site, so no password or key has to
travel anywhere: we fetch an invoice from the v3 registrar for the
balance (less a small routing reserve), pay it, then rename the account
to &lt;username&gt;_v2 — which releases the username so v3's registrar will
let them claim it. Old account stays, renamed, and stops receiving.

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