{"id":51971135,"url":"https://github.com/gingerbeardman/twitter-classic-branding","last_synced_at":"2026-07-29T22:30:44.095Z","repository":{"id":369184359,"uuid":"1288777158","full_name":"gingerbeardman/twitter-classic-branding","owner":"gingerbeardman","description":"Rebrand a decrypted Twitter/X IPA back to classic Twitter (bird logo, feather compose, bird icons) + NeoFreeBird tweak. Version-adaptive; ships no artwork.","archived":false,"fork":false,"pushed_at":"2026-07-04T00:52:44.000Z","size":13,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-07-04T02:24:12.696Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gingerbeardman.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-07-04T00:46:14.000Z","updated_at":"2026-07-04T00:52:47.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/gingerbeardman/twitter-classic-branding","commit_stats":null,"previous_names":["gingerbeardman/twitter-classic-branding"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/gingerbeardman/twitter-classic-branding","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gingerbeardman%2Ftwitter-classic-branding","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gingerbeardman%2Ftwitter-classic-branding/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gingerbeardman%2Ftwitter-classic-branding/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gingerbeardman%2Ftwitter-classic-branding/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gingerbeardman","download_url":"https://codeload.github.com/gingerbeardman/twitter-classic-branding/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gingerbeardman%2Ftwitter-classic-branding/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":36052204,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"online","status_checked_at":"2026-07-29T02:00:04.910Z","response_time":95,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-07-29T22:30:43.432Z","updated_at":"2026-07-29T22:30:44.086Z","avatar_url":"https://github.com/gingerbeardman.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# twitter-classic-branding\n\nRebrand a decrypted **Twitter / X** IPA back to **classic Twitter** — bird logo in the\nfeed, feather compose button, bird launch screen, bird app icon + name, classic bird\nalternate icons, and \"Post → Tweet\" wording — then inject the [NeoFreeBird](https://github.com/NeoFreeBird)\ntweak. One command, and it adapts to the app version.\n\n\u003e [!WARNING]\n\u003e You need a **decrypted Twitter/X IPA that you obtained legally** (dumped from a device\n\u003e you own). This repo ships **no** Twitter/X artwork — branding assets are fetched at\n\u003e build time from the public [NeoFreeBird/app](https://github.com/NeoFreeBird/app) repo.\n\u003e \"Twitter\", the bird, and \"X\" are trademarks of X Corp. For personal use.\n\n## Why it's built this way\n\nThe interesting part is *where* each branded element actually lives — most of it is **not**\nin the asset catalog, which is why naive catalog edits don't work:\n\n| Element | Real source | Fix |\n|---|---|---|\n| Feed / nav logo | `TwitterAppearance.bundle/VectorImages/main/twitter.svg` | swap the vector |\n| Compose button | feature switch `composer_fab_icon_option` (+ `compose.svg`) | set to `\"\"`, swap vector |\n| Launch screen | `xLogo` **inside `Assets.car`** | rebuild the catalog |\n| App name / home icon | `Info.plist` / primary icon | `cyan -n` / `cyan -k` |\n| Alternate icons | `Custom-Icon-*` in `Assets.car` | rebuild the catalog |\n| Wording | `Localization_Localization.bundle` (English) | in-place string replace |\n\nThe catalog is rebuilt from the target version's **own** extracted renditions with only the\nbranded ones swapped, so nothing the newer app added gets lost.\n\n## Requirements\n\n- macOS with **Xcode** (`actool`, `assetutil`, `clang`)\n- `brew install imagemagick librsvg`\n- `pipx install cyan \u0026\u0026 pipx inject cyan pillow`  ([pyzule-rw](https://github.com/asdfzxcvbn/pyzule-rw))\n- A compiled **NeoFreeBird tweak** (the `.dylib`s + `BHTwitter.bundle`). Build it from\n  [the tweak repo](https://github.com/NeoFreeBird) with `./build.sh --sideloaded`, then point\n  `TWEAK_DYLIBS` / `TWEAK_BUNDLE` at it (defaults look in `./tweak/`).\n\n## Usage\n\n```bash\n./rebrand.sh /path/to/decrypted-twitter.ipa [output.ipa]\n```\n\nFirst run auto-fetches branding sources (`fetch-sources.sh`) and generates the home icon.\nOutput defaults to `./NeoFreeBird-Twitter.ipa`. Install with AltStore / SideStore / Sideloadly.\n\n## What's committed vs fetched vs generated\n\n- **Committed:** the scripts in `tools/`, `rebrand.sh`, `fetch-sources.sh`, and\n  `sources/Twitter_bird_logo_black.svg` (the [Font Awesome](https://fontawesome.com) free\n  Twitter mark, CC BY 4.0) used to render the app/launch/icon birds.\n- **Fetched** into `sources/nfb/` (git-ignored): NeoFreeBird's `twitter.svg`, `compose.svg`,\n  and classic custom-icon masters.\n- **Generated / ignored:** `sources/home-icon.png`, the merged catalog, and all IPAs.\n\n## Tools\n\n| file | role |\n|---|---|\n| `rebrand.sh` | orchestrator |\n| `fetch-sources.sh` | pull NeoFreeBird branding assets from upstream |\n| `tools/carextract.m` | CoreUI `Assets.car` → PNG extractor |\n| `tools/list_appicons.py` | list App Icon asset names in a `.car` |\n| `tools/merge_assets.py` | apply bird overrides at the version's rendition sizes |\n| `tools/build_xcassets.py` | flat PNGs → `.xcassets` for `actool` |\n| `tools/rebrand_strings.py` | English wording rebrand |\n\n## Notes\n\n- **English only** for wording — blanket replacement across all 47 languages is unsafe\n  (e.g. German \"Post\" = mail), so other languages keep their current strings.\n- `Custom-Icon-X-*` (Cyber/Mars/Moon/…) and Grok keep their X art — no classic equivalent.\n- Login/posting may fail due to X's server-side attestation; that's outside a tweak's control.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgingerbeardman%2Ftwitter-classic-branding","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgingerbeardman%2Ftwitter-classic-branding","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgingerbeardman%2Ftwitter-classic-branding/lists"}