LinuxDoors AppImage Store

LinuxDoors Games

Games from LinuxDoors, each a single self-contained AppImage — the whole game and the runtime it needs in one file that you download, mark executable and run. Nothing to install, nothing left behind, and it runs the same on Debian, Ubuntu and other Linux distributions that can launch an AppImage. Back to the full AppImage Store.

4 games — free, one file, download and play.

Pool Table icon

Pool Table$0.00

Open code, fair pay

The source stays open — free to read, build on and share. A price, where there is one, is not for the code as that is opensource. It is for the work around it: the servers and bandwidth that carry the download to you, and the hours a programmer spent designing, building, testing and looking after the app — hours that support them and the people they love, the same as any other profession in the workplace economy.

A share of what the paid apps earn goes back to the Linux and free-software projects they are built on. That community gave its work away so all of this should exist; paying the people who keep it alive is how it stays alive.

Anything marked $0.00 is exactly that — free, no asterisk.

Seven games of pool on a programmed-drawn table.

from LinuxDoors.com · created September 8, 2026

A LinuxDoors AppImage Software Product

↓  Download Pool_Table.AppImage ↓  Source Download .tar.gz (336.9 KB) icon (.png) Version 0.3  ·  38.1 MB  ·  60 downloads  ·  single file, download and run
SHA256 f0dac2746cd5514fb66a053e5545e32363c944f80f1973f9f339e59c8788392c
A table, a cue, and seven games to play on it. Nothing in it is a photograph or a sprite: the cloth is woven out of noise and lit by a lamp overhead, the balls are shaded spheres with a highlight, a rim light and a shadow that moves with them, the rails are cut leather with a cushion nose, and the pockets are holes with a shadow inside. All of it is drawn, so it is sharp at any size and there is no folder of pictures to lose. The cue works the way the old online tables did, because it is the way that works with a mouse: point to aim, hold the button and pull back to draw the power, let go to hit. Now with real sound -- four noises worked out rather than sampled (ball on ball, tip on cue ball, cushion, pocket), each one told apart by what actually happened and how hard it happened, so a kiss and a break never sound the same. Everything it needs travels with it -- no Python to install first and no Qt to match, which is the point of shipping it as one file.
chmod +x Pool_Table.AppImage ./Pool_Table.AppImage # open on the eight ball table ./Pool_Table.AppImage nine # rack up nine ball instead (or ten, snooker, straight, cutthroat, practice) ./Pool_Table.AppImage --version # on LinuxDoors (no FUSE): ./Pool_Table.AppImage --appimage-extract-and-run # or via linuxdoors-run-appimage, which unpacks it once rather than on every launch
LinuxDoors original. Built by LinuxDoors.com -- this is our own application, not a mirror and not a repackaging of somebody else's build. The SHA-256 above is authoritative. The first game for LinuxDoors: it carries its own Python and its own Qt, so it runs on a computer with nothing installed on it, and the table, the balls, the physics, the rules and the opponent are all the program's own code.

This is an early version

Version 0.2, and the first game LinuxDoors has. It is a whole game and it plays properly, but it is early: there will be things in it that are wrong, and rough edges that only turn up once somebody other than its author is holding the cue. Version 0.2 is also the first version with sound -- see "The noise it makes" below. That is what the bug address is for -- bugs-report-pooltable@linuxdoors.com. If a shot does something a shot should not do, if a rule goes the wrong way, if it looks wrong or gets stuck or will not start, please write and say what you did and what happened. Every report is read, and the physics in it has already been rebuilt more than once on the strength of somebody saying "that is not how a ball behaves."

The seven games

Eight ball -- solids and stripes, then the black. Nine ball -- lowest ball first, and the nine wins it. Ten ball -- the called-shot version, on the tournament table. Straight pool -- every ball is a point. Cutthroat -- three players, and you pot other people's. Snooker -- reds and colours, on a twelve foot table. Practice -- a table, a rack and nobody keeping score. Each racks itself correctly and knows its own rules: which ball is on, what counts as a foul, when a scratch gives ball in hand, and who has won.

The table, from four sides

Straight down is the view you can actually aim in, and where the game opens. Raked tips it back to three quarters, for when you would rather look at the table than play on it. Free lets you walk around it -- drag with the right button to swing the eye about, the wheel to come closer. Down on the shot (press E) puts you behind the white and along the line of the aim, the way it looks when you are actually standing at a table: the eye about a foot and a half above the cloth, a stride back from the ball, stick coming toward you, and aiming turns the whole view with you. Once you strike, it holds absolutely still -- moving the view while the balls are moving makes it impossible to see what happened, so it does not. All four are painted by the same code from the same scene, so the balls sit where the physics says they are whichever one you are looking through.

How the balls behave

The part that has had the most work. Where you strike the cue ball decides what the white does: drag the spot on the little ball in the Strike panel -- hit it high and the white follows through, hit it low and it comes back (around two feet from normal potting range, less from further away, which is how a draw shot actually grades), hit it to a side for English, which bends the path an inch or three over a full table rather than the banana a first attempt produced. There is a button to put the tip back in the middle, because side left on by accident quietly bends every shot after it. The cloth is fast: rolling friction and sliding friction are separate, so a skidding ball scrubs off speed quickly while a rolling one barely fights anything, and the balls settle rather than stop -- the cloth lets go as a ball slows, so it eases out of its roll and creeps the last of it. Energy is accounted for: no collision hands out more than the balls brought into it, checked across thirty of them at every pace and strike, and the most any one made was 98%.

Playing against the computer

Three strengths, and they are honestly different: on a table with one ball to pot, the computer makes roughly one in ten, three in ten, or five and a half in ten. It looks for the shot it can see, works out the pace from how far the ball has to travel, and misses by an amount that depends on how good it is meant to be.

The controls

Point to aim. Hold the button and pull back to draw the power; let go to hit, and pull further for a harder shot. Left and right arrows turn the cue a little; Shift and arrows turn it a very little; Shift while aiming is fine aim when you are down on the shot. Space hits it. E gets you down on the shot or stands you back up. 0 shows the whole table; Ctrl+= and Ctrl+- come closer and back. Right-button drag looks around in the free view; the wheel comes closer, or walks you up and down the line when you are down on the shot. Ctrl+N racks them again. Down on the shot the mouse turns the aim at a steady rate rather than pointing at a spot on the cloth -- from behind the ball the cloth is no guide at all, and pointing at it made the stick unusably twitchy.

The noise it makes

There is not a recording anywhere in the program, for the same reason there is not a photograph. Four sounds, worked out rather than sampled. Ball on ball is very short and almost all attack -- phenolic resin is about the hardest thing anybody plays a game with, and two of them meeting is a click rather than a note. The tip on the cue ball is softer and lower, since leather and chalk aren't resin; the two are told apart by timing, not by guessing -- the first contact of a shot involving the cue ball is the one the cue made, every later one is two balls. The cushion is dull and quick with no ring at all, which is the whole difference between a cushion and a rail; the pocket is the ball off the shelf and the run down behind it, two layers together. How loud each one is comes from how fast the balls were closing, taken before the exchange rather than after -- a kiss and a break are the same kind of event and must not be the same noise. Sound is a toggle (Game menu, or S), and it tells the truth: on a machine with no sound server it says so and takes its own tick off, rather than pretending to work.

On the command line

Pool_Table.AppImage opens on the eight ball table; add a game name to start on a different one -- nine, ten, straight, cutthroat, snooker or practice. Pool_Table.AppImage --version and --help do what they say. Settings live in ~/.config/pool_table/pool_table.save and are written when the game closes; deleting that file puts everything back as it started.

Running it -- nothing to install

Download the AppImage, make it executable, run it -- optionally with a game name to open a different table. On LinuxDoors, which has no FUSE, run it the way LinuxDoors runs any AppImage: ./Pool_Table.AppImage --appimage-extract-and-run, or through linuxdoors-run-appimage, which does that for you and unpacks it once rather than on every launch.

Written for LinuxDoors, though nothing in it is specific to LinuxDoors -- it runs on Debian- and Ubuntu-type systems, and on any other Linux distribution that can run an AppImage.

=============================================================================== Pool Table — for the LinuxDoors AppImage Store =============================================================================== Name: Pool Table Version: 0.2 — AN EARLY VERSION Price: $0.00 Author: LinuxDoors.com Created: September 19, 2026, 9:58 AM Kind: A LinuxDoors AppImage Software Product File: Pool_Table.AppImage Size: 38,148,600 bytes (~38 MB) SHA256: f0dac2746cd5514fb66a053e5545e32363c944f80f1973f9f339e59c8788392c CHANGED, 3 OCTOBER 2026 -- FIXED: DID NOT START ON SOME REAL DESKTOPS On Linux Mint 22.3 and some Ubuntu-family desktops, this AppImage failed to open at all, printing "qt.qpa.plugin: ... xcb-cursor0 or libxcb-cursor0 is needed" and exiting. The AppImage bundles its own Qt, but was missing one small library (libxcb-cursor, plus its own two helper libraries) that Qt's screen code needs -- present on Debian and LinuxDoors by other means, but not installed by default on Mint or Ubuntu. That library is now bundled inside the AppImage itself, so it no longer depends on the host having it. Bug reports: bugs-report-pooltable@linuxdoors.com CARD DESCRIPTION (the one line the store shows under the name) Seven games of pool on a table drawn rather than photographed. ------------------------------------------------------------------------------- THIS IS AN EARLY VERSION ------------------------------------------------------------------------------- Version 0.2, and the first game LinuxDoors has. It is a whole game and it plays properly, but it is early: there will be things in it that are wrong, and rough edges that only turn up once somebody other than its author is the one holding the cue. Version 0.2 is also the first version with sound -- see "The noise it makes" below. That is what this address is for: bugs-report-pooltable@linuxdoors.com If a shot does something a shot should not do, if a rule goes the wrong way, if it looks wrong or gets stuck or will not start — please write. Say what you did and what happened. Every report is read, and the physics in it has already been rebuilt more than once on the strength of somebody saying "that is not how a ball behaves." ------------------------------------------------------------------------------- DESCRIPTION ------------------------------------------------------------------------------- A table, a cue, and seven games to play on it. Nothing in it is a photograph or a sprite. The cloth is woven out of noise and lit by a lamp overhead, the balls are shaded spheres with a highlight, a rim light and a shadow that moves with them, the rails are cut leather with a cushion nose, and the pockets are holes with a shadow inside. All of it is drawn, so it is sharp at any size and there is no folder of pictures to lose. The cue works the way the old online tables did, because it is the way that works with a mouse: point to aim, hold the button and pull back to draw the power, let go to hit. Pull further for a harder shot. Push forward again and the power comes back down, so you can feel for the pace before you commit. Everything it needs travels with it. There is no Python to install first and no Qt to match — which is the point of shipping it as one file. Written for LinuxDoors, though nothing in it is specific to LinuxDoors — it runs on Debian and Ubuntu type systems, and on any other Linux distribution that can run an AppImage. ------------------------------------------------------------------------------- The seven games ------------------------------------------------------------------------------- Eight ball solids and stripes, then the black Nine ball lowest ball first, and the nine wins it Ten ball the called-shot version, on the tournament table Straight pool every ball is a point Cutthroat three players, and you pot other people's Snooker reds and colours, on a twelve foot table Practice a table, a rack and nobody keeping score Each racks itself correctly and knows its own rules — which ball is on, what counts as a foul, when a scratch gives ball in hand, and who has won. ------------------------------------------------------------------------------- The table, from three sides ------------------------------------------------------------------------------- STRAIGHT DOWN The view you can actually aim in, and where the game opens. RAKED Tipped back to three quarters, for when you would rather look at the table than play on it. FREE Walk around it. Drag with the right button to swing the eye about, the wheel to come closer. DOWN ON THE SHOT (press E) Behind the white and along the line of the aim, the way it looks when you are actually standing at a table — the eye about a foot and a half above the cloth, a stride back from the ball, stick coming toward you. Aiming turns the whole view with you. The wheel walks you up and down the line rather than zooming. Once you strike, it holds absolutely still. Moving the view while the balls are moving makes it impossible to see what happened, so it does not. All four are painted by the same code from the same scene, so the balls sit where the physics says they are whichever one you are looking through. ------------------------------------------------------------------------------- How the balls behave ------------------------------------------------------------------------------- The part that has had the most work, and the part most likely to still be wrong somewhere. WHERE YOU STRIKE THE BALL DECIDES WHAT THE WHITE DOES Drag the spot on the little cue ball in the Strike panel. Hit it high and the white follows through; hit it low and it comes back — around two feet from normal potting range, less from further away, which is how a draw shot actually grades. Hit it to a side for English, which bends the path an inch or three over a full table, not the banana that a first attempt at it produced. There is a button to put the tip back in the middle, because side left on by accident quietly bends every shot after it. THE CLOTH IS FAST Rolling friction and sliding friction are separate, because a ball that is skidding scrubs off speed quickly and a ball that is rolling barely fights anything. A struck ball runs on the way a struck ball does. AND THE BALLS SETTLE RATHER THAN STOP The cloth lets go as a ball slows, so it eases out of its roll and creeps the last of it instead of arriving at zero still braking. Energy is accounted for. No collision anywhere in the game hands out more than the balls brought into it — checked across thirty of them at every pace and every strike, and the most any one made was 98%. ------------------------------------------------------------------------------- Playing against the computer ------------------------------------------------------------------------------- Three strengths, and they are honestly different: on a table with one ball to pot it makes roughly one in ten, three in ten, or five and a half in ten. It looks for the shot it can see, works out the pace from how far the ball has to travel, and misses by an amount that depends on how good it is meant to be. ------------------------------------------------------------------------------- The controls ------------------------------------------------------------------------------- Point aim Hold and pull back draw the power; let go to hit Left / right arrows turn the cue a little Shift + arrows turn it a very little Shift while aiming fine aim, down on the shot Space hit it E get down on the shot, or stand back up 0 the whole table Ctrl + = / Ctrl + - closer, back Right button drag look around, in the free view Wheel closer, or up and down the line when down on it S sound on or off Ctrl+N rack them again Down on the shot the mouse turns the aim at a steady rate rather than pointing at a spot on the cloth — from behind the ball the cloth is no guide at all, and pointing at it made the stick unusably twitchy. ------------------------------------------------------------------------------- On the command line ------------------------------------------------------------------------------- Pool_Table.AppImage open on the eight ball table Pool_Table.AppImage nine rack up nine ball instead Pool_Table.AppImage snooker or snooker, or ten, straight, cutthroat, practice Pool_Table.AppImage --version Pool_Table.AppImage --help ------------------------------------------------------------------------------- LinuxDoors original ------------------------------------------------------------------------------- Built by LinuxDoors — this is our own application, not a mirror and not a repackaging of somebody else's build. The SHA-256 above is authoritative. The first game for LinuxDoors. It carries its own Python and its own Qt, so it runs on a computer with nothing installed on it. The table, the balls, the physics, the rules and the opponent are all the program's own code. ------------------------------------------------------------------------------- Running it — nothing to install ------------------------------------------------------------------------------- chmod +x Pool_Table.AppImage ./Pool_Table.AppImage On LinuxDoors, which has no FUSE, run it the way LinuxDoors runs any AppImage: ./Pool_Table.AppImage --appimage-extract-and-run or through linuxdoors-run-appimage, which does that for you and unpacks it once rather than on every launch. Settings live in ~/.config/pool_table/pool_table.save and are written when the game closes. Deleting that file puts everything back as it started. ------------------------------------------------------------------------------- THE NOISE IT MAKES ------------------------------------------------------------------------------- There is not a recording anywhere in the program, for the same reason there is not a photograph. Four sounds, worked out rather than sampled. Ball on ball is very short, very bright and almost all attack: phenolic resin is about the hardest thing anybody plays a game with, and two of them meeting is a click rather than a note. Its partials are high and deliberately not whole multiples of each other, because a sphere's modes are not a string's. The tip on the cue ball is softer and lower — leather and chalk are not resin, and there is a cue behind it. The engine only ever sees balls touching, so the two are told apart by when: the first contact of a shot involving the cue ball is the one the cue made, and every later one is two balls. The cushion is dull and quick with no ring at all, which is the whole difference between a cushion and a rail. The pocket is the ball off the shelf and then the run down behind it, two layers together. How loud each one is comes from how fast the balls were closing, taken before the exchange rather than after it — the point of a collision is that it changes those velocities, so asking afterwards measures the wrong thing. A kiss and a break are the same event and must not be the same noise. On a full break: one cue, forty-four clicks, twenty-three cushions and four pockets, running from a quarter to half of full gain. It does not use Qt for any of it. QtMultimedia is not in the runtime these programs are packaged on, and putting it there drags in a media stack several times the size of the game in order to play four noises. The mixing happens in the game and the result goes down one pipe to whatever the desktop already plays sound with — pipewire, pulse or alsa, whichever is there. The pipe is set to four kilobytes, one page and the smallest a pipe can be: left at the default sixty-four it holds a second and a half of audio, and every sound would arrive a second and a half after the thing that made it. Sound is a toggle — in the Game menu, or the S key. Off closes the pipe rather than muting it: a game that is not making a noise should not be holding the sound device open either. And it tells the truth — on a machine with no sound server it says so in as many words and takes its own tick off, leaving the setting asking for sound, so the same copy elsewhere starts making a noise again without anybody having to remember why it stopped. ------------------------------------------------------------------------------- Tell us what is wrong with it ------------------------------------------------------------------------------- bugs-report-pooltable@linuxdoors.com It is an early version. Your report is the next one.
Basketball icon

Basketball$0.00

Open code, fair pay

The source stays open — free to read, build on and share. A price, where there is one, is not for the code as that is opensource. It is for the work around it: the servers and bandwidth that carry the download to you, and the hours a programmer spent designing, building, testing and looking after the app — hours that support them and the people they love, the same as any other profession in the workplace economy.

A share of what the paid apps earn goes back to the Linux and free-software projects they are built on. That community gave its work away so all of this should exist; paying the people who keep it alive is how it stays alive.

Anything marked $0.00 is exactly that — free, no asterisk.

An open court, a hoop and a crosshair on the glass, drawn rather than photographed.

from LinuxDoors.com · created September 19, 2026

A LinuxDoors AppImage Software Product

↓  Download Basketball.AppImage ↓  Source Download .tar.gz (477.4 KB) icon (.png) Version 0.3  ·  38.2 MB  ·  53 downloads  ·  single file, download and run
SHA256 c2f823ad19e26330897b19d4460db2caf1aea38e461b7e50e2b3e0093b57d196
A hoop, an open court and nine different ways to shoot at it -- from a one-motion pull like a pool cue to a crosshair that never stops drifting until the instant you let go. The aiming square on the backboard tells the truth about where the ball is going and says so in a word: in, ring, or glass -- worked out from two hundred and thirty-one simulated flights when the court is built, not a guess. The backboard is a real surface with real banking, the rim gives back only what it was given, a basket only counts on the ball's downward crossing of the ring itself (not a foot below it, which used to slip through), and the sound for every contact is worked out from the ball's own flight and played just before it lands, so nothing arrives a beat behind what the eye already saw. Six court surfaces, four camera views built from one shared drawing pass, and seven game modes -- including two played from any angle around the three-point arc, turning the whole court to shoot from the wing or square along the baseline -- against a machine opponent with three honestly different skill levels. Nothing in it is a photograph: the floor grain, the glass, the ring and the twelve-strand net are all drawn against one overhead lamp, and the ball has six things going on that a real basketball does, right down to the pebbling.
chmod +x Basketball.AppImage ./Basketball.AppImage ./Basketball.AppImage --game rapid --aim quick ./Basketball.AppImage --version # on LinuxDoors (no FUSE): ./Basketball.AppImage --appimage-extract-and-run # or via linuxdoors-run-appimage, which unpacks it once rather than on every launch
LinuxDoors original. Built by LinuxDoors.com -- this is our own application, not a mirror and not a repackaging of somebody else's build. The SHA-256 above is authoritative. The second game for LinuxDoors: it carries its own Python and its own Qt, so it runs on a computer with nothing installed on it, and the court, the physics, the aiming, and the sound are all the program's own code.

This is an early version

Version 0.2. It is a whole game and it plays properly, but it is early, and there will be rough edges that only turn up once somebody other than its author is the one shooting. Bug reports go to bugs-report-basketball@linuxdoors.com -- if a shot does something a shot should not do, please write and say what you did and what happened.

Aiming on the square

The crosshair sits on the painted square on the glass, not in a box in the corner of the screen -- that square is what a person aims at, which is why it is painted on the backboard in the first place. Across is across, and higher up the square is deeper into the ring, exactly what higher on the glass does to a real shot. It tells the truth: the speed the ball leaves at is solved backwards from the spot picked, so where the crosshair is, is where the ball goes. And it says what it would do, in a word -- "in" when the ball drops, "ring" when it is on the rim, "glass" when it is going off the board -- worked out from two hundred and thirty-one real flights simulated when the court is built, not a guess. The sweeping lines can be turned off on their own, leaving the crossing and the shaded scoring patches; in the pointing modes (Pool and Flick) the targeter is just a ring following the mouse over the one part of the picture worth looking at.

Nine ways to shoot

Pool (point and pull back, the way a cue works -- the one it starts on), Drift (the crosshair wanders on its own and you press when you like the look of it), Flick (flick up with the mouse and click to let go), Arcade (two sweeping lines, one press stops both, then pull back and shoot), Arcade #2 (the crosshair never stops -- hold and drag upwards to wind the throw up, and the aim is read at the instant you release, the hardest of the modes because hesitating costs something), Quick (the same two lines with the pull already loaded, so letting go at once takes the shot the crosshair already promised), Classic (across first, then depth, and it shoots itself), Snap (both lines, one press, shot for you), and Pitch (one line at a time, then shoot it yourself). The wandering in Drift is two sines of unrelated speed on each axis -- close enough to repeating to be learnable, far enough that it never quite does.

The shot, and why the arc is the fixed thing

Pull back and let go, or hold Space and release. What is held fixed while the shot is solved is the arc, not the release angle -- the obvious choice is provably the wrong one. At a fixed angle the speed needed to clear the ring's height is not a straight line against distance; it has a minimum, and either side of it the same speed answers two different distances, one of which is the ball still on its way up. Holding the arc fixed instead -- the ball always clears the ring by the same amount at the top of its flight -- gives one answer for every distance, and it is also the truer description of a real shooter, who keeps their arc and lets the angle flatten as they move back.

The glass

The backboard is a real surface and banking is a real shot -- half the depth track scores, eight inches of it straight through and thirteen and a half banked in off the glass. The contact is computed on the skin of the ball, not its center, so it doesn't come off five inches too deep. A ball can bank more than once, since going up into the glass and back down through it is a real and fairly common way to score. And the board's stiffness was tuned against real behavior -- the band of deep aims that actually bank in is fourteen times wider than an earlier, softer setting gave. The rim gives back only about a quarter of what it was given, so a rattle settles instead of dancing forever.

What counts as a basket

One thing, and only this: the ball crossed the plane of the ring on its way down, with its whole width inside. Nothing below the ring counts, whatever it is doing there. That is worth stating because the game used to get it wrong, in the one place hardest to see -- a ball that had caught the ring and rattled out was still asked, every frame, whether it was somewhere below the ring and falling and over the middle, which is also true of a ball a foot underneath the hoop on its way down. The game now works back to the exact instant the ball passed the ring's own height and asks there instead, so a bounce comes off the ring itself rather than off a spot the ball had already gone by. Measured over 7,503 shots -- every aim point on the crosshair's grid at three different speeds -- 64 baskets that had been awarded with the ball as much as 41 inches below the rim are gone, and no basket is now given anywhere but at the ring.

The court, the camera, and the sound

The court is open -- no arcade cage, just a hoop on an NBA-sized floor across six real surfaces (Maple, Oak, Walnut boards; Slate, Blacktop, Painted outdoor courts). Four views share one camera and one drawing pass: from above, raked (the one to play in), from the free-standing shooting line, and a free 3D view you can drag around. The line-of-sight view alone took real measurement to get right -- the whole backboard, the ring, some floor, and the ball in frame for the whole flight, all at once. Every sound in the game -- the ring, the glass, the net, the end-of-game horn -- is synthesized rather than recorded, and computed from the ball's own predicted flight so it arrives at the ear exactly as the ball arrives, not a beat behind. Measured over 231 shots and 464 real contacts: every contact makes its sound, and the sound lands a median 99 milliseconds ahead of the moment of contact -- which is what makes it feel simultaneous rather than delayed.

Seven games, a machine opponent, and the controls

Rapid fire (45 seconds, ball comes straight back, every shot worth the same so nothing tempts you to stop and think), Frenzy (60 seconds, last ten worth double), Twenty-five (a straight 25 shots), Around the World (seven spots on the floor, make one to move to the next), Around the 3 Point Line (played in Free 3D from any angle you turn the court to -- pinned to the arc the whole time, so every basket is a three), Around the Arc (the same shooting made into a round -- seven spots on the arc from baseline to baseline, the court turning to face each one for you), and Knockout (goes until a shot misses). A machine opponent takes alternate shots in the fixed-count games at three honestly different skill levels. Controls: Space to shoot (hold and release), arrow keys or the mouse to lean the ball once it's airborne, 1-4 to switch camera views, S for sound, right-drag to orbit the views that turn, the wheel to zoom, Ctrl+N for a new game, F1 for how to play.

Shooting from anywhere on the arc

The two arc games work by solving every shot in the shooter's own frame -- across, along, up, with the ring straight ahead -- then turning that frame about the ring to put it on the court. Since the ring is a circle, that costs almost nothing: the arc, the power bar and the crosshair are the same arithmetic wherever you're standing. The backboard is the one exception, since a board isn't a circle -- it's checked where it actually is rather than in the shooter's frame, and the result falls straight out of the geometry: aims that bank in run 28 straight on, 24 at thirty degrees, 23 at sixty, and just 9 at ninety, where the board is nearly edge-on -- exactly like a real court.

Running it -- nothing to install

Python, Qt and PySide6 all travel inside the AppImage -- nothing on the machine is used and nothing on the machine can conflict with it. Download it, make it executable, and run it: ./Basketball.AppImage (add --game rapid --aim quick to jump straight into a mode). On LinuxDoors, which has no FUSE, run it the way LinuxDoors runs any AppImage: ./Basketball.AppImage --appimage-extract-and-run, or through linuxdoors-run-appimage, which does that for you and unpacks it once rather than on every launch.

Written for LinuxDoors, though nothing in it is specific to LinuxDoors -- it runs on Debian- and Ubuntu-type systems, and on any other Linux distribution that can run an AppImage.

=============================================================================== Basketball — for the LinuxDoors AppImage Store =============================================================================== Name: Basketball Version: 0.2 — AN EARLY VERSION Price: $0.00 Author: LinuxDoors.com Created: September 23, 2026, 5:12 AM Kind: A LinuxDoors AppImage Software Product File: Basketball.AppImage Size: 38,185,464 bytes (~38 MB) SHA256: c2f823ad19e26330897b19d4460db2caf1aea38e461b7e50e2b3e0093b57d196 CHANGED, 3 OCTOBER 2026 -- FIXED: DID NOT START ON SOME REAL DESKTOPS On Linux Mint 22.3 and some Ubuntu-family desktops, this AppImage failed to open at all, printing "qt.qpa.plugin: ... xcb-cursor0 or libxcb-cursor0 is needed" and exiting. The AppImage bundles its own Qt, but was missing one small library (libxcb-cursor, plus its own two helper libraries) that Qt's screen code needs -- present on Debian and LinuxDoors by other means, but not installed by default on Mint or Ubuntu. That library is now bundled inside the AppImage itself, so it no longer depends on the host having it. Bug reports: bugs-report-basketball@linuxdoors.com CARD DESCRIPTION (the one line the store shows under the name) An open court, a hoop and a crosshair on the glass, drawn rather than photographed. ------------------------------------------------------------------------------- THIS IS AN EARLY VERSION ------------------------------------------------------------------------------- Version 0.2. It is a whole game and it plays properly, but it is early, and there will be rough edges that only turn up once somebody other than its author is the one shooting. bugs-report-basketball@linuxdoors.com If a shot does something a shot should not do, please write. Say what you did and what happened. ------------------------------------------------------------------------------- AIMING ON THE SQUARE ------------------------------------------------------------------------------- The crosshair sits on the painted square on the glass, not in a box in the corner of the screen. That is not decoration: the square is what a person aims at, it is why it is painted on the backboard in the first place, and a crosshair sitting on it needs no key and no explaining. Across is across, and higher up the square is deeper into the ring — which is exactly what higher on the glass does to a real shot. It tells the truth. The speed the ball leaves at is solved backwards from the spot you picked, so where the crosshair is, is where the ball goes. And it says what it would do, in a word: "in" when the ball drops, "ring" when it is on the rim, "glass" when it is going off the board. That word is not a guess. Two hundred and thirty-one real flights are simulated when the court is built — a fifth of a second, once — and the readout is what those flights actually did, which is why it never disagrees with the shot you get. The sweeping lines can be turned off on their own, leaving the crossing and the shaded scoring patches. Once you can read the crosshair the lines are scaffolding, and the game is better looking at the hoop than at them. And the crosshair has a switch of its own beside it. The two are one thing in the sweeping modes and quite different in the pointing ones: Pool and Flick have no sweeping lines at all — the aim is wherever the mouse is — so the only thing the targeter draws there is a ring following the pointer, sitting over the one part of the picture worth looking at. Off, there is nothing between you and the hoop. The shaded patches stay, and so does the arc if you want it, because each of those is its own switch too. ------------------------------------------------------------------------------- NINE WAYS TO SHOOT ------------------------------------------------------------------------------- Pool point at the square and pull back, the way a cue works. One movement. This is the one it starts on. Drift the crosshair wanders about the square on its own and you press when you like the look of it. No pulling. This is the one to play Rapid fire in. Flick flick up with the mouse and click to let go. Arcade two sweeping lines across the square, one press stops both, then you pull back and shoot. Arcade #2 the crosshair never stops. Hold and drag upwards to wind the throw up, and let go when it is where you want it — the aim is read at the instant you release. Quick the same two lines, with the pull already loaded. One press stops both and the bar is at once on the shot the crosshair asked for. Let go without moving the mouse and it goes in; drag to trim it either way. Classic across first, then depth, and it shoots itself. Snap both lines, one press, shot for you. Pitch one line at a time, then shoot it yourself. The wandering in Drift is two sines of unrelated speed on each axis. A single sine is a pendulum and is learnable in three shots; a random walk jitters and looks broken. Two that do not divide into each other drift about the square for a long time without quite repeating, and sit over a scoring spot about a fifth of the time — which is a window worth waiting for rather than a lottery. Arcade #2 is the other end of the same argument. Every other mode splits the shot in two — settle the aim, then deal with the power, each in its own time. This one refuses to. The crosshair keeps drifting the whole while you are winding the throw up, and the aim is read at the instant you let go, so the pull is not a job done in peace: it is the thing you are doing while the only thing that matters drifts past the spot you wanted. It is the hardest of the modes, because it is the only one where hesitating costs something. The pull runs the other way in it — down to up. Dragging back to throw harder is how a cue works, and a cue is drawn back; an arm that throws a ball upwards goes up. In a mode where the wind-up happens while you are watching the crosshair move, the hand going the same way as the ball is the one that does not have to be thought about. And the green band moves with the crosshair rather than standing where it was when the button went down — otherwise it would be a promise about a spot the aim has already left. Quick is there because the wind-up is a second game bolted onto the end of the first. Everywhere else the bar starts at nought and has to be dragged up, so a press-and-release takes no shot at all — the ball drops at your feet. That is fair enough when you have time. It is the wrong thing to ask of somebody who has just stopped two sweeping lines and wants the shot they were promised: the aim was the hard part and it is already done. So the bar opens on what the aim asked for. Of the aims the crosshair calls a score, letting go at once with no mouse movement whatever: Quick 8 of 8 go in Arcade 0 of 8 — the bar was at nought Dragging still works exactly as it did, from there rather than from zero: back for more, forward for less. And when two lines sweep at once they start at opposite ends of their tracks. Started together at the near end, every quick press gave the same short shot, and the fastest thing a player could do was also the worst shot on the board. ------------------------------------------------------------------------------- THE SHOT, AND WHY THE ARC IS THE FIXED THING ------------------------------------------------------------------------------- Pull back and let go, or hold Space and release. What is held fixed while the shot is solved is the arc, not the angle, and that is worth explaining because the obvious choice is the wrong one. A shooter's hands do the same thing every time, so fixing the release angle sounds right. It is provably wrong here. At a fixed angle the speed needed to pass through the height of the ring is not a straight line against distance: it has a minimum where the arc just grazes that height, and either side of the minimum the same speed answers two different distances — one of which is the ball on its way *up*, which is not a shot at all. Measured on this court, the fixed-angle model wanted 281 in/s to land a foot short of the ring and 278 to land in the middle of it. Harder meant shorter, the power bar could not be inverted, and nothing ever went in. So the arc is what is held: the ball always goes the same distance over the ring at the top of its flight, and how far it travels is how hard it is thrown. That is also the truer description of a shooter — people keep their arc and let the angle flatten as they move back, which is exactly what this does. One answer for every distance, going the same way the whole time, and it inverts in a line rather than by halving. ------------------------------------------------------------------------------- THE GLASS ------------------------------------------------------------------------------- The backboard is a real surface and banking is a real shot. Half the depth track scores: eight inches of it drops the ball straight through, and thirteen and a half of it banks in off the glass. Three things make that work, and each was wrong first: The contact is on the skin of the ball, not at its middle. A ball is nearly five inches of radius, and waiting for its centre to reach the glass means it is already half buried in the board and comes off five inches too deep. It can happen more than once. A ball off the ring can go up into the glass and come down through it — a real and fairly common way to score — and a flag saying "this ball has banked already" quietly made that impossible. And how stiff the board is decides whether any of it matters. Eighteen pairs of numbers were tried; at seven tenths back and eight tenths kept, the band of deep aims that actually bank in is seven inches wide instead of the half inch a softer board gave. That is the difference between banking being a shot and banking being an accident. The ring gives back and never adds. It used to return a share of what arrived *plus* fourteen inches a second across and twenty-six upward — energy from nowhere, so a ball that crawled onto the rim left it briskly. Now a contact keeps about a quarter of what it had, which is why a rattle settles instead of dancing. ------------------------------------------------------------------------------- ONCE IT IS IN THE AIR ------------------------------------------------------------------------------- Move the mouse left or right and the ball leans that way. Arrow keys do the same. It is worth an inch and a half by the time the ball reaches the ring: enough to save one rattling on the rim, nowhere near enough to rescue a shot that was never close. **Mouse assist** is a separate toggle and goes further — with it on, the mouse flies the ball for the whole of its flight, up the court as well as across. That is frankly outside the physics, which is exactly why it is a switch you turn on rather than how the game behaves. **Unlimited shots** is another. The game stops ending, so practising is not interrupted every forty-five seconds by a scoreboard. ------------------------------------------------------------------------------- WHAT COUNTS AS A BASKET ------------------------------------------------------------------------------- One thing, and only this: the ball crossed the plane of the ring on its way down, with its whole width inside. Nothing below the ring counts, whatever it is doing there. That is worth stating because the game used to get it wrong, in the one place that is hardest to see. A ball that had caught the ring and rattled out was still being asked, every frame, whether it was below the ring and falling and somewhere over the middle — and that is true of a ball a foot underneath the hoop, dropping away, that happens to pass back across the centre. An in-and-out could therefore be called a basket, with the swoosh and the scoreboard to match. It now has to be a crossing, and a crossing only, exactly as a ball arriving cleanly has always had to be. Where the question is asked matters as much as when. A frame is three or four inches of fall at shooting speeds, and the ball is travelling sideways throughout, while the ring leaves four and a quarter inches of room around a ball that fits through it. Asking at the end of the frame therefore asked inches past the ring, always in the direction the ball was going — turning some that went in into misses and some that missed into baskets. The game now works back to the exact point the ball passed the ring's height and asks there, and a bounce comes off the ring itself rather than off a spot the ball had already gone by. Measured over 7,503 shots — every aim point on the crosshair's grid at three different speeds — 64 baskets that had been awarded with the ball as much as 41 inches below the rim are gone, and no basket is now given anywhere but at the ring. ------------------------------------------------------------------------------- THE COURT ------------------------------------------------------------------------------- It is open. There was an arcade cage — mesh walls up either side of the lane — and it has gone: a hoop on an NBA-sized floor with the markings painted on it, nothing boxing in the shot, nothing between you and the board. The hoop hangs with nothing under it. It stood on a post, and the post was the whole trouble: a hundred and twelve inches of pole under a thirty inch board is honest — that is how high a hoop is — but from the shooting line it ran most of the way down the window and was the first thing the eye found. Every camera that framed the post comfortably made the hoop too small; every camera that made the hoop worth looking at ran the post off the bottom of the screen. Six surfaces: Maple, Oak and Walnut boards, and Slate, Blacktop and Painted for a court that is outdoors. The markings are drawn to the court rather than sized by eye — key, circle, three-point arc with its straight legs down the sides — so what you are shooting over is laid out where it would be laid out. ------------------------------------------------------------------------------- FOUR VIEWS ------------------------------------------------------------------------------- 1 From above the plan 2 Raked the one to play in 3 From the line standing where the shot is taken 4 Free 3D drag it round with the right mouse button All four are one camera and one lot of drawing code, so the ball is where the physics says it is in every one of them. **From the line** is the hardest of the four to get right and the argument is worth setting out. Standing at head height ten feet from the hoop, the ground under the ring is twenty-nine degrees below the eye and the top of the arc is forty-seven above it — seventy-six degrees from one to the other, where an ordinary lens sees fifty-three. So there is no casual answer: point the camera up for the ball and the floor is gone, point it down for the floor and the ball leaves over the top. It was measured rather than guessed. Every combination of eye height, distance back, lens and framing point was tried against four requirements at once — the whole backboard visible, the ring, some floor, and the ball in the window for the whole of every flight — keeping only those with forty-five pixels to spare on all four, and taking the one of those with the largest hoop. And the hoop does not move. For a while the view followed the ball, tilting up as it rose the way a head does. It made the hoop bigger and it was wrong: the rim and the board slid up and down the screen while the ball was in the air, and a hoop that moves is not a hoop you can aim at. Zoom works, on all of them. It did not, in any of these three games, for a long time and invisibly: the framing was recomputed with the zoom applied, so the wheel moved the eye closer and the framing stood back by exactly the same factor. The wheel turned, the arithmetic ran, and the picture did not change. ------------------------------------------------------------------------------- THE SOUND ------------------------------------------------------------------------------- There is not a recording anywhere in the program, for the same reason there is not a photograph: the ring is a handful of metal partials struck hard and left to ring down, the glass is the same idea an octave lower and damped so it thuds where the ring sings, the net is filtered noise, and the end of the game is a square wave that sags. The partials of the ring are deliberately not whole multiples of each other. A hoop is a bent tube, not a string, and its overtones do not line up — which is the whole difference between something that sounds like metal and something that sounds like a note. Six sounds, and they are worked out in about twenty milliseconds the first time they are wanted. There were seven. The ball leaving your hands had a whoosh of its own, and it had to go: it was made of the same stuff as the net. Both were filtered noise — one at three hundred to three and a half thousand cycles, the other at nine hundred to four thousand — and a second apart they did not read as two things happening. They read as the swish happening twice, which made every basket sound like a mistake. The net is the one worth keeping; the release already has the power bar and the ball itself to announce it. Each one begins and ends at silence, which is less obvious than it sounds. A sound that simply stops while it is still moving is a step down to nothing, and a step is a click. The chime was the bad one: two sines still at a ninth of their height when the samples ran out, so a basket was a swish, a chime, and then a tick a third of a second later that sounded like something else in the room. Half a millisecond of rise and twenty-five of fall — far too short to shorten anything, long enough to land on zero. How loud each one is comes from how hard the ball arrived, so a deliberate bank off the board and a ball brushing it on the way past are not the same noise. It does not use Qt for any of it. QtMultimedia is not in the runtime these programs are packaged on, and putting it there drags in a media stack several times the size of the game in order to play six noises. Instead the mixing happens in the game and the result goes down one pipe to whatever the desktop already plays sound with — pipewire, pulse or alsa, whichever is there. One pipe that stays open, rather than a program launched per sound, so a ball hits the ring and the sound is already on its way. And the pipe is deliberately tiny. This was the one thing that made the sound feel wrong rather than merely be wrong. A pipe on Linux holds sixty-four kilobytes by default, and sixty-four kilobytes of this is a second and a half of audio — so the mixer filled it, ran a second and a half ahead from then on, and the swish arrived when the ball was already back in your hands. Python's own eight kilobyte buffer sat on top of that, worth another third of a second. Nothing is gained by that lead. What is in the pipe is already decided and cannot be changed; a big pipe only buys the ability to fall a long way behind without anybody noticing, and mixing six short sounds does not fall behind. So Python's buffer is off and the pipe is set to four kilobytes, which is one page and the smallest a pipe can be — about ninety milliseconds. Measured: it ran 1,555 ms ahead of the ear, and now runs between 76 and 162. ------------------------------------------------------------------------------- AND THE SOUND RUNS AHEAD OF THE BALL ------------------------------------------------------------------------------- A tenth of a second is still visible. A ball and its noise a tenth apart do not look like the same event — they look like a ball, and then a noise. So the noise is not triggered by the contact. It is worked out *before* the contact, from the trajectory, and said early enough that it comes out of the speaker exactly as the ball arrives. It can be, because free flight has a closed form. The moment the ball next crosses the height of the ring is the descending root of a quadratic; the moment it reaches the face of the glass is a division; where it will be when it gets there is two multiplications. If that moment is inside the lead, the sound is called now. This is prediction and not cheating: it uses the ball's own position and pace under the same gravity the ball is about to fall under, and the only thing it cannot see is a lean that has not happened yet — worth about a sixth of an inch over a tenth of a second. Only ever the next contact, though, and that mattered. Calling both was audibly wrong: a ball on its way into the board is also, at that instant, on a path that passes the ring — so the ring was called, the glass turned the ball round, and the ring it had been promised never arrived. One phantom ping per rattle. Whatever happens first is the only thing whose path is known, because it is the thing that changes the path. A call is redeemed by its own contact and then forgotten, so a ball going round the ring three times rings three times. And a call that never comes true expires, so a lean that takes the ball off the rim after the rim was called does not silence the next one. Measured over 231 shots covering the whole aiming range — 464 contacts: every contact makes its noise 464 of 464 noises with no contact behind them 15 (3%, and it was 55) when each noise lands median 99 ms before the contact **Sound is a toggle** — in the Game menu, or the S key. Off closes the pipe rather than muting it: a game that is not making a noise should not be holding the sound device open either. **Ring** is a third switch, and the only one that starts on. It is the tin when the ball catches the rim — three times over when one rattles round — and it comes off on its own, taking nothing whatever with it. The swish still swishes, the glass still knocks, the ball still lands. That rattle is the most conspicuous noise in the game and it is made by missing, which is why it is the one worth being able to silence by itself. It was bundled with the glass and the landing at first, under a single switch called "swoosh only" — which did silence the rattle, and also took the knock off the board with it, and the knock off the board is the sound of a bank shot working. **Nothing but the swoosh** goes the whole way, for when one switch is wanted rather than three. One tick and the only sound the program makes is the ball going through the net — not the chime, not the ring, not the glass, not the horn at the end of the game. While it is on the other two decide nothing and are greyed out; they keep their settings and come back exactly as they were, but a switch that decides nothing should not look as though it does. So there are four, and each does one thing: sound, ring, chime, and nothing but the swoosh. **The chime is a toggle of its own, and it starts off.** A basket is the swish and nothing after it. The two were triggered at the same instant, which is not how they were heard. The swish is a burst of noise down to a twentieth of its height by three hundred milliseconds; the bell is still ringing at four hundred. So what reached you was the ball, and then a bell — and the bell read as a separate thing that had happened afterwards rather than as part of the same event. It is also the one sound here that is not something happening. The ball through the net is a noise the net makes. The chime is a machine congratulating you, and the score on the board has already done that. It is still there in the Game menu for anyone who wants the arcade back. And the toggle tells the truth. On a machine with no sound server it says so in as many words, takes its own tick off rather than claiming to work, and leaves the setting asking for sound — so the same copy on a machine that can play it starts making a noise again without anybody having to remember why it stopped. ------------------------------------------------------------------------------- THE GAMES ------------------------------------------------------------------------------- Seven of them. The aiming is the same in all seven and is yours to choose from the Aim menu; what changes is what ends the game, and where you are standing when you take the shot. RAPID FIRE — forty-five seconds The ball comes straight back the moment the outcome is known, rather than waiting for it to drop out of the net or finish rattling round the rim. The whole game is how many you can get away inside the clock. Every basket is worth two, flat: no double at the end, and no extra for a bank. Anything that makes one shot worth more than another is a reason to stop shooting and think, which is the opposite of the point of this one. It is the game Drift was built for — the crosshair wanders the square on its own and you press when you like the look of it, with no pulling and no second press. FRENZY — sixty seconds, and the last ten are doubled The same idea with a sting in the tail: everything scored in the final ten seconds counts twice, so a run at the end is worth more than a run at the start, and a miss with eight seconds left costs more than a miss with fifty. The scoreboard says DOUBLE while it is running. TWENTY-FIVE SHOTS — a straight twenty-five No clock at all. Twenty-five shots, and whatever they add up to. The one to play if you want to find out how good you actually are, because nothing is hurrying you and nothing is worth more than it should be. AROUND THE WORLD — seven spots along the floor Seven places across the front of the court, left to right. Make the shot and you move to the next one; miss and you stay where you are until you make it. Each one counts one, so the score is how far round you got, and finishing the seventh ends the game. AROUND THE 3 POINT LINE — any angle you like Played in Free 3D, and the angle you turn the court to is the angle you shoot from. Turn to the wing and the ball leaves from the wing; turn until the backboard is edge-on and you are shooting along the baseline, ninety degrees to the glass. Pinned to the arc the whole time, so every basket is a three. It sets the view and the aim itself — Free 3D, because no other view can say which way round the arc you are standing; and Arcade #2, so the crosshair wanders, never stops, and the pull runs upwards. AROUND THE ARC — the circuit, baseline to baseline The same shooting, made into a round. Seven places on the three-point line from one baseline to the other: ninety degrees, sixty, thirty, straight on, and back out the other side. Make one and it moves you to the next and turns the court to suit — you are never asked to find the spot yourself, because you would be shooting from somewhere you cannot see. Miss and you stay. Clear all seven and it is over. KNOCKOUT — until you miss It goes on for as long as you keep making them, and stops on the first one you do not. Nothing else ends it. A basket is two, off the glass is three — because that is a shot — and everything doubles in the last ten seconds of Frenzy. In Rapid fire everything is worth two flat: the game is how many, and anything that makes one shot worth more than another is a reason to stop shooting and think, which is the opposite of the point. A machine opponent takes alternate shots in the games with a fixed number of them. It plays the same game you do — it picks a spot, then it has to stop the lines — and its skill is how close it gets. Over twenty-five shots it averages twelve at easy, nineteen at fair and twenty at hard. ------------------------------------------------------------------------------- SHOOTING FROM ANYWHERE ON THE ARC ------------------------------------------------------------------------------- The two arc games are played in Free 3D, and the angle you turn the court to is the angle you shoot from. Turn to the wing and the ball leaves from the wing; turn until the backboard is edge-on and you are shooting along the baseline, ninety degrees to the glass. They select Free 3D themselves, because the other views cannot say which way round the arc you are standing — and they set the aim to Arcade #2, which is how they were asked for. Every shot is worked out in the shooter's own frame — across, along, up, with the ring straight ahead — and that frame is then turned about the ring to put it on the court. That is why this cost almost nothing: the ring is a circle, so every test against it reads the same whichever way you turn, and the arc, the power bar and the crosshair are the same arithmetic they always were. The backboard is the exception, and it is the interesting one. A board is not a circle; it faces one way. So the glass is the single thing checked where it actually is rather than in the shooter's frame, and the consequence falls straight out of the geometry rather than being written in. Counting the aims that bank in, from each angle: straight on 28 thirty degrees 24 sixty degrees 23 ninety degrees 9 From the corner the board is edge-on and there is almost nothing to bank off, exactly as on a real court. The table of what-scores-where is rebuilt for each angle and kept, rounded to five degrees. A table is two hundred and thirty-one real flights and about eighty milliseconds — nothing once, a stutter on every frame of a drag, and five degrees of stance moves a landing point by less than the table can see anyway. The circuit turns the camera itself rather than asking you to find the spot, because otherwise you would be shooting from a place you cannot see. ------------------------------------------------------------------------------- DRAWN, NOT PHOTOGRAPHED ------------------------------------------------------------------------------- One lamp over the court, and everything shaded against it. The floor is boards with the grain drawn in three dimensions so it converges the way the boards do; the glass is glass, with the room showing through it and a highlight down one side; the ring is a run of short arcs so it can be lit along the side the lamp is on, because a ring that is one colour all the way round is a circle rather than a tube; and the net is twelve strands that curve inwards and lift when a ball goes through. The ball has six things going on and every one is something a real ball does: the lit body, the soft band where the light gives out, light bouncing back up off the pale boards into its underside, a thin rim from the room behind it, a small hard highlight offset towards the lamp rather than centred, and the pebbling, which is what a basketball has instead of a polish and is why it never looks wet. The seams turn as it flies. ------------------------------------------------------------------------------- THE REST OF IT ------------------------------------------------------------------------------- The arc of the shot shown or not, as you like. The shaded patches that say where a shot would land, shown or not. Tickets, a prize wall, and best games kept with the date. Settings live in ~/.config/basketball/basketball.save. A setting in there of the wrong shape is ignored rather than fatal — a game that will not start because of one line in a save file is a worse outcome than a game that starts on its defaults. ------------------------------------------------------------------------------- KEYS ------------------------------------------------------------------------------- Space press, and hold-then-release to shoot ← → lean on the ball once it is in the air 1 2 3 4 from above, raked, from the line, free 3D S sound on or off (the ring, the chime and nothing-but-the-swoosh have their own switches in the Game menu) right drag turn the court round, in the views that turn wheel closer and further away Ctrl+N another game F1 how to play Esc out ------------------------------------------------------------------------------- RUNNING IT — NOTHING TO INSTALL ------------------------------------------------------------------------------- chmod +x Basketball.AppImage ./Basketball.AppImage Python, Qt and PySide6 all travel inside it. Nothing on the machine is used and nothing on the machine can conflict with it. On the command line: ./Basketball.AppImage --game rapid --aim quick ./Basketball.AppImage --version On a machine without FUSE, add --appimage-extract-and-run.
Skee Ball icon

Skee Ball$0.00

Open code, fair pay

The source stays open — free to read, build on and share. A price, where there is one, is not for the code as that is opensource. It is for the work around it: the servers and bandwidth that carry the download to you, and the hours a programmer spent designing, building, testing and looking after the app — hours that support them and the people they love, the same as any other profession in the workplace economy.

A share of what the paid apps earn goes back to the Linux and free-software projects they are built on. That community gave its work away so all of this should exist; paying the people who keep it alive is how it stays alive.

Anything marked $0.00 is exactly that — free, no asterisk.

The arcade alley game of Skee Ball, on a lane drawn with the program.

from LinuxDoors.com · created September 19, 2026

A LinuxDoors AppImage Software Product

↓  Download Skee_Ball.AppImage ↓  Source Download .tar.gz (235.2 KB) icon (.png) Version 0.2  ·  38.1 MB  ·  33 downloads  ·  single file, download and run
SHA256 53b908c4ac11eacbe32a01e87d13c386b120e9c992dbb1d2dd73cda6c3af141c
A skee ball lane with a targeter that tells the truth: two sweeping lines cross in a box in the corner of the screen, and wherever they cross is exactly where the ball lands -- the throw is solved backwards from that spot, not aimed and hoped. Six ways to use it, from a one-motion pull like a pool cue to a crosshair that never stops until the instant you let go. Power is the up-and-down half of the aim rather than a separate difficulty, so a green band on the power bar marks the exact speed the crosshair asked for. Real physics underneath -- a rolling ball's own share of climbing loss, a leaning sloped plate for landing detection, holes sized to the ball rather than by eye -- and every sound is worked out from the ball's own predicted flight and played just before it lands. Four game modes against a machine opponent with three honestly different skill levels, three camera views built from one shared drawing pass, and tickets and a prize wall to work towards. Nothing in it is a photograph: the maple lane, the ramp, the holes and the ball are all drawn against one overhead lamp.
chmod +x Skee_Ball.AppImage ./Skee_Ball.AppImage ./Skee_Ball.AppImage --game rush --aim classic ./Skee_Ball.AppImage --version # on LinuxDoors (no FUSE): ./Skee_Ball.AppImage --appimage-extract-and-run # or via linuxdoors-run-appimage, which unpacks it once rather than on every launch
LinuxDoors original. Built by LinuxDoors.com -- this is our own application, not a mirror and not a repackaging of somebody else's build. The SHA-256 above is authoritative. The third game for LinuxDoors: it carries its own Python and its own Qt, so it runs on a computer with nothing installed on it, and the lane, the physics, the targeter, and the sound are all the program's own code.

This is an early version

Version 0.1, and the second game LinuxDoors has. It is a whole game and it plays properly, but it is early, and there will be rough edges that only turn up once somebody other than its author is the one rolling the ball. Bug reports go to bugs-report-skee_ball@linuxdoors.com -- if a ball does something a ball should not do, please write and say what you did and what happened.

The targeter

Two lines at right angles, in a box in the corner of the screen -- one runs side to side and says where across the plate the ball will land, the other runs up and down and says how far up the slope. Where they cross is where the ball goes, with a miniature plate under the tracks showing which hole that is. It isn't drawn across the plate itself, on purpose: that would put a line through the one thing worth looking at. And it goes there -- the throw is solved backwards from the crossing, so the crosshair is a promise rather than a suggestion. Every one of 143 test aims spread over the whole plate landed in exactly the hole it was aimed at.

Six ways to use it

Pool (point at the plate and pull back, the way a cue works -- the one it starts on), Flick (flick up with the mouse and click to let go), Arcade (both lines at once, one press stops them, then throw), Arcade #2 (no lines at all -- the aim wanders on its own, hold and drag upwards to wind the throw up, and the aim is read at the instant you release), Classic (across first, then up, and it throws itself -- two timed presses, the way the video cabinets did it), Snap (both lines, one press, thrown for you -- the quickest and least forgiving), and Pitch (one line at a time, then throw it yourself). When both lines sweep at once they run at deliberately unrelated speeds and start at opposite ends of their tracks, so the fastest press isn't automatically the worst throw. Sweep speed -- gentle, normal, quick, unkind -- is the actual, honest difficulty control.

The throw, and why power is the height

Pull back with the mouse and let go, or hold Space and release. How hard you throw isn't a separate difficulty -- it's the up-and-down half of the aim, since on a real machine the ramp never moves and only speed decides whether a ball drops into the ten or sails into the fifty. The power bar stands upright beside the lane with a green band marking exactly the speed the crosshair asked for: pull to the band and the ball lands on the crossing, pull past it and it lands high, fall short and it lands low -- the same aim at 80% power lands fourteen inches lower on the plate.

Leaning on it, and the sound

Once the ball is rolling, moving the mouse or the arrow keys leans it left or right -- worth about six inches by the time it reaches the plate, enough to save a shot between neighboring holes without undoing a bad aim. Nothing about it is painted over the lane; what the lean is doing shows in the targeter box instead, and when a ball drops the whole plate lights up, gold for a hundred and green for the rest. Every sound -- the ball on the boards, the drop, the plate -- is synthesized rather than recorded and worked out from the ball's own predicted flight, called about 99ms ahead of contact so it lands on the ear exactly as the ball lands on the plate, not a beat behind.

Four games, a machine opponent, three views

Nine balls (the standard frame), Rush (90 seconds, get as many away as you can), Hundreds (nine balls, only the two corner holes count), and Knockout (goes until a ball scores nothing). A machine opponent takes alternate rolls in the fixed-count games, picking a hole and then having to stop the lines itself -- averaging a bit over 100 across nine balls at easy, about 350 at fair, and over 500 at hard. Three camera views share one camera and one drawing pass: from above (the plan), raked (standing at the machine, the one to play in), and a free 3D view you can drag around with the right mouse button, tipping and turning the machine itself rather than an abstract camera.

The physics

The ball rolls the lane losing a little to friction, climbs the ramp losing five-sevenths of what a sliding thing would lose (a rolling sphere's real share, since it carries energy in its spin too), leaves the lip at the ramp's own angle, and flies as ordinary ballistics onto a sloped plate. The holes are sized correctly -- a hole only takes a ball if the whole ball fits, which at true dimensions leaves under an inch of room in the fifty, exactly why the targeter has to tell the truth rather than approximate.

Running it -- nothing to install

Python, Qt and PySide6 all travel inside the AppImage -- nothing on the machine is used and nothing on the machine can conflict with it. Download it, make it executable, and run it: ./Skee_Ball.AppImage (add --game rush --aim classic to jump straight into a mode). On LinuxDoors, which has no FUSE, run it the way LinuxDoors runs any AppImage: ./Skee_Ball.AppImage --appimage-extract-and-run, or through linuxdoors-run-appimage, which does that for you and unpacks it once rather than on every launch.

Written for LinuxDoors, though nothing in it is specific to LinuxDoors -- it runs on Debian- and Ubuntu-type systems, and on any other Linux distribution that can run an AppImage.

=============================================================================== Skee Ball — for the LinuxDoors AppImage Store =============================================================================== Name: Skee Ball Version: 0.1 — AN EARLY VERSION Price: $0.00 Maker: LinuxDoors.com Games Created: September 19, 2026, 10:00 AM Kind: A LinuxDoors AppImage Software Product File: Skee_Ball.AppImage Size: 38,148,600 bytes (~38 MB) SHA256: 53b908c4ac11eacbe32a01e87d13c386b120e9c992dbb1d2dd73cda6c3af141c CHANGED, 3 OCTOBER 2026 -- FIXED: DID NOT START ON SOME REAL DESKTOPS On Linux Mint 22.3 and some Ubuntu-family desktops, this AppImage failed to open at all, printing "qt.qpa.plugin: ... xcb-cursor0 or libxcb-cursor0 is needed" and exiting. The AppImage bundles its own Qt, but was missing one small library (libxcb-cursor, plus its own two helper libraries) that Qt's screen code needs -- present on Debian and LinuxDoors by other means, but not installed by default on Mint or Ubuntu. That library is now bundled inside the AppImage itself, so it no longer depends on the host having it. Bug reports: bugs-report-skee_ball@linuxdoors.com CARD DESCRIPTION (the one line the store shows under the name) The arcade alley game of Skee Ball, on a lane drawn with the program. ------------------------------------------------------------------------------- THIS IS AN EARLY VERSION ------------------------------------------------------------------------------- Version 0.1, and the second game LinuxDoors has. It is a whole game and it plays properly, but it is early: there will be things in it that are wrong, and rough edges that only turn up once somebody other than its author is the one rolling the ball. That is what this address is for: bugs-report-skee_ball@linuxdoors.com If a ball does something a ball should not do, if the aim and the landing disagree, if it looks wrong or gets stuck or will not start — please write. Say what you did and what happened. ------------------------------------------------------------------------------- THE TARGETER ------------------------------------------------------------------------------- This is the whole game, so it is worth being plain about. Two lines at right angles to each other, in a box in the top corner of the window. One runs side to side and says where across the plate the ball will land; the other runs up and down and says how far up the slope it. Where they cross is where the ball goes, and the plate in miniature under the two tracks shows which hole that is. In the corner, and not drawn across the plate itself. On the plate the lines crossed the holes they were about to go into, which meant the one thing you most needed to see was the one thing with a line through it. While they sweep the machine is left clear; a quiet pip appears on the plate once the aim is settled, so there is something to look at while you wind up the throw. And it goes there. The throw is solved backwards from that crossing — the speed the ball must leave the lip at is worked out from where you asked it to come down — so the crosshair is a promise rather than a suggestion. Every one of a hundred and forty-three test aims spread over the whole plate landed in exactly the hole it was aimed at. All of the difficulty is in stopping the lines where you meant to, which is where it should be. Two lines rather than one, because one is not enough to describe the target. The fifty is straight ahead and the two hundreds are not: going up the plate gets you to the fifty, and only going up AND across gets you to a corner. A single sweeping line could never ask that question. ------------------------------------------------------------------------------- SIX WAYS TO USE IT ------------------------------------------------------------------------------- One of them has no sweeping at all, and the other four are two questions with two answers each: do the lines stop one at a time or together, and is the ball thrown for you or by you. Pool point at the plate and pull back, the way a cue works on a pool table. Aim and power in one movement instead of two, and the one it starts on. Flick flick up with the mouse and click to let go. Arcade both lines at once, one press, then you throw it. Arcade #2 no lines and no stopping: the aim wanders about the plate on its own. Hold and drag *upwards* to wind the throw up, and let go when it is over the hole you want — the aim is read at the instant you release. Classic across first, then up, and it throws itself. Two timed presses, the way the video cabinets did it. Snap both lines, one press, thrown for you. The quickest and the least forgiving. Pitch one line at a time, then throw it yourself. The slowest to aim and the hardest to finish. When both lines run at once they run at deliberately unrelated speeds. Two sweeps at the same rate fall into step and the crossing walks a straight diagonal, which anybody learns in about four throws and is then not a game. They also start at opposite ends of their tracks. Started together at the near end, every quick press gave the same short throw — so the fastest thing a player could do was also the worst throw on the plate, which is the wrong lesson for a machine to teach. How fast they sweep is yours: gentle, normal, quick or unkind. That is the difficulty, and it is the honest place to put it — the machine is not secretly deciding whether you deserve the fifty. ------------------------------------------------------------------------------- THE THROW, AND WHY THE POWER IS THE HEIGHT ------------------------------------------------------------------------------- Pull back with the mouse and let go. Hold Space and release, if you would rather not use the mouse. How hard you throw is not a second difficulty bolted on beside the aim. It *is* the up-and-down half of the aim. On a real machine the ramp never moves, and the only thing deciding whether a ball drops into the ten or sails into the fifty is how fast it is going when it leaves the lip. So the power bar stands up beside the lane rather than lying along the bottom, and it has a green band marked on it. That band is exactly the speed the crosshair asked for. Pull to the band and the ball lands on the crossing. Pull past it and it lands high; fall short and it lands low — measurably so: the same aim thrown at eighty per cent power comes down fourteen inches lower on the plate. The bar is the z axis of the throw, stood on end where you can see it. Pulling to the band and landing on the crossing are then the same action rather than two separate things to learn. ------------------------------------------------------------------------------- LEANING ON IT ------------------------------------------------------------------------------- Once the ball is on its way, move the mouse left or right and it leans that way. Arrow keys do the same. This is not a second go at the aim, and it deliberately does not happen during the wind-up. The lines were stopped, the ball was thrown, and this is what a person's body does afterwards. It is worth six inches by the time the ball reaches the plate — the ball spends the best part of a second on the boards before it leaves the lip, and a lean that cannot be felt in that time may as well not be there. Six inches moves a ball between neighbouring holes, which is a real save; it does not reach from the middle of the plate to a hundred eleven inches out, so the lines still have to be stopped somewhere sensible. Nothing about it is painted over the machine. The lane is the thing to be watching while a ball is rolling, and a banner across the foot of it is in the way of the one moment the game is actually happening. What the lean is doing shows in the targeter box instead. And when a ball drops, the whole plate lights up — gold for a hundred, green for the rest. A machine that scores is supposed to be pleased about it, and a glow round one hole is a notification where this wants to be a reaction. ------------------------------------------------------------------------------- THE NOISE IT MAKES ------------------------------------------------------------------------------- There is not a recording anywhere in the program, for the same reason there is not a photograph. The ball on the boards is filtered noise, low and rough, because a maple lane under a three pound ball is the loudest thing in an arcade and the least like a tone. The drop is the lip of the hole and the net behind it, layered. The plate is wood struck and left to stop almost at once, which is what a dished face does. Five sounds. How loud each one is comes from how hard the ball arrived, so a ball that just reaches the fifty and one that slams into it are not the same noise. It does not use Qt for any of it. QtMultimedia is not in the runtime these programs are packaged on, and putting it there drags in a media stack several times the size of the game in order to play five noises. Instead the mixing happens in the game and the result goes down one pipe to whatever the desktop already plays sound with — pipewire, pulse or alsa, whichever is there. And the pipe is deliberately tiny — four kilobytes, which is one page and the smallest a pipe can be. Left at the default sixty-four it holds a second and a half of audio, so the mixer fills it once and from then on every sound arrives a second and a half after the thing that made it. Even a tenth of a second is visible, though, so the sound is not triggered by the event: it is worked out *before* it. A ball in the air is in free flight and free flight has a closed form — the plate is a plane, the moment the ball crosses it is the root of a quadratic, and where on the plate it will be when it gets there is two multiplications. Measured at every hole on the plate, the noise is called 99 ms ahead of the contact, which is exactly what the pipe swallows. Sound the lot, on or off (S) Chime when it scores the bright one after the drop, on its own Nothing but the drop the ball going in, and silence everywhere else ------------------------------------------------------------------------------- THE GAMES ------------------------------------------------------------------------------- Nine balls the standard frame, and whatever nine of them add up to Rush ninety seconds, and as many as you can get away Hundreds nine balls, and only the two corner holes count at all Knockout it goes on until a ball scores nothing, and then it stops A machine opponent will take alternate rolls in the frames that have a fixed number of them. It plays the same game you do: it picks a hole, and then it has to stop the lines, and its skill is entirely how close it gets. At easy it averages a bit over a hundred across nine balls, at fair about three hundred and fifty, and at hard a little over five hundred — and it visibly nearly-misses in the same way a person does, because it is missing in the same way. ------------------------------------------------------------------------------- THREE VIEWS ------------------------------------------------------------------------------- 1 From above the plan, and the easiest to read the plate in 2 Raked standing at the machine, which is the one to play in 3 Free 3D the same again from wherever you drag it to Hold the right button in Free 3D and drag, and the machine turns under you. Dragging takes hold of the machine rather than of the camera — pull the near edge downwards and the lane tips towards you, so you end up looking from higher up; pull it up and you drop towards the floor. Sideways turns it. The wheel goes closer and further away. Doing it in either of the other two quietly switches to Free 3D rather than doing nothing, because somebody dragging with the right button is asking to look around and the honest answer is to let them. The plan is the one view that never turns: it is the plan, and it stops being the plan the moment it can be nudged off square. The eye can be dragged from eight degrees below the horizontal to eighty-four above. Not to the floor, because from there the plate is edge-on and the holes close to nothing, which is a view of a plank; and not to straight down, where the arithmetic for which way is up stops having an answer. All three are one camera and one lot of drawing code, so the ball is where the physics says it is in every one of them rather than in three places that have to be kept agreeing. The plate leans back rather than standing up. That is how the machines are built, and it is also the only way the view from straight above is any use: a plate standing upright is edge-on from up there and collapses to a line, which is a picture of nothing. ------------------------------------------------------------------------------- DRAWN, NOT PHOTOGRAPHED ------------------------------------------------------------------------------- There is not a photograph or a sprite anywhere in the program. The maple is grain made out of smoothed noise and drawn board by board; the ramp is painted as strips across the lane so each one can be shaded for the angle the boards are at just there, which is why it looks round instead of looking like a wedge with a picture of wood on it; the holes are a mouth, a rim lit on the side the lamp is on, a net and a dark inside; and the cabinet is cut and lit in code. One lamp hangs over the lane, and everything is shaded against that one light. One light consistently applied is most of what makes a drawn thing look like a photographed one — far more than detail is. The ball has six things going on and every one of them is something a real ball does: the lit body, the soft band where the light gives out (never a hard line on something round), warm light bouncing back up off the pale boards into its underside, a thin bright rim from the room behind it, a small hard highlight that is the actual reflection of the lamp and is offset towards it rather than centred, and fine speckle, because a composite ball is not poured plastic. Its shadow spreads and fades as the ball rises, because the same darkness is being shared over more floor. Drawn rather than fetched means it is sharp at any size and there is no folder of pictures to lose. ------------------------------------------------------------------------------- THE PHYSICS ------------------------------------------------------------------------------- The ball rolls the length of the lane losing a little to friction, climbs the ramp losing a little more to the climb — five sevenths of what a sliding thing would lose, which is a solid sphere's share, because a rolling ball carries energy in its spin as well as its motion — leaves the lip at the angle the ramp is built at, and flies. The flight is ordinary ballistics. The plate it comes down on leans, so "has it arrived" is which side of a sloping plane the ball is on rather than how far up the lane it has got, checked either side of every step so that a fast ball cannot be past the plate before anything has looked. Reading the equation the other way — speed in, place on the plate out — is done by halving rather than by algebra. With the ramp and the plate both at forty-five degrees the two happen to cancel and the answer is a straight line, but that is a coincidence of two numbers that are meant to be adjustable, and an equation that is only right while nobody touches them is a trap rather than a saving. The holes are a shade larger than an alley machine's. A hole takes a ball only if the whole ball fits, so what you are aiming at is the hole less one ball — and at true dimensions that leaves about three quarters of an inch of room in the fifty, which is unplayable when the aiming is a sweeping line rather than your own arm. ------------------------------------------------------------------------------- THE REST OF IT ------------------------------------------------------------------------------- Tickets. Every frame pays out the way an alley does — one for every ten points and five more for each hundred, because the corners are the ones people remember. They add up across sessions and the prize wall says what the tin is worth, from a paper fortune fish at forty to the enormous bear nobody has ever won at twenty-five thousand. Best frames, kept with the date. Maple, oak or walnut, if you would rather the lane were darker. The arc the ball will take, shown or not, as you like. Settings, tickets and best frames live in ~/.config/skee_ball/skee_ball.save. Deleting that file puts everything back as it started. ------------------------------------------------------------------------------- KEYS ------------------------------------------------------------------------------- Space press, and hold-then-release to throw S sound on or off 1 2 3 from above, raked, free 3D right drag turn the machine round, in Free 3D wheel closer and further away Ctrl+N another frame F1 how to play Esc out ------------------------------------------------------------------------------- RUNNING IT — NOTHING TO INSTALL ------------------------------------------------------------------------------- chmod +x Skee_Ball.AppImage ./Skee_Ball.AppImage Python, Qt and PySide6 all travel inside it. Nothing on the machine is used and nothing on the machine can conflict with it. On the command line: ./Skee_Ball.AppImage --game rush --aim classic ./Skee_Ball.AppImage --version On a machine without FUSE, add --appimage-extract-and-run.
Bowling icon

Bowling$0.00

Open code, fair pay

The source stays open — free to read, build on and share. A price, where there is one, is not for the code as that is opensource. It is for the work around it: the servers and bandwidth that carry the download to you, and the hours a programmer spent designing, building, testing and looking after the app — hours that support them and the people they love, the same as any other profession in the workplace economy.

A share of what the paid apps earn goes back to the Linux and free-software projects they are built on. That community gave its work away so all of this should exist; paying the people who keep it alive is how it stays alive.

Anything marked $0.00 is exactly that — free, no asterisk.

Ten pins and ten frames, on a lane drawn with the program.

from LinuxDoors.com · created September 19, 2026

A LinuxDoors AppImage Software Product

↓  Download Bowling.AppImage ↓  Source Download .tar.gz (185.4 KB) icon (.png) Version 0.2  ·  38.1 MB  ·  32 downloads  ·  single file, download and run
SHA256 810746fbf65db177ac29803500fe796773819321aa194bcef02d4f56557b587d
A lane, ten pins and ten frames. Point down the lane and pull back to roll -- one movement, the way the cue works on the pool table -- or pick one of the sweeping-line arcade aim modes instead. The pace is a real choice: slower gives the ball longer to hook, faster hits harder, and the hook itself belongs to the player, not the ball -- move the mouse or the arrow keys while it rolls and it bends, but a ball left alone arrives exactly on the line it was shown. The pins are real bodies, not footprints: each one has a foot and a head, topples about its base like an inverted pendulum, and where the ball strikes decides whether a pin slides into its neighbour or goes over. Real sound -- five noises worked out rather than sampled, including a room built from Schroeder's own 1962 reverberator so the crash of ten pins actually sounds like a building answering rather than a chair leg dropped in a cupboard. Ten pin, nine pin no-tap, and best-of-three, against a machine opponent at three honest skill levels, in three camera views built from one shared drawing pass. Nothing in it is a photograph -- the lane, the pins and the ball are all drawn against one overhead lamp.
chmod +x Bowling.AppImage ./Bowling.AppImage ./Bowling.AppImage --game nofuss ./Bowling.AppImage --version # on LinuxDoors (no FUSE): ./Bowling.AppImage --appimage-extract-and-run # or via linuxdoors-run-appimage, which unpacks it once rather than on every launch
LinuxDoors original. Built by LinuxDoors.com -- this is our own application, not a mirror and not a repackaging of somebody else's build. The SHA-256 above is authoritative. It carries its own Python and its own Qt, so it runs on a computer with nothing installed on it, and the lane, the pins, the physics, the scoring and the opponent are all the program's own code.

This is an early version

Version 0.1. It is a whole game and it plays properly, but it is early -- there will be things in it that are wrong. That is what the bug address is for -- bugs-reports-bowling@linuxdoors.com. If a ball or a pin does something it should not do, please write and say what you did and what happened.

Aiming, and rolling it

Point down the lane and the ball goes there -- a dashed line shows the line it will take, with a ring where it crosses the arrows, which is the board a bowler would actually call out loud. Pull back and let go, one movement, the way the cue works on the pool table, and that is what the game starts on. Sweeping-line arcade aim modes are in the Aim menu for anyone who wants them, including Arcade #2, which never locks -- the line wanders on two sines of unrelated speed, and the board is read at the instant you let go, so the pull is not a job done in peace. Only one line, not two: bowling has one thing to aim, where across the lane, and how far is answered by pace instead.

The pace is a choice

The green band on the power bar marks the pace that carries best -- marked, not enforced, because pace is a real decision. Slower gives the ball longer to bend, so more hook; faster bends it less and hits harder. That trade is in the arithmetic rather than bolted on: how far a lean moves the ball is divided by how fast it is going, since a sideways push does more to a path the longer the ball is under it.

The hook is yours

Move the mouse or the arrow keys left or right while the ball is rolling and it curves that way -- that is the whole of the hook, and it belongs to the player rather than the ball on purpose. A hook built into the ball would mean the line shown was never the line delivered; keep your hands still and the ball arrives exactly where the line said, and every inch of bend after that is something you did.

The pins

A pin has a body, not a footprint -- fifteen inches of wood on a two inch foot, carrying a tilt and a line from foot to head that everything touching it actually touches. The ball against a pin is a sphere against that segment; a pin against a pin is one segment against another, walked rather than solved. Where the ball strikes matters as much as that it strikes -- a hit low drives a pin along the deck, the same hit high takes the head out from under it. Once a pin is leaning, gravity finishes the job like an inverted pendulum, going over past forty-five degrees with nothing bringing it back. Two numbers -- how much pace a pin takes, and how slick the deck is -- decide whether any of it feels like bowling; thirty-two pairs were tried before landing on the one where a slow ball tops out and a fast one carries. And the strike is not down the middle -- a ball straight at the head pin leaves six or seven standing, the same as on a real lane, because the pocket falls out of where the pins actually are.

The noise it makes

Five sounds, worked out rather than sampled, the same discipline as the sound in Pool Table. The ball down the boards is low, rough and long; the channel is hollower and higher, the sound of a ball that has already failed. The crash is four things at once -- a burst of hard broadband for the strike itself, the boom of the deck and the pit underneath, the wood of the pins in the middle, and forty small knocks crowded into the first quarter second, because ten pins do not fall at once. The whole of it sits in a room built from Schroeder's own 1962 reverberator arrangement (four feedback combs, two allpass filters, deliberately unrelated delays) so the crash rings the way a real alley -- boards, block, a high ceiling, nothing soft anywhere -- actually answers, rather than sounding like a chair leg dropped in a cupboard. How loud each sound is comes from how hard the thing arrived, so a trickled pocket hit and a full-speed strike are never the same noise. Sound is a toggle (Game menu, or S), and it tells the truth on a machine with no sound server rather than pretending to work.

The scoring

Ten frames, done properly -- a strike is ten plus the next two balls, a spare is ten plus the next one, and the tenth frame gives the extra balls to finish those with. Checked against the cases that catch programs out: twelve strikes is 300, ten five-and-fives is 150, nine-and-miss ten times is 90, three strikes then nothing is 60. Ten pin is the game itself; Nine pin no-tap counts a nine as a strike, the way some leagues really play it (twelve nines is 279); Best of three runs three racks and keeps only the best one.

Drawn, not photographed

One lamp, and everything shaded against it. The lane is thirty-nine boards drawn one at a time, each a shade different from its neighbour, with the oil shining down the middle two thirds and fading before the pins. A pin is a turned profile -- foot, waist, belly, neck, head -- drawn along its own axis wherever that axis happens to point, rather than as an upright shape that gets shorter. The ball takes a long smear of the lights above the lane rather than one round dot, and its finger holes turn with it. The lane itself is thirty feet rather than a real sixty, so the pins -- which are the game -- read clearly instead of shrinking to specks at the vanishing point; the hook rates are scaled to match, so a full hook still bends the same real distance at every pace regardless of lane length.

The rest of it

Three views share one camera -- from above, raked, and a free 3D view you can drag around with the right mouse button, tipping and turning the lane itself rather than an abstract camera; dragging in either of the other two views quietly switches to Free 3D rather than doing nothing. A machine opponent bowls alternate frames at easy, fair or hard. Maple, oak or walnut lanes. Tickets, a prize wall, and best games kept with the date. Settings live in ~/.config/bowling/bowling.save.

Running it -- nothing to install

Python, Qt and PySide6 all travel inside the AppImage -- nothing on the machine is used and nothing on the machine can conflict with it. Download it, make it executable, and run it: ./Bowling.AppImage (add --game nofuss to start a no-tap game directly). On LinuxDoors, which has no FUSE, run it the way LinuxDoors runs any AppImage: ./Bowling.AppImage --appimage-extract-and-run, or through linuxdoors-run-appimage, which does that for you and unpacks it once rather than on every launch.

Written for LinuxDoors, though nothing in it is specific to LinuxDoors -- it runs on Debian- and Ubuntu-type systems, and on any other Linux distribution that can run an AppImage.

=============================================================================== Bowling — for the LinuxDoors AppImage Store =============================================================================== Name: Bowling Version: 0.1 — AN EARLY VERSION Price: $0.00 Author: LinuxDoors.com Created: September 19, 2026, 1:18 PM Kind: A LinuxDoors AppImage Software Product File: Bowling.AppImage Size: 38,128,120 bytes (~38 MB) SHA256: 810746fbf65db177ac29803500fe796773819321aa194bcef02d4f56557b587d CHANGED, 3 OCTOBER 2026 -- FIXED: DID NOT START ON SOME REAL DESKTOPS On Linux Mint 22.3 and some Ubuntu-family desktops, this AppImage failed to open at all, printing "qt.qpa.plugin: ... xcb-cursor0 or libxcb-cursor0 is needed" and exiting. The AppImage bundles its own Qt, but was missing one small library (libxcb-cursor, plus its own two helper libraries) that Qt's screen code needs -- present on Debian and LinuxDoors by other means, but not installed by default on Mint or Ubuntu. That library is now bundled inside the AppImage itself, so it no longer depends on the host having it. Bug reports: bugs-reports-bowling@linuxdoors.com CARD DESCRIPTION (the one line the store shows under the name) A lane, ten pins and ten frames, drawn with the program. ------------------------------------------------------------------------------- THIS IS AN EARLY VERSION ------------------------------------------------------------------------------- Version 0.1. It is a whole game and it plays properly, but it is early. bugs-reports-bowling@linuxdoors.com If a ball or a pin does something it should not, please write. Say what you did and what happened. ------------------------------------------------------------------------------- AIMING, AND ROLLING IT ------------------------------------------------------------------------------- Point down the lane and the ball goes there. The dashed line is the line it will take, and the green ring on it is the arrow it crosses — which is the board a bowler would actually call out loud. Then pull back and let go. One movement, the way a cue works on the pool table, and it is what the game starts on. There are sweeping-line modes in the Aim menu for anyone who wants the arcade version instead. **Arcade #2** is the one that does not stop. The line does not sweep there: it *wanders* across the lane on two sines of unrelated speed, and it never locks. Hold and drag upwards to wind the pace up, and the board is read at the instant you let go — so the pull is not a job done in peace, it is the thing you are doing while the board you wanted walks out from under it. It is the hardest of the modes, because it is the only one where hesitating costs something. The pull runs the other way in it, down to up. Dragging back to roll harder is how a cue works, and a cue is drawn back; an arm that rolls a ball down a lane swings forward. When the wind-up happens while the line is moving, the hand going the same way as the ball is the one you do not have to think about. Only one line, not two. Bowling has one thing to aim — where across the lane — and the second question the other games in this set ask, how far, is answered by the pace instead. A second sweeping line would be a gauge for a decision nobody has to make. ------------------------------------------------------------------------------- THE PACE IS A CHOICE ------------------------------------------------------------------------------- The green band on the bar is the pace that carries best. It is marked and not enforced, because pace is a real decision: slower the ball has longer to bend, so more hook faster it bends less, and hits harder That trade is in the arithmetic rather than bolted on: how far a lean moves the ball is divided by how fast it is going, because a sideways push does more to a path the longer the ball is under it, and that is the length of the lane over the pace. ------------------------------------------------------------------------------- THE HOOK IS YOURS ------------------------------------------------------------------------------- Move the mouse left or right while the ball is rolling and it curves that way. Arrow keys do the same. That is the whole of the hook. It belongs to you rather than to the ball, deliberately. A hook built into the ball would mean the line you were shown was never the line you got, and a targeter that says where the ball is going has to be telling the truth or it is decoration. Keep your hands still and the ball arrives exactly where the line said; every inch of bend after that is something you did. ------------------------------------------------------------------------------- THE PINS ------------------------------------------------------------------------------- This is the part that had to be right, because the whole game is what the pins do to each other. A pin has a body, not a footprint. It is fifteen inches of wood standing on a two inch foot, and every interesting thing that happens on a lane happens because of that: it topples about its base, its head travels further and faster than its foot, and what it takes out on the way down is whatever its head reaches. So each one carries a tilt — how far over it is, and which way it is going — and its body is the line from its foot to its head. Everything that touches a pin touches that line. The ball against a pin is a sphere against that segment; a pin against a pin is one segment against another, walked rather than solved because the closed form has half a dozen degenerate cases and each one is a way to divide by nothing on a frame nobody is watching. Where the ball strikes matters as much as that it strikes. A hit low drives a pin along the deck; the same hit high takes the head out from under it and the pin goes over — so how far up the pin the contact happened is worked out and used, because that is the difference between a pin that slides into its neighbour and one that topples across two of them. Once a pin is leaning, gravity finishes the job. A falling pin is an inverted pendulum: the further over it is the faster it goes over, which is why a clipped pin hesitates and then drops rather than easing to the floor. Past forty-five degrees it is going over and nothing is bringing it back, which is the honest place to call it down. They were circles that slid, once. Ten pins would shove each other about the deck like curling stones and the drawing flattened them where they stood, which is the single most obvious way for a game to say "this is a picture". Two numbers decide whether any of that feels like bowling: how much of the ball's pace a pin takes, and how slick the deck is. Left light, every pin the ball touched slid off the back whatever speed it arrived at, and a ten mile an hour ball knocked down exactly what a twenty did — which is not bowling. Thirty-two pairs were tried. At the pair in there now, a slow ball tops out at nine and a fast one carries, which is the difference everybody who has ever bowled knows about. And the strike is not down the middle. A ball straight at the head pin leaves six or seven standing here, the same as it does on a real lane; the pocket is about three inches either side of centre. Nobody put that in — it falls out of the pins being where pins are. ------------------------------------------------------------------------------- THE NOISE IT MAKES ------------------------------------------------------------------------------- There is not a recording anywhere in the program, for the same reason there is not a photograph. Five sounds, worked out rather than sampled. The ball down the boards is low, rough and long, because sixteen pounds of resin on maple is the loudest thing in the building and the least like a tone. The channel is hollower and higher — a gutter is a trough and rings where boards do not, and it is the sound of a ball that has already failed. The crash is the biggest noise the game has and the one worth getting right, because it is the sound anybody who has been to an alley knows. It is four things at once: a few milliseconds of hard broadband for the strike itself; the boom of the deck and the pit under it, low and slow to die, which is the part you feel; the wood of the pins in the middle; and forty small knocks over the following second and a quarter, laid out so they crowd into the first quarter — because ten pins do not fall at once and the deck is loudest at the start. And then the whole of it is put in the room, which is the part that was missing and was the whole of what was missing. An alley is a long hard shed — boards, block, a ceiling a long way up, nothing soft anywhere — and the crash of a ball into ten pins is mostly the building answering. Dry, the same partials sounded like a chair leg dropped in a cupboard. The room is four feedback combs and two allpass filters, Schroeder's arrangement from 1962, with the comb delays deliberately not multiples of each other: delays that divide into one another line their echoes up and the result rings on a note instead of decaying into noise. The crash now stays above a tenth of its peak for 1.24 seconds where it used to be finished in 0.4. The pins and the ball are in the same room, more faintly. Without that the clacks sit in front of the crash rather than inside it, which is the giveaway that they were made separately. A pin against a pin is short, hollow and quite high, because a pin is a turned shell rather than a block — and ten of them going over is that sound a dozen times in half a second, which is what a strike actually sounds like. Nothing is scheduled to make it happen: it falls out of the pins hitting each other. How loud each one is comes from how hard the thing arrived, so a ball that trickles into the pocket and one that comes in at speed are not the same noise, and a pin clipped on the way past is not the same as one driven across the deck. It does not use Qt for any of it. QtMultimedia is not in the runtime these programs are packaged on, and putting it there drags in a media stack several times the size of the game in order to play five noises. The mixing happens in the game and the result goes down one pipe to whatever the desktop already plays sound with — pipewire, pulse or alsa, whichever is there. The pipe is set to four kilobytes, one page and the smallest a pipe can be: left at the default sixty-four it holds a second and a half of audio, and every sound would arrive a second and a half after the thing that made it. Sound is a toggle — in the Game menu, or the S key. Off closes the pipe rather than muting it: a game that is not making a noise should not be holding the sound device open either. And it tells the truth — on a machine with no sound server it says so in as many words and takes its own tick off, leaving the setting asking for sound, so the same copy elsewhere starts making a noise again without anybody having to remember why it stopped. ------------------------------------------------------------------------------- THE SCORING ------------------------------------------------------------------------------- Ten frames, done properly: a strike is ten and the next two balls, a spare is ten and the next one, and the tenth gives you the extra balls to finish those with. Checked against the cases that catch programs out — twelve strikes is 300, ten five-and-fives is 150, nine-and-miss ten times is 90, three strikes then nothing is 60. Ten pin the game Nine pin no-tap nine counts as a strike; the leagues really do play it, and twelve nines is 279 Best of three three racks, only the best one counts ------------------------------------------------------------------------------- DRAWN, NOT PHOTOGRAPHED ------------------------------------------------------------------------------- One lamp, and everything shaded against it. The lane is thirty-nine boards drawn one at a time, each a shade different from its neighbour the way a real floor is, with the oil shining down the middle two thirds and fading before the pins. Boards rather than one brown rectangle because a lane *is* boards — it is what bowlers count in and what the arrows point at — and because the seams running away to a point are most of what makes a lane look as long as it is. The seven arrows sit further down the lane the further out they are, which is how they are laid. A pin is a turned profile — foot, waist, belly, neck, head — because that silhouette is what makes it recognisable from the other end of an alley. It is drawn along its own axis wherever that axis happens to point, rather than as an upright shape that gets shorter: one lying on the deck pointing away from you is a stubby oval, one lying across the lane is its full length side on, and one caught half over is somewhere between. The two red stripes travel with the body and turn with it rather than staying level. The ball takes a long smear of the lights above the lane rather than one round dot, which is the thing that says polished, and its three finger holes turn with it — the only way to show a bowling ball rolling instead of sliding. Behind the pins the pit is dark with a strip of light under the masking unit, which is what you see at the end of a real lane. The lane is thirty feet, not sixty. A real one is sixty, and at sixty the pins are ten white specks at the vanishing point in any view that also shows where you are standing — and the pins are the game. Halved, the whole machine reads. The hook is scaled to suit, which is the part that would have gone wrong quietly. The bend is the lean times the time under it, and the time is the length over the pace — so on a lane half as long the same lean bends the ball half as far. The rates are quoted for a sixty foot lane and scaled to whatever lane they are used on, so a full hook still bends it the same twenty-six inches at every pace. The view still sits up the lane rather than at the foul line, and that was measured again rather than assumed. Fit all thirty feet into the window and the pins are 3.6 pixels across; at the crop it uses they are 23. Twenty-two feet gives 6.6, eighteen gives 13.5. ------------------------------------------------------------------------------- THE REST OF IT ------------------------------------------------------------------------------- Three views: from above, raked, and free 3D, all one camera. Hold the right button in Free 3D and drag, and the lane turns under you. Dragging takes hold of the lane rather than of the camera — pull the near end downwards and it tips towards you, so you end up looking from higher up; pull it up and you drop towards the boards. Sideways swings it round the pins. The wheel goes closer and further away. Doing it in either of the other two quietly switches to Free 3D rather than doing nothing, because somebody dragging with the right button is asking to look around and the honest answer is to let them. The plan is the one view that never turns: it is the only one where the line to the pocket is a line rather than a vanishing point, and it stops being that the moment it can be nudged off square. The eye can be dragged from four degrees above the boards to eighty-four. Not to deck level, where the pins are edge-on and stand in front of each other — a view of one pin; and not to straight down, where the arithmetic for which way is up stops having an answer. A machine opponent at easy, fair or hard, bowling alternate frames. Maple, oak or walnut. Tickets, a prize wall, and best games kept with the date. Settings live in ~/.config/bowling/bowling.save. ------------------------------------------------------------------------------- KEYS ------------------------------------------------------------------------------- Space hold and release to roll S sound on or off ← → hook the ball while it is rolling 1 2 3 from above, raked, free 3D right drag turn the lane round, in Free 3D Ctrl+N another game wheel closer and further away F1 how to play Esc out ------------------------------------------------------------------------------- RUNNING IT — NOTHING TO INSTALL ------------------------------------------------------------------------------- chmod +x Bowling.AppImage ./Bowling.AppImage Python, Qt and PySide6 all travel inside it. Nothing on the machine is used and nothing on the machine can conflict with it. On the command line: ./Bowling.AppImage --game nofuss ./Bowling.AppImage --version On a machine without FUSE, add --appimage-extract-and-run.