Skip to content

Releases

v1.0.6

Choose a tag to compare

@LoreanXavier LoreanXavier released this 08 Nov 20:20
  • A tap shows a card's description (#9). A tap on a joker, a consumable, or a
    card in the shop, a pack or the collection leaves its description open with your
    finger out of the way; another tap on it, a tap on the description or a tap
    anywhere else closes it. A finger held down still works, and cards in your hand
    still go up on a tap. It's on by default: Tap for Descriptions in Settings,
    under Game, in the game's language, turns it off for the old way.
  • A description left open never passes a tap to a button under it, so it can't
    take you out of the shop by Next Round.
  • New tap_tooltip scenario, and suite.py --only tap runs it alone.

Downloads

  • balatro_portrait.zip: the Zygisk module for rooted Android (Magisk, KernelSU or APatch with Zygisk). Flash it, answer the two volume-key questions, reboot, open the official Balatro. Mods on it are experimental.
  • Source code (zip / tar.gz): everything needed to build the portrait APK (no root) or the iPhone IPA from your own copy of the game. Unzip it and run python build.py; on the phone use Termux and bash termux-build.sh.
  • SHA256SUMS.txt: checksum of the module ZIP.

There is no ready-made APK or IPA: it would contain the game. Which route is yours, step by step: README.

v1.0.5

Choose a tag to compare

@LoreanXavier LoreanXavier released this 07 Nov 22:29
  • No more crash after Stats. Opening the usage pages of Stats (jokers,
    consumables, vouchers) and then starting a round crashed the game at the blind
    select, in every language. The game's own code there writes a global that the
    portrait blind panel kept its type function in.
  • Fits in long languages (#8):
    • Focus: the joker count stays clear of the blinds.
    • The round's end keeps its dollars in one column, however long a row's text.
    • Classic: "Choose your next Blind" stays inside its panel.
    • A tag's tooltip by the screen's edge: its box was moved onto the screen and
      its text left where it was.
    • A card tooltip wider than the phone (French, Russian, Japanese, Indonesian, and
      German with Steamodded) shrinks to fit, and long one-line tooltips wrap.
    • A final boss's reward row stays inside its column.
  • The Deck screen stays on the screen. In Polish, with a boss weakening cards,
    its columns were put one under the other and ran off the top and the bottom.
    A menu is now stacked only when it still fits, and gets smaller text otherwise.
  • Credits laid out for a phone: even buttons, a readable text size, long
    lines wrapped and columns in pairs, instead of the desktop page shrunk to 3 px.
  • Counts follow the cards when Layout or Left or Right Hand is changed in a
    run.
    The deck's count and the card slots stayed behind and drifted further off
    with each change, until they left the screen.
  • Foldables: on a nearly square screen the blinds and the shop no longer run off
    the bottom.
  • Tooltips near the bottom of the screen are no longer cut off, and on a
    tablet's Game Over Jimbo talks from beside himself when there is no room below.
  • The headless runs audit the text of every screenshot, tooltips included, and
    suite.py --hunt sweeps every screen, card, boss and tooltip in every language
    and size, with random play on top. New blind_screen and stats_crash scenarios.

Downloads

  • balatro_portrait.zip: the Zygisk module for rooted Android (Magisk, KernelSU or APatch with Zygisk). Flash it, answer the two volume-key questions, reboot, open the official Balatro. Mods on it are experimental.
  • Source code (zip / tar.gz): everything needed to build the portrait APK (no root) or the iPhone IPA from your own copy of the game. Unzip it and run python build.py; on the phone use Termux and bash termux-build.sh.
  • SHA256SUMS.txt: checksum of the module ZIP.

There is no ready-made APK or IPA: it would contain the game. Which route is yours, step by step: README.

v1.0.4

Choose a tag to compare

@LoreanXavier LoreanXavier released this 07 Nov 11:34
  • The menu comes down when the keyboard closes (#4). Closing Gboard from the
    chevron under it told the game nothing, so the menu stayed lifted and the field
    stayed open until Enter. The APK and the Zygisk module now watch for the keyboard
    leaving, and a tap beside the field ends the edit too. Tested on a OnePlus 13.
  • New APKs install over the last one on Termux (#6). Each Termux build signed
    with a new key, and the Termux command starts from a fresh clone, so Android
    refused the update as a conflicting package. Termux now signs with the key PC
    builds use. A Termux install from before 1.0.4 needs one last uninstall: see
    docs/TERMUX.md.
  • Haptic Feedback has a strength (#7): Off, Light, Medium (the new default) or
    Strong, which is the old length. Pulses keep at least 0.08 s apart, since those
    landing on each other felt like a rumble. In the APK the level also sets the
    motor's power on phones that allow it; some, like OnePlus, play their own fixed
    effect whatever the app asks.
  • New keyboard and haptics headless scenarios, and tests/signing_test.py.

Downloads

  • balatro_portrait.zip: the Zygisk module for rooted Android (Magisk, KernelSU or APatch with Zygisk). Flash it, answer the two volume-key questions, reboot, open the official Balatro. Mods on it are experimental.
  • Source code (zip / tar.gz): everything needed to build the portrait APK (no root) or the iPhone IPA from your own copy of the game. Unzip it and run python build.py; on the phone use Termux and bash termux-build.sh.
  • SHA256SUMS.txt: checksum of the module ZIP.

There is no ready-made APK or IPA: it would contain the game. Which route is yours, step by step: README.

v1.0.3

Choose a tag to compare

@LoreanXavier LoreanXavier released this 06 Nov 23:16
  • Swipe Only's cue stays clear of the hand (#5). The corners of the fanned
    cards ran up to 9 px into Play Hand and Discard on a 720 px wide screen, in all
    three layouts. The cards now sit a little higher, and the cue and the "8/8"
    stay where they were.
  • The swipe headless scenario checks every card's corners against the cue, with
    cards picked at each end of the hand and in the middle.

Downloads

  • balatro_portrait.zip: the Zygisk module for rooted Android (Magisk, KernelSU or APatch with Zygisk). Flash it, answer the two volume-key questions, reboot, open the official Balatro. Mods on it are experimental.
  • Source code (zip / tar.gz): everything needed to build the portrait APK (no root) or the iPhone IPA from your own copy of the game. Unzip it and run python build.py; on the phone use Termux and bash termux-build.sh.
  • SHA256SUMS.txt: checksum of the module ZIP.

There is no ready-made APK or IPA: it would contain the game. Which route is yours, step by step: README.

v1.0.2

Choose a tag to compare

@LoreanXavier LoreanXavier released this 06 Nov 20:53
  • The black ellipse is gone (#2), tested on the Pixel 7 that reported it.
    Wrapping the time in 1.0.1 did not cure it there, so the half float overflow
    given there as the cause was wrong or not the whole story. The CRT shader's
    noise is the only code that multiplies the two screen coordinates, the shape of
    the black area, and the official Android shader has it commented out. It now
    stays out on every route, as there. The grain it added was too faint to see.
    The CRT shader stays on, and --disable-crt is still there.
  • Steamodded's Config tab fits the screen (#3). In Spanish its two toggles
    side by side ran it off both edges, and squeezing the menu only shrank its tabs
    and buttons, not the text. A menu still too wide after squeezing now gets its
    columns one under the other and keeps its buttons' size.
  • Steamodded's version clears the corner (#3). It sat flush with the top right
    corner, where the CRT curve cut its last letters.
  • The language box stays off the menu column (#3). A long name such as
    Español (España) made it wider than the room beside the column.
  • The crt headless scenario no longer draws the ellipse under an emulation of
    half precision, since that passed on a fix that failed on a phone. It checks
    that the shipped shader has no noise left and still takes noise_fac.
  • New mod_menus headless scenario: the title and the Mods screen's tabs with
    Steamodded, in every language.

Downloads

  • balatro_portrait.zip: the Zygisk module for rooted Android (Magisk, KernelSU or APatch with Zygisk). Flash it, answer the two volume-key questions, reboot, open the official Balatro. Mods on it are experimental.
  • Source code (zip / tar.gz): everything needed to build the portrait APK (no root) or the iPhone IPA from your own copy of the game. Unzip it and run python build.py; on the phone use Termux and bash termux-build.sh.
  • SHA256SUMS.txt: checksum of the module ZIP.

There is no ready-made APK or IPA: it would contain the game. Which route is yours, step by step: README.

v1.0.1

Choose a tag to compare

@LoreanXavier LoreanXavier released this 05 Nov 22:36
  • The black ellipse is fixed. The CRT shader's noise multiplies the screen
    position by a time that starts at 400, and past 65504 that no longer fits a
    half float. A GPU that runs the shader at half precision then draws everything
    beyond that curve black. The time now wraps, so the number stays in range. The
    official Android shader has the noise commented out, and the build had put it
    back as it was. The CRT shader stays on, and --disable-crt is still there.
  • The APK's mod folder is ASET/Mods/ again (#1), where Lovely looks by
    default and where
    Balatro Mod Manager for Android
    looks too. Mods in the old game/Mods/ move there by themselves on the first
    launch and load from the second, and so does anything put in the old place
    later. A mod bundled with --steamodded goes there too.
  • Frame Rate in Options > Settings > Graphics: the screen's rate as before,
    or 60, or 30 to save battery.
  • One-Thumb's score line keeps its height. The hand's total came up larger than
    the line had room for, which made the line taller and pushed it into the played
    cards on a tablet.
  • The build says it is working. It prints what the first run is about to
    download, and its output no longer sits in a buffer when run from Git Bash or
    an IDE.
  • A new FAQ in the README: ready-made APKs, the Google Play version, cloud saves,
    achievements, sign-in and battery.
  • tools/headless/suite.py runs the whole test matrix in one pool, three times as
    fast as before. New scenarios: crt draws the ellipse under a half precision
    emulation and checks the shipped shader does not, and mod_folder covers the
    move to ASET/Mods/.

Downloads

  • balatro_portrait.zip: the Zygisk module for rooted Android (Magisk, KernelSU or APatch with Zygisk). Flash it, answer the two volume-key questions, reboot, open the official Balatro. Mods on it are experimental.
  • Source code (zip / tar.gz): everything needed to build the portrait APK (no root) or the iPhone IPA from your own copy of the game. Unzip it and run python build.py; on the phone use Termux and bash termux-build.sh.
  • SHA256SUMS.txt: checksum of the module ZIP.

There is no ready-made APK or IPA: it would contain the game. Which route is yours, step by step: README.

v1.0.0

Choose a tag to compare

@LoreanXavier LoreanXavier released this 05 Nov 13:41

The reboot. A new repository, a new version line, two new layouts, and a
test suite that runs the real game. The old repository and its account are
gone; its history is kept below, without its dead links.

Layouts (Options > Settings > Game > Layout, applied at once, mid-run too)

  • One-Thumb: a short HUD on top, a score line right above the hand (hands
    left, the hand's name over chips x mult, discards left) that stays up while
    the hand scores, and Discard and Play as the biggest buttons. On a tablet
    the score line is a compact two-row version, so it clears the jokers.
  • Focus: one full-width HUD read top to bottom (blind and target with Run
    Info and Options, the round score with a bar filling towards the target,
    the hand with chips x mult, the five run stats) and a single flat bar under
    the hand.
  • Classic is the 2.x layout, and stays the default.
  • Swipe Only Mode is redesigned for all three: Play and Discard go, the
    hand's cards grow 15% into their room and ease back to size when played, each
    bar keeps the rest in one thin row (One-Thumb used to lose Options), and while
    cards are selected a cue fades in beside the card counter, up for Play and down
    for Discard, in the buttons' colours and on their sides. It applies at once,
    mid-hand too, and the shop and blind panels stay in place.
  • Both new layouts follow written rules the suite measures: one column edge
    to edge, three text sizes, nothing under 9 px in normal play on any tested
    phone, no block on top of another.

Nothing off the screen

  • Every menu is measured when it opens (and when a tab changes) and fitted
    inside the screen with a margin: frame padding first, then card rows, then
    minimum widths. On a 20:9 Android phone the Collection, Editions, Booster
    Packs and Spectral pages used to run 2 to 7 px past both edges, and Run
    Info, Profile and the Blinds collection touched them. Mods' menus go
    through the same path.
  • Shop and blind select are placed against the real bottom of the screen
    (the room starts below its top), so a tablet in Focus no longer loses the
    shop's packs or the blind select's bottom.
  • On tablets Cash Out, Next Round, Reroll and the shop's jokers can be tapped
    again (the panels rose onto the joker shelf, which took the taps), the
    shop's bottom row is on screen, played cards stop above the hand, and tags
    past seven stack downwards instead of onto the HUD.
  • Classic's sort column no longer pushes Play and Discard past the edges in
    French, Russian and Indonesian, and its hand preview stays centred when a
    long hand name widens it.

Every language the game ships (de, fr, nl, ru, ja, zh_CN, zh_TW, ko,
es_ES, es_419, pt_BR, it, pl, id)

  • Long labels wrap onto two lines or borrow width from the next column
    instead of shrinking: "Durchlauf mit Code" no longer pushes Back off a
    360 dp screen, "MISE INITIALE" no longer widens the Blinds collection,
    "Weggooimogelijkheden" is no longer 3 px, Italian's long Settings toggle
    fits, and Classic's Rank / Suit stack when their words are long.
  • The game sizes a hand's name by its length in bytes and chips / mult by
    their digits; in the new layouts they keep their size and only shrink to
    fit, so Japanese hand names and 99,999,999,999 are no longer 6 px.
  • Russian labels are grown to the English line height (its font draws a
    tenth shorter); buttons widen for them where needed.
  • With Readabletro (the build's default) the new layouts are scaled to the
    pixel font's line: TypoQuik draws a 28% taller line and 15% wider digits,
    so a 99,999,999,999 round score ran off the screen and, on a tablet, the
    taller HUD and score line pushed the joker shelf onto the stage.

Huge numbers

  • naneinf no longer turns the score flames into solid blocks over the HUD.
  • Counters that grow mid-run (money in the billions, naneinf) re-fit as they
    change in One-Thumb and Focus.
  • Stress-tested in every layout: 12 jokers over the slot limit, 6
    consumables, a 12-card hand, 8 tags, a long boss, $9,999,999,999, ante 39,
    round 999, scores of 99,999,999,999 and naneinf, then through the shop.

Mods

  • Tested with Steamodded 26.1002.0 and 1.0.0-beta-1814a, Talisman 2.7,
    JokerDisplay 2.0.8, Amulet 3.6.1 and Cryptid 0.5.17d.
  • Steamodded's play / discard limit shows in every button bar.
  • Steamodded 1.0.0-beta: card counters no longer read "52/nil".
  • Cryptid: the game starts (its game-over patch matches again), its intro
    takes taps and is drawn full size, its tutorial bubble, panel and buttons
    no longer overlap, and Steamodded's run select fits the screen.
  • A boss's two debuff lines and Steamodded's mod badge fit in the new
    layouts' blind panels.
  • 25 Steamodded patches that found nothing to patch were reviewed one by one;
    the ones that matter on a phone apply again or are done in the portrait
    code.

Support

  • Options has a Support on Patreon button at the bottom, on the title screen
    and during a run. It opens the mod's Patreon page in your browser.

Fixes

  • A long translation could leave copies of the Classic button bar alive
    after it was removed; they crashed the next run (de, fr, ru, ...).
  • Options > Settings no longer crashes in a landscape window.
  • The explanation line under Enhancements, Seals and Editions has a dark
    backing, so it reads over the title buttons behind it.

Zygisk module

  • Fixed for the new code: portrait_layouts.lua is not in the official APK,
    so the module now carries it as a preload, like portrait_config. Without
    this the 1.0.0 code would not start under the module.
  • No game code in the ZIP. The module carries the patches and builds the
    game from the app's own files on first launch, again after a module or game
    update. If a Play update no longer fits the patches, the game starts as
    shipped and portrait_patch_error.txt says why.
  • Mods, experimental. Lovely is built into the module, so Steamodded mods
    run on the official app. Put mods in /sdcard/BalatroMods, press the
    module's Action button or reboot; they are copied in with the app's owner.
    With no mods Lovely never starts. The Lua side is tested with Steamodded,
    Talisman, Amulet and Cryptid; the native hook has not run on a phone yet.
  • Version 1.0.0 (versionCode 1000), and its update link points at the new
    repository.

Tooling

  • The game's code is out of the repository. patches/portrait/ holds what the
    mod changes as unified diffs against 1.0.1o, and build.py applies them to your
    copy of the game (tools/patches.py). A change that finds no place stops the
    build and is named. Another game version needs --allow-untested-game.
  • patches/portrait-mobile/ does the same from the Play Store copy, and gives
    the same code, so the phone-only Termux build and the Zygisk module run exactly
    what the Steam build runs.
  • tools/headless/run.py runs the game on a hidden desktop as any phone
    size, with Android and iOS code paths, iPhone safe-area insets, any game
    language, Lovely mods, and --source zygisk (the Play copy with the module's
    chunk swapped in). Scenarios: smoke, menus, run (a bot plays a
    seeded run), layouts, stress, mods. Checks include text and buttons off
    screen, menu panels too close to the edge, blocks overlapping, text under
    7 px, and UI left alive after its box was removed.
  • 1.0.0 passes it on 8 screen sizes, 5 mod sets, 14 languages and the Zygisk
    staging (which is also the suite's Readabletro run).
  • showcase records the README's GIFs from the real game
    (tools/headless/make_gif.py).

Downloads

  • balatro_portrait.zip: the Zygisk module for rooted Android (Magisk, KernelSU or APatch with Zygisk). Flash it, answer the two volume-key questions, reboot, open the official Balatro. Mods on it are experimental.
  • Source code (zip / tar.gz): everything needed to build the portrait APK (no root) or the iPhone IPA from your own copy of the game. Unzip it and run python build.py; on the phone use Termux and bash termux-build.sh.
  • SHA256SUMS.txt: checksum of the module ZIP.

There is no ready-made APK or IPA: it would contain the game. Which route is yours, step by step: README.