Repository navigation
Releases
v1.0.6
- 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_tooltipscenario, andsuite.py --only tapruns 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 andbash 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
- 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 itstypefunction 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 --huntsweeps every screen, card, boss and tooltip in every language
and size, with random play on top. Newblind_screenandstats_crashscenarios.
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 andbash 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
- 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
keyboardandhapticsheadless scenarios, andtests/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 andbash 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
- 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
swipeheadless 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 andbash 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
- 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-crtis 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
crtheadless 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 takesnoise_fac. - New
mod_menusheadless 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 andbash 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
- 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-crtis 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 oldgame/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--steamoddedgoes 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.pyruns the whole test matrix in one pool, three times as
fast as before. New scenarios:crtdraws the ellipse under a half precision
emulation and checks the shipped shader does not, andmod_foldercovers the
move toASET/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 andbash 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
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.luais not in the official APK,
so the module now carries it as a preload, likeportrait_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 andportrait_patch_error.txtsays 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, andbuild.pyapplies 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.pyruns 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). showcaserecords 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 andbash 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.