変更履歴
リリースノートは英語で書かれています。
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
- readme: the docs, screenshots and video tour of the current tabs (#184) (8f1cba4)
- readme: the release badge read from the release-please manifest, not the GitHub API (#219) (bac4c15)
- readme: the screenshots and video tour of 1.2.0 (#204) (0d4da46)
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).