OpenReceive 0.4.26 makes the plain PHP checkout as fast as Laravel's. Service::fromEnvironment() now keeps the BTC price, the swap provider's rates and the wallet's info between requests, in a private temp directory under a web server, with no code change: on an agent-built plain PHP shop with the trial wallet, a checkout and a reload went from 34 s to 12 s, and most routes now answer in milliseconds. Laravel's notifications worker stops on SIGTERM. The agent directions say that a paid order's page shows no checkout, and that a Docker Compose app recreates its container after writing .env. New recipes cover SvelteKit, Nuxt, Astro and React Router. Upgrade if you run OpenReceive in plain PHP, or Laravel's notifications worker.
Optional swaps let payers use USDT, USDC, SOL and ETH; a configured swap provider converts them to BTC over Lightning in the merchant's connected wallet. Asset and network availability depends on the provider.
- Fixed (PHP): a plain PHP app's checkout was 5–10 times slower than
Laravel's.
Service::fromEnvironment()kept nothing between requests. So every route asked the wallet for its info event (about 0.5 s) and fetched the BTC price and the swap provider's currencies and rates again (0.5–1.5 s). Routes that slow also kept the reconcile gate open, so most of them ran a wallet scan too. Under a web server,fromEnvironment()now keeps all of it inOpenReceive\Support\FileSharedCache: a directory under the system temp dir that only the PHP user can open, named from a hash of the codes and the install path, so a new code is checked live. Command-line runs (doctor, the notifications worker) still ask the wallet. PasssharedCache:to use your own cache orfalsefor none, andwalletInfoCacheSeconds: 0to keep the preflight live. The info cache isOpenReceive\Nwc\CachedWalletInfo, the core twin of the Laravel adapter's. On an agent-built plain PHP shop with the trial wallet, the secondcheckouts/preparewent from 5.0 s to 6 ms, a swap quote from 6.2 s to 5 ms, and the 13 routes of a checkout and a reload from 34 s to 12 s. The price feed is also asked far less often, which avoids its 503 "Exchange rates are temporarily unavailable" when several shops share an address. - Fixed (Laravel):
php artisan openreceive:notificationsstops on SIGTERM. The wallet-info wrapper did not pass the stop on, so the listener kept running until its relay connection ended. - Changed (PHP):
Doctor::report()heads its outputOpenReceive doctor, as the Node doctor does, instead of the artisan command nameopenreceive:doctor, which a plain PHP app'sbin/doctoralso printed. - Docs: four new recipes mount
@openreceive/httpas a web-standard route on Node: SvelteKit (an endpoint, with@openreceive/svelte), Nuxt (a Nitro server route, with@openreceive/vue), Astro (an on-demand endpoint, with the<openreceive-checkout>element) and React Router (a resource route, with@openreceive/react). Each builds one stack per process on its first request and reads the framework's own session and client address. Each was checked by building a fresh app on the current major (SvelteKit 3.0, Nuxt 4.6, Astro 7.3, React Router 8.4) and running it on Node in Docker with Postgres and the trial wallet: the buyer's page showed the invoice in Chromium, a stranger got 403 and a 404 page, a payer-supplied amount got 400, and a settled invoice ranonPaidonce. SvelteKit 3 and Astro keep.envout ofprocess.envin development, where OpenReceive reads the swap settings, so those two recipes say how to load it. The Node and Next.js directions link the four recipes. - Docs: the agent directions say that a paid order's page shows that it is
paid and no checkout. A checkout that settles on the page updates the
page's status line and stays mounted as the payer's receipt. The 0.4.25
starters already do this; an app built from the directions did not, and
its paid order's page showed a checkout that could not start. Under Docker
Compose the directions now recreate the container after writing
.env, becausedocker compose restartkeeps the old environment. The Supabase guide says that only the React<Checkout>takes afetch.