OurPoker (ourapps-ae/ourpoker) 0.5.2 A complete Texas hold'em game for two to nine players: phones, tablets, computers, the web and a television as a shared table, optional video, computer players, lessons, rebuys and rising blinds. Category: games Tags: cards, multiplayer, poker, texas-holdem, tournament Targets: client web, ios, android, macos, windows, tvos; server hosting-provider, own-hardware Publisher: George McIntyre (george-mcintyre) Source: ourapps-ae/ourpoker-recipe release v0.5.2 Digest: sha256:2f9804a5b6a4439d3f30f9193e7c5bf2ce5712d12c268e8be0d32812701c3375 Bundle: ourpoker-0.5.2.tar sha256:2f9804a5b6a4439d3f30f9193e7c5bf2ce5712d12c268e8be0d32812701c3375 Bundle download: GET https://ourapps.app/api/recipes/ourpoker/0.5.2/bundle returns a link valid for one hour Build it (aepm, Python 3.12, Node.js, Graphviz) 1. git clone https://github.com/ourapps-ae/aepm && export PYTHONPATH=$PWD/aepm 2. python3 -m aepm fetch ourpoker@0.5.2 --with-dependencies --store store (downloads the recipe and the component it prefers for each slot, checks each sha256 digest and the signatures) 3. python3 -m aepm questions ourpoker@0.5.2 --store store (the questions as JSON; answer from the person's description, ask the rest) 4. write answers.json (question id to answer), then: python3 -m aepm design ourpoker@0.5.2 --store store --answers answers.json --out definition.json another component of a slot's class instead of the preferred one: python3 -m aepm alternatives ourpoker@0.5.2 SLOT --store store lists the components that fit, then python3 -m aepm design ourpoker@0.5.2 --store store --answers answers.json --substitute SLOT=NAME@VERSION --out definition.json 5. python3 -m aepm resolve definition.json --catalogue store/catalogue.json --out lock.json 6. make the owner policy: Level N's release and guardian keys from https://ourapps.app/policy/levelnpolicy.json plus your own owner key (python3 -m aepm.test_identities DIR makes a disposable one); INSTRUCTIONS.md in the recipe archive shows how 7. python3 -m aepm install definition.json --lock lock.json --store store --policy policy.json --target app 8. build and run: section "Build and run" of INSTRUCTIONS.md in the recipe archive (local: cd app/server && npm ci && npm start, then cd app/web && npm ci && npm run dev) Page: https://ourapps.app/recipes/ourpoker; JSON: https://ourapps.app/api/recipes/ourpoker/0.5.2 What you download The recipe itself: source code and a form, in one archive file, not a link to code elsewhere. - Recipe: recipe.json holds the questions it asks, its slots (for each, the class of component it needs and the component it prefers, by exact version), the settings that connect them, the choice of providers by size, and the tested answer sets. - Application code: The recipe's own application-specific component: the screens, artwork, sounds, translated text, rules and end-to-end tests that belong to this application and to no other. - Instructions: INSTRUCTIONS.md tells an agent how to answer the questions and what each answer changes, and tells the developer which accounts are needed. - Not included: The components that fill its slots. Each is a separate download, fetched by exact version and checked against its digest. The archive is a release file on the publisher's public GitHub repository. ourapps keeps this page's details and a pointer to the release; it does not hold or run the code. The digest is the sha256 fingerprint of the archive. aepm checks it before anything is copied. Installing copies the listed files into your application and runs none of the package's code. Diagram: https://ourapps.app/api/recipes/ourpoker/0.5.2/diagram.svg Description # OurPoker A complete Texas hold'em game with two tables of two to nine players each. People play on phones, tablets, computers or the web; a television or any shared screen shows the public table; players can see and hear each other by video; computer players can fill empty seats; play has decision clocks, rising blinds and rebuys; and the game speaks English, French, German and Spanish. ## Who it is for A group that wants its own poker night without accounts or an app store: a book club, a club's league night, a poker league, a company event. The group's developer owns the accounts and the server; nothing runs on our platform. ## Devices Web, iPhone and iPad, Android, Mac, Windows and Apple TV. Each is a switch; the devices question decides which are built. The television shows the public table only and cannot act or see private cards. ## House rules by default Two to nine players at a table, 5,000 chips each, blind levels of 10 minutes that double after level 16, 30 seconds to act before the game checks or folds, one rebuy of 5,000 chips until level 3, side pots, no-limit betting. ## The questions An agent answers them from your description and asks you only what it cannot infer; the server location is always asked. Fourteen are the main questions; fourteen follow-ups, most asked only when they apply (a web address, a bundle identifier, the server address after the first deploy, whether builds are published, the GitHub repository for the code, whether GitHub Actions build releases, the video service address, the store invitation, and the references to your hosting account and, only when publishing, your video, store, Android and web deployment secrets). Building and running it on your own machine needs no secret at all. 1. Which devices? (any of web, ios, android, macos, windows, tvos) 2. How many people play at the same time? (small: up to 10; medium: 11 to 100; large: 101 to 1,000) 3. Which languages? (en, fr, de, es) 4. Which look? (night: dark green felt and striped card backs; lounge: warm brown and plain card backs; for the whole application) 5. How many players per table? (2 to 9; there are always two tables, so at most 18 play at once and anyone else watches) 6. Starting chips? (5,000) 7. How long is each blind level? (600 seconds) 8. How many rebuys? (1, until level 3) 9. Decision time? (30 seconds, then check or fold) 10. Computer players? (none; on request; or fill empty seats, so one person can start alone; on request) 11. Video and audio between players? (yes) 12. Lessons for new players? (yes) 13. Where does the server run? (Cloudflare or your own hardware) 14. Offer updates through ourapps.app? (no) ## What the answers choose - Devices include or leave out the web, Apple, Android and Windows hosts. - Lessons, video and updates each include or leave out their component. Computer players are in the design unless the answer is none; the answer sets their mode (on request or fill empty) and none leaves out computer-players and poker-strategy. - The scale answer chooses, per job, the cheapest candidate whose declared load covers it: small and medium use Cloudflare's free tier and LiveKit's free plan; large uses the paid Cloudflare plan and LiveKit's Ship plan. Your own hardware is the other server choice; with it the scale changes only the video plan. - Chips, level length, rebuys, decision time and player count set the settings of the components that own them and the matching numbers of the house rules file, with no code change. ## What it needs from you - A Cloudflare account, or a machine of your own, for the server. - An Apple developer membership for iPhone, iPad, Mac and Apple TV builds. - A LiveKit Cloud account if video is on. - A GitHub account: the code goes to a private repository of yours. - Signing and deployment keys for the targets you publish, kept as the repository's secrets. Secrets are given by reference only; no key is written into the recipe, the answers or the application. ## Components 39 components in five groups (delivery and hosts; rooms, people and sessions; turn-based game framework; poker; interface and presentation) plus the recipe's own application-specific component: screen flow, artwork, text in four languages, lessons and end-to-end tests. Thirty-five of the 39 have nothing to do with poker. The diagram names every component, grouped, with the connections of the default design; store-update is dashed because it is present only when updates is yes. Each component sits in a slot named after it: the slot's class is what the recipe relies on (the interfaces it connects and the settings it writes), and the component named is the one the recipe prefers. Any catalogue component of the same class can take its place: `aepm alternatives ourpoker@ ` lists them and `aepm design ... --substitute =@` uses one. `ourapps-ae/theme-high-contrast`, for example, fills the `theme` slot with high-contrast night and lounge looks. ## Building it With aepm and the published catalogue: `aepm fetch ourpoker@0.5.2 --with-dependencies --store STORE`, then read the recipe's INSTRUCTIONS.md from the fetched archive: ``` python3 -c 'import json,sys,tarfile; s,v=sys.argv[1:]; d=next(e["digest"] for e in json.load(open(s+"/catalogue.json"))["entries"] if e["name"]=="ourapps-ae/ourpoker" and e["version"]==v); sys.stdout.write(tarfile.open(f"{s}/objects/{d}.tar").extractfile("INSTRUCTIONS.md").read().decode())' STORE 0.5.2 > INSTRUCTIONS.md ``` It takes you through `aepm questions`, `aepm design`, `aepm resolve` and `aepm install`, then the build and run commands for each device. ### Repository and releases The installed application goes to your GitHub repository (the agent proposes `/ourpoker`, made private): ``` git init -b main && git add -A && git commit -m "OurPoker from ourapps-ae/ourpoker " gh repo create / --private --source . --push ``` When builds are published (or the releases answer is yes), the installation also holds GitHub Actions: checks of the server, web, Android and Windows parts on every push, and a release workflow. `git tag v0.1.0 && git push --tags` builds the web client, the Android APK and the Windows installer and publishes a GitHub Release with `my-app.json`, the file ourapps.app reads to offer the app. Signing and deployment keys are repository secrets you set yourself with `gh secret set`, named from your reference answers (INSTRUCTIONS.md lists every name); without them the Android build is signed with a temporary key, the Windows installer is unsigned and the web client is released as `web.zip`. Registering the app on ourapps.app is optional. ## Tested answer sets The default answers, `book-club`, `poker-league`, `company-event`, `company-event-hosted`, `tv-only`, `browser-only-no-extras`, `large-paid-host`, `clinic`, `no-computers`, `web-own-hardware`, `native-no-lessons`, `local-web`, `fill-empty-own-hardware`, `lounge-web-ios` and `windows-only`; every combination of devices, video, lessons, updates, publishing, computer players, server and scale is checked to give a complete design. ## Status Version 0.5.2. Installed with `aepm install` from signed packages and built and run with the recipe's own install proof and by fresh agents following INSTRUCTIONS.md: - Server on Node and on Cloudflare Workers (deployed, two-step with the web client on its own worker); the web client in a browser, locally and deployed: a player sits, a computer player joins and a hand is dealt. - iPhone and iPad, Mac (Mac Catalyst) and Apple TV apps built for their simulators and Mac; the Android app built, unit-tested and played to a dealt hand on the emulator; the Windows installer built, installed, played and uninstalled on a Windows PC. - GitHub: every workflow green and a tagged release carrying the web bundle, the Android app, the Windows installer and `my-app.json`. - Substitution: the `theme` slot filled with `ourapps-ae/theme-high-contrast`. Not run: signed Android, Windows and Apple builds; App Store, TestFlight and store publishing; video with a real LiveKit account and keys. The open items are in `INTEGRATION-GAPS.md`. Questions (28) - targets (set): Which devices should the game run on? options: web, ios, android, macos, windows, tvos default: ["web","ios","android","macos","windows","tvos"] agent: Infer from the request (phone, tablet, television, computer, browser); ask only if no device is named. sets ourapps-release.targets to the answer sets apple-host.targets to the answer - webAddress (text): At which web address will the web version be served? default: http://localhost:5173 asked only when targets includes web; otherwise it takes its default agent: Ask only when the web is a target; keep http://localhost:5173 for local use, otherwise the developer's own https address (the server refuses a plain http origin other than localhost). sets web-host.webAddress to the answer sets application.webAddress to the answer sets server-host.allowedOrigins to the answer sets invitations.inviteAddress to the answer - bundleId (text): Which bundle identifier should the phone, tablet, television and Mac apps carry (for example com.yourname.poker)? Leave empty to use the one the application derives. default: agent: Leave empty unless the developer names one; the application derives app.ourapps.. sets apple-host.bundleIdentifier to the answer sets android-host.packageId to the answer sets ourapps-release.bundleIdentifier to the answer sets application.packageId to the answer - scale (choice): How many people will play at the same time, at most? options: small, medium, large default: small agent: People at the same time, not seats: up to 10 small, 11 to 100 medium, over 100 large. It sizes the server and video plans only: the game always has two tables of up to 9 seats, so at most 18 play at once and the rest watch. Tell the person when the group is over 18. - languages (set): Which languages should the game speak? options: en, fr, de, es default: ["en","fr","de","es"] agent: Use the languages the request names; otherwise keep all four. sets translations.languages to the answer sets application.languages to the answer - look (choice): Which look should the game have: night (dark green felt, gold, striped card backs) or lounge (warm brown, plain card backs)? options: night, lounge default: night agent: The look of the whole application on every device: both rooms, every screen, the felt and the card backs. Pick night (dark) or lounge (warm) from any style the request gives; otherwise keep night. sets theme.themeName to the answer sets card-graphics.backStyle to {"map":{"night":"stripes","lounge":"plain"}} sets application.look to the answer sets application.cardBack to {"map":{"night":"stripes","lounge":"plain"}} - players (integer): What is the largest number of players at one table (2 to 9)? range: 2 to 9 default: 9 agent: Seats at one table. There are always two tables (Casino and Home), each up to this number, so at most twice it play at once (18 with 9) and everyone else watches. About a dozen: 9, or 6 for two even tables. Over 18 people: tell the person some will watch. sets seating.maximumPlayers to the answer sets holdem-rules.seats to the answer sets chip-ledger.seats to the answer sets room-directory.roomCapacity to the answer sets application.maximumPlayers to the answer - startingChips (integer): How many chips does each player start with? range: 100 to 1000000 default: 5000 agent: Use the number in the request; keep 5000 if unstated. sets tournament.startingStack to the answer sets tournament.rebuyStack to the answer sets application.startingStack to the answer - levelSeconds (integer): How many seconds does each blind level last? range: 60 to 3600 default: 600 agent: Convert minutes to seconds; keep 600 (10 minutes) if unstated. sets level-schedule.levelSeconds to the answer sets application.levelSeconds to the answer - rebuys (integer): How many rebuys may each player take (0 for none)? range: 0 to 5 default: 1 agent: Use 0 if the request says no rebuys; keep 1 (until level 3) if unstated. sets tournament.rebuysPerPlayer to the answer sets application.rebuysPerPlayer to the answer - decisionSeconds (integer): How many seconds does a player have to act before the game checks or folds for them? range: 5 to 300 default: 30 agent: Keep 30 unless the request names a pace. sets game-clock.decisionSeconds to the answer sets turn-engine.decisionSeconds to the answer sets application.decisionSeconds to the answer - computerPlayers (choice): Computer players? none: never; on-request: a person adds them, and one plays for anyone away; fill-empty: as on-request, and when one person (or more) presses Start, computers take every empty seat. options: none, on-request, fill-empty default: on-request agent: on-request unless the request says people only (none) or asks for full tables or playing alone against the computer (fill-empty: one person can press Start alone and the table fills). sets computer-players.mode to the answer sets application.computerPlayers to the answer - video (boolean): Should players see and hear each other by video? default: true agent: No if the request says no video or the people share a room; when yes the developer supplies the video service address and the key and secret by reference. - videoServiceUrl (text): What is the web address of your LiveKit video service (leave empty to set it later)? default: asked only when video is yes; otherwise it takes its default agent: Ask only when video is on; the developer's own LiveKit address, never invented. sets video-calls.serviceUrl to the answer - videoKey (secretRef): Under which name is the video service API key kept in your secret store? default: asked asked only when (video is yes) and (publish is yes); otherwise it takes its default agent: Ask only when video is on and builds are published; a reference name, never the key. Locally the server reads LIVEKIT_URL, LIVEKIT_API_KEY and LIVEKIT_API_SECRET from its environment instead. sets video-calls.keyReference to {"ref":"videoKey"} - videoSecret (secretRef): Under which name is the video service API secret kept in your secret store? default: asked asked only when (video is yes) and (publish is yes); otherwise it takes its default agent: Ask only when video is on and builds are published; a reference name, never the secret. Locally the server reads LIVEKIT_URL, LIVEKIT_API_KEY and LIVEKIT_API_SECRET from its environment instead. sets video-calls.secretReference to {"ref":"videoSecret"} - lessons (boolean): Should the game teach new players with step-by-step lessons? default: true agent: Yes unless the request says players already know the game. - server (choice): Where should the server run: on a hosting provider (Cloudflare) or on your own hardware? options: cloudflare, own-hardware default: asked agent: Ask the developer; never guess a hosting account. cloudflare needs the developer's Cloudflare account; own-hardware needs a machine. The cost and size of the choice are picked from the scale answer. - hostingAccount (secretRef): Under which name is your Cloudflare account kept in your secret store? default: asked asked only when server is cloudflare; otherwise it takes its default agent: Ask only when the server runs on Cloudflare; a reference name (lowercase letters, digits, hyphens), never a key. Deploying from a computer uses the wrangler login; the name only chooses the GitHub secrets the release workflow deploys the server with. sets server-host.accountReference to {"ref":"hostingAccount"} sets ourapps-release.hostingAccount to {"ref":"hostingAccount"} - serverAddress (text): At which address does the server answer? Keep http://localhost:8788 until the server is deployed; after the first deploy, give the address it reports. default: http://localhost:8788 agent: Keep http://localhost:8788 for local use and for the first install; after the server is deployed, answer with its https address (Cloudflare reports it, own hardware is the developer's own) and rebuild the clients. Never guess a domain. sets application.serverAddress to the answer - updates (boolean): Should installed apps offer new versions through ourapps.app? default: false agent: No unless the request mentions updates or keeping the app current. sets application.updatesEnabled to the answer - publish (boolean): Will builds be signed and published (web hosting, Android and Apple stores, updates through ourapps.app)? default: false agent: No for building and running it locally or on the developer's own machine; yes only when the request is to publish. Every signing and deployment reference is asked only when this is yes. GitHub builds and releases without store publishing is releases yes, publish no. - repository (text): In which GitHub repository should the application's code go (owner/name)? Leave empty for your own account and the name ourpoker. default: agent: The repository the developer names, else /ourpoker (the login from `gh api user -q .login`); created private when it does not exist (INSTRUCTIONS.md part 4, Repository and releases). owner/name: letters, digits, hyphens, underscores. sets ourapps-release.repository to {"template":"https://github.com/{{answer}}"} sets ourapps-release.manifestUrl to {"template":"https://api.github.com/repos/{{answer}}/releases/latest"} - releases (boolean): Should GitHub Actions check every change and publish a release for each version tag? (Publishing builds always sets this up.) default: false agent: Yes when GitHub should build, check and release each version: GitHub builds and releases without store publishing is releases yes, publish no (publish yes sets it up whatever this answer is). It uses the repository's Actions minutes. - storeInvitation (text): What is your ourapps.app store invitation link (leave empty to set it later)? default: asked only when updates is yes; otherwise it takes its default agent: Ask only when updates are on; the developer's own link, never invented. sets store-update.inviteAddress to the answer sets application.inviteAddress to the answer - storeCredentials (secretRef): Under which name are your app store credentials kept in your secret store? default: asked asked only when (publish is yes) and ((updates is yes) or (targets includes ios)); otherwise it takes its default agent: Ask only when builds are published and updates are on or iPhone and iPad is a target (the release pipeline has no store call and no iOS job without it); a reference name, never the credentials. sets ourapps-release.storeCredentials to {"ref":"storeCredentials"} - androidSigning (secretRef): Under which name is your Android signing key kept in your secret store? default: asked asked only when (publish is yes) and (targets includes android); otherwise it takes its default agent: Ask only when builds are published and Android is a target; a reference name, never the key. sets ourapps-release.androidSigning to {"ref":"androidSigning"} - webDeploy (secretRef): Under which name is your web deployment key kept in your secret store? default: asked asked only when (publish is yes) and (targets includes web); otherwise it takes its default agent: Ask only when builds are published and the web is a target; a reference name, never the key. sets ourapps-release.webDeploy to {"ref":"webDeploy"} Slots (39): each needs a component of its class; the preferred component fills it unless another component that fits the class is substituted - slot web-host (only when (targets includes web) or (targets includes windows)) class: provides ae/web-shell 1.0.0; requires ae/theme 1.0.0; settings applicationId string (slug), always written, applicationName string (label), always written, backgroundColour string (identifier), always written, shortName string (label), always written, themeColour string (identifier), always written, webAddress string (address), always written preferred: ourapps-ae/web-host 0.5.0 (https://ourapps.app/components/web-host.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: web-host profile any: cost none; load none; regions any; compliance none other components of this class (0): https://ourapps.app/components?provides=ae%2Fweb-shell python3 -m aepm alternatives ourpoker@0.5.2 web-host --store store - slot apple-host (only when (targets includes ios) or (targets includes macos) or (targets includes tvos)) class: provides ae/apple-shell 1.0.0; requires ae/theme 1.0.0; settings bundleIdentifier string (qualified), always written, displayName string (label), always written, scheme string (identifier), always written, targets string (label), always written preferred: ourapps-ae/apple-host 0.6.0 (https://ourapps.app/components/apple-host.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: apple-host profile any: cost none; load none; regions any; compliance none other components of this class (0): https://ourapps.app/components?provides=ae%2Fapple-shell python3 -m aepm alternatives ourpoker@0.5.2 apple-host --store store - slot android-host (only when targets includes android) class: provides ae/android-shell 1.0.0; requires ae/theme 1.0.0; settings applicationName string (label), always written, packageId string (qualified), always written preferred: ourapps-ae/android-host 0.5.0 (https://ourapps.app/components/android-host.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: android-host profile any: cost none; load none; regions any; compliance none other components of this class (0): https://ourapps.app/components?provides=ae%2Fandroid-shell python3 -m aepm alternatives ourpoker@0.5.2 android-host --store store - slot windows-desktop (only when targets includes windows) class: provides ae/desktop-host 1.0.0; requires none; settings none preferred: ourapps-ae/windows-desktop 0.6.0 (https://ourapps.app/components/windows-desktop.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: windows-desktop profile any: cost none; load none; regions any; compliance none other components of this class (0): https://ourapps.app/components?provides=ae%2Fdesktop-host python3 -m aepm alternatives ourpoker@0.5.2 windows-desktop --store store - slot server-host class: provides ae/server-host 1.0.0; requires ae/room-directory 1.0.0, ae/room-session 1.0.0; settings accountReference string (slug), allowedOrigins string (address), always written, provider string (slug), always written, roomPrefix string (slug), always written preferred: ourapps-ae/server-host 0.6.0 (https://ourapps.app/components/server-host.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: server-host profile cloudflare-free: cost free; load requestsPerDay 100000, storedMegabytes 5000; regions any, eu, us, fedramp; compliance none; Cloudflare Workers with SQLite-backed Durable Objects Workers Free profile cloudflare-paid: cost metered; load none; regions any, eu, us, fedramp; compliance none; Cloudflare Workers with SQLite-backed Durable Objects Workers Paid profile own-hardware: cost none; load none; regions any; compliance none; Node http server on the owner's machine own hardware other components of this class (0): https://ourapps.app/components?provides=ae%2Fserver-host python3 -m aepm alternatives ourpoker@0.5.2 server-host --store store - slot ourapps-release (only when (publish is yes) or (releases is yes)) class: provides ae/release-pipeline 1.0.0; requires none; settings androidSigning string (slug), applicationId string (slug), always written, applicationName string (label), always written, bundleIdentifier string (qualified), always written, hostingAccount string (slug), manifestUrl string (address), repository string (address), storeCredentials string (slug), targets string (label), always written, webDeploy string (slug) preferred: ourapps-ae/ourapps-release 0.5.0 (https://ourapps.app/components/ourapps-release.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: ourapps-release profile any: cost none; load none; regions any; compliance none other components of this class (0): https://ourapps.app/components?provides=ae%2Frelease-pipeline python3 -m aepm alternatives ourpoker@0.5.2 ourapps-release --store store - slot store-update (only when updates is yes) class: provides ae/updates 1.0.0; requires none; settings inviteAddress string (address) preferred: ourapps-ae/store-update 0.6.0 (https://ourapps.app/components/store-update.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: store-update profile any: cost none; load none; regions any; compliance none other components of this class (0): https://ourapps.app/components?provides=ae%2Fupdates python3 -m aepm alternatives ourpoker@0.5.2 store-update --store store - slot realtime-rooms class: provides ae/room-session 1.0.0; requires ae/game-adapter 1.0.0, ae/guest-identity 1.0.0; settings none preferred: ourapps-ae/realtime-rooms 0.7.0 (https://ourapps.app/components/realtime-rooms.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: realtime-rooms profile free: cost free; load requestsPerDay 100000, storedMegabytes 5000; regions any; compliance none; Cloudflare Workers and Durable Objects (SQLite-backed) Workers Free profile paid: cost metered; load none; regions any; compliance none; Cloudflare Workers and Durable Objects (SQLite-backed) Workers Paid profile own-hardware: cost none; load none; regions any; compliance none; Own hardware running the room code on Node through server-host own-hardware other components of this class (0): https://ourapps.app/components?provides=ae%2Froom-session python3 -m aepm alternatives ourpoker@0.5.2 realtime-rooms --store store - slot room-directory class: provides ae/room-directory 1.0.0; requires ae/room-session 1.0.0; settings roomCapacity integer, always written preferred: ourapps-ae/room-directory 0.5.0 (https://ourapps.app/components/room-directory.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: room-directory profile any: cost none; load concurrentPeople 1000; regions any; compliance none; any durable-object runtime any other components of this class (0): https://ourapps.app/components?provides=ae%2Froom-directory python3 -m aepm alternatives ourpoker@0.5.2 room-directory --store store - slot guest-identity class: provides ae/guest-identity 1.0.0; requires none; settings none preferred: ourapps-ae/guest-identity 0.6.0 (https://ourapps.app/components/guest-identity.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: guest-identity profile any: cost none; load none; regions any; compliance none; any storage any other components of this class (0): https://ourapps.app/components?provides=ae%2Fguest-identity python3 -m aepm alternatives ourpoker@0.5.2 guest-identity --store store - slot presence class: provides ae/presence 1.0.0; requires ae/guest-identity 1.0.0; settings awayAfterSeconds integer, always written, dropAfterSeconds integer, always written, hostAbsentRule string (identifier), always written preferred: ourapps-ae/presence 0.5.0 (https://ourapps.app/components/presence.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: presence profile any: cost none; load none; regions any; compliance none other components of this class (0): https://ourapps.app/components?provides=ae%2Fpresence python3 -m aepm alternatives ourpoker@0.5.2 presence --store store - slot invitations class: provides ae/invitations 1.0.0; requires none; settings codeLength integer, always written, inviteAddress string (address), always written preferred: ourapps-ae/invitations 0.3.0 (https://ourapps.app/components/invitations.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: invitations profile any: cost none; load none; regions any; compliance none other components of this class (0): https://ourapps.app/components?provides=ae%2Finvitations python3 -m aepm alternatives ourpoker@0.5.2 invitations --store store - slot private-views class: provides ae/private-views 1.0.0; requires none; settings none preferred: ourapps-ae/private-views 0.5.0 (https://ourapps.app/components/private-views.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: private-views profile any: cost none; load none; regions any; compliance none other components of this class (0): https://ourapps.app/components?provides=ae%2Fprivate-views python3 -m aepm alternatives ourpoker@0.5.2 private-views --store store - slot display-mode class: provides ae/display-policy 1.0.0; requires none; settings none preferred: ourapps-ae/display-mode 0.6.0 (https://ourapps.app/components/display-mode.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: display-mode profile any: cost none; load none; regions any; compliance none other components of this class (0): https://ourapps.app/components?provides=ae%2Fdisplay-policy python3 -m aepm alternatives ourpoker@0.5.2 display-mode --store store - slot video-calls (only when video is yes) class: provides ae/media-session 1.0.0; requires none; settings keyReference string (identifier), secretReference string (identifier), serviceUrl string (address) preferred: ourapps-ae/video-calls 0.6.0 (https://ourapps.app/components/video-calls.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: video profile free: cost free; load concurrentPeople 100; regions any; compliance none; LiveKit Cloud Build profile paid: cost paid; load concurrentPeople 1000; regions any; compliance none; LiveKit Cloud Ship profile scale: cost paid; load concurrentPeople 5000; regions any; compliance none; LiveKit Cloud Scale other components of this class (0): https://ourapps.app/components?provides=ae%2Fmedia-session python3 -m aepm alternatives ourpoker@0.5.2 video-calls --store store - slot preferences class: provides ae/preferences 1.0.0; requires none; settings defaultCameraOn boolean, always written, defaultMicrophoneOn boolean, always written, defaultSound boolean, always written preferred: ourapps-ae/preferences 0.3.0 (https://ourapps.app/components/preferences.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: preferences profile any: cost none; load none; regions any; compliance none other components of this class (0): https://ourapps.app/components?provides=ae%2Fpreferences python3 -m aepm alternatives ourpoker@0.5.2 preferences --store store - slot turn-engine class: provides ae/game-adapter 1.0.0; requires ae/computer-players 1.0.0 (optional), ae/game-clock 1.0.0, ae/game-rules 1.0.0, ae/presence 1.0.0, ae/private-views 1.0.0, ae/round-history 1.0.0, ae/rules-settings 1.0.0, ae/seating 1.0.0, ae/tournament 1.0.0; settings decisionSeconds integer, always written, lobbyDropSeconds integer, always written, settleMs integer, always written, staleMinutes integer, always written, standingsSeconds integer, always written preferred: ourapps-ae/turn-engine 0.6.0 (https://ourapps.app/components/turn-engine.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: turn-engine profile any: cost none; load none; regions any; compliance none other components of this class (0): https://ourapps.app/components?provides=ae%2Fgame-adapter python3 -m aepm alternatives ourpoker@0.5.2 turn-engine --store store - slot game-clock class: provides ae/game-clock 1.0.0; requires none; settings decisionSeconds integer, always written preferred: ourapps-ae/game-clock 0.5.0 (https://ourapps.app/components/game-clock.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: game-clock profile any: cost none; load none; regions any; compliance none other components of this class (0): https://ourapps.app/components?provides=ae%2Fgame-clock python3 -m aepm alternatives ourpoker@0.5.2 game-clock --store store - slot seating class: provides ae/seating 1.0.0; requires ae/guest-identity 1.0.0; settings hostRemovesPeople boolean, always written, maximumPlayers integer, always written preferred: ourapps-ae/seating 0.5.0 (https://ourapps.app/components/seating.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: seating profile any: cost none; load none; regions any; compliance none other components of this class (0): https://ourapps.app/components?provides=ae%2Fseating python3 -m aepm alternatives ourpoker@0.5.2 seating --store store - slot fair-shuffle class: provides ae/random-source 1.0.0; requires none; settings source string (slug), always written preferred: ourapps-ae/fair-shuffle 0.5.0 (https://ourapps.app/components/fair-shuffle.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: fair-shuffle profile any: cost none; load none; regions any; compliance none other components of this class (0): https://ourapps.app/components?provides=ae%2Frandom-source python3 -m aepm alternatives ourpoker@0.5.2 fair-shuffle --store store - slot card-deck class: provides ae/card-deck 1.0.0; requires ae/random-source 1.0.0; settings decks integer, always written, jokers boolean, always written preferred: ourapps-ae/card-deck 0.5.0 (https://ourapps.app/components/card-deck.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: card-deck profile any: cost none; load none; regions any; compliance none other components of this class (0): https://ourapps.app/components?provides=ae%2Fcard-deck python3 -m aepm alternatives ourpoker@0.5.2 card-deck --store store - slot computer-players (only when computerPlayers is not none) class: provides ae/computer-players 1.0.0; requires ae/game-clock 1.0.0, ae/player-strategy 1.0.0, ae/seating 1.0.0; settings minimumGapMs integer, always written, mode string (label), always written, names string (label), always written, rebuyDelayMs integer, always written, thinkMinMs integer, always written, thinkSpreadMs integer, always written preferred: ourapps-ae/computer-players 0.6.0 (https://ourapps.app/components/computer-players.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: computer-players profile any: cost none; load none; regions any; compliance none other components of this class (0): https://ourapps.app/components?provides=ae%2Fcomputer-players python3 -m aepm alternatives ourpoker@0.5.2 computer-players --store store - slot chip-ledger class: provides ae/chip-ledger 1.0.0; requires none; settings seats integer, always written preferred: ourapps-ae/chip-ledger 0.6.0 (https://ourapps.app/components/chip-ledger.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: chip-ledger profile any: cost none; load none; regions any; compliance none other components of this class (0): https://ourapps.app/components?provides=ae%2Fchip-ledger python3 -m aepm alternatives ourpoker@0.5.2 chip-ledger --store store - slot level-schedule class: provides ae/level-schedule 1.0.0; requires none; settings levelSeconds integer, always written preferred: ourapps-ae/level-schedule 0.5.0 (https://ourapps.app/components/level-schedule.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: level-schedule profile any: cost none; load none; regions any; compliance none other components of this class (0): https://ourapps.app/components?provides=ae%2Flevel-schedule python3 -m aepm alternatives ourpoker@0.5.2 level-schedule --store store - slot tournament class: provides ae/tournament 1.0.0; requires ae/chip-ledger 1.0.0, ae/level-schedule 1.0.0, ae/seating 1.0.0; settings rebuyStack integer, always written, rebuysPerPlayer integer, always written, startingStack integer, always written, tiebreak string (identifier), always written preferred: ourapps-ae/tournament 0.5.0 (https://ourapps.app/components/tournament.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: tournament profile any: cost none; load none; regions any; compliance none other components of this class (0): https://ourapps.app/components?provides=ae%2Ftournament python3 -m aepm alternatives ourpoker@0.5.2 tournament --store store - slot round-history class: provides ae/round-history 1.0.0; requires none; settings maxRounds integer, always written preferred: ourapps-ae/round-history 0.5.0 (https://ourapps.app/components/round-history.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: round-history profile any: cost none; load none; regions any; compliance none other components of this class (0): https://ourapps.app/components?provides=ae%2Fround-history python3 -m aepm alternatives ourpoker@0.5.2 round-history --store store - slot rules-settings class: provides ae/rules-settings 1.0.0; requires none; settings rulesFile string (slug), always written, strict boolean, always written preferred: ourapps-ae/rules-settings 0.5.0 (https://ourapps.app/components/rules-settings.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: rules-settings profile any: cost none; load none; regions any; compliance none other components of this class (0): https://ourapps.app/components?provides=ae%2Frules-settings python3 -m aepm alternatives ourpoker@0.5.2 rules-settings --store store - slot poker-hand-ranking class: provides ae/hand-ranking 1.0.0; requires ae/card-deck 1.0.0; settings none preferred: ourapps-ae/poker-hand-ranking 0.5.0 (https://ourapps.app/components/poker-hand-ranking.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: poker-hand-ranking profile any: cost none; load none; regions any; compliance none other components of this class (0): https://ourapps.app/components?provides=ae%2Fhand-ranking python3 -m aepm alternatives ourpoker@0.5.2 poker-hand-ranking --store store - slot poker-odds class: provides ae/poker-odds 1.0.0; requires ae/card-deck 1.0.0, ae/hand-ranking 1.0.0; settings cacheSize integer, always written, sampleBoards integer, always written preferred: ourapps-ae/poker-odds 0.5.0 (https://ourapps.app/components/poker-odds.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: poker-odds profile any: cost none; load none; regions any; compliance none other components of this class (0): https://ourapps.app/components?provides=ae%2Fpoker-odds python3 -m aepm alternatives ourpoker@0.5.2 poker-odds --store store - slot holdem-rules class: provides ae/game-rules 1.0.0; requires ae/card-deck 1.0.0, ae/chip-ledger 1.0.0, ae/hand-ranking 1.0.0, ae/level-schedule 1.0.0, ae/rules-settings 1.0.0; settings revealAtRunout boolean, always written, seats integer, always written preferred: ourapps-ae/holdem-rules 0.5.0 (https://ourapps.app/components/holdem-rules.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: holdem-rules profile any: cost none; load none; regions any; compliance none other components of this class (0): https://ourapps.app/components?provides=ae%2Fgame-rules python3 -m aepm alternatives ourpoker@0.5.2 holdem-rules --store store - slot poker-strategy (only when computerPlayers is not none) class: provides ae/player-strategy 1.0.0; requires ae/hand-ranking 1.0.0, ae/poker-odds 1.0.0; settings aggression integer, always written, difficulty integer, always written preferred: ourapps-ae/poker-strategy 0.5.0 (https://ourapps.app/components/poker-strategy.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: poker-strategy profile any: cost none; load none; regions any; compliance none other components of this class (0): https://ourapps.app/components?provides=ae%2Fplayer-strategy python3 -m aepm alternatives ourpoker@0.5.2 poker-strategy --store store - slot theme class: provides ae/theme 1.0.0; requires none; settings themeName string (slug), always written preferred: ourapps-ae/theme 0.5.0 (https://ourapps.app/components/theme.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: theme profile any: cost none; load none; regions any; compliance none other components of this class (1): https://ourapps.app/components?provides=ae%2Ftheme python3 -m aepm alternatives ourpoker@0.5.2 theme --store store - slot controls class: provides ae/controls 1.0.0; requires ae/theme 1.0.0; settings none preferred: ourapps-ae/controls 0.5.0 (https://ourapps.app/components/controls.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: controls profile any: cost none; load none; regions any; compliance none other components of this class (0): https://ourapps.app/components?provides=ae%2Fcontrols python3 -m aepm alternatives ourpoker@0.5.2 controls --store store - slot table-layout class: provides ae/table-layout 1.0.0; requires ae/controls 1.0.0, ae/theme 1.0.0; settings none preferred: ourapps-ae/table-layout 0.5.0 (https://ourapps.app/components/table-layout.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: table-layout profile any: cost none; load none; regions any; compliance none other components of this class (0): https://ourapps.app/components?provides=ae%2Ftable-layout python3 -m aepm alternatives ourpoker@0.5.2 table-layout --store store - slot card-graphics class: provides ae/card-graphics 1.0.0; requires ae/theme 1.0.0; settings backStyle string (identifier), always written, cardWidth integer, always written, cornerStyle string (identifier), always written preferred: ourapps-ae/card-graphics 0.5.0 (https://ourapps.app/components/card-graphics.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: card-graphics profile any: cost none; load none; regions any; compliance none other components of this class (0): https://ourapps.app/components?provides=ae%2Fcard-graphics python3 -m aepm alternatives ourpoker@0.5.2 card-graphics --store store - slot chip-graphics class: provides ae/chip-graphics 1.0.0; requires ae/theme 1.0.0; settings chipColours string (label), always written, denominations string (label), always written preferred: ourapps-ae/chip-graphics 0.5.0 (https://ourapps.app/components/chip-graphics.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: chip-graphics profile any: cost none; load none; regions any; compliance none other components of this class (0): https://ourapps.app/components?provides=ae%2Fchip-graphics python3 -m aepm alternatives ourpoker@0.5.2 chip-graphics --store store - slot sound-cues class: provides ae/sound-cues 1.0.0; requires ae/preferences 1.0.0; settings defaultMuted boolean, always written, soundManifest string (slug), always written preferred: ourapps-ae/sound-cues 0.5.0 (https://ourapps.app/components/sound-cues.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: sound-cues profile any: cost none; load none; regions any; compliance none other components of this class (0): https://ourapps.app/components?provides=ae%2Fsound-cues python3 -m aepm alternatives ourpoker@0.5.2 sound-cues --store store - slot guided-tour (only when lessons is yes) class: provides ae/guided-tour 1.0.0; requires ae/controls 1.0.0, ae/language 1.0.0, ae/preferences 1.0.0; settings none preferred: ourapps-ae/guided-tour 0.5.0 (https://ourapps.app/components/guided-tour.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: guided-tour profile any: cost none; load none; regions any; compliance none other components of this class (0): https://ourapps.app/components?provides=ae%2Fguided-tour python3 -m aepm alternatives ourpoker@0.5.2 guided-tour --store store - slot translations class: provides ae/language 1.0.0; requires none; settings languages string (label), always written preferred: ourapps-ae/translations 0.6.0 (https://ourapps.app/components/translations.txt) guardians: Level N Ltd (guardian key 08775f20) suitable for jobs: translations profile any: cost none; load none; regions any; compliance none other components of this class (0): https://ourapps.app/components?provides=ae%2Flanguage python3 -m aepm alternatives ourpoker@0.5.2 translations --store store Choosing by suitability Scale question: scale - band small: small: up to 10 people at the same time; load concurrentPeople 10, requestsPerDay 2000, storedMegabytes 100 - band medium: medium: 11 to 100 people at the same time; load concurrentPeople 100, requestsPerDay 50000, storedMegabytes 1000 - band large: large: 101 to 1,000 people at the same time; load concurrentPeople 1000, requestsPerDay 1000000, storedMegabytes 10000 - job server fills slot server-host (the answer to server restricts the candidates first): ourapps-ae/server-host (cloudflare-free), ourapps-ae/server-host (cloudflare-paid), ourapps-ae/server-host (own-hardware) - job realtime fills slot realtime-rooms (the answer to server restricts the candidates first): ourapps-ae/realtime-rooms (free), ourapps-ae/realtime-rooms (paid), ourapps-ae/realtime-rooms (own-hardware) - job video fills slot video-calls: ourapps-ae/video-calls (free), ourapps-ae/video-calls (paid), ourapps-ae/video-calls (scale) Connections (application is the recipe's own component) - theme.theme -> web-host.theme - theme.theme -> apple-host.theme - theme.theme -> android-host.theme - realtime-rooms.room-session -> server-host.room-session - room-directory.room-directory -> server-host.room-directory - application.game-adapter -> realtime-rooms.game-adapter - guest-identity.guest-identity -> realtime-rooms.guest-identity - realtime-rooms.room-session -> room-directory.room-session - guest-identity.guest-identity -> presence.guest-identity - holdem-rules.game-rules -> turn-engine.game-rules - seating.seating -> turn-engine.seating - game-clock.game-clock -> turn-engine.game-clock - private-views.private-views -> turn-engine.private-views - presence.presence -> turn-engine.presence - tournament.tournament -> turn-engine.tournament - computer-players.computer-players -> turn-engine.computer-players - round-history.round-history -> turn-engine.round-history - rules-settings.rules-settings -> turn-engine.rules-settings - guest-identity.guest-identity -> seating.guest-identity - fair-shuffle.random-source -> card-deck.random-source - poker-strategy.player-strategy -> computer-players.player-strategy - game-clock.game-clock -> computer-players.game-clock - seating.seating -> computer-players.seating - chip-ledger.chip-ledger -> tournament.chip-ledger - level-schedule.level-schedule -> tournament.level-schedule - seating.seating -> tournament.seating - card-deck.card-deck -> poker-hand-ranking.card-deck - poker-hand-ranking.hand-ranking -> poker-odds.hand-ranking - card-deck.card-deck -> poker-odds.card-deck - card-deck.card-deck -> holdem-rules.card-deck - chip-ledger.chip-ledger -> holdem-rules.chip-ledger - level-schedule.level-schedule -> holdem-rules.level-schedule - poker-hand-ranking.hand-ranking -> holdem-rules.hand-ranking - rules-settings.rules-settings -> holdem-rules.rules-settings - poker-hand-ranking.hand-ranking -> poker-strategy.hand-ranking - poker-odds.poker-odds -> poker-strategy.poker-odds - theme.theme -> controls.theme - theme.theme -> table-layout.theme - controls.controls -> table-layout.controls - theme.theme -> card-graphics.theme - theme.theme -> chip-graphics.theme - preferences.preferences -> sound-cues.preferences - controls.controls -> guided-tour.controls - preferences.preferences -> guided-tour.preferences - translations.language -> guided-tour.language - turn-engine.game-adapter -> application.wrapped-game-adapter - web-host.web-shell -> application.web-shell - apple-host.apple-shell -> application.apple-shell - android-host.android-shell -> application.android-shell - windows-desktop.desktop-host -> application.desktop-host - server-host.server-host -> application.server-host - ourapps-release.release-pipeline -> application.release-pipeline - invitations.invitations -> application.invitations - display-mode.display-policy -> application.display-policy - video-calls.media-session -> application.media-session - table-layout.table-layout -> application.table-layout - card-graphics.card-graphics -> application.card-graphics - chip-graphics.chip-graphics -> application.chip-graphics - sound-cues.sound-cues -> application.sound-cues - guided-tour.guided-tour -> application.guided-tour - store-update.updates -> application.updates - controls.controls -> application.controls - preferences.preferences -> application.preferences - translations.language -> application.language - theme.theme -> application.theme Tested answer sets: default, book-club, poker-league, company-event, company-event-hosted, tv-only, browser-only-no-extras, large-paid-host, clinic, no-computers, web-own-hardware, native-no-lessons, local-web, fill-empty-own-hardware, lounge-web-ios, windows-only - book-club: {"targets":["ios","android","tvos"],"scale":"small","languages":["en","fr"],"look":"night","players":9,"startingChips":3000,"levelSeconds":600,"rebuys":1,"decisionSeconds":30,"computerPlayers":"on-request","video":false,"lessons":true,"server":"cloudflare","updates":false,"publish":true,"hostingAccount":"ourpoker-cloudflare-account","storeCredentials":"ourpoker-store-credentials","androidSigning":"ourpoker-android-signing"} - poker-league: {"targets":["web","ios","android","macos","windows","tvos"],"scale":"medium","languages":["en","fr","de","es"],"look":"night","players":9,"startingChips":5000,"levelSeconds":600,"rebuys":1,"decisionSeconds":30,"computerPlayers":"on-request","video":true,"lessons":true,"server":"cloudflare","updates":true,"publish":true,"videoKey":"ourpoker/video-key","videoSecret":"ourpoker/video-secret","hostingAccount":"ourpoker-cloudflare-account","storeCredentials":"ourpoker-store-credentials","androidSigning":"ourpoker-android-signing","webDeploy":"ourpoker-web-deploy","storeInvitation":"https://ourapps.app/l/0123456789abcdef01234567","webAddress":"https://poker.acme.io"} - company-event: {"targets":["web","ios","android","macos","windows","tvos"],"scale":"large","languages":["en","fr","de","es"],"look":"night","players":9,"startingChips":5000,"levelSeconds":600,"rebuys":1,"decisionSeconds":30,"computerPlayers":"on-request","video":true,"lessons":true,"server":"own-hardware","updates":true,"publish":false,"storeInvitation":"https://ourapps.app/l/0123456789abcdef01234567","webAddress":"https://poker.acme.io"} - company-event-hosted: {"targets":["web","ios","android","macos","windows","tvos"],"scale":"large","languages":["en","fr","de","es"],"look":"night","players":9,"startingChips":5000,"levelSeconds":600,"rebuys":1,"decisionSeconds":30,"computerPlayers":"on-request","video":true,"lessons":true,"server":"cloudflare","updates":true,"publish":true,"videoKey":"ourpoker/video-key","videoSecret":"ourpoker/video-secret","hostingAccount":"ourpoker-cloudflare-account","storeCredentials":"ourpoker-store-credentials","androidSigning":"ourpoker-android-signing","webDeploy":"ourpoker-web-deploy","storeInvitation":"https://ourapps.app/l/0123456789abcdef01234567","webAddress":"https://poker.acme.io"} - tv-only: {"targets":["tvos"],"scale":"small","languages":["en"],"look":"night","players":9,"startingChips":5000,"levelSeconds":600,"rebuys":1,"decisionSeconds":30,"computerPlayers":"on-request","video":false,"lessons":false,"server":"cloudflare","updates":false,"publish":false,"hostingAccount":"ourpoker-cloudflare-account"} - browser-only-no-extras: {"targets":["web"],"scale":"small","languages":["en","fr","de","es"],"look":"night","players":9,"startingChips":5000,"levelSeconds":600,"rebuys":0,"decisionSeconds":30,"computerPlayers":"none","video":false,"lessons":false,"server":"cloudflare","updates":false,"publish":false,"hostingAccount":"ourpoker-cloudflare-account"} - large-paid-host: {"targets":["web","ios","android","macos","windows","tvos"],"scale":"large","languages":["en","fr","de","es"],"look":"lounge","players":6,"startingChips":5000,"levelSeconds":600,"rebuys":3,"decisionSeconds":30,"computerPlayers":"fill-empty","video":true,"lessons":true,"server":"cloudflare","updates":false,"publish":true,"videoKey":"ourpoker/video-key","videoSecret":"ourpoker/video-secret","hostingAccount":"ourpoker-cloudflare-account","storeCredentials":"ourpoker-store-credentials","androidSigning":"ourpoker-android-signing","webDeploy":"ourpoker-web-deploy","bundleId":"io.acme.poker","webAddress":"https://poker.acme.io","videoServiceUrl":"https://video.acme.io"} - clinic: {"targets":["web","windows"],"scale":"small","languages":["en","es"],"look":"night","players":9,"startingChips":5000,"levelSeconds":600,"rebuys":1,"decisionSeconds":30,"computerPlayers":"on-request","video":false,"lessons":false,"server":"own-hardware","updates":false,"publish":false,"webAddress":"https://clinic.example"} - no-computers: {"targets":["web","android"],"scale":"small","languages":["en","fr","de","es"],"look":"night","players":9,"startingChips":5000,"levelSeconds":600,"rebuys":1,"decisionSeconds":30,"computerPlayers":"none","video":true,"lessons":true,"server":"cloudflare","updates":false,"publish":false,"hostingAccount":"ourpoker-cloudflare-account","webAddress":"https://poker.acme.io"} - web-own-hardware: {"targets":["web"],"scale":"small","languages":["en","fr"],"look":"night","players":9,"startingChips":5000,"levelSeconds":600,"rebuys":1,"decisionSeconds":30,"computerPlayers":"none","video":false,"lessons":false,"server":"own-hardware","updates":false,"publish":false} - native-no-lessons: {"targets":["ios","android","tvos"],"scale":"small","languages":["en","fr"],"look":"night","players":9,"startingChips":5000,"levelSeconds":600,"rebuys":1,"decisionSeconds":30,"computerPlayers":"on-request","video":true,"lessons":false,"server":"cloudflare","updates":true,"publish":false,"hostingAccount":"ourpoker-cloudflare-account","storeInvitation":"https://ourapps.app/l/0123456789abcdef01234567"} - local-web: {"targets":["web"],"scale":"small","languages":["en"],"video":false,"server":"own-hardware"} - fill-empty-own-hardware: {"targets":["web"],"languages":["en"],"video":false,"lessons":false,"server":"own-hardware","computerPlayers":"fill-empty","players":8} - lounge-web-ios: {"targets":["web","ios"],"scale":"medium","languages":["en","fr"],"look":"lounge","players":8,"computerPlayers":"fill-empty","video":false,"server":"own-hardware"} - windows-only: {"targets":["windows"],"scale":"small","languages":["en","fr","de","es"],"look":"night","players":9,"startingChips":5000,"levelSeconds":600,"rebuys":1,"decisionSeconds":30,"computerPlayers":"on-request","video":false,"lessons":true,"server":"own-hardware","updates":false,"publish":false,"serverAddress":"https://poker.clinic.example"} Versions - 0.5.2 (2026-11-13T06:57:44.433Z) sha256:2f9804a5b6a4439d3f30f9193e7c5bf2ce5712d12c268e8be0d32812701c3375 - 0.5.1 (2026-11-13T06:07:27.157Z) sha256:d0bd6cfa8ba761458247cc1bd8f34668d4fde9ea0345f73a53810a9b4dacb9e7 - 0.5.0 (2026-11-13T04:25:00.129Z) sha256:af5f59111e84fe6f6b5df70ab20465e588e1d11ae9cab530859681a7b40022f8 Copyright Level N Ltd 2026