Repository navigation
Releases: f2i-com/softn.com
Release list
SoftN v0.0.31
SoftN v0.0.31
What's new
- Upgrading, and act on this if your site runs on nginx: the
nginx.conf.examplein every release so far lets anyone download your site'sdata/folder, which holds the admin key, every published bundle (hidden apps' too), comments and the records apps keep on the server. The rule that looks as if it refuses the folder does not: nginx prefers a regular expression to a plain prefix, so/data/config.jsonwas served as an ordinary file. If you copied that example into your nginx configuration, find the linelocation /data/ { return 404; }, put these two lines in its place, and reload nginx (sudo nginx -t, thensudo systemctl reload nginx):location = /data { return 404; }andlocation ^~ /data/ { return 404; }. Or replace your copy's wholeserver { }block with the new example and put yourserver_name,rootand TLS back, which also brings the other changes below. Check it from outside:curl -s -o /dev/null -w "%{http_code}\n" https://your.site/data/README.txtmust print 404. That file is in every site, and answered 200 before. Then treat the admin key as seen by others: put a new value inadminKeyindata/config.json(the next request reads it), and look in your access log for requests under/data/. If anyone took the folder, they can also work out the IPv4 address of each visitor who commented or rated, because the salt in that same file is what hides them; tell your visitors if that matters where you are. Leavesaltas it is: replacing it undoes nothing already taken, and it cuts visitors off from the records apps keep for them. Edit keys need no replacing: only their hashes are in that folder, and those cannot be reversed. A site on Apache with the shipped.htaccesswas not affected. - Upgrading from v0.0.30: the engine is still ZIPP v0.0.32, so nothing is rebuilt, and FormLogic's adapter and every protocol number are v0.0.30's. Take the new
.htaccessornginx.conf.examplealong with the files: most of what is below about what a server serves is in those. - Files nobody meant to publish are not served, wherever in the site they were left. The site's
.htaccesshad no rule for dot files, so on Apache/.git/configand/.envwere plain downloads wherever a folder held them. So were both in the static single-app package; the host and private packages refused.envand not.git/config, becauseFilesMatchlooks at a file's own name and at no folder in its path. All of them now refuse any dot file or dot folder but/.well-known/, which a certificate's challenge needs. The site on both servers, the packages on Apache (withmod_alias, which is on by default) and the nginx blocks in their guides also refuse a file namedconfig.json, and one ending in.zip,.tar,.tar.gz,.tgz,.sql,.sql.gz,.sqlite,.db,.bak,.old,.origor.save, in capitals or not. An address under the site's own/api/is a route and is not touched; a folder calledapifurther down is no exception. A site that does mean to offer such a file, a.zipto download say, must take that one rule out of its copy. Those nginx blocks no longer send a stray.phpfile's source.DEPLOY.mdsays to keep a backup ofdata/outside the document root, and gives the check to run after an upload. The tests now run all of this on a real Apache and a real nginx, the guides' blocks included. - FormLogic: a loop of writes to one collection is not refused. XDB keeps a collection under one key, so each record added wrote the whole collection again, and the frame holds 32 saves: the 33rd was refused as a full store with room to spare. The save last in the queue now takes a newer value of the same key, with that value's deadline, and every receipt says what became of it. A save already handed over is never changed, keys land in the order they were written, and a parent on protocol 0 gets every write as before. Writes that take turns between collections cannot merge, so the 33rd of those is still refused while the queue is full.
- FormLogic: a store that refuses a write says so in the frame, where the parent confirms saves. A collection in FormLogic's browser storage holds 30,000 characters, and past it the app's write failed with nothing on screen. The note goes once a save of that collection goes through. The records an app ships with are no save of anyone's: if they do not fit, the app opens without them and no note stands over it.
- A deleted record gives its room back. It keeps its place for sync, which reads its id and stamp, and it kept its data too, so deleting freed nothing and a full store stayed full. When the store refuses a save, the data of deleted records goes, in every collection, because the limit is shared, and the save is tried again. While there is room they stay whole. In FormLogic's frame, where no sync can reach the store, the rows go too: an emptied row still costs about 170 characters, so an app that added and deleted small records ended full, with nothing left to delete.
- FormLogic: no app runs in a frame without an opaque origin. The document's framing headers and FormLogic's sandbox are what give it one, and a page or a server that left them out would have run the app on the site's own origin.
- The Builder's FormLogic build carries the script policy its other builds and Studio's do.
- A seed record whose id is a number is kept, under the same digits, where it was dropped without a word. A record with no id or a blank one, or with
datathat is not an object, is left out and counted in the file's warning: a blank id stored made its whole collection read as damaged. - SoftN Web opens its kept page when the site answers 500 or above, as it does offline: only a thrown network error reached the copy, so the page that worked with the network off showed the host's error page with it on. A 404 still passes through.
coi.jsis asked for assw.jsis.sw.jsloads it, so a deploy that changed it ran the old copy for up to an hour, and the worker then kept that copy until its next update.- The static single-app package always asks for
index.html. It had noCache-Control, so a browser could reuse the page by its own rule after a deploy had replaced the scripts it names. - The directory API turns PHP's error display off before it reads its first library. During an upload, a library missing or half written answered 200 with the server's paths.
- softn-runner is on wasmtime 50.0.1 (it was 45), which closes the critical advisory on Cranelift for aarch64. It needs Rust 1.97; the runner is built with 1.99.0, and the guest is unchanged.
- The directory's play counter counts every opening, trending counts visitors once a day, and a metadata file keeps its access. On a host that disables
chmodorchgrp, metadata still saves, and the log says what it could not keep. - The Builder reads a seed record's id as the runtime does. A numeric id was skipped there and kept by the runtime, so an edit to any other row wrote the file back without the rows the published app showed.
- A save with an unknown outcome is named as that in the notice, not as a full store. A refused save no longer leaves "Storage is full" on a collection nobody tried to save.
- SoftN Web and the play page say when an app's records are not being kept. With site data refused, or the 3 MB record budget full, an app looked as if it had saved and the record was gone on reopening; the desktop loader and FormLogic's frame showed a notice for this and these two did not. An app that is saving normally shows nothing. With site data refused that notice is the one thing said: the "could not save" bar stays away, where it sat under it telling the person to free up storage. Where that bar does show, it names one key at a time, a key that was dismissed stays dismissed however often the app saves it, and it says what is refusing the save.
- SoftN Web keeps the address an app was opened from. A directory app's address is its slug, where the bar used to take the name in its manifest: a listing that named itself after another app put that app's address in the bar, and a name no listing has gave whoever got the link "This app wasn't found". An app from a file is at
/web/app/~<name>, which the directory is never asked about and which works only in the browser that has it. An app opened by a link of this site is there too, with the link beside it (?from=), so that address opens it in any browser and offline falls back to the saved copy; opened from Home, or from that saved copy, it has no link to carry. A name with a dot or a slash in it reloads on Apache and nginx: a slash is written~2F, because Apache answers%2Fitself. A page name with a..step in it stays out of the address, where the browser collapsed it and../twenty48put another app's address over this app's screen. A saved app is found by its slug when the site cannot be reached. Addresses and bookmarks from before this still open their app, and a saved app's records are not touched: the directory says which slug an old address spells, and the bar and the library take that. One exception: an address spelt as a slug goes to the directory first, so a bookmark of a file app whose name is a slug the directory also has now opens the directory's app; the file app is still on Home. On nginx, a dot in a name needslocation ^~ /web/app/ { try_files $uri @softn_web; }from the new example. - A page that does not parse says so on the page, with the file and line, in SoftN Web, on the play page, in the desktop loader and in FormLogic's frame. It used to play as an empty app with the message in the console. What could be drawn of the page is still drawn, and a page with only warnings shows nothing. Publishing is not refused: the directory still takes such a bundle.
- An app's code failing after it has started is said on the page: a handler that throws, an async handler that rejects, a timer, a listener. One message, the next in...
SoftN v0.0.30
SoftN v0.0.30
What's new
- Upgrading from v0.0.29: the engine is still ZIPP v0.0.32, so nothing is rebuilt, and the FormLogic runtime and every protocol are v0.0.29's. Scene3D loads a model given as a
data:URL (below), which is how FormLogic's frame and OAIY's preview give an app's assets: a host that changed the runtime's code to hand models over asblob:URLs need not. - Scene3D loads a model handed over as a
data:URL, as it already loaded a model's embedded buffers and images: adata:URL never leaves the page. Its loader held a model's own URL to the scheme list for links (http:,https:,blob:), so a host with no file server for an app's assets, which gives each one as adata:URL, had every model refused with "Unsafe model URL". FormLogic's frame is such a host: from v0.0.28 it serves an app's glTF, GLB, OBJ, STL and FBX files, and Scene3D drew none of them until now. OAIY's preview, built on the same frame, had worked around it by changing the runtime's code as it installed it.
Downloads
| Download | What it is | Pick it when |
|---|---|---|
softn-website-v0.0.30-zipp-v0.0.32.zip |
The complete softn.com website. The whole softn.com in one folder: the landing page, the app directory, the web runtime, Builder, Studio, the documentation and the directory API. | You want to run your own SoftN site: a directory people can publish apps to and play them from. |
softn-app-static-v0.0.30.zip |
One app on a page (static). The smallest way to host one SoftN app: a plain page with a loading spinner, a permission bar and your app, with no SoftN branding and no server code. | You have a .softn app and a web host, and you want the app on a page of your own site. |
softn-app-static-with-backend-linux-x64-v0.0.30.zip |
One app on a page, with an optional PHP server backend. The static single-app page above, plus a backend/ folder that lets the app run its own private server logic and SQLite database on an Apache/PHP host, with no service to keep running. |
Your app has a private server part (server/ logic, SQL migrations, routes) and your host is Apache with PHP on Linux x86-64. |
softn-app-private-v0.0.30.zip |
One app served privately by PHP. The single-app page again, but PHP renders it and hands the app's files to the browser piece by piece behind a viewer cookie, so the .softn file itself is never at a URL. |
You do not want visitors (or crawlers) to be able to download your app as one file. |
softn-app-private-with-backend-linux-x64-v0.0.30.zip |
One app served privately by PHP, with an optional server backend. The privately served page above together with the PHP server backend: three folders, webroot/, private/ and backend/. The app works at once without the backend; you enable the backend when the app needs it. |
You want the .softn file kept off every URL and the app has a private server part. |
softn-formlogic-runtime-v0.0.30.zip |
The SoftN runtime for FormLogic. Everything FormLogic embeds from SoftN, already built: the sandboxed frame FormLogic runs an app in, Builder and Studio as editors inside FormLogic, the server-side runtime for native apps, and the starter adapter. FormLogic’s build downloads this from the latest SoftN release instead of building SoftN from source. | You run FormLogic and its build cannot reach GitHub; download this and point SOFTN_RELEASE_ARCHIVE at it. |
Each archive unzips with a README.md at the top that explains it; RELEASE-GUIDE.md below compares them all.
The backend download targets Linux x86-64 with Apache/PHP and process execution enabled. It is a generic, unconfigured distribution: install your own public and private app bundles and preserve existing configuration, keys and databases when upgrading. Native XDB synchronization remains a Rust-host feature.
The complete website archive's name carries the tag of the zipp engine inside it. It ships no
example apps: the directory starts empty, and .softn files dropped on any
page of the site publish into it — one, or a folder at once, with the admin
key from data/config.json lifting the hourly limit for the site owner. The
example apps are published as .softn downloads with every
softn-Examples release.
The desktop loader and builder are not attached to releases; they build from
this tag's manifests with npm run tauri build in their apps. RELEASE-GUIDE.md
below compares every download and says which one to take.
The single-app archive includes a small counter example; replace it with your own bundle. It has no app download controls, but browser-delivered app bytes remain extractable. Required license notices are included in all archives.
Built with ZIPP v0.0.32 (its javascript-python-base engine, javascript engine and torch package; the release SHA256SUMS has sha256 2f54dcc6d32729814483d4d7967aa16dd2d80a37f6aa9fee6af2f4f278469876).
SoftN v0.0.29
SoftN v0.0.29
What's new
- Upgrading from v0.0.28: the engine is still ZIPP v0.0.32, so nothing is rebuilt, and the FormLogic runtime and its protocols are v0.0.28's. Studio's editor bridge reads one optional key more,
aiLabelonopen: FormLogic v0.1.17 sends it, and an older FormLogic's Studio says only that FormLogic's AI answers (below). - Studio inside FormLogic says which AI it uses. Its AI is FormLogic's (every request goes to the person's default AI in FormLogic's Settings → AI), but its settings listed "FormLogic AI · FormLogic default · localhost:11434 · no key", the address of a local server it never asks, and that row's Test, its model list and its Add, Edit and Remove asked or changed a provider Studio does not use: the test and the model list failed against
localhost:11434, so FormLogic's AI looked unused, and Remove left Studio with no AI until it was opened again. Now Settings shows one row, FormLogic AI with the AI FormLogic names (the editor bridge'sopenmay carryaiLabel, one line of text, optional likesaveLabel), a Test that sends a short prompt through FormLogic, and where to change it; the chat's AI pill names it too, and no longer opens a setup the hosted editor does not have. What runs learn about the AI (tool calls written as text, replies not streamed) is kept for the AI FormLogic named, so choosing another one there does not carry it over. A FormLogic that sends no label gets "Your default AI in FormLogic".
Downloads
| Download | What it is | Pick it when |
|---|---|---|
softn-website-v0.0.29-zipp-v0.0.32.zip |
The complete softn.com website. The whole softn.com in one folder: the landing page, the app directory, the web runtime, Builder, Studio, the documentation and the directory API. | You want to run your own SoftN site: a directory people can publish apps to and play them from. |
softn-app-static-v0.0.29.zip |
One app on a page (static). The smallest way to host one SoftN app: a plain page with a loading spinner, a permission bar and your app, with no SoftN branding and no server code. | You have a .softn app and a web host, and you want the app on a page of your own site. |
softn-app-static-with-backend-linux-x64-v0.0.29.zip |
One app on a page, with an optional PHP server backend. The static single-app page above, plus a backend/ folder that lets the app run its own private server logic and SQLite database on an Apache/PHP host, with no service to keep running. |
Your app has a private server part (server/ logic, SQL migrations, routes) and your host is Apache with PHP on Linux x86-64. |
softn-app-private-v0.0.29.zip |
One app served privately by PHP. The single-app page again, but PHP renders it and hands the app's files to the browser piece by piece behind a viewer cookie, so the .softn file itself is never at a URL. |
You do not want visitors (or crawlers) to be able to download your app as one file. |
softn-app-private-with-backend-linux-x64-v0.0.29.zip |
One app served privately by PHP, with an optional server backend. The privately served page above together with the PHP server backend: three folders, webroot/, private/ and backend/. The app works at once without the backend; you enable the backend when the app needs it. |
You want the .softn file kept off every URL and the app has a private server part. |
softn-formlogic-runtime-v0.0.29.zip |
The SoftN runtime for FormLogic. Everything FormLogic embeds from SoftN, already built: the sandboxed frame FormLogic runs an app in, Builder and Studio as editors inside FormLogic, the server-side runtime for native apps, and the starter adapter. FormLogic’s build downloads this from the latest SoftN release instead of building SoftN from source. | You run FormLogic and its build cannot reach GitHub; download this and point SOFTN_RELEASE_ARCHIVE at it. |
Each archive unzips with a README.md at the top that explains it; RELEASE-GUIDE.md below compares them all.
The backend download targets Linux x86-64 with Apache/PHP and process execution enabled. It is a generic, unconfigured distribution: install your own public and private app bundles and preserve existing configuration, keys and databases when upgrading. Native XDB synchronization remains a Rust-host feature.
The complete website archive's name carries the tag of the zipp engine inside it. It ships no
example apps: the directory starts empty, and .softn files dropped on any
page of the site publish into it — one, or a folder at once, with the admin
key from data/config.json lifting the hourly limit for the site owner. The
example apps are published as .softn downloads with every
softn-Examples release.
The desktop loader and builder are not attached to releases; they build from
this tag's manifests with npm run tauri build in their apps. RELEASE-GUIDE.md
below compares every download and says which one to take.
The single-app archive includes a small counter example; replace it with your own bundle. It has no app download controls, but browser-delivered app bytes remain extractable. Required license notices are included in all archives.
Built with ZIPP v0.0.32 (its javascript-python-base engine, javascript engine and torch package; the release SHA256SUMS has sha256 2f54dcc6d32729814483d4d7967aa16dd2d80a37f6aa9fee6af2f4f278469876).
SoftN v0.0.28
SoftN v0.0.28
What's new
- Upgrading from v0.0.27: the engine is still ZIPP v0.0.32, so a FormLogic that installs this release rebuilds nothing. What a FormLogic notices is in the entries marked FormLogic below: a native app's
softn.net.fetchis answered by the frame for every language, with nothing added to the app's source; a call waits 35 seconds for its answer, where it waited 20; saves go in a lane of their own only whereinitsaysstorageLane: true; an error carriesphase(loadorruntime); and the frame'sconnect-srcnamesdata:beside the runtime directory, which a FormLogic that checks it must allow. FormLogic v0.1.15 does all of this. FormLogic v0.1.12 to v0.1.14 run this frame as they ran v0.0.27's, save that their ownconnect-srccheck refusesdata:; a FormLogic older than v0.1.12 refuses the archive, which no longer carries the engine copies it asks for (21 MB less). - The Rust backend host reads bundles with
zip9.1.3 (it was 2.4.2), which fixes a critical advisory: an archive whose central directory and local headers disagree could be read one way when checked and another when unpacked.rustlsis 0.23.46 in the Rust host, the desktop loader and the XDB crate (one moderate and three low advisories). The openwasmtimeadvisory concerns Cranelift on aarch64, for which softn-runner is not built; its fix is in wasmtime 48, a later major release than the runner's 45. - FormLogic: the runtime archive is 21 MB smaller. It no longer adds the engine at
assets/core-runtime/zipp_wasm_bg.wasmin the hosted runtime and each editor, three copies of the 7 MB engine that nothing read, kept only because FormLogic's installer asked for them; FormLogic stopped asking in v0.1.12. A FormLogic older than v0.1.12 refuses this archive. - A bundle's seed records are written to the app's database together, one save of each collection, where they were saved a record at a time: a seed of a few dozen records made a few dozen saves of an ever larger collection, on every host, and in FormLogic, whose saves are acknowledged one at a time and 32 at most, the rest were refused.
- FormLogic: an app FormLogic hosts opens with the records it ships with. The FormLogic frame never added the
.xdbfilesmanifest.files.xdbnames, so a hosted app's directory, a game's levels or a demo's sample rows were missing there and nowhere else; it now adds them before the app first draws, with core's reader and seeder, as SoftN Web, the standalone runtime and the desktop loader do (once per record, never over the person's own, a removed seed stays removed). A file that is missing, unreadable or too large for the app's storage is named in the console and skipped. - FormLogic: the frame serves every kind of media SoftN's other hosts show, where it served pictures, sound and two font formats: video (MP4, WebM), more sound (Opus, AAC, FLAC, M4A), more pictures (AVIF, ICO, BMP, HDR, EXR), TrueType and OpenType fonts, 3D models (glTF, GLB and its
.bin, OBJ, STL, FBX), and WGSL shaders, text and Markdown, each under the type core's asset classification gives it. Nothing that runs (HTML, JavaScript) is served. The frame'sconnect-srcnow namesdata:as well as the runtime directory, so an app canfetchits own assets as a model loader or a compute shader does; it still reaches no network. A FormLogic that holdsconnect-srcto the runtime directory alone in its own checks must allowdata:. - FormLogic: a native app's helper logic reaches its backend.
softn.net.fetchwas given to a JavaScript app by a<logic>fragment prepended to its entry file, and the entry's logic runs after the filesmanifest.files.logicnames and the pages it imports, so a helper that fetched as it loaded, or keptsoftn.net.fetchto call later, had the browser's own fetch, which a native app is never permitted. The frame now answers the call itself, for every language, as it already did for Python, and adds nothing to the app's source. A method is sent upper-cased, as a browser'sfetchsends it:{method: 'post'}was refused. - FormLogic: a call waits thirty-five seconds for its answer, where it waited twenty. FormLogic lets a native app's request run for twenty-five, so a write that was made in the last five seconds reached the app as a failure, and an app that tried again made it twice.
- FormLogic: a parent that sends
storageLane: trueininithas the app's saves sent in a lane of their own. In the one lane, a screen whose own calls filled the four slots and the thirty-two places behind them had a save refused as busy, and that failed save held the app's imports and restores until it was opened again. Without the flag (a FormLogic before v0.1.15, which counts saves against its four) saves go with the calls, as before. - FormLogic: an error says whether the app failed to open or failed while running (
phase: 'load'or'runtime', after its first page was drawn). FormLogic put "The app could not load" over an app that was still on screen and running, for an error inside one of its components or a script that stopped, and left it there.
Downloads
| Download | What it is | Pick it when |
|---|---|---|
softn-website-v0.0.28-zipp-v0.0.32.zip |
The complete softn.com website. The whole softn.com in one folder: the landing page, the app directory, the web runtime, Builder, Studio, the documentation and the directory API. | You want to run your own SoftN site: a directory people can publish apps to and play them from. |
softn-app-static-v0.0.28.zip |
One app on a page (static). The smallest way to host one SoftN app: a plain page with a loading spinner, a permission bar and your app, with no SoftN branding and no server code. | You have a .softn app and a web host, and you want the app on a page of your own site. |
softn-app-static-with-backend-linux-x64-v0.0.28.zip |
One app on a page, with an optional PHP server backend. The static single-app page above, plus a backend/ folder that lets the app run its own private server logic and SQLite database on an Apache/PHP host, with no service to keep running. |
Your app has a private server part (server/ logic, SQL migrations, routes) and your host is Apache with PHP on Linux x86-64. |
softn-app-private-v0.0.28.zip |
One app served privately by PHP. The single-app page again, but PHP renders it and hands the app's files to the browser piece by piece behind a viewer cookie, so the .softn file itself is never at a URL. |
You do not want visitors (or crawlers) to be able to download your app as one file. |
softn-app-private-with-backend-linux-x64-v0.0.28.zip |
One app served privately by PHP, with an optional server backend. The privately served page above together with the PHP server backend: three folders, webroot/, private/ and backend/. The app works at once without the backend; you enable the backend when the app needs it. |
You want the .softn file kept off every URL and the app has a private server part. |
softn-formlogic-runtime-v0.0.28.zip |
The SoftN runtime for FormLogic. Everything FormLogic embeds from SoftN, already built: the sandboxed frame FormLogic runs an app in, Builder and Studio as editors inside FormLogic, the server-side runtime for native apps, and the starter adapter. FormLogic’s build downloads this from the latest SoftN release instead of building SoftN from source. | You run FormLogic and its build cannot reach GitHub; download this and point SOFTN_RELEASE_ARCHIVE at it. |
Each archive unzips with a README.md at the top that explains it; RELEASE-GUIDE.md below compares them all.
The backend download targets Linux x86-64 with Apache/PHP and process execution enabled. It is a generic, unconfigured distribution: install your own public and private app bundles and preserve existing configuration, keys and databases when upgrading. Native XDB synchronization remains a Rust-host feature.
The complete website archive's name carries the tag of the zipp engine inside it. It ships no
example apps: the directory starts empty, and .softn files dropped on any
page of the site publish into it — one, or a folder at once, with the admin
key from data/config.json lifting the hourly limit for the site owner. The
example apps are published as .softn downloads with every
softn-Examples release.
The desktop loader and builder are not attached to releases; they build from
this tag's manifests with npm run tauri build in their apps. RELEASE-GUIDE.md
below compares every download and says which one to take.
The single-app archive includes a small counter example; replace it with your own bundle. It has no app download controls, but browser-delivered app bytes remain extractable. Required license notices are included in all archives.
Built with ZIPP v0.0.32 (its javascript-python-base engine, javascript engine and torch package; the release SHA256SUMS has sha256 2f54dcc6d32729814483d4d7967aa16dd2d80a37f6aa9fee6af2f4f278469876).
SoftN v0.0.27
SoftN v0.0.27
What's new
- Upgrading from v0.0.26: the engine is ZIPP v0.0.32 (it was v0.0.29), in the browser, in the Rust backend host and in softn-runner; what logic can see of it is in its entry below, and the module every app downloads is 7.34 MB, 775 KB larger (1.80 MB with Brotli, from 1.63 MB). Six entries marked "Upgrading" below change what an existing deployment may notice: on the Rust backend host a sync update is the record's whole data rather than merged into it, and the before-sync hooks' answers are read strictly (an
asynchook now has every push refused: make it synchronous); a private peer-to-peer room with no key is joined under a new name, so every device that uses one must be updated; browsers no longer sendconfig.server.auth_tokenfor server sync, which has a token of its own,config.server.token; the PHP host'ssetup.phprun as root stops before it checks the application; and the PHP host answers requests on softn-runner, without Node, where its backend carries it, as the release's two archives with a backend now do. A FormLogic that installs this release rebuilds its server sandbox from ZIPP v0.0.32 (with Rust 1.92.0, as for v0.0.26); the adapter and every protocol number are v0.0.26's. - Upgrading: on the Rust backend host, a sync update's
datais the record's whole data, which is what the runtime's client sends: a key it leaves out is removed. Updates were merged into the record. A client of your own that sends only the fields it changes must send the whole record. A before-sync hook that deletes a key from what a client sent still keeps the stored value (PRIVATE_BACKEND.md). A field a route'sdb.updateadded is gone again if a client then sends an update made on a copy from before that write: the record is the last writer's, whole, as clients already take it. - Upgrading: on the Rust backend host, the before-sync hooks' answers are read strictly, so a hook that guards writes cannot let them through by answering in a form the host did not read (
PRIVATE_BACKEND.mdlists every form each takes).onBeforeSyncnow rejects its op on a number, a string, a list or an object with neitherdatanor nothing in it ({ allowed: false }), all of which took it.onBeforeSyncBatchnow refuses the whole push for a list oropsentry naming anything but this push's op ids (record ids in place of op ids included), anopsentry with nodata, or a number, all of which let every op through;falserejects every op. In either, aSet,Map,Date, function or Promise anywhere in the answer refuses it: nested, it read asundefined; as the whole answer, it was an error the client retried. So anasynchook, which answers with a Promise, now has every push refused for good, where its ops were kept and sent again: make the hook synchronous. A hook that answered1,'ok'or record ids must answer as documented, or each op is refused and undone on the device that pushed it. - Upgrading: a private peer-to-peer room with no key (not shared, which is every private room on SoftN's own hosts) is joined under a name worked out from its own and encrypted with its own, so devices on this build and on an earlier one no longer meet in it: update every device that uses one. Shared rooms, and rooms with a key, meet as before.
- Upgrading: browsers no longer send
config.server.auth_tokenfor server sync. It is the Rust host's operator token, which opens every route of the app that is not public, and a bundle that carried it gave it to everyone who had the bundle. Sync has a token of its own now,config.server.token(orSOFTN_SYNC_TOKENon the host; serving many apps,SOFTN_SYNC_TOKEN_<TENANT_ID>only), which opens/syncand/sync/ticketand nothing else; the operator token still opens them for the operator's scripts. An app whose pages synced withauth_tokenstops syncing until a sync token is set, and the host says so at startup. A sync token equal to the operator token refuses to start. - Upgrading: the PHP host's
setup.phprun as root now stops before it checks the application, with aWARNING:and exit status 1, where it went on and only said afterwards that root was wrong. That check runs the app's logic and migrations, which as root ran with root's rights and left a database the web server's PHP could not open. A Dockerfile or provisioning script that runsphp backend/setup.phpas root and stops on an error must run it as the web server's PHP account instead (sudo -u www-data php backend/setup.php, orsu/runuserin an image). - Upgrading: the PHP host answers requests on softn-runner, without Node, where its backend carries it, and the release's two archives with a backend now do (
backend/bin/softn-runner-linux-x86_64, its licences inbackend/licenses/, its digest and ceilings inBUILD-INFO.json). A backend updated from this release starts it for every request on Linux x86-64;setup.phpchecks it as a request starts it and says which runner requests run on. Node stays in the backend and still answers whereprivate/config.jsonsets"runner": "node", whereenableRequestHookorenableAfterRequestHookis on (those hooks are JavaScript modules only Node runs, and softn-runner refuses such a configuration), and on any other server; the WebSocket bridge runs on Node as before. What an app may notice is what softn-runner's README lists: a frame of SoftN's own shim is namedzipp:preamble,softn.time.formatends some 262,000 years from year 0, SQLite is 3.53.2 and keeps temporary data in memory, and a request still running a quarter of a second before the 20-second deadline is stopped, rolled back and answered500 host_error, where Node's process was killed and PHP answered503 runner_unavailable. How much memory a request may take is"requestMemoryMb"inprivate/config.json(128 to 1024 MiB, 256 without it, what Node's copy of the engine is held to): the app's engine may grow to it, a script's heap to 64 MiB less (past it the engine stops the script and the request fails, as on Node's engine at its 256 MiB), and SQLite to it again, where Node'snode:sqlitehad no limit and spilled to temporary files.http.phpnow names the backend to either runner (SOFTN_BACKEND_ROOT), which softn-runner needs because it is not besiderunner.mjs.npm run package:single -- --with-backendandnpm run package:private-single-phptake--runner-dir <dir>(whereapps/softn-runner/build.mjswrote the Linux build); without it an archive carries Node alone, as before. - softn-runner locks its own process down on Linux before it reads a request, behind the engine's sandbox and wasmtime's. Landlock lets it read the backend folder and the system's time zone (for SQLite's
localtime), make, write and remove regular files only in its database folder and rate-limit notes, and refuses every other open and any device, link, socket or pipe made (and, on newer kernels, TCP, and signals and sockets outside it). seccomp filters refuse any system call of another ABI (i386, x32), running a program, making a process, sockets, signals, limits and scheduling aimed at any other process, other processes' memory, io_uring, a file's mode, owner, times or attributes changed by path (which Landlock does not govern), links and device nodes, typing into a terminal, and the calls that only widen the kernel's surface. It has its own session (no terminal), nothing can gain privileges, no core file is written, and what it makes is private. It is the kernel's own means, applied by the process to itself, so nothing is installed and no root or container is needed; a kernel without one part still gets the other, though without Landlock other processes of the account stay reachable through/proc.softn-runner --check-lockdownreports what a system enforced and tries eight refusals, and the PHP host'ssetup.phpsays it in words and names anything that was not refused. - softn-runner takes a third of the memory it took on Linux, and a fifth less time: a request that only answers peaks at 14.6 MB, where it took 47 MB and Node's runner takes 100, and one that makes 150,000 objects at 64 MB (96 before, 139 on Node). The engine's compiled code, 20 MB of the program, runs where it lies in the program's pages, shared by every runner the server has running, and only what a request runs is read from disk; it was copied into memory of each process's own, which also cost 9 of a request's 40 ms. Where a system will not let those pages be made executable, and on Windows, it is copied as before. The host now says how much memory a request may take (
SOFTN_RUNNER_MEMORY_MB, 128 to 1024 MiB): the engine's memory and SQLite's are held to it, and a script's heap to 64 MiB less, up to the 512 MiB it always was; FormLogic says nothing and keeps the 1 GiB its Node runner's engine has, and the PHP host says 256 or its operator'srequestMemoryMb. - The engine is ZIPP v0.0.32 (it was v0.0.29), in the browser, in the Rust backend host and in softn-runner. What logic can see of it, each run on 0.0.29's engine, 0.0.30's and 0.0.32's: a
DataViewwhose buffer has been detached or has shrunk beneath it has abyteLengthandbyteOffsetof 0, where reading them threw a TypeError (Node still throws);pop(),shift()andsplice()on an array whoselengthcannot be written remove or move the elements before they throw, as Node does;f.apply(t, a),Reflect.apply,Reflect.construct,f(...a)and[...a]run the getter of an element redefined as an accessor, where they read its old value; a string's property is not looked up onObject.prototypeonceString.prototype's own prototype is set tonull(aStringobject's, a number's, a boolean's and a BigInt's still are, as in 0.0.29); an arrow function in a class method reads the method's own variable where that has the class's name (inclass e { m() { let e = {}; return () => e } }the arrow answered the class, and minified ...
SoftN v0.0.26
SoftN v0.0.26
What's new
- Upgrading from v0.0.25: the engine is still ZIPP v0.0.29, so a FormLogic that installs this release keeps the server sandbox it built for v0.0.25, and nothing a browser loads changes. On the server two fixes below change what an app's backend may notice: a request whose transaction SQLite ends under it (
INSERT OR ROLLBACK) writes nothing more, on every host, and the PHP host'ssoftn.time.parseZonedreads a fixed offset past 14 hours. FormLogic's native-app tests pass on this release's runtime under Node and under softn-runner. New is softn-runner (the next entry), which the FormLogic runtime archive now carries innative-runtime/bin/for Linux and Windows x86-64 (about 53 MB for the two) with its licences. A FormLogic from commit c3854f0d on starts it for native apps and needs no Node on the server for them (FORMLOGIC_NATIVE_RUNNER=nodekeeps Node); an older one, v0.1.12 among them, installs the archive as before, does not look inbin/, and runsrunner.mjsunder Node. - An app's private server logic can run without Node.
apps/softn-runneris one program that takes the request the PHP host'sruntime/runner.mjstakes (the same stdin, environment and deadline) and gives the same answer and the same line in the operator's log, byte for byte on every case compared but one:softn.time.formatof a time more than 262,000 years either side of year 0, which the README explains. The app's logic runs on ZIPP v0.0.29'ssafe-sandboxengine built for WebAssembly, behind the same preamble, inside a wasmtime instance that has the clock and randomness and nothing else: no file, no network, no environment, and one host call,db.query, whose every answer the runner decides. The rest is native, each part a port of the Node runner's file of the same job (the bundle and configuration checks, migrations, the rate limit, SQLite opened and guarded asnode:sqliteis,softn.sql,softn.crypto, record events), andsoftn.timeis the Rust host's own. A request is answered in about a fifth of the Node runner's time (about 40 ms where it takes 160 to 200, on Linux and on Windows), by one file of about 27 MB, static for Linux x86-64 and for Windows x86-64, where Node is 93 to 127 MB; its third-party licences go with it (SOFTN-RUNNER-THIRD-PARTY-LICENSES.txt, written from Cargo's record of what it compiles in). The Node runner's own suite runs on it in CI (SOFTN_TEST_RUNNER). It also stops what it can stop itself a quarter of a second before the deadline, the app's logic and any SQL statement of the request, so such a request is rolled back and answered where the Node runner's process was killed, and SQLite keeps its temporary data in memory, at most 1 GiB;apps/softn-runner/README.mdlists what else differs. The FormLogic runtime archive carries both builds asnative-runtime/bin/softn-runner-<platform>, recorded innative-runtime/provenance.json, so a FormLogic that knows to start it runs native apps with no Node on the server; one that does not runsrunner.mjsunder Node as before. - A request whose transaction SQLite ends under it writes nothing more. An
INSERT OR ROLLBACKthat meets a conflict, or a column declaredON CONFLICT ROLLBACK, rolls the whole transaction back, and SQLite carries on in autocommit: on the PHP host and on the Rust host each statement the handler made after it was committed by itself, whatever the request answered. A handler that caught the failure and went on writing kept those writes although the request answered host_error, and one that asked for the rollback answered host_error too. Now no host call runs once the transaction has ended (the script is toldTransaction rolled back), the request answers host_error, and a handler that asked for the rollback keeps its own answer. softn-runner does the same, where a write the soft deadline interrupted ends the transaction too.route-declarations.test.mjsholds both runners to it, and the Rust host has a test of its own. softn.time.parseZonedon the PHP host reads a fixed offset past 14 hours (+15:00, out to±23:59, asformatalready did) as the Rust host does; it said the time did not exist during daylight saving. A zone's offsets today are all within 14 hours, so for any other zone it searches as before, and only when nothing within 14 hours matches does it look further.- Dependencies: XDB's lock takes rustls 0.23.45 (GHSA-2mjx-qc3c-rqvc, moderate: TLS 1.3 handshake messages accepted across encryption levels), a crate no XDB build compiles but its lock named; softn-runner is built on wasmtime 45.0.3, past GHSA-4ch3-9j33-3pmj (moderate: WASI hard links past a directory's permissions), which a runner whose guest has no directory could not meet; its own toolchain is Rust 1.99.0, the guest's still ZIPP's 1.92.0. Every crate of every Cargo.lock in the repository was checked against GitHub's advisory database, and npm's audit finds nothing.
Downloads
| Download | What it is | Pick it when |
|---|---|---|
softn-website-v0.0.26-zipp-v0.0.29.zip |
The complete softn.com website. The whole softn.com in one folder: the landing page, the app directory, the web runtime, Builder, Studio, the documentation and the directory API. | You want to run your own SoftN site: a directory people can publish apps to and play them from. |
softn-app-static-v0.0.26.zip |
One app on a page (static). The smallest way to host one SoftN app: a plain page with a loading spinner, a permission bar and your app, with no SoftN branding and no server code. | You have a .softn app and a web host, and you want the app on a page of your own site. |
softn-app-static-with-backend-linux-x64-v0.0.26.zip |
One app on a page, with an optional PHP server backend. The static single-app page above, plus a backend/ folder that lets the app run its own private server logic and SQLite database on an Apache/PHP host, with no service to keep running. |
Your app has a private server part (server/ logic, SQL migrations, routes) and your host is Apache with PHP on Linux x86-64. |
softn-app-private-v0.0.26.zip |
One app served privately by PHP. The single-app page again, but PHP renders it and hands the app's files to the browser piece by piece behind a viewer cookie, so the .softn file itself is never at a URL. |
You do not want visitors (or crawlers) to be able to download your app as one file. |
softn-app-private-with-backend-linux-x64-v0.0.26.zip |
One app served privately by PHP, with an optional server backend. The privately served page above together with the PHP server backend: three folders, webroot/, private/ and backend/. The app works at once without the backend; you enable the backend when the app needs it. |
You want the .softn file kept off every URL and the app has a private server part. |
softn-formlogic-runtime-v0.0.26.zip |
The SoftN runtime for FormLogic. Everything FormLogic embeds from SoftN, already built: the sandboxed frame FormLogic runs an app in, Builder and Studio as editors inside FormLogic, the server-side runtime for native apps, and the starter adapter. FormLogic’s build downloads this from the latest SoftN release instead of building SoftN from source. | You run FormLogic and its build cannot reach GitHub; download this and point SOFTN_RELEASE_ARCHIVE at it. |
Each archive unzips with a README.md at the top that explains it; RELEASE-GUIDE.md below compares them all.
The backend download targets Linux x86-64 with Apache/PHP and process execution enabled. It is a generic, unconfigured distribution: install your own public and private app bundles and preserve existing configuration, keys and databases when upgrading. Native XDB synchronization remains a Rust-host feature.
The complete website archive's name carries the tag of the zipp engine inside it. It ships no
example apps: the directory starts empty, and .softn files dropped on any
page of the site publish into it — one, or a folder at once, with the admin
key from data/config.json lifting the hourly limit for the site owner. The
example apps are published as .softn downloads with every
softn-Examples release.
The desktop loader and builder are not attached to releases; they build from
this tag's manifests with npm run tauri build in their apps. RELEASE-GUIDE.md
below compares every download and says which one to take.
The single-app archive includes a small counter example; replace it with your own bundle. It has no app download controls, but browser-delivered app bytes remain extractable. Required license notices are included in all archives.
Built with ZIPP v0.0.29 (its javascript-python-base engine, javascript engine and torch package; the release SHA256SUMS has sha256 d92c1d763caf703143a52291fee3723f2d486745640adc2db3aa3812f521f4a7).
SoftN v0.0.25
SoftN v0.0.25
What's new
- Upgrading from v0.0.24: the engine is ZIPP v0.0.29 (it was v0.0.27), in the browser and in the Rust backend host. What logic can see of it is in its entry below; among it, an error's
stacknow holds frames that count from the app's logic (at save (logic:12:5)), and a class written as a statement with no name (class { }) is a SyntaxError. Four entries marked "Upgrading" below change what an existing app may notice: a page may be written as HTML, with every existing.uiand.logicapp reading as it did; an app's style block styles the app and nothing else;softn.net.fetchsends no cookie or referring address, andnetwithoutallowed_hostsno longer reaches this computer or its local network; and local AI loads GGUF checkpoints on ZIPP, with ONNX Runtime, transformers.js and Kokoro gone. Logic that opens with"use strict"now runs strict. A FormLogic that installs this release rebuilds its server sandbox from ZIPP v0.0.29 (with Rust 1.92.0, as for v0.0.27); FormLogic's checks, its UI and PHP suites and its hosted-runtime and ZIPP-sharing tests pass on this release's archive as FormLogic stands. - Size: the components every app downloads at start are the thirty most apps draw (the layout, text and images, a button, a text field, a form and a list), and the other thirty-nine light ones (Select, Checkbox, Modal, Tabs, Table, Avatar, Progress, Tooltip and the rest) are five groups,
controls,feedback,data,displayandnavigation, each fetched by the page that draws one. A page with only the common components parses 147 KB less JavaScript before it is drawn (858 KB to 711 KB in the standalone runtime, 921 KB to 773 KB in SoftN Web) and is drawn about 90 to 150 ms sooner on a CPU slowed four times. A page's first draw waits for the groups its first screen names, for at most 300 ms, so it opens drawn rather than around placeholders, and the runtime remembers what each app's first screen waited for, so its next open starts those groups while the bundle is still arriving: a repeat visit to a page that draws all five is as quick as it was. A first visit to such a page is 20 to 60 ms slower at the median, within the measurement's run-to-run spread. SoftN Web keeps the groups in its precache, so an app that uses them works offline as before.@softn/components/minimalkeeps every export it had;essentialsand the five groups are new entries (docs/engineering/COMPONENT_LOADING.md). - While an app loads, the runtime says what it is downloading. After 400 ms the loading screen shows a bar and a line for each piece (the app's bundle, the 6.5 MB script engine, the torch package, the components its first screen draws) with sizes where they are known, in SoftN Web and the standalone runtime. A page is drawn before the engine is ready, and an app that draws its screen from its script is blank until then, so a thin line along the top of the app, with a small label ("Script engine · 34%"), then shows what is still arriving: on a first visit over a slow connection, the engine its taps are waiting for; later, a page's 3D. A load from the cache is over before either shows. A host can read the same list (core's
loadProgressItemsandsubscribeLoadProgress, runtime-shell'sLoadProgress). - The engine is ZIPP v0.0.29 (it was v0.0.27), in the browser and in the Rust backend host. What logic can see of it, each checked on the engine before it and on 0.0.29's:
TextEncoderandTextDecoderare the engine's own, in every app's logic, where only a page given the document had them; they read and write UTF-8 exactly as the document's copies did (the two were run on the same inputs), read UTF-16LE besides, and a page given the document now has the engine's.Error.prototype.stackholds the error's frames, where it was empty, and each frame says where in the app's logic its code is:at save (logic:12:5)is line 12 of the logic, counted from its first line, however much the runtime compiles ahead of it, in the browser, in the script worker and on both backend hosts. The logic is the app's logic files joined, with their imports inlined, so for an app with one logic file those are that file's lines. A syntax error is placed by the engine itself, and the page and Studio's check quote the line it names as before (SyntaxError: unexpected token ';', at this line of the logic: let c = ;), now in the script worker too, where the engine's message stood alone. In the browser, a regular expression that backtracks past the engine's ceiling for one search is aRangeErrorthe code can catch, where it ended the call (not insoftn.sandbox.run, whose smaller budget runs out first). A class declared inside a block is not seen after it, andnewon a Proxy around an arrow function throws a TypeError, as the language says. A class made more than once (a mixin applied to two bases) runs its ownsupercalls, where each copy ran the last one's, andclass { }written as a statement, with no name, is a SyntaxError, as in a browser; no repository example or published demo has one. In Python,x in b"..."raises ValueError for an int outside 0 to 255,b"bc" in bytearray(b"abc")is True,inon a range asks a value's own__eq__, and dividing two large ints rounds once, as CPython does (1 / (1 << 1020)was 0.0). ZIPP measures its interpreter two to four times faster on large bundled programs. The module every app downloads is 6.57 MB, 155 KB larger (1.63 MB with Brotli, from 1.59 MB). A FormLogic that installs a release with it rebuilds its server sandbox from ZIPP v0.0.29 (with Rust 1.92.0, as for v0.0.27). - Code whose only browser names are
TextEncoderandTextDecoderis no longer given the document shell (about 60 KB compressed). The engine has both now and the shell leaves them in place, so such a page loaded the shell for nothing. - An app's
"use strict"is in force. JavaScript logic that opens with it (comments may come first) ran sloppy everywhere: the runtime, its worker and both backend hosts put their own code ahead of the app's, and the engine reads a directive only at the very start, sothisin a plain call was the global object and assigning an undeclared name quietly made a global. The runtime, the worker and the PHP host now put the directive first when the app's code opens with it, on the first line so no line of the app moves, and the Rust host compiles server logic with ZIPP'scompile_script_with_preamble_and_origin, which reads the app's own prologue. SoftN's own code runs strict with it (every core test passes with every app made strict), and a strict app's$:values still need no declaration. Logic that does not open with the directive runs exactly as before; no repository example or published demo does. - The Rust backend host runs server logic on ZIPP's
safe-sandboxprofile, the one the browser engine and the PHP host's engine are built with and the one ZIPP gives for untrusted code. A regular expression that backtracks for ever (/^(a+)+$/against forty a's and a!) is now aRangeErrorthe handler can catch, in under a second; it held its worker for the 25-second wall time and then left the thread running on a core, so a request that reached such a pattern with the right input took a worker each time, and after eight the pool stopped replacing them. Server logic is held to the browser's other caps too: a regular expression's source of 16 KB, JSON nested 64 deep (the host already refuses a body nested past 62), arrays nested 4 deep in onejoin, and BigInts of 2^20 bits. The interpreter is the memory-safe one and the server binary carries no JIT (one was built in but never used: the step budget turned it off); a handler measured the same on both, about 160 ms of sorting, JSON, regex and objects in a release build. - Size: a production build carries no source maps: the site build, every release and the apps' production builds write none, 27 MB of the site with their compressed copies, read by no visitor (
scripts/build/sourcemaps.mjs).npm run build:site:dev(--sourcemaps) builds them for a development deployment, BUILD-INFO.json records which, andpackage-sitepackages such a build only with--development, assoftn-website-<tag>-zipp-<engine>-development.zip. The packages' owndist/keep theirs for development. - Size: each app's
assets/core-runtime/holds only what the workers reach (packages/@softn/core/scripts/worker-files.mjs): the script, sandbox and local-model workers' modules, the model worker's WebAssembly and licences, and the torch package. It was the whole of core's dist, 4.1 MB of which the workers reach 2.8; core's owndist/core-runtime/mirror is the same set. - Offline: Studio and the Builder are installed whole. Their service workers precache everything they ship, every feature, Three.js and its loaders, the QR decoder and the workers' files included, so an installed editor works offline with every feature, while a page still loads each one only when it draws it. The precache revisions the workers' files, whose names do not change from build to build.
- Offline: an app opened once online in SoftN Web is installed with everything it can reach, so it opens and runs with no connection as an installed app does. The install now also fetches what a component asks for later than its chunk (every Three.js loader, control and effect a
Scene3Dmay use, whatever models it is given; aQRReader's decoder), the sandbox worker for an app whose code usessoftn.sandbox, and for an app that asks foraithe AI runtime and the local-model worker, so a model it has loaded before, or one in its own bundle, runs offline.e2e/tests/offline-app.spec.tsopens such an app, waits for Offline ready, takes the browser offline and uses all of it. - A tap before an app's script has loaded is answered once it has. The page is drawn as soon as it is parsed and its functions arrived with the script, so the first tap after ope...
SoftN v0.0.24
SoftN v0.0.24
What's new
- Upgrading from v0.0.23: the engine is ZIPP v0.0.27, a fix release; besides it, one fix to the Rust backend host's sync (the last entry). What logic can see of the engine is in the entry below: regular expressions that 0.0.26 refused or that crashed it now compile, very large functions compile, and subclassing
%TypedArray%directly throws. A FormLogic that installs this release rebuilds its server sandbox from ZIPP v0.0.27; the archive's ZIPP trees have the same layout as v0.0.23's. - The engine is ZIPP v0.0.27 (it was v0.0.26), in the browser and in the Rust backend host: a fix release, and logic can see what it fixes. A regular expression of deeply nested quantified groups such as
(?:(?:a|)+|)+compiles in milliseconds, where on 0.0.26 a deep one crashed the browser engine until the page was reloaded (matching one can still run out of the regex budget, a RangeError). A regular expression may have any number of alternatives, where the browser engine refused more than 64 with a SyntaxError. A function of tens of thousands of statements compiles, where one of about 33,000 failed for needing more than 32,768 registers. Subclassing%TypedArray%directly throws the TypeError the language requires. Server logic on the Rust backend host runs faster: the host gives every call an abort flag, and the flag no longer sends every instruction down the slow metering path (ZIPP measured a loop about seven times slower with one). The module every app downloads is still 6.41 MB, 7.8 KB larger (1.59 MB with Brotli). - Rust backend host sync: an edit stamped in the same millisecond as a write the server made itself (a hook's
db.update), after it, applies instead of being sent back as overtaken. Clients stamp edits to the millisecond and the server stamped its own writes to the nanosecond, so the edit lost on digits it could not write; the two are now compared to the millisecond.
Downloads
| Download | What it is | Pick it when |
|---|---|---|
softn-website-v0.0.24-zipp-v0.0.27.zip |
The complete softn.com website. The whole softn.com in one folder: the landing page, the app directory, the web runtime, Builder, Studio, the documentation and the directory API. | You want to run your own SoftN site: a directory people can publish apps to and play them from. |
softn-app-static-v0.0.24.zip |
One app on a page (static). The smallest way to host one SoftN app: a plain page with a loading spinner, a permission bar and your app, with no SoftN branding and no server code. | You have a .softn app and a web host, and you want the app on a page of your own site. |
softn-app-static-with-backend-linux-x64-v0.0.24.zip |
One app on a page, with an optional PHP server backend. The static single-app page above, plus a backend/ folder that lets the app run its own private server logic and SQLite database on an Apache/PHP host, with no service to keep running. |
Your app has a private server part (server/ logic, SQL migrations, routes) and your host is Apache with PHP on Linux x86-64. |
softn-app-private-v0.0.24.zip |
One app served privately by PHP. The single-app page again, but PHP renders it and hands the app's files to the browser piece by piece behind a viewer cookie, so the .softn file itself is never at a URL. |
You do not want visitors (or crawlers) to be able to download your app as one file. |
softn-app-private-with-backend-linux-x64-v0.0.24.zip |
One app served privately by PHP, with an optional server backend. The privately served page above together with the PHP server backend: three folders, webroot/, private/ and backend/. The app works at once without the backend; you enable the backend when the app needs it. |
You want the .softn file kept off every URL and the app has a private server part. |
softn-formlogic-runtime-v0.0.24.zip |
The SoftN runtime for FormLogic. Everything FormLogic embeds from SoftN, already built: the sandboxed frame FormLogic runs an app in, Builder and Studio as editors inside FormLogic, the server-side runtime for native apps, and the starter adapter. FormLogic’s build downloads this from the latest SoftN release instead of building SoftN from source. | You run FormLogic and its build cannot reach GitHub; download this and point SOFTN_RELEASE_ARCHIVE at it. |
Each archive unzips with a README.md at the top that explains it; RELEASE-GUIDE.md below compares them all.
The backend download targets Linux x86-64 with Apache/PHP and process execution enabled. It is a generic, unconfigured distribution: install your own public and private app bundles and preserve existing configuration, keys and databases when upgrading. Native XDB synchronization remains a Rust-host feature.
The complete website archive's name carries the tag of the zipp engine inside it. It ships no
example apps: the directory starts empty, and .softn files dropped on any
page of the site publish into it — one, or a folder at once, with the admin
key from data/config.json lifting the hourly limit for the site owner. The
example apps are published as .softn downloads with every
softn-Examples release.
The desktop loader and builder are not attached to releases; they build from
this tag's manifests with npm run tauri build in their apps. RELEASE-GUIDE.md
below compares every download and says which one to take.
The single-app archive includes a small counter example; replace it with your own bundle. It has no app download controls, but browser-delivered app bytes remain extractable. Required license notices are included in all archives.
Built with ZIPP v0.0.27 (its javascript-python-base engine, javascript engine and torch package; the release SHA256SUMS has sha256 5f6b9053ef88660e0153fc731a7ff6e782be1df54b63aec0f8cb3d5c4fb89dd1).
SoftN v0.0.23
SoftN v0.0.23
What's new
- Upgrading from v0.0.22: the engine is ZIPP v0.0.26, which ZIPP now publishes as plain
.wasmfiles rather than zip bundles; besides it, only the installer that takes it and the documentation changed. A few things logic can see change with it, each in the entry below: iterators havechunks,windowsandincludes;toFixed,toExponentialandtoPrecisionround exactly; a frozen or sealed class refuses writes to its statics; andevalcode sees a builtin global the program replaced or deleted. A FormLogic installs this release only once its checks read the new layout of the archive's ZIPP trees (entry below), and it rebuilds its server sandbox from ZIPP v0.0.26. - The engine is ZIPP v0.0.26 (it was v0.0.25), in the browser and in the Rust backend host. The module every app downloads is 6.41 MB where it was 6.19 MB (1.59 MB with Brotli, from 1.54 MB); about 60 KB of that (13 KB with Brotli) is the engine's JavaScript bindings, which ZIPP now publishes inside the module as well. ZIPP measured a Python app's first
import torchin a browser from 0.64 s to about 0.27 s in Chromium and from about 32 s to under 0.4 s in WebKit. Logic can see a few of 0.26's changes: iterators havechunks,windowsandincludes;takeanddroprefuse a limit above 2^53 − 1 with a RangeError;toFixed,toExponentialandtoPrecisionround exactly, so an edge case can print differently; afor-ofbreak, destructuring orArray.fromthat closes a generator calls areturnthe code replaced; a frozen or sealed class refuses writes to its statics; andevalcode sees a builtin global the program replaced or deleted. - Building SoftN: from 0.0.26 ZIPP publishes each engine as one
.wasmfile that carries its own bindings and a record of its release, commit and variant, instead of zip bundles.fetch:zippinstalls the files as published and checks each against the release'sSHA256SUMSand its own record, writes the engine's bindings out aszipp_wasm.js, and takes the engine's type declarations and licence from the release's embed kit. ZIPP no longer publishes a loader for the torch package, so the installer generates SoftN's ownzipp_torch.js, which does what ZIPP's did.ZIPP_RELEASE_DIRmust now holdSHA256SUMS,zipp-<version>-javascript-python-base.wasm,zipp-<version>-javascript.wasm,zipp-<version>-torch-package.wasmandzipp-<version>-wasm-embed-kit.zip. An existing checkout replaces its 0.0.25 install on the next build or test; a release before 0.0.26 is refused. - FormLogic: the release archive's
zipp/,zipp-web/andzipp-torch/trees hold that install.zipp/has the engine module as ZIPP published it, its bindings, the kit's declarations and licence, ZIPP'sSHA256SUMSandSOURCE.json, with noBUILD-INFO.txt,PROFILE.jsonor bundleSHA256SUMS. Each record'sbundlenames a.wasmfile, whose digest isbundleSha256, andzipp/SOURCE.jsongains akitrecord and dropsrustcandwasmBindgen, which the release no longer states. A FormLogic whose checks expect the zip-bundle files refuses the archive until they follow, and one that installs it rebuilds its server sandbox from ZIPP v0.0.26.
Downloads
| Download | What it is | Pick it when |
|---|---|---|
softn-website-v0.0.23-zipp-v0.0.26.zip |
The complete softn.com website. The whole softn.com in one folder: the landing page, the app directory, the web runtime, Builder, Studio, the documentation and the directory API. | You want to run your own SoftN site: a directory people can publish apps to and play them from. |
softn-app-static-v0.0.23.zip |
One app on a page (static). The smallest way to host one SoftN app: a plain page with a loading spinner, a permission bar and your app, with no SoftN branding and no server code. | You have a .softn app and a web host, and you want the app on a page of your own site. |
softn-app-static-with-backend-linux-x64-v0.0.23.zip |
One app on a page, with an optional PHP server backend. The static single-app page above, plus a backend/ folder that lets the app run its own private server logic and SQLite database on an Apache/PHP host, with no service to keep running. |
Your app has a private server part (server/ logic, SQL migrations, routes) and your host is Apache with PHP on Linux x86-64. |
softn-app-private-v0.0.23.zip |
One app served privately by PHP. The single-app page again, but PHP renders it and hands the app's files to the browser piece by piece behind a viewer cookie, so the .softn file itself is never at a URL. |
You do not want visitors (or crawlers) to be able to download your app as one file. |
softn-app-private-with-backend-linux-x64-v0.0.23.zip |
One app served privately by PHP, with an optional server backend. The privately served page above together with the PHP server backend: three folders, webroot/, private/ and backend/. The app works at once without the backend; you enable the backend when the app needs it. |
You want the .softn file kept off every URL and the app has a private server part. |
softn-formlogic-runtime-v0.0.23.zip |
The SoftN runtime for FormLogic. Everything FormLogic embeds from SoftN, already built: the sandboxed frame FormLogic runs an app in, Builder and Studio as editors inside FormLogic, the server-side runtime for native apps, and the starter adapter. FormLogic’s build downloads this from the latest SoftN release instead of building SoftN from source. | You run FormLogic and its build cannot reach GitHub; download this and point SOFTN_RELEASE_ARCHIVE at it. |
Each archive unzips with a README.md at the top that explains it; RELEASE-GUIDE.md below compares them all.
The backend download targets Linux x86-64 with Apache/PHP and process execution enabled. It is a generic, unconfigured distribution: install your own public and private app bundles and preserve existing configuration, keys and databases when upgrading. Native XDB synchronization remains a Rust-host feature.
The complete website archive's name carries the tag of the zipp engine inside it. It ships no
example apps: the directory starts empty, and .softn files dropped on any
page of the site publish into it — one, or a folder at once, with the admin
key from data/config.json lifting the hourly limit for the site owner. The
example apps are published as .softn downloads with every
softn-Examples release.
The desktop loader and builder are not attached to releases; they build from
this tag's manifests with npm run tauri build in their apps. RELEASE-GUIDE.md
below compares every download and says which one to take.
The single-app archive includes a small counter example; replace it with your own bundle. It has no app download controls, but browser-delivered app bytes remain extractable. Required license notices are included in all archives.
Built with ZIPP v0.0.26 (its javascript-python-base engine, javascript engine and torch package; the release SHA256SUMS has sha256 dfc1d9067175f35cfc662334220e480fae32f2f2da735b4fdec5c9a52c9f385c).
SoftN v0.0.22
SoftN v0.0.22
What's new
- Upgrading from v0.0.21: the engine is ZIPP v0.0.25; besides it, only documentation changed. A few things logic can see change with it, each in the entry below:
Object.keys(globalThis)andfor-inover it list a script's own globals after the global object's other properties; a promise'sresolveandrejecthavecall,applyandbind; andObject.freeze(globalThis)freezes a script's globals too. A FormLogic that installs this release rebuilds its server sandbox from ZIPP v0.0.25. - The engine is ZIPP v0.0.25 (it was v0.0.24), in the browser and in the Rust backend host. The module every app downloads is 6.19 MB where it was 6.15 MB (1.54 MB with Brotli, from 1.52 MB). ZIPP 0.0.25 fixes the ten issues reported against 0.0.24 and more found since. Code made by
new Functionorevalis now freed with the state that ran it, where it was kept for good. A VM that reached its heap ceiling can allocate again once its references are dropped. The browser engine holds 16,384 globals created at run time, where a script with more than 1,024 failed with "too many global bindings".WeakMap#deleteno longer makes the next lookup slow. Logic can see some changes:Object.keys(globalThis)andfor-inover it list a script's own globals after the global object's other properties; a promise'sresolveandrejectare ordinary functions withcall,applyandbind; writes to the global object reach a Proxy on its prototype chain as they should; andObject.freeze(globalThis)freezes a script's globals too.
Downloads
| Download | What it is | Pick it when |
|---|---|---|
softn-website-v0.0.22-zipp-v0.0.25.zip |
The complete softn.com website. The whole softn.com in one folder: the landing page, the app directory, the web runtime, Builder, Studio, the documentation and the directory API. | You want to run your own SoftN site: a directory people can publish apps to and play them from. |
softn-app-static-v0.0.22.zip |
One app on a page (static). The smallest way to host one SoftN app: a plain page with a loading spinner, a permission bar and your app, with no SoftN branding and no server code. | You have a .softn app and a web host, and you want the app on a page of your own site. |
softn-app-static-with-backend-linux-x64-v0.0.22.zip |
One app on a page, with an optional PHP server backend. The static single-app page above, plus a backend/ folder that lets the app run its own private server logic and SQLite database on an Apache/PHP host, with no service to keep running. |
Your app has a private server part (server/ logic, SQL migrations, routes) and your host is Apache with PHP on Linux x86-64. |
softn-app-private-v0.0.22.zip |
One app served privately by PHP. The single-app page again, but PHP renders it and hands the app's files to the browser piece by piece behind a viewer cookie, so the .softn file itself is never at a URL. |
You do not want visitors (or crawlers) to be able to download your app as one file. |
softn-app-private-with-backend-linux-x64-v0.0.22.zip |
One app served privately by PHP, with an optional server backend. The privately served page above together with the PHP server backend: three folders, webroot/, private/ and backend/. The app works at once without the backend; you enable the backend when the app needs it. |
You want the .softn file kept off every URL and the app has a private server part. |
softn-formlogic-runtime-v0.0.22.zip |
The SoftN runtime for FormLogic. Everything FormLogic embeds from SoftN, already built: the sandboxed frame FormLogic runs an app in, Builder and Studio as editors inside FormLogic, the server-side runtime for native apps, and the starter adapter. FormLogic’s build downloads this from the latest SoftN release instead of building SoftN from source. | You run FormLogic and its build cannot reach GitHub; download this and point SOFTN_RELEASE_ARCHIVE at it. |
Each archive unzips with a README.md at the top that explains it; RELEASE-GUIDE.md below compares them all.
The backend download targets Linux x86-64 with Apache/PHP and process execution enabled. It is a generic, unconfigured distribution: install your own public and private app bundles and preserve existing configuration, keys and databases when upgrading. Native XDB synchronization remains a Rust-host feature.
The complete website archive's name carries the tag of the zipp engine inside it. It ships no
example apps: the directory starts empty, and .softn files dropped on any
page of the site publish into it — one, or a folder at once, with the admin
key from data/config.json lifting the hourly limit for the site owner. The
example apps are published as .softn downloads with every
softn-Examples release.
The desktop loader and builder are not attached to releases; they build from
this tag's manifests with npm run tauri build in their apps. RELEASE-GUIDE.md
below compares every download and says which one to take.
The single-app archive includes a small counter example; replace it with your own bundle. It has no app download controls, but browser-delivered app bytes remain extractable. Required license notices are included in all archives.
Built with ZIPP v0.0.25 (its web-python-base engine and web-torch package; the release SHA256SUMS has sha256 dcb561dc200d2a6a4e2ab303f52e9482552ad0292143fef31d9ba03b794ed03a).