BadNotes 0.3 forges one subscription response
BadNotes changes what Goodnotes sees when the app checks a subscription. Its single Objective-C source file replaces NSURLSession's request method at runtime, watches for the /v1/subscribers/ path, and rewrites the returned JSON. The substituted data says the account owns a Pro product and gives that entitlement an expiry in 2099. This is a client-side bypass of a paid service, not an independent notes app or an extension API.
Release 0.3 goes beyond changing one JSON field. The code suppresses StoreKit receipt refresh and restore calls, changes two localized strings, removes cache validators from matching requests, and reports a successful JSON response to the app. Those choices make the intent easy to audit because the whole implementation fits in Tweak.m. They also mean the tweak reaches into networking, purchases, and interface text inside an app it does not control.
What happened when we ran it
Our 3-CPU, 8 GB sandbox did not run BadNotes at commit 9687b80 on September 23, 2026. The lab has no supported Objective-C ecosystem, and this repository has no Dockerfile that could provide one. We therefore have no successful install, build, or test to claim. That limitation matters here because a compiler command in a README does not establish that an injected iOS app opens, signs correctly, or survives a Goodnotes update.
The unprivileged sandbox also had no Apple device, iOS signing setup, or decrypted Goodnotes package. We did not substitute a different environment and call that equivalent. The useful result is the boundary itself: BadNotes cannot be evaluated through the project's documented command on our standard Debian runner. Any reliability judgment must therefore come from the source, release history, and reported device behavior rather than from a run we did not perform.
One compiler command does not produce an installable app
The README's build section contains one xcrun clang command for an arm64 dynamic library. It does not explain how to obtain or sign the host app, which iOS and Goodnotes versions match release 0.3, how to remove the tweak, or how to recover user data after a crash. That gap is visible in issue 2, where a reader asks for a tutorial and receives a community answer involving third-party sideloading rather than maintainer documentation.
A manual GitHub Actions workflow fills in part of the missing machinery. It accepts two URLs, downloads a decrypted IPA and a tweak, clones insert_dylib and ivinject, then publishes a modified IPA as a release asset. The workflow's default tweak URL still points to version 0.1 even though 0.3 is the latest tag. It also reads the tweak's MIME type without rejecting an unexpected result, so that step's name promises more validation than its shell commands perform.
Server-side Goodnotes features remain unavailable
BadNotes writes an AI quota of 525 into its replacement response, but the README plainly says server-side features such as AI and collaboration will not work. That is the right warning to believe. A local response patch can change what the interface thinks an account owns, while a remote service can still check authorization before doing work. Anyone choosing the tweak for those features is choosing the one part the author already excludes.
The open compatibility report is more basic. Issue 1 describes a white screen followed by an immediate exit on current iPadOS installation attempts. The owner attributed the failure to missing CloudKit entitlements and said on September 8 that a fix had been found but was not yet released. GitHub shows the latest push and release 0.3 on September 7, so the repository history does not contain that later promised update.
September activity has not produced the promised fix
GitHub listed 148 stars and 2 open issues and pull requests when we fetched the repository. The last push was September 7, 2026, the day release 0.3 appeared. Issue 1 was still receiving comments through September 20, which shows user interest, but activity around a problem is different from a shipped correction. The owner answered early in the thread, yet the release available to users still predates the claimed fix.
The project is also young. Its first commit landed on September 1, followed by three numbered releases within one week. Fast iteration can be useful during an experiment, but it leaves little compatibility history for a tweak that depends on private behavior inside another iOS app. With no result from our sandbox and no documented device matrix, a cautious reader should treat every Goodnotes update as an unverified target.
Three legitimate note apps avoid the entitlement bypass
Joplin is an offline-first Markdown notes app with iOS support and several sync choices. Standard Notes provides end-to-end encrypted notes across mobile and desktop clients. Logseq is aimed at linked, local knowledge management and includes mobile work. None is a drop-in replacement for Goodnotes handwriting, but each offers a supported path to open-source note-taking without injecting code into a commercial app or fabricating a purchase record.
BadNotes 0.3 is most defensible as a compact security example: it shows exactly why a paid entitlement should not depend on mutable client data. That lesson does not make the tweak a sensible daily tool. The published release still lacks the post-September 8 compatibility fix, the main issue still reports immediate exits, and the project's own README rules out the server features that might otherwise justify the risk.
