Изменения
Описание версий ведётся на английском.
В разработке
В main, ещё не в v1.3.0: в следующей версии или уже сейчас в сборке для разработки. Установить сборку для разработки
🚀 Features
- site: count the audience with Umami Cloud (#435)
- about: the credits say PlayGuard is part of Boréale (#434)
- site: the website moves to guard.boreale.dev (#433)
- remote: only games listed on the broker, and what the console is doing (#431)
- remote: every game's icon on the broker, and the system titles by their name (#430)
- themes: theme folders with pictures, a logo and the loading screen's picture (#428)
- themes: a palette for each season and feast, and one that follows the calendar (#427)
- themes: pick a palette or your own theme file in Preferences (#426)
- home-assistant: Firmware and Atmosphère off by default (#424)
- agent: each account's play time, from the play log (#423)
- branding: Aurore's aurora, and a new icon: a shield around its night (#422)
- remote: the console's nickname names it in Home Assistant when no name is set (#421)
- remote: events when a game starts or stops, 10 minutes before the end, and when games are blocked (#420)
- remote: an optional link to MQTT and Home Assistant (#54)
- sidebar: the rail folds on its icons, and opens over the tab to choose one (#410)
- forwarders: PlayGuard's own icons for forwarders, and a badge on the protected ones (#404)
🐞 Bug Fixes
- fonts: free fonts in place of the console's in the simulators and desktop builds (#436)
- updates: the latest firmware is read from switchbrew, not from a firmware mirror (#437)
- themes: warning cards and status pills let a theme's background picture show through (#429)
- web: the console's Restart in the web smoke test (#425)
- changelog: a bullet with nothing left once cleaned no longer breaks the next line (#417)
- test: the gate's rules compared field by field, not with their padding (#416)
- ci: clang-tidy checks nothing when a pull request changes no source (#411)
- console: a check or a warning by the version on the system tiles, not a pill (#409)
- sys-notes: the installed and new marks sit beside the version in the release notes (#408)
- dev-build: the installed and new marks sit beside a build's title (#407)
- forwarders: a forwarder's new icon shows in the lists at once (#406)
✨ Polish
- ui: the Cadran look comes from Aurore (#415)
🧰 Other
- aurore: the library lives in library/aurore, no longer extern/borealis (#418)
- borealis: follow Aurore, the fork's new name, on main (#413)
- borealis: built from our fork, which carries PlayGuard's fixes (#412)
📚 Documentation
- site: say PlayGuard is part of Boréale, with PlayShelf and Aurore (#432)
- sync: the Home Assistant integration is done, in its own repository (#419)
1.3.0
🚀 Features
- activity: the Export chip goes straight to the SD card, the week's QR code is gone (#387) (700146f)
- clock: the measurement's result in a dialog (#299) (c906613)
- console: a sys-patch tile beside hekate, with its version and release notes (#311) (de2a7c2)
- console: forwarders — a pause after refused PINs, hours it never opens, icons from the album, rescue page, backups (#274) (fcbb8fd)
- console: Game patches asks to set the sigpatches aside in the modal that says what was found (#309) (b4f7efd)
- console: lock the homebrew menu; a light PIN gate, free hours and tries in the history (#267) (26fb114)
- console: NRO forwarders, PlayGuard and any homebrew on the HOME menu as games, listed, edited and deleted (#246) (fd07ef0)
- console: protect a forwarder with the PIN (#263) (3a65c8a)
- console: the gate's rules in the forwarder, the day's limit, two spans, the week's tries (#290) (6edf5e7)
- console: the real serial number, read from Atmosphère's PRODINFO backup when blanked (#308) (939d6fe)
- console: Tools back under System, action tiles on one line with their icon (#354) (18e908b)
- console: version tiles say a newer release in a pill, not in a cut line (#316) (f017f4c)
- dev: a console self-test before the hardware checklist; stacked pull requests in CONTRIBUTING (#291) (1984448)
- diagnostics: what Atmosphère's DNS redirection does with Nintendo's servers, in the session log and the report (#314) (77f4318)
- forwarders: a forwarder that would not start is said before it is made, and its known causes fixed (#305) (821fc65)
- forwarders: a protected forwarder's rules as icons in the list (#292) (a8987f9)
- forwarders: Check the homebrew menu says when it is not locked, and which rescue module is out of date (#318) (44b398f)
- forwarders: Details edits the rules, ZR for the PIN, the gate's rule icons; the guide in every language (#294) (6f15550)
- forwarders: launch options, a user chosen at launch, screenshots and video capture (#322) (c92b2c4)
- forwarders: the forwarders made here in one card, protected or not: their icon's badge says which (#352) (68bf647)
- forwarders: the gate tries again with Ⓐ once refused, opens faster, and says more (#330) (f11c5fa)
- forwarders: the icon chosen in a grid of the album's screenshots, with a preview (#302) (591a61d)
- games: a removal that shows what went: covers floating away, segments, its end, Try again (#377) (249498b)
- games: removing several games in a dialog, a card when no game has a problem (#327) (9d28064)
- games: the covers leafed through while games are checked or removed (#368) (7c9fb37)
- games: the covers right under one short line in Check the installed games (#300) (8a683b5)
- gate: the forwarders open as PlayGuard does, before the PIN, 2 s by default (#369) (4fee98b)
- history: a change made by a development build says so, with its commit and pull request (#312) (cdba41b)
- pin: pausing parental controls when the PIN is entered becomes a setting, off by default (#389) (28167af)
- play-timer: the bedtime set with the stick, Off and By day in its dialog (#288) (bc09244)
- prefs: Start on as a grid of the tabs (#306) (066b7e5)
- profiles: the scheduled profile says Soon, until the MQTT bridge (#386) (265a061)
- restrictions: a green check, not "Allowed", on the level tiles (#383) (8fa6a82)
- security: the PIN pauses parental controls while the parent is in PlayGuard (#376) (e4b6fe7)
- site,web: the documentation and simulator of each release beside main's, and what main has since (#269) (d0ee81f)
- site,web: the site's roots and fallbacks, and the site and simulator on iOS and Android (#264) (5077acb)
- start-up: the data folder's migrations run once each, not at every start (#250) (0c1fd65)
- tabs: reorganise the menus, tiles first on every tab (#334) (4d96171)
- tools: smoke_all, more resource checks and doc deltas (#254) (1b65e75)
- tour: a 100-second tour in the Cadran look, the app moving, with music, a teaser and every language (#380) (42ea37a)
- ui: a lighter footer clock, Console's tools first, extra time in one row, A says which day it ends (#341) (d0a1b7e)
- ui: a picker's list fades at its foot while more rows follow, as a screen's (#252) (7e2647d)
- ui: a soft light in its own ink behind each action tile (#362) (f1ca183)
- ui: Cadran follow-up: dark screenshots and simulator, the child's key alone, wrapped lines without a leading space (#249) (81cf70b)
- ui: Cadran polished: dark by default, states by their shape, the old look cleaned out (#245) (fd628cd)
- ui: Cadran, PlayGuard's one look, on every screen (#92) (538a089)
- ui: clearer Today pills, row badges, week bars and restriction levels (#333) (bac3c8d)
- ui: every sheet in the Cadran look: sections, icons, switches, value lists (#293) (6fdaec2)
- ui: flags and icons in the Preferences and network clock pickers (#295) (0203ec5)
- ui: History in Preferences, a rail of eight; the controller's keys and the Cadran pieces written down (#279) (6e60893)
- ui: language at once in every case, the focus kept, the week stepping by the hour (#260) (dfb2129)
- ui: Larger text reaches the rail, the header and the footer (#361) (89cc23f)
- ui: one progress dialog body, cadran::progress_body: the data check and the build download (#286) (f3849c1)
- ui: PIN and Console say their state in one line at the top (#289) (8556c33)
- ui: read-only said and undone, errors with a next step, plainer words, the header's keys shown (#349) (dddcf73)
- ui: the footer shows − and Ⓨ again, left out when a screen needs the room (#365) (90a9053)
- ui: the loading screen in the light theme's colours when it is chosen (#283) (3976b0d)
- ui: the look in motion, full by default on the battery too, with a Reduced motion setting (#375) (5286a89)
- ui: the screens left out of Cadran on its pieces: release notes, a build's page, empty lists, the start screens' lines (#278) (3362da7)
- ui: the status tiles' icons in the action tiles' inks, one per tile in turn (#384) (854e000)
- ui: theme and language without a restart, bedtime countdown, hold to step by the hour (#256) (8e29b22)
- ui: visual effects automatic by default, in full on the dock and lighter in hand (#392) (238d96d)
- ui: where a screen was opened from, Help in sections, one kicker (#280) (2eb783d)
- updates: installed from the Homebrew App Store, updated through it, unless its catalogue is behind (#272) (8ab5925)
- upload: the sent report's dialog says which code to scan, its link once (#298) (5a0c121)
- web: a console that lives on: its time played counted and kept, a line under the screen, time servers that answer (#287) (44dd1cb)
- web: dark screenshots, a changelog page and Atom feed, documentation search, and a preview image, tour video and 404 page in every language (#233) (6946034)
- web: install in two tabs, the release's date to its notes, the simulator's size on its buttons, its tools behind a button on a phone, and data saver asked first (#247) (bba0e9c)
- web: PlayGuard's website and its simulator in a browser, on GitHub Pages (#226) (80d9068)
- web: screenshots in each language, questions and answers, and a site for search engines and AI assistants (#230) (8e2ae8b)
- web: steps links, a tour, a report button, the simulator offline, screens compared with main (#229) (b18cc7e)
- web: the documentation's screenshots in the page's theme, its search through the questions and the changelog, and a share sheet in the simulator (#248) (3a583ab)
- web: the simulator in the website's look and on a phone: its header, no zoom into its fields, the pad under the screen or beside it in landscape (#243) (43278ea)
- web: the simulator on a phone: full screen, home screen in landscape, splash screens, the tour awake (#268) (d514d18)
- web: the simulator tested in a browser, the time moved on, live settings and a kept state (#228) (0a7acab)
- web: the simulator versioned as the documentation, simulator/dev/ for main (#270) (daad239)
- web: the site's layout checked on a phone in CI, an iPhone home-screen icon, "Locked out?" on the home page, a firmware check, copy buttons and a printable documentation (#242) (e31b718)
- web: the website on a phone, screenshots larger over the page, install first, PlayGuard beside Nintendo's app, and each section a link away (#237) (0ddde1f)
🐞 Bug Fixes
- activity: the game names and icons kept whole between threads, the gate's log kept until it is in the history (#339) (7579c95)
- branding: the store icon's name clear of its dial (#273) (0852782)
- ci: Emscripten's cache kept between web runs, and the site's address in https when Pages enforces it (#231) (6365234)
- console: a sys-patch pattern meant for this firmware left unpatched is no longer hidden (#301) (887c2ba)
- console: forwarder icons on every console language, no EXIF or progressive icon (#257) (943cf7c)
- console: the Console and PIN tabs open on their tiles, without a headline over them (#307) (cf745ed)
- console: the serial number found again in PRODINFO backups (#348) (d634a0f)
- dev-build: Install another build's bar in the header, its note at the foot (#355) (975bf97)
- dev: clearer build list and download window in Install another build (#329) (a79df0a)
- forwarders: a protected forwarder starts its gate, no longer closing at once (#323) (95e1644)
- forwarders: after the PIN, a protected forwarder starts its homebrew, no longer stuck on the gate's screen (#326) (4fb5d89)
- forwarders: ForceDebug set in the ACID too, so Atmosphère 1.8.0+ starts them (#320) (e4ce858)
- forwarders: making several forwarders shows its progress, one a frame, instead of freezing the screen (#342) (494d727)
- forwarders: the loader refresh dialog reads clearly, and a forwarder made again leaves the bell (#325) (de3c3e2)
- forwarders: the PIN no longer skipped by moving the clock, through a store, or by making a forwarder again (#336) (e17875c)
- forwarders: the remake dialog joins the names to what follows (#366) (c916243)
- games: one game said in the singular, no "A on a game" nor Ⓡ with none listed (#335) (4877a9c)
- gate: every gate screen laid out as the opening, in PlayGuard's language and theme (#390) (40e6736)
- header: the version badge is level with the title (#315) (676e137)
- i18n: translations read safely from the background threads (#359) (03c388b)
- pin: the PIN tab no longer offers to turn parental controls back on, and Today's button is amber (#310) (8eeb1cb)
- play-timer: the child screen says time's up past the limit, one ring rule for every screen (#346) (37207ee)
- play-timer: the week's summary fits beside its buttons, no longer cut (#385) (45397fe)
- security: the open code scanning alerts on main (#321) (71836dd)
- security: the PIN before a rollback, a recovery proof no copy can crack, a gate no clock can fool (#347) (80f7fba)
- site: the website's screenshots taken again in the dark theme, Console and its Network clock the right screens (#393) (19ad06e)
- sys-notes: the release notes' bar in the header, at its right (#363) (2cdc2bf)
- today: started from its HOME icon, PlayGuard no longer says "opened from a game" (#373) (d388dc4)
- today: with Larger text, the buttons and card heads keep Today on one screen (#370) (0e6f248)
- ui: a frame with many draws no longer crashes PlayGuard on the console (#296) (631ce4a)
- ui: About › Help & diagnostics no longer opens blank, its icons only (#382) (3356975)
- ui: Console › Forwarders' cards no longer stay nearly clear (#391) (48d5431)
- ui: dialogs in the colour of what they do, failures as failures, refusals as refusals (#275) (88c889b)
- ui: hidden footers not refitted each frame; the pill race in the smoke test (#258) (c231a51)
- ui: Install another build and the History no longer crash when their list is filled again (#394) (971a8f1)
- ui: no empty band inside or between the lists' cards (#317) (1d57bed)
- ui: the header's pill alone says parental controls are unlocked (#313) (46a139d)
- ui: the header's pill of the tab shown, not of the one it replaced (#251) (9093a0e)
- ui: the quick settings' list (Language, theme and text size) with its icons (#388) (ff509d5)
- ui: the rail's text no longer flashes at each change of tab (#324) (994356c)
- web: a step's button tapped, not held, so a busy page cannot repeat it (#240) (42c3f74)
- web: no fsync in the simulator, which could freeze it when a change needed the unlock (#235) (372a4a1)
- web: only this repository's builds on the site, a Content-Security-Policy, Sora served with the site, emsdk pinned (#227) (3053604)
✨ Polish
- build: the build's identity on two files, a precompiled header on the desktop, runtime packages for the shards (#344) (21d7978)
- games: the game check in three files: the list, the actions, the pieces they share (#284) (6bd3a64)
- logic: the clock, Activity and forwarder logic out of the screens, with tests; no more copies (#350) (9e54190)
- sim: the simulated console split by service, behind a lock, its games in one table, its variables read alike (#239) (09e2e78)
- ui: late callbacks guarded, one update check per session, layers checked by CI (#351) (6f725bf)
- ui: one colour API, the theme's; corners and type sizes as tokens (#277) (95e675c)
- ui: structured dialogs and errors, one palette, Today split (#255) (80d9934)
- ui: the hand-made dialogs on the Cadran pieces: a QR card, a wait, a bar, the display face (#276) (29f051d)
🧰 Other
- cmake: warn on shadowed names, and none left (#360) (5225ba5)
- packaging: the Homebrew App Store listing, written for each build and checked by the store's own tool (#271) (2e4cbc3)
🧪 Tests
- sim: the time left read at the frozen Wednesday, not the host's clock (#319) (1c0f8c4)
- smoke: still footer hints, targeted reference updates, doc lag warnings, bedtime and dialog coverage (#261) (ec08266)
- smoke: the larger text on Console, Preferences, About and Help too (#282) (c19f601)
- ui: the palettes' contrast checked, both themes (#281) (c2a3c53)
- visual: the references are main's own screens, kept by CI; a pull request announces the screens it changes (#371) (2a0d612)
📚 Documentation
- contributing: main wants pull requests up to date, not a merge queue (#343) (4e6fe1e)
- contributing: one page per subject under docs/contributing/, the test suites grouped by area (#374) (5671ee4)
- guide: a getting-started page, the features in sections, the common problems, in the console's 15 languages (#253) (b1e67c0)
- guide: every translation caught up with the English pages, the roadmap with what shipped (#332) (e9d0378)
- guide: every translation caught up with the security and wording changes (#357) (f30f1ce)
- guide: every translation of the features page caught up with the English one (#378) (b4ae136)
- guide: the 12 other translations caught up with the reorganised tabs, the last strings in English translated (#340) (c03a828)
- guide: the boards in every language (#236) (f92a13f)
- guide: the guide caught up with the app, the README's screenshots and tour taken again (#379) (44406cf)
- guide: the guide's translations caught up with English, the scheduled profile and the PIN's pause in every language (#395) (7397496)
- guide: the reorganised menus everywhere, the features page in every language, one name per thing (#345) (4e4f5d8)
- guide: the user guide in every language of the console, with stale translations flagged and the site's links checked (#232) (fd61173)
- pin: a restart of the console locks a temporary unlock again (#224) (446d2fa)
- PlayGuard is in the Homebrew App Store and sphaira, in every language (#398) (6b21bc1)
- PlayGuard is not in the Homebrew App Store yet, install it by hand (#328) (8a86a07)
- readme: a cleaner README that reads well on a phone (#331) (21733c7)
- readme: one short README in English; the documentation read on the website (#285) (70e402c)
- release-notes: the 1.3.0 summary, from every pull request since 1.2.0 (#396) (0249826)
- web: the website and the simulator at https://playguard.link (#244) (75f7bd9)
Предыдущие версии
1.2.0
🚀 Features
- about: PlayGuard's release notes on the same screen as Atmosphère's and hekate's (#211) (6a368b4)
- about: the release notes on the Version row, Ⓐ and a chevron, not a row of their own (#220) (98ca7da)
- about: the release notes on their own screen, laid out as in "What's new" (#217) (be36404)
- activity: a grey controller on a game's cover until its icon arrives (#214) (ae4628c)
- activity: All games on a screen of its own, as covers or a list (#201) (1c7a4c8)
- activity: drop the games to rediscover (#209) (6d03162)
- activity: play time over 100 h in whole hours, the all-time average over months or years (#195) (69591f3)
- activity: start on the account shown last, or on a default one (#198) (5f88b3b)
- compat: firmware 23.0.1 verified on a console (#167) (a3f8802)
- console: the Console tab's notes icons on their rows, their text a press away (#216) (3b98efb)
- dev-builds: a clearer build page, GitHub's Markdown, text from GitHub made safe (#149) (0f325f3)
- dev-builds: a page per build, a loading bar, Find a build, resumed downloads (#147) (44239ec)
- dev-builds: each build on two lines with tags, Y to search (#150) (4f7d8bf)
- dev-builds: go back to the previous build, even when the new one crashes (#148) (a116ddf)
- dev-builds: the first tab lists the repository's releases, not just the latest (#145) (e7eacd3)
- games: the data check remembered, a To check section, games picked for one action (#166) (ea59309)
- games: the Reinstall actions as buttons above the list, and the list sent to a gist (#163) (a04395b)
- games: Tools › Check the installed games: the cause, the fix and the repairs (#69) (bb35936)
- header: the language and the theme in the main screen's header, a tap or − to change them (#189) (4964e7a)
- header: the version in a tag next to the title, the bell, language and theme at the right (#221) (7b4f601)
- history: refused changes, the countdown, day groups, a filter and an export (#159) (fd00eef)
- logs: a log file per run, PlayGuard's own CPU crashes with their backtrace, a fuller report (#157) (cdbe871)
- notices: a notification bell gathers what needs the parent, Y opens it (#155) (97be4df)
- notices: a weak PIN, PlayGuard open without it, backups, SD space, the week, and kinds to turn off (#158) (0338592)
- notices: ignore a warning to do from the bell, mark everything read (#188) (fe4a5b2)
- notices: the bell counts the parental controls, the Console tab the console, in a fixed order (#179) (ff92739)
- notices: the recovery sysmodule out of date, newer Atmosphère, hekate and firmware (#156) (7a386cf)
- pin: the PIN entered once holds until PlayGuard closes, asking again after 5 minutes a switch away (#186) (e307f09)
- play-timer: the week chart opens the per-day editor, one save for several days (#180) (9b9430a)
- rescue: update an out-of-date recovery sysmodule from the notification bell (#164) (88a2c4f)
- rollback: the previous build offered only after a start that did not finish, not with L + R (#218) (ea80f11)
- tools: release notes of Atmosphère, hekate and the firmware (#165) (ddc8ca8)
- ui: a badge on each tab with something to do (#199) (e23c2ef)
- ui: a Console tab and a History tab in place of Tools and Network clock (#178) (36c19b5)
- ui: an open padlock and a crossed-out pencil by the title, a tap goes where they are undone (#212) (ab8a14e)
- ui: each setting next to the feature it shapes, Advanced on a screen of its own (#176) (c7a01bb)
- ui: one meaning per word for the locks, a PIN tab, a chevron on lines that open a screen (#170) (6cc0166)
- ui: the badge on the row to fix, and the tab opens on it (#202) (a494fd2)
- ui: the installed games to check as covers, and All games' chevron (#213) (34b57c8)
🐞 Bug Fixes
- app: the findings of the second review of main (#185) (1dee8b6)
- console: a Diagnostics header above the network clock and the game check (#197) (a987107)
- dev-builds: no error page in a resumed download, requests side by side, a cut install recovered, a digest required (#173) (263e2ae)
- diagnostic: the memory PlayGuard allocated, developer mode logged, the free-communication list one ID per line (#222) (26463a1)
- games: one scan of the installed games at a time, stopped on exit, and the same names as Activity (#171) (475240b)
- i18n: a build without a checksum said to be refused, the public-report notice translated (#181) (c457964)
- markdown: runs of <, & and <scripted are read once, not once per character (#154) (b6c7561)
- play-timer: extra time comes back by itself the next day, no "Keep" to dismiss it with (#182) (fb1f49d)
- play-timer: no PIN, no silent "not applied"; three pctl codes named (#151) (8c271f6)
- rescue: the recovery report proven by the sysmodule, and other security fixes (#175) (7fbf87a)
- security: "Lock and quit" closes the game PlayGuard runs over (#146) (fc60f5f)
- sys-notes: older versions in the tabs left, so an up-to-date console can browse its notes (#196) (e01aed8)
- ui: the focus kept on the screen after a dialog whose opener went (#169) (f84c157)
- ui: the footer clock on one line, the hints whole on the Switch (#200) (db00d83)
✨ Polish
- activity: the games' icons decoded off the UI thread (#210) (47a7895)
- ci: shorter smoke-test pauses, cached packages, and the slow screens' timings in the diagnostic report (#206) (9b88467)
- ci: the smoke test in balanced shards, faster scrolls to a list's end, and no relayout for an unchanged text (#203) (2353adb)
- core: pctl, the recovery sysmodule, the simulator and playstats share what they repeated (#190) (f39766c)
- games: the name and icon of each game read from ns' cache first (#168) (f107fae)
- i18n: borealis' string lookup without an exception per string in English (#207) (bd93f24)
- prefs: Preferences only sets the app up, About holds its updates and help (#187) (f827f98)
- startup: the start-up's SD-card looks before the preferences halved, and each one timed (#215) (e9c1f1b)
- tests: shared test helpers, default suite flags, markdown::parse in steps (#191) (358a223)
- ui: borealis lays out only what changed, and registers a view's XML attributes only when read (#208) (69e2cae)
- ui: shared console actions, the game check's rules under test, smaller notices and main() (#193) (97887fb)
- ui: the change history and All games laid out once, and ccache caches the size of one build (#205) (a10465e)
- ui: the UI thread kept off the SD card: logs in batches, files read in part, config.json first (#172) (ac248cd)
- util: shared date, text, UTF-8, emoji and JSON helpers; dead code out; core headers extern "C" (#177) (d1005c4)
- util: the remaining copies on the shared helpers; the game check's rules and the Activity export out of their screens (#183) (8d00e08)
- util: the remaining hand-written copies on the shared helpers; the GitHub API's URLs and its 401 handled once (#192) (276e5fa)
🧪 Tests
- fuzz: resource checks for binds, layouts, images and config keys, new suites and seven fuzz targets (#174) (7d76ecc)
- smoke: the notices' ignored screen taken once the list scrolled from its settled layout (#194) (56503fd)
📚 Documentation
1.1.0
🚀 Features
- about: the release highlights with icons, the full changelog a press away (#122) (0b8bd5d)
- history: clearer lines — the day a limit changed, today/yesterday, unknown kinds named (#139) (0357f5b)
- play-timer: choose what the console does when the time is up (#134) (cc4b958)
- release: an airier release page, and the console's own lines in comments (#128) (b5be063)
🐞 Bug Fixes
- ci: one summary on the release page, laid out again on a re-run, airier (#124) (c7eea78)
- ci: the release's discussion updated with the release app's token (#130) (7f0efde)
- play-timer: a DAILY-mode block read through its daily rule (#133) (4404c82)
- play-timer: show the time played over the limit (#140) (3890375)
- ui: dialog texts always wrap inside the dialog (#141) (682d9ac)
🧪 Tests
📚 Documentation
- a 30-second video tour, at the top of the README (#142) (26d4b2d)
- a one-screen README (#136) (e33bdc0)
- a short README, the details in a user guide under docs/ (#135) (4c37b0a)
- tested versions apart from the ones that should work (#138) (750efa8)
- the README's video tour plays inline as a GIF, and three times lighter (#143) (39c2bde)
1.0.0
⚠ BREAKING CHANGES
- new name and SD-card folder (sd:/switch/playguard/).
🚀 Features
- a branded loading screen with a progress bar over the start-up steps (#101) (12716f8)
- a summary per period and games to rediscover in Activity (#81) (3543af7)
- About tab, What's new after updates, and ways to support PlayGuard (#34) (a7a4fb3)
- Activity day by day, deleted games' totals and play time per account (#21) (33f2153)
- Activity tab with play time per game (0a6a556)
- activity: time on no account, and new user accounts flagged (#93) (49ce852)
- an intro at start-up, the loading screen held 2 seconds (Preferences) (#110) (ee3aea7)
- ask for the PIN before a change, or to open PlayGuard (#19) (bb91242)
- back up and restore the parental-control settings (0a6a556)
- bedtime alarm display and opt-in advanced actions (time's up alarm, pause / resume) (4a00686)
- change the bedtime alarm, checked against what the console reports (#44) (dd86342)
- clock: set the network clock to the console clock when no server answers (#94) (a8f1c8d)
- console lock — one switch for a 0-minute limit every day (#28) (ec78f4f)
- dev builds in tabs, reports to GitHub gists only (as .url links); fix update check and build install on the console (#114) (a874d16)
- dev builds: the build list at once, kept and refreshed on demand; artifacts download through a GitHub App; network tasks no longer wait behind the play log (#48) (18144ca)
- dev: clear the cache and the log files, with confirmations and result screens (#102) (ef3e91f)
- developer tool to compare the play-timer block, exemption list in the diagnostic report (#22) (8e8841d)
- development builds from the build artifacts, signed in to GitHub with a QR code; no more pre-releases (#40) (a2c6ce6)
- dev: the builds on a screen of their own, by kind, the pull requests sortable (#112) (0ccf593)
- diagnostic report in sd:/switch/playguard/logs/ (never contains the PIN) (4a00686)
- diagnostics: the start-up times in the diagnostic report (#106) (ebe85c5)
- export the Activity figures to the SD card as CSV, JSON, XLSX or PDF (0a6a556)
- extra time today from the Play timer tab (0a6a556)
- firmware 23.0.1 / Atmosphère 1.12.0 support with firmware and Atmosphère detection (4a00686)
- French translation, language and theme preferences, readable error messages (4a00686)
- install a development build in place from the developer tools (#39) (9af654e)
- lock parental controls again right after a write (4a00686)
- network clock from ~50 public NTP servers, measured against 3 servers (adapted from anbingxi's fork) (4a00686)
- new PlayGuard logo and store art (f576890)
- onboarding, applet warning, Activity totals, week view and i18n polish (#14) (17bc3f1)
- per-day editor with no-limit days, Monday–Friday / weekend presets, copy a day and discard changes (4a00686)
- play-time limit profiles saved on the SD card (4a00686)
- PlayGuard in every console language (#25) (8ff5b0c)
- preferences — start tab, extra-time amounts, remembered Activity choices, daily update check, start-up clock check, backups kept (#17) (cfb9d44)
- profiles with any name, edited and renamed without applying; backups keep the alarm, the rating body and the raw play-timer block (#18) (392499d)
- READ_ONLY build "PlayGuard Diagnostics" that cannot change anything (4a00686)
- record the play timer every 30 s, explain the clock sync setting, document how the parental controls work (#46) (884f94f)
- recovery sysmodule and screen for a forgotten PIN that blocks the console (#27) (39be7fc)
- restrictions — what a preset restricts before choosing it, the rating organisation editable and restored from backups (#20) (10bfe9d)
- restrictions tab (level, age rating, social-media posting, communication, VR mode) (4a00686)
- say that PlayGuard's time over a game counts, and leave it out of the Activity tab (#37) (b401170)
- say when the console is not counting play time, what it does at the limit, and what changed outside PlayGuard (#87) (2ec32af)
- SD-card layout: sd:/config/playguard, a folder per system, logs in subfolders with limits (#111) (bc59c46)
- send a diagnostic report online, with the debug files, as a link and QR codes (#38) (21f38d4)
- show the PIN in the Security tab (0a6a556)
- single build with runtime read-only, developer mode and firmware screen (#8) (111afeb)
- tabbed interface (Overview with a play-time gauge, Play timer, Restrictions, Network clock, Companion app, PIN & security, Tools & about) (4a00686)
- the Activity tab opens at once on its last figures, kept on the SD card, and refreshes them quietly (#42) (5f38ec0)
- the console's live clock and time zone for "today", midnight while open, pending and automatic extra-time restore (#16) (32ee158)
- the play-timer recording says what happened, in an event column (#66) (e535ca9)
- the version at the right of every screen's header, a development build shown apart (#115) (fbe1c84)
- UI/UX overhaul — editable week chart, first steps, change history with undo, per-account activity, Preferences tab (#24) (3c0b950)
- UI/UX overhaul, play-timer profiles and extra time, console information and PlayGuard naming (#6) (97af3c8)
- update: update in place as a method, a screen at start-up for a newer release (#117) (0364abf)
- upload: a gist with a file per part, not one bundled text (#109) (6c8885b)
- upload: send reports to bpa.st, or a secret gist when signed in to GitHub (#49) (a16524e)
- upload: the latest crash reports sent with the report, the bug form's launch and system filled in (#113) (ebd1cef)
- warn while the "time's up" alarm is off, and compare PlayGuard with replacement sysmodules (#30) (a0dd1da)
🐞 Bug Fixes
- a failed read or save no longer loses extra time, the history or a block the timer still counts (#72) (360507f)
- a hand-written rescue report, a damaged config or an unlocked exit no longer get past the PIN (#70) (5d2376c)
- an uncaught exception crashes PlayGuard, not hbmenu after it (#68) (607ce67)
- bpa.st's new Let's Encrypt root on the console, and long dialogs wrapped again (#103) (df74698)
- build: ship the compiled deko3d shaders, uam does not give the same bytes twice (#105) (bb8ebd1)
- every D-pad press moves one line, nothing hidden at the ends; "..." on the console font (#35) (33a57a4)
- findings of a full review — two crashes, the play-timer gate, relock safety, console lock, rescue delete (#33) (edbf386)
- harden the PIN: Show the PIN always asks, "open" locks again after time away (#83) (9807925)
- hints for documented error codes, a "list cut" signal, relock after a manual unlock (#95) (570126f)
- join background threads instead of detaching them (the console cannot) (#99) (b57ef58)
- keep damaged settings and history, check the play-timer block, gate firmware 23.x (#84) (4ccbd20)
- keep the play-timer fields PlayGuard does not decode, relock after an unverified unlock, resilient preferences (#10) (cde7aef)
- label the week charts, mark over-limit and unsaved days, unchecked extra-time list, download progress (#76) (101f81f)
- Latin font for every label on the console, no cross-fade between screens (#36) (2c45307)
- open the pctl:a session per action and release it right away (Atmosphère crashes on 22.5) (4a00686)
- play-timer write gate moved into the service layer, also covering "Remove the limit" (4a00686)
- QR codes drawn as one texture, a long link crashed the app (#108) (d174d4f)
- restore with nothing to change, warn while the phone app is linked, all-time totals of games deleted before PlayGuard (#90) (47a58c4)
- security: localtime_r in the crash handler, files created 0644 (#107) (bac99e1)
- sign in to GitHub with the recreated PlayGuard OAuth app (#63) (5cd6326)
- the first steps' clock check no longer hangs on its spinner (#43) (81967c3)
- the PIN lock screen says what the PIN screen answered (#55) (5352990)
- the right PIN opens PlayGuard from the lock screen (#65) (83db34f)
- UI feedback and consistency (unlocked title, B cancels, danger buttons, clock and update checks, plain app errors) (#11) (0251ce8)
- upload: send the report as multipart and show dpaste's real error (#45) (d1889c7)
- verify the temporary unlock before writing (4a00686)
- warn about the recovery sysmodule, confirm loosened restrictions, say what to do after a system error, accept any script in profile names (#75) (7d4ae43)
✨ Polish
- activity: small icons, bounded caches, kept "Show all", less UI-thread work (#91) (1926019)
- game names and icons kept between runs, compressed titles read, quitting no longer waits for a play-data read (#85) (dc6f467)
- one pctl session per Overview refresh, clocks read every 10 s, per-run caches (#13) (452e639)
- rename the project to PlayGuard, JigSawFr as author (6aff9e1)
- SD-card writes off the UI thread (config, history, developer log, exports) (#96) (2bd4996)
- split ui.cpp by concern, one game sort, fsync before rename, strict config lists (#77) (08a9c61)
- stop leaving PlayGuard's own time out of the Activity tab (#64) (135dbbe)
- the Activity list updates in place, builds its first 50 rows, decodes each icon once; background tasks end before the app (#74) (7b63af0)
- the UI's last console calls behind core/platform.h, simulated on the desktop (#23) (b2c362d)
🧰 Other
- a code of conduct, a support page, translation and console-report forms, labels kept in a file, a social preview image (#82) (9ac96c0)
- draw with deko3d on the Switch (.nro 9.4 MB -> 3.7 MB) (#12) (bd345c3)
- PlayGuard's own warnings on (errors in CI), the last English strings translated, docs caught up (#71) (a444e5b)
- release zip with the sphaira GitHub entry, raw .nro and .zip release assets (4a00686)
- restore the Switch CPU flags, ccache and a pinned toolchain in CI, sanitized host tests (#9) (84ca61a)
🧪 Tests
- CHECK() instead of assert() in the host suites, clang and coverage in CI, reproducible zips (#78) (c9cfcbb)
- desktop smoke looks for the PlayGuard window (85accf9)
- draw the footer clock at the console's time in the visual references, not a black box (#80) (f9862e6)
- host tests for pt_flow, http and backup_flow logic; visual refs for library and devbuild (#89) (f835907)
- host tests for the PIN lock, console lock and history undo decisions (#73) (b9c619b)
- one console-free core for the console and the simulator, failure injection, play-timer decisions under test (#15) (c2b5c9e)
- unit tests of the C service layer, desktop build with a simulated console, headless smoke test, resource checks (4a00686)
📚 Documentation
- a limit written by PlayGuard is enforced on the console (#53) (c10c638)
- a roadmap, and how PlayGuard compares with Nintendo's companion app (#50) (2482082)
- a work-in-progress notice at the top of both READMEs until 1.0.0 is out (#98) (33d49af)
- emuMMC/sysMMC note, a decode call while linked, honest compatibility FAQ, specific error hints, corrected texts (#88) (0fdacc0)
- every key of config.json, its values and default (#67) (751c4f8)
- explain conventional commits and squash merges for releases (4a00686)
- README screenshots regenerated from the current UI (#116) (489f283)
- refresh the README screenshots, list every file PlayGuard writes (#41) (7f71944)
- remove the work-in-progress notice from both READMEs for 1.0.0 (#118) (aad42e5)
- reorganise the README for readers, move build docs to CONTRIBUTING.md (#31) (d474430)
- roadmap horizon mentions iPhone Live Activities fed by the MQTT bridge (#79) (de32116)
- say how AI assistants were used to build PlayGuard (#52) (2c886b8)
- tests, simulator, store texts, SD-card file lists and README screenshots caught up with the code (#97) (4469a60)
- what to do when locked out (second-hand console, forgotten PIN) (#26) (ee19595)
- why PlayGuard exists, and the horizon of a bridge to MQTT and Home Assistant (#51) (a3146a3)
Upstream history — Pctl Manager by Taylor
PlayGuard is a fork of Pctl Manager. The entries below are Taylor's releases, kept for reference.
Pctl Manager v3.0.0
UI rewrite onto borealis — Horizon-system-style graphical UI replaces the v2 text console. No functional changes — every action behaves the same.
- App display name is now "Pctl Manager" (repo name
NX-Pctl-Managerunchanged). - Non-CFW boot shows a dedicated error screen (was a silent fall-through in v2).
- Build switched to CMake;
make/./run.shinterfaces unchanged. .nrogrew 265 KB → ~8.2 MB (borealis library + assets).
Tested on fw 22.1.0 / Atmosphère 1.11.1. make PROBE=1 still adds the diagnostic dump cell.
Pctl Manager v2.0.0
First public release. CFW (Atmosphère) only; tested on fw 22.1.0 / Atmosphère 1.11.1.
- Configure the daily play-time limit offline — one for all days, per-day limits, or off. When the timer is active, writes turn parental controls off temporarily (the app reads the PIN automatically) so the write doesn't destabilise Atmosphère.
- Set / change PIN via the system passcode applet.
- Delete all parental controls — also the recovery path when the PIN is forgotten.
- Unlink the Nintendo Switch Parental Controls companion phone app.
- View status: safety level, PIN length, restrictions, play-timer state.
make PROBE=1 adds a read-only "Dump current config" diagnostic cell (off in release builds).