AppsinityAPPSINITY
Desktop client

Client library and installs

The client's library is a folder of unpacked games plus a manifest. Understanding the unpack and launch rules is how you package a Windows build that actually starts.

Open Appsinity Studio

When the client takes over a download

Only downloads that start while the current page URL matches /listing/<slug> are intercepted. Everything else behaves like a normal browser save with a Save-As dialog.

An intercepted file is written to <library>\<slug>\, where <library> is the folder the player chose in the Downloaded games drawer, or %LOCALAPPDATA%\Appsinity\library if they never chose one. A name collision is suffixed (2) through (99).

Important: A PC build advertised with a link that is not a listing URL will not enter the library, will not create a shortcut, and will not appear in the tray's Play list. Share listing URLs.

Unpacking and choosing the executable

A .exe or .msi download is a direct launch target and skips the unpack. Note that neither can be uploaded as a build, so in practice everything arrives as a zip — see Windows builds.

The id rides on the shortcut as one token, --launch=slug rather than --launch slug: Electron rebuilds the command line before it reports a second launch to the client that is already running, and that rebuild moves every loose value somewhere else. Shortcuts written in the old split form still resolve — the client asks its own library which token names an installed title before it gives up.

  1. Expand. A .zip is unpacked with PowerShell Expand-Archive into <name>.appsinity.
  2. Search. The first .exe within three folder levels is selected.
  3. Skip. Names containing unins, uninst, crash, helper, uploader or update are ignored.
  4. Shortcut. A real .lnk is written to the Desktop targeting the client's own executable with --launch=<slug> and the description Play <name> through Appsinity.
  5. Launch. The client spawns the executable detached and records the session, with the process id, in a local play log.
Watch out: The search is breadth-first by name order, not by intent. Ship one executable at the archive root and name it unmistakably after your game.

One progress bar, and the chip behind it

A listing streams a Windows build itself and shows its own download sheet, so while that sheet is on screen the client writes its messages into it — the sheet is the only bar a player sees, and it is the one that counted the bytes.

The client's 296 px chip is what appears when nothing on the page is already reporting: a sheet the player closed, a listing cached before it grew that door, or a save from another window. It is throttled to one update every 220 ms, holds the percentage at 99 until the transfer truly completes, and falls back to byte counts when the server sends no content length.

There is one case where the client says nothing at all: when the page has already fetched the file and is only asking for it to be filed away, re-reporting those bytes as a fresh transfer would snap a bar to 100% in one frame, so the client starts speaking at Unpacking.

MessageMeaningDeveloper action
DownloadingBytes arriving—
UnpackingExpanding the archive—
Ready - shortcut on your desktopSuccess—
Ready - shortcut blockedInstalled; Windows refused the shortcutAsk the player to check folder permissions or antivirus
Download cancelledThe player cancelled—
Download failedThe transfer or write failedCheck the build URL resolves
Could not add to libraryThe manifest write failedReproduce and report the slug
Note: Whichever surface shows them, those are the only states a download has, and there is no repair action. A failed install means downloading again.

The listing button becomes Play

A listing whose build is already in this client's library shows ▶ Play instead of a download button, and starts the installed file rather than fetching a second copy. The page does not decide this alone: it hands its own URL to the client, the client derives the library id from that URL exactly the way it filed the download, and answers whether the title is there and whether it has something executable to start.

A browser has no client to ask, so the answer is always empty and every button keeps its normal meaning.

  • The flip is live: when an install finishes, the client re-asks the listing that is on screen, so no reload is needed.
  • A build with no Windows executable - an HTML5 title, or an archive with nothing launchable inside - keeps its original button.
  • Play uses the same path as a desktop shortcut: the client comes up with the game, the session is logged, the overlay starts.
  • A listing that is unavailable, or not installable on that device, never shows Play.
Note: This question is also how the page now recognises the client itself. The Download the Windows client gate used to test the user agent for Appsinity/\d, which never matched - the client's UA string carries Electron's version, not Appsinity's - so the gate appeared inside the very app it was advertising. It tests for the client bridge instead.

The library drawer

Downloaded games lists installed titles with Play, Folder and Store page per entry, a Rescan action, an Open the store button, and an Install location tile that shows where builds are written and offers Change folder and Open it. The header states Shortcuts on your desktop route back through this client.

  • Empty state: Nothing installed yet with a Browse the store button.
  • Summary stats read N with a Windows executable, the total size, and launched through Appsinity or launch a title to start the count.
  • The manifest holds up to 300 games, slugs are truncated at 64 characters and shortcut names at 80.
  • Folder size is computed by walking up to 6,000 files, so an enormous install can report a low figure.
  • The play log keeps the last 200 sessions.
Watch out: There is no uninstall action. A player who wants a newer build of your game downloads the listing again and gets a second copy — for the client's own releases see how the client updates itself.

Windows integration details

  • The app user model id is Appsinity.Client, so the taskbar tile resolves through the client's Start Menu shortcut.
  • WebP artwork is re-requested as PNG because the icon conversion cannot read WebP, and the icon is converted at 48 × 48.
  • Every PowerShell call runs hidden, with no profile, execution policy bypassed, and a 60-second timeout.
  • A shortcut whose tile still reads "Electron" means a stale shortcut on that machine, not a broken build.

Frequently asked questions

Can I install to a different folder?

The library path is fixed. The installer itself allows a custom install directory; per-game folders do not.

Why is my game missing from the tray Play list?

Either it has no detected executable, or it is past the first 15 launchable titles.

A player says their desktop shortcut reports the title is no longer in the library.

That was the split --launch <id> form losing its value when Electron rewrote the command line for an already-running client. It is fixed, and old shortcuts still resolve. If it persists on an up to date client, the title really is gone from %LOCALAPPDATA%\Appsinity\library\installed.json — ask them to download the listing again.

Why does a listing still show Download for a title the player already has?

Three reasons, in order of likelihood: the client is older than the Play handoff and cannot answer the question, the installed build has no Windows executable so there is nothing to start, or they are looking at the same listing in a browser, which has no library to consult.

Do I need to do anything for the client to find my build?

Only package it as a zip with one root executable and publish from a listing URL, see Windows builds.

Need help?

Developer publishing support: [email protected]
General support: [email protected]
Partnerships: [email protected]