mirror of
https://github.com/faroukbmiled/RyukGram.git
synced 2026-07-24 13:11:00 +02:00
Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f1e4b3c32f | |||
| efe1dcaed2 | |||
| 57f05c8ccb | |||
| 2baffde0ee | |||
| db4a0b7e6f | |||
| 2e79bbf09a | |||
| d97b22ad5c | |||
| 2f9bf47566 |
@@ -0,0 +1,234 @@
|
||||
name: Build sideloaded IPA from Release Assets
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
build_sideload:
|
||||
description: "Build normal sideload IPA (zxPluginsInject + ipapatch)"
|
||||
default: true
|
||||
required: false
|
||||
type: boolean
|
||||
build_noplugins:
|
||||
description: "Build no-plugins IPA (NoPluginsPatch, any sideloader)"
|
||||
default: false
|
||||
required: false
|
||||
type: boolean
|
||||
decrypted_instagram_url:
|
||||
description: "Direct URL to the decrypted Instagram IPA"
|
||||
default: ""
|
||||
required: true
|
||||
type: string
|
||||
release_tag:
|
||||
description: "Release tag to pull assets from (leave empty for latest, e.g. v1.3.0)"
|
||||
default: ""
|
||||
required: false
|
||||
type: string
|
||||
upload_artifact:
|
||||
description: "Upload artifact"
|
||||
default: true
|
||||
required: false
|
||||
type: boolean
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
env:
|
||||
UPSTREAM_REPO: faroukbmiled/RyukGram
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Build RyukGram from Release
|
||||
runs-on: macos-latest
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
steps:
|
||||
- name: Validate selection
|
||||
run: |
|
||||
if [ "${{ inputs.build_sideload }}" != "true" ] && \
|
||||
[ "${{ inputs.build_noplugins }}" != "true" ]; then
|
||||
echo "::error::Select at least one of build_sideload / build_noplugins."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Install Dependencies
|
||||
run: brew install dpkg
|
||||
|
||||
- name: Install IPA tooling (cyan + ipapatch)
|
||||
run: |
|
||||
pip install --force-reinstall https://github.com/asdfzxcvbn/pyzule-rw/archive/main.zip
|
||||
mkdir -p "$HOME/.local/bin"
|
||||
curl -fLo "$HOME/.local/bin/ipapatch" https://github.com/asdfzxcvbn/ipapatch/releases/download/v2.1.3/ipapatch.macos-arm64
|
||||
chmod +x "$HOME/.local/bin/ipapatch"
|
||||
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
|
||||
|
||||
- name: Resolve release tag
|
||||
id: tag
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
INPUT_TAG: ${{ inputs.release_tag }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
if [ -n "$INPUT_TAG" ]; then
|
||||
TAG="$INPUT_TAG"
|
||||
else
|
||||
TAG="$(gh release view --repo "$UPSTREAM_REPO" --json tagName -q .tagName)"
|
||||
fi
|
||||
[ -n "$TAG" ] || { echo "::error::Could not resolve release tag."; exit 1; }
|
||||
VERSION="${TAG#v}"
|
||||
echo "tag=${TAG}" >> "$GITHUB_OUTPUT"
|
||||
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
|
||||
echo "TAG=${TAG}" >> "$GITHUB_ENV"
|
||||
echo "VERSION=${VERSION}" >> "$GITHUB_ENV"
|
||||
echo "Using release tag: ${TAG} (version ${VERSION})"
|
||||
|
||||
- name: Download release assets (rootless deb + injection dylibs)
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
mkdir -p packages release-assets
|
||||
|
||||
gh release download "$TAG" --repo "$UPSTREAM_REPO" --dir release-assets \
|
||||
--pattern "RyukGram_*_rootless.deb"
|
||||
DEB="$(ls -t release-assets/RyukGram_*_rootless.deb 2>/dev/null | head -n1 || true)"
|
||||
[ -n "$DEB" ] || { echo "::error::Rootless .deb not found in release $TAG."; exit 1; }
|
||||
echo "DEB=${DEB}" >> "$GITHUB_ENV"
|
||||
|
||||
if [ "${{ inputs.build_sideload }}" = "true" ]; then
|
||||
gh release download "$TAG" --repo "$UPSTREAM_REPO" --dir release-assets \
|
||||
--pattern "zxPluginsInject_v*.dylib"
|
||||
ZX_DYLIB="$(ls -t release-assets/zxPluginsInject_v*.dylib 2>/dev/null | head -n1 || true)"
|
||||
[ -n "$ZX_DYLIB" ] || { echo "::error::zxPluginsInject dylib not found in release $TAG (enable include_zxinject when releasing)."; exit 1; }
|
||||
echo "ZX_DYLIB=${ZX_DYLIB}" >> "$GITHUB_ENV"
|
||||
fi
|
||||
|
||||
if [ "${{ inputs.build_noplugins }}" = "true" ]; then
|
||||
gh release download "$TAG" --repo "$UPSTREAM_REPO" --dir release-assets \
|
||||
--pattern "NoPluginsPatch_v*.dylib"
|
||||
NP_DYLIB="$(ls -t release-assets/NoPluginsPatch_v*.dylib 2>/dev/null | head -n1 || true)"
|
||||
[ -n "$NP_DYLIB" ] || { echo "::error::NoPluginsPatch dylib not found in release $TAG (enable include_noplugins_patch when releasing)."; exit 1; }
|
||||
echo "NP_DYLIB=${NP_DYLIB}" >> "$GITHUB_ENV"
|
||||
fi
|
||||
|
||||
ls -la release-assets
|
||||
|
||||
- name: Extract dylib + bundle from rootless deb
|
||||
run: |
|
||||
set -euo pipefail
|
||||
STAGE="$(mktemp -d)"
|
||||
dpkg-deb -x "$DEB" "$STAGE"
|
||||
|
||||
DYLIB_SRC="$(find "$STAGE" -type f -name 'RyukGram.dylib' | head -1)"
|
||||
BUNDLE_SRC="$(find "$STAGE" -type d -name 'RyukGram.bundle' | head -1)"
|
||||
[ -n "$DYLIB_SRC" ] || { echo "::error::RyukGram.dylib not found in deb."; exit 1; }
|
||||
[ -n "$BUNDLE_SRC" ] || { echo "::error::RyukGram.bundle not found in deb."; exit 1; }
|
||||
|
||||
cp "$DYLIB_SRC" packages/RyukGram.dylib
|
||||
rm -rf packages/RyukGram.bundle
|
||||
cp -R "$BUNDLE_SRC" packages/RyukGram.bundle
|
||||
|
||||
if [ "${{ inputs.build_sideload }}" = "true" ]; then
|
||||
# Match the @rpath LC that ipapatch writes into target binaries.
|
||||
cp "$ZX_DYLIB" packages/zxPluginsInject.dylib
|
||||
install_name_tool -id "@rpath/zxPluginsInject.dylib" packages/zxPluginsInject.dylib 2>/dev/null || true
|
||||
fi
|
||||
|
||||
if [ "${{ inputs.build_noplugins }}" = "true" ]; then
|
||||
cp "$NP_DYLIB" packages/NoPluginsPatch.dylib
|
||||
fi
|
||||
|
||||
rm -rf "$STAGE"
|
||||
ls -la packages
|
||||
ls -la packages/RyukGram.bundle | head -20
|
||||
|
||||
- name: Prepare Instagram IPA
|
||||
env:
|
||||
Instagram_URL: ${{ inputs.decrypted_instagram_url }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
wget "$Instagram_URL" --no-verbose -O packages/com.burbn.instagram.ipa
|
||||
ls -la packages
|
||||
|
||||
- name: Build sideloaded IPA (cyan + ipapatch with zxPluginsInject)
|
||||
if: ${{ inputs.build_sideload }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
rm -f packages/RyukGram-sideloaded.ipa
|
||||
cyan \
|
||||
-i packages/com.burbn.instagram.ipa \
|
||||
-o packages/RyukGram-sideloaded.ipa \
|
||||
-f packages/RyukGram.dylib packages/RyukGram.bundle \
|
||||
-c 9 -m 15.0 -du
|
||||
|
||||
# Embed Safari "Open in Instagram" extension before ipapatch
|
||||
# re-signs, so instagram.com links open the app.
|
||||
APPEX_SRC="extensions/OpenInstagramSafariExtension.appex"
|
||||
if [ -d "$APPEX_SRC" ]; then
|
||||
echo "Embedding Safari extension"
|
||||
INJECT_TMP="$(mktemp -d)"
|
||||
unzip -q packages/RyukGram-sideloaded.ipa -d "$INJECT_TMP"
|
||||
APP_DIR="$(find "$INJECT_TMP/Payload" -maxdepth 1 -type d -name '*.app' | head -1)"
|
||||
if [ -n "$APP_DIR" ]; then
|
||||
mkdir -p "$APP_DIR/PlugIns"
|
||||
rm -rf "$APP_DIR/PlugIns/OpenInstagramSafariExtension.appex"
|
||||
cp -R "$APPEX_SRC" "$APP_DIR/PlugIns/"
|
||||
( cd "$INJECT_TMP" && zip -qr -9 ../repacked.ipa Payload )
|
||||
mv "$INJECT_TMP/../repacked.ipa" packages/RyukGram-sideloaded.ipa
|
||||
fi
|
||||
rm -rf "$INJECT_TMP"
|
||||
fi
|
||||
|
||||
echo "Running ipapatch (zxPluginsInject LC injection)"
|
||||
ipapatch \
|
||||
--input packages/RyukGram-sideloaded.ipa \
|
||||
--inplace --noconfirm \
|
||||
--dylib packages/zxPluginsInject.dylib
|
||||
|
||||
mv packages/RyukGram-sideloaded.ipa "packages/RyukGram_sideloaded_v${VERSION}.ipa"
|
||||
ls -la packages
|
||||
|
||||
- name: Build no-plugins IPA (cyan + NoPluginsPatch, appex stripped)
|
||||
if: ${{ inputs.build_noplugins }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
rm -f packages/RyukGram-noplugins.ipa
|
||||
cyan \
|
||||
-i packages/com.burbn.instagram.ipa \
|
||||
-o packages/RyukGram-noplugins.ipa \
|
||||
-f packages/RyukGram.dylib packages/NoPluginsPatch.dylib packages/RyukGram.bundle \
|
||||
-c 9 -m 15.0 -du
|
||||
|
||||
# No-plugins: strip every app extension (no ipapatch, no Safari ext).
|
||||
INJECT_TMP="$(mktemp -d)"
|
||||
unzip -q packages/RyukGram-noplugins.ipa -d "$INJECT_TMP"
|
||||
APP_DIR="$(find "$INJECT_TMP/Payload" -maxdepth 1 -type d -name '*.app' | head -1)"
|
||||
if [ -n "$APP_DIR" ]; then
|
||||
find "$APP_DIR" -type d -name '*.appex' -prune -exec rm -rf {} +
|
||||
( cd "$INJECT_TMP" && zip -qr -9 ../repacked.ipa Payload )
|
||||
mv "$INJECT_TMP/../repacked.ipa" packages/RyukGram-noplugins.ipa
|
||||
fi
|
||||
rm -rf "$INJECT_TMP"
|
||||
|
||||
mv packages/RyukGram-noplugins.ipa "packages/RyukGram_noplugins_v${VERSION}.ipa"
|
||||
ls -la packages
|
||||
|
||||
- name: Upload sideload IPA artifact
|
||||
if: ${{ inputs.upload_artifact && inputs.build_sideload }}
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: RyukGram_sideloaded_v${{ steps.tag.outputs.version }}
|
||||
path: packages/RyukGram_sideloaded_v*.ipa
|
||||
if-no-files-found: error
|
||||
|
||||
- name: Upload no-plugins IPA artifact
|
||||
if: ${{ inputs.upload_artifact && inputs.build_noplugins }}
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: RyukGram_noplugins_v${{ steps.tag.outputs.version }}
|
||||
path: packages/RyukGram_noplugins_v*.ipa
|
||||
if-no-files-found: error
|
||||
@@ -0,0 +1,138 @@
|
||||
[release] RyukGram v1.3.2
|
||||
|
||||
### ✨ Highlights
|
||||
- **Follow Requests Tracker** — logs the follow requests you send and receive, fully on-device, and catches who cancels a request to follow you before you ever answer.
|
||||
- **Read receipts** — get notified (and optionally keep a searchable log) when someone reads a message you sent, grouped per chat with unread counts.
|
||||
- **Device ID** — mask the device identity Instagram reports, roll a fresh fingerprint, set a custom one, or fully clear the device and relaunch.
|
||||
- **Story viewers list** — filter, sort, search and pin who viewed your story, by mutuals / followers / verified / who liked / A–Z.
|
||||
- **Deleted-messages log overhaul** — now groups by chat and captures removed reactions and disappearing (view-once) media, not just text.
|
||||
- **Auto-coloured chat bubbles** — custom chat backgrounds can tint message bubbles solid or gradient, with auto-contrast text.
|
||||
- **Customizable tab bar** — drag to reorder any tab and toggle tabs off, replacing the old fixed presets.
|
||||
|
||||
### 🆕 New features
|
||||
|
||||
#### Profile & Profile Analyzer
|
||||
- Follow Requests Tracker — logs follow requests you send (accepted / declined / cancelled) and receive (approved / ignored / withdrawn), catching who cancels a request to follow you before you answer; notifications that open the list, a searchable history split by direction with filters, sort and bulk actions, plus a home-shortcut entry — all on-device
|
||||
- Search followers and following lists by name or username, from the filter & sort sheet
|
||||
- Hide suggested users on profiles — removes the suggested-accounts strip shown under a profile
|
||||
- Profile Analyzer scans keep running after you leave the view — a progress pill lets you track or cancel from anywhere
|
||||
- Profile Analyzer can remove people who follow you but you don't follow back, straight from the list — per-row or in batch
|
||||
- Profile Analyzer — turn individual checks on or off from a new Checks screen; disabled ones are greyed out and no longer calculated or shown
|
||||
- Profile Analyzer — turning on snapshot recording now saves your current scan right away instead of waiting for the next one
|
||||
- Profile Analyzer — opening a list now flags entries new since you last looked: a NEW tag, they sort to the top, and a "New only" filter
|
||||
|
||||
#### Messages & DMs
|
||||
- Read receipts — get notified, and optionally keep a log, when someone reads a message you sent; grouped by chat with profile photos, an unread count per chat that clears when you open it, username/date search and sort, a per-person/chat ignore list, group-chat support, and a notifications-only mode (off by default); tapping the notification opens the log; backs up via Backup & Restore (opt-in, under Feature data)
|
||||
- Custom chat backgrounds can auto-color message bubbles (text, replies and voice notes) — the other person's, yours, or both, solid or gradient (vertical, horizontal, or diagonal), with custom or auto-contrast text; works with animated themes and shows through the composer; editable from the in-chat picker with live updates
|
||||
- Deleted-messages log now groups by chat — group-chat unsends appear under the group, each tagged with who unsent it
|
||||
- Deleted-messages log can optionally record removed reactions — the emoji, who removed it, and which message it was on
|
||||
- Deleted-messages log now captures disappearing (view-once) media — saved when you open it, when it's unsent, or when you reopen the chat, and states clearly when it couldn't be recovered
|
||||
- Filter the deleted-messages log to disappearing media only
|
||||
- Exclude chats from the deleted-messages log — long-press one to stop logging it, with an ignored list to manage and undo
|
||||
- Optional background keep-alive for the deleted-messages log — catches unsends while you're away, off by default (may use more battery)
|
||||
- Hide the DM and story seen buttons while keeping receipt blocking on, with an optional confirmation before any mark-as-seen action
|
||||
- Disappearing media can advance to the next stacked message when you mark it as viewed
|
||||
- Reroute Instagram's built-in Save button on DM photos & videos to Photos, the gallery, share, or expand in-app — with the HD quality picker for videos; configurable like the other action menus (reorder, enable/disable, default tap), off by default
|
||||
- Favorite GIFs — long-press a GIF in the picker (comments and DMs) to pin it to the top with a star badge or download it; GIF comments can be favorited from their long-press menu
|
||||
- Bypass "You can't send messages" — removes the blocked-composer banner and restores the text input in restricted threads (Messages → Advanced)
|
||||
|
||||
#### Stories & Notes
|
||||
- Filter, sort, search and pin your story viewers list — reorder by mutuals, who follows you, verified, who liked, or A–Z; search by name or username; settings stick; long-press to pin viewers on top (pin by username even before they view your story)
|
||||
- Custom sticker colors — the color-wheel long-press now works on every sticker editor (slider, fundraiser, prompt and more), not just music
|
||||
- Hide story highlights — removes the resurfaced highlights row from the feed stories tray
|
||||
|
||||
#### Reels & Instants
|
||||
- Instants can auto-advance to the next one after you like or react
|
||||
- Auto-save instants — pick Photos or the RyukGram gallery and every instant you view (including while swiping) saves automatically, each one only once
|
||||
|
||||
#### Downloads & media saving
|
||||
- Save photo posts with their music — new feed action menu entries combine the photo with the exact track snippet the post plays and save it as a video to Photos or the Gallery
|
||||
- Save straight to Photos from the profile action button and the expanded media viewer, alongside the existing Gallery and share options
|
||||
|
||||
#### Notifications
|
||||
- Mirror toasts to iOS notifications — toasts that fire while Instagram is in the background are delivered to the notification centre instead so they aren't missed; tapping one opens the same thing as tapping the toast, with per-action overrides and auto-clear when the app opens
|
||||
- Bursts of toasts no longer pile up — opening the app to many unsent messages, removed reactions or seen marks shows one summary pill (e.g. "15 messages unsent") instead of a stack, while a single action still toasts instantly
|
||||
|
||||
#### Interface, navigation & theming
|
||||
- Tab bar icon order is now fully customizable — drag to reorder any tab and toggle tabs off (including profile), replacing the old fixed presets; the hide-tab switches moved into the new Icon order screen
|
||||
- Reordering rows in settings (action menus, home shortcut) is more reliable — native drag handles, no more failed drops
|
||||
- Messages-only mode keeps the search tab, with a toggle to hide it, and trims its explore grid and trending searches
|
||||
- Force progressive blur (iOS 26) — keeps the scroll-edge blur visible instead of letting it fade out
|
||||
- Custom date formats — build your own with placeholders like `{DD}/{MM}/{YYYY} {HH}:{mm}`, live preview and tap-to-insert tokens; save as many as you like and switch between them, plus a new `dd/MM/yyyy` 24-hour preset
|
||||
- Force liquid glass off — disables liquid glass for accounts that have it enabled by default
|
||||
|
||||
#### Privacy & Advanced
|
||||
- Device ID — change the device identity Instagram reports: masks the device ID and family device ID it sends, with a button on the login screen and a Device ID menu in Settings → Advanced to roll a new fingerprint, set a custom ID, revert to your real one, or fully clear the device (logins, cookies, stored IDs) and relaunch fresh
|
||||
- Disable all tweak options (Advanced → Instagram) — turns every feature off so Instagram behaves stock; your settings are kept and restored when you turn it back off
|
||||
- File logging (Settings → Debug) — records RyukGram's own activity across the app and its extensions to one shareable log file for troubleshooting, off by default
|
||||
|
||||
#### Backup & data
|
||||
- Importing a backup can now merge into your existing data instead of replacing it — pick Replace or Merge on the import page; duplicates are combined, including merging galleries together
|
||||
|
||||
### 🛠 Fixes
|
||||
- Profile action button now shows on every profile layout (some accounts were missing it on other people's profiles), no longer crashes when tapped, and long-press opens its menu again
|
||||
- Disappearing media now downloads in full quality — videos use the HD quality picker (with audio) instead of the low-bitrate version
|
||||
- Story overlay buttons no longer crash, freeze, disappear, or jump to the corner when swiping between stories — across action-button / mentions / seen combos (including mentions-only on iPad landscape)
|
||||
- Notification pills no longer re-open their view when tapped while you're already inside it
|
||||
- Home shortcut updates without a restart and now shows on accounts that don't have the create button
|
||||
- Instants download button stays put when Instagram hides its toolbar anchors
|
||||
- Instants gallery button matches the native camera controls and glides with the capture animation
|
||||
- Instants saved to gallery group under the username instead of the timestamp
|
||||
- Sending Instants from your photo album handles HDR / wide-gamut photos on every device
|
||||
- Video in photo sticker picker works again on Instagram 431+
|
||||
- Do not save recent searches works again on Instagram 431 — search bars and the DM recipient picker stop saving
|
||||
- Confirm note like also catches double-tapping a note in the inbox tray or on a profile
|
||||
- Keep deleted messages survives huge unsend bursts and cache evictions, and no longer blocks Instagram's own unsend in chat
|
||||
- Unsent-message toast names who unsent again instead of the generic message, even for messages received before the last app restart
|
||||
- Voice notes and audio shares in the deleted-messages log save as Audio with the right file extension instead of generic Share/Link
|
||||
- Deleted-messages log unread count badge now sits beside the time instead of misaligned under it
|
||||
- Doom-scrolling Reels limit starts from the reel you tapped instead of the top of the feed
|
||||
- OLED mode now blacks out more dark surfaces in comments, DMs, profiles and the deleted-messages log, while keeping buttons, search fields and Notes readable
|
||||
- Reels force-audio finds the right audio cell when Instagram nests it differently
|
||||
- Reels no longer black-screen on play in pause/play mode; silent reels are detected without flashing the "no sound" toast
|
||||
- Settings search now reaches options inside nested pages like Security & Privacy and the passcode screen
|
||||
- Skip sensitive content covers now reveal in any app language and work on feed posts, not just reels
|
||||
- Launch tab and messages-only reliably open the chosen tab instead of sometimes landing on feed or reels
|
||||
- Gallery save mode now applies to HD videos and bulk carousel saves, not just single photos
|
||||
- HD downloads no longer freeze when you leave the app mid-encode — encoding continues in the background with your quality settings, switching to a software encoder when needed
|
||||
- Notification action names in Settings, the read receipts footer, quality-picker sizes and several other strings now translate properly instead of always showing in English
|
||||
- Hold-for-settings shortcut on the profile button works again on Instagram 432
|
||||
- Profile action button works again on Instagram 432 and no longer disappears when you open its menu
|
||||
- Profile action button no longer overlaps Instagram's own nav buttons (notify bell, follow, more) on profiles that show them
|
||||
- Auto mark seen on send no longer fires a read receipt when you forward or share a post into a chat, including to multiple people
|
||||
- Auto mark seen on send now also covers reel quick-reactions, voice notes and media, and still marks if you leave the chat before media finishes uploading
|
||||
- Confirm calls and hide call buttons now work on the new single call button that opens an audio/video menu (some accounts)
|
||||
- Confirm calls no longer asks twice on accounts with the old call-button layout
|
||||
- Confirm note reactions works again on Instagram 431
|
||||
- Hide "Made with Edits" and "Use template" work again on Instagram 431
|
||||
- Reels swipe-to-profile opens the right reel on newer Instagram versions and no longer hijacks carousel swipes
|
||||
- Note theming and custom note buttons work as independent toggles again
|
||||
- Instagram-native style notifications appear above tweak popups instead of behind them
|
||||
- Hide UI on Capture now also redacts the home shortcut, follow indicator, follow-list filter button, notes editor buttons, revealed sticker results, story mentions counter, Instants gallery / chat background / password-locked-reels buttons, profile-card view/like/date overlays, and the Unsent tag on kept deleted messages — previously these stayed visible in screenshots
|
||||
- Long-press download works again on carousel posts on Instagram 432 — saves the right photo or video from feed and Reels carousels
|
||||
- Hide Meta AI works again on Instagram 432 — search, the DM inbox AI button, the summarize pill, and AI fonts
|
||||
- Hide suggested users (search and profiles) and hide suggested chats work again on Instagram 432
|
||||
- Copy note text on long-press, OLED chat backgrounds, DM screenshot blocking, carousel photo zoom, and the detailed color picker work again on Instagram 432
|
||||
- Hiding the stories tray now also removes the mid-feed and expiring-soon stories carousels
|
||||
- Detailed color picker, hiding the explore search bar, and slider sticker reveal work again on Instagram 433
|
||||
- Quiz sticker reveal no longer highlights the first option when Instagram sends no answer data
|
||||
- Confirm switching Instants and auto-advance after a reaction work again on Instagram 433
|
||||
- Profile card likes and dates load again on the reels and reposts tabs on Instagram 433
|
||||
- Hide stories tray, story-tray filter, keep-deleted Unsent marker, feed filtering, chat backgrounds and hide call buttons all work again on Instagram 434
|
||||
- Custom GIF in comments works again on Instagram 432+
|
||||
- Download quality sheet no longer randomly skips to standard quality on some reels and reposts
|
||||
- Gallery filters now work inside grouped folders — only folders with matches show, counts and previews reflect the filter, and it carries into the folder you open
|
||||
- The tweak's story menu options (exclude story seen, mute audio, view mentions) now also appear in Instagram's redesigned story menu — the new bottom sheet some accounts get — matching its native grouped style, with the same items as the classic 3-dot menu
|
||||
- Profile Analyzer “You unfollowed” list now shows your real follow state — people you re-followed get an Unfollow button instead of always showing Follow
|
||||
- Settings search bar no longer shows a grey box over the native glass on accounts that have liquid glass enabled by default
|
||||
|
||||
### 🔄 Changes
|
||||
- RyukGram's own menus now keep the stock iOS appearance — the theme only applies to Instagram
|
||||
- Profile settings toggles that lacked a description now have one
|
||||
- Deleted-messages log chat list restyled to match the read receipts log, with the search bar kept at the top on iOS 26
|
||||
- Follow indicator redesigned — cleaner pill look and faster cached follow statuses
|
||||
- Removed the Disable instants creation toggle — Instagram has its own option to hide Instants
|
||||
- Removed the Auto-scroll reels toggle — Instagram now has this natively
|
||||
- Locked, hidden, and excluded chat lists now show real profile pictures, including group chat photos
|
||||
- Fixed Hide trending searches not working on newer Instagram versions
|
||||
- Fixed hide call buttons, hide stories tray, custom chat backgrounds and the keep-deleted unsent marker not working on newer Instagram versions
|
||||
@@ -1,6 +1,14 @@
|
||||
# RyukGram
|
||||
A feature-rich iOS tweak for Instagram, forked from [SCInsta](https://github.com/SoCuul/SCInsta) with additional features and fixes.\
|
||||
`Version v1.2.2` | `Tested on Instagram 426.0.0`
|
||||
`Version v1.3.2` | `Tested on Instagram 434.0.0`
|
||||
|
||||
<a href="https://buymeacoffee.com/axryuk" target="_blank" rel="noopener noreferrer"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-violet.png" alt="Buy me a coffee" height="50"></a>
|
||||
|
||||
---
|
||||
|
||||
> [!WARNING]
|
||||
> **Source pushes to this repository are paused for now, until further notice** — partly because a bit of the code has been finding its way into other paid projects, with no credit.
|
||||
> Releases and localization are still kept up to date here — new builds land on the [Releases](https://github.com/faroukbmiled/RyukGram/releases/latest) page, and translation pull requests are still welcome.
|
||||
|
||||
---
|
||||
|
||||
@@ -22,10 +30,14 @@ A feature-rich iOS tweak for Instagram, forked from [SCInsta](https://github.com
|
||||
- Hide ads
|
||||
- Hide Meta AI
|
||||
- Hide metrics (likes, comments, shares counts)
|
||||
- Hide the TestFlight beta update popup
|
||||
- Disable app haptics
|
||||
- Copy description
|
||||
- Copy comment text from long-press menu **\***
|
||||
- Download GIF comments **\***
|
||||
- Download / copy / expand GIF and image comments **\***
|
||||
- Custom GIF in comments — long-press the GIF button to paste any Giphy link **\***
|
||||
- Favorite GIFs — long-press a GIF in the picker to pin it to the top or download it **\***
|
||||
- Download audio from the reels audio page **\***
|
||||
- Profile copy button **\***
|
||||
- Replace domain in shared links for embeds (Discord, Telegram, etc.) **\***
|
||||
- Strip tracking params from shared links **\***
|
||||
@@ -36,6 +48,9 @@ A feature-rich iOS tweak for Instagram, forked from [SCInsta](https://github.com
|
||||
- Use detailed (native) color picker
|
||||
- Enable liquid glass buttons
|
||||
- Enable liquid glass surfaces **\***
|
||||
- Force liquid glass off — for accounts that have it enabled by default
|
||||
- Liquid glass tab bar — Fixed (never shrink) / Hide on scroll
|
||||
- Force progressive blur (iOS 26) — keep the scroll-edge blur from fading out
|
||||
- Enable teen app icons
|
||||
- IG Notes:
|
||||
- Hide notes tray
|
||||
@@ -47,6 +62,7 @@ A feature-rich iOS tweak for Instagram, forked from [SCInsta](https://github.com
|
||||
- No suggested chats
|
||||
- Hide trending searches
|
||||
- Hide explore posts grid
|
||||
- Skip sensitive content covers **\***
|
||||
- Live
|
||||
- Anonymous live viewing **\***
|
||||
- Toggle live comments **\***
|
||||
@@ -56,6 +72,7 @@ A feature-rich iOS tweak for Instagram, forked from [SCInsta](https://github.com
|
||||
### Feed
|
||||
- Hide stories tray
|
||||
- Hide suggested stories **\***
|
||||
- Hide story highlights **\***
|
||||
- View profile picture from story tray long-press menu **\***
|
||||
- Hide entire feed
|
||||
- No suggested posts
|
||||
@@ -64,7 +81,8 @@ A feature-rich iOS tweak for Instagram, forked from [SCInsta](https://github.com
|
||||
- No suggested threads posts
|
||||
- Disable video autoplay
|
||||
- Media zoom — long press media to expand in full-screen viewer **\***
|
||||
- Custom date format — feed, notes/comments/stories, and DMs **\***
|
||||
- Start media muted — expanded videos open with sound off **\***
|
||||
- Custom date format — feed, notes/comments/stories, and DMs; presets or build your own with placeholders (`{DD}/{MM}/{YYYY} {HH}:{mm}`), optional relative threshold, compact "1h" style, and a Combine with date picker (`Jan 5, 2026 (2h)` or `2h – Jan 5, 2026`) **\***
|
||||
- Disable background refresh, home button refresh, and home button scroll **\***
|
||||
- Disable reels tab button refresh **\***
|
||||
- Hide repost button in feed **\***
|
||||
@@ -78,7 +96,11 @@ A feature-rich iOS tweak for Instagram, forked from [SCInsta](https://github.com
|
||||
- Unlock password-locked reels **\***
|
||||
- Hide reels header
|
||||
- Hide repost button in reels **\***
|
||||
- Hide friends avatars on the reels Friends tab **\***
|
||||
- Hide social context overlay on reels (reposted/commented bubbles) **\***
|
||||
- Hide "Made with Edits" / "Open in Edits" promo pills on reels **\***
|
||||
- Hide reels blend button
|
||||
- Swipe a reel left to open the author's profile
|
||||
- Disable scrolling reels
|
||||
- Prevent doom scrolling (limit maximum viewable reels)
|
||||
- Enhanced Pause/Play mode (when Pause/Play tap control is set): **\***
|
||||
@@ -91,7 +113,10 @@ A feature-rich iOS tweak for Instagram, forked from [SCInsta](https://github.com
|
||||
### Action buttons **\***
|
||||
- Context-aware action menu on feed, reels, and stories **\***
|
||||
- Configurable default tap action per context **\***
|
||||
- Global icon picker — change the icon used across feed, stories, reels and DMs **\***
|
||||
- Optional date header at the top of the action menu **\***
|
||||
- Carousel and multi-story reel support with bulk download **\***
|
||||
- Save photo posts with their music as a video — uses the exact track snippet the post plays (Photos or Gallery) **\***
|
||||
- Repost via IG's native creation flow **\***
|
||||
- Full-screen media viewer with zoom and swipe **\***
|
||||
- Story playback pauses when menus are open **\***
|
||||
@@ -100,25 +125,59 @@ A feature-rich iOS tweak for Instagram, forked from [SCInsta](https://github.com
|
||||
- Zoom profile photo — long press to view full-screen **\***
|
||||
- Save profile picture
|
||||
- View highlight cover from profile long-press menu **\***
|
||||
- Profile copy button **\***
|
||||
- Follow indicator — shows whether the user follows you **\***
|
||||
- Profile action button — copy info, view / share / save the profile picture (Photos or Gallery), follower info **\***
|
||||
- Follow indicator — shows whether the user follows you (off / on / colored) **\***
|
||||
- Copy note on long press **\***
|
||||
- Fake profile stats — verified badge and follower/following/post counts **\***
|
||||
- Profile Analyzer (beta) — follower/following scans with mutuals, non-followbacks, new/lost trackers, and profile change history; searchable lists with batch follow/unfollow **\***
|
||||
- Show full follower / post count on profile headers **\***
|
||||
- No suggested users — hides the suggested-accounts strip on profiles **\***
|
||||
- Profile card details — view count, like count and upload date overlay on each post / reel card, with optional short-number format and on-demand fetch for missing counts **\***
|
||||
- Filter, sort & search follower/following lists — reorder by mutuals, who follows you, verified or A–Z, filter to just those, search by name or username, plus load-more and jump to top/bottom **\***
|
||||
- Follow Requests Tracker — logs follow requests you send (accepted / declined / cancelled) and receive (approved / ignored / withdrawn), catching who cancels a request before you answer; notifications, a searchable history split by direction with filters, sort and bulk actions, all on-device **\***
|
||||
|
||||
### Profile Analyzer (beta) **\***
|
||||
- Follower and following scans with progress and cancel **\***
|
||||
- Mutuals and non-followbacks lists **\***
|
||||
- New and lost followers/following trackers across scans **\***
|
||||
- Profile change history — username, name, bio, pfp **\***
|
||||
- Searchable lists with inline and batch follow/unfollow, plus remove-follower on the non-followbacks list **\***
|
||||
- Visited profiles tracker — log every profile you open with date / verified / private filters **\***
|
||||
- Pull-to-refresh on the visited list re-syncs identity and pictures from IG **\***
|
||||
- Enable or disable individual checks from a Checks screen — disabled ones are greyed out and skipped **\***
|
||||
- Turning on snapshot recording archives your current scan right away instead of waiting for the next one **\***
|
||||
- Opening a list flags what's new since you last viewed it — a NEW tag, new entries sorted to the top, and a New-only filter **\***
|
||||
|
||||
### Saving
|
||||
- Enhanced HD downloads up to 1080p **\***
|
||||
- Quality picker with preview playback **\***
|
||||
- Audio-only and raw photo download options **\***
|
||||
- Fallback to 720p without FFmpegKit **\***
|
||||
- Download pill with progress bar and bulk counter **\***
|
||||
- Save to RyukGram album **\***
|
||||
- Live progress through both download and encode **\***
|
||||
- Encodes keep running when you leave the app — hardware hands off to a software encoder that keeps your quality settings **\***
|
||||
- Download manager — parallel downloads with a configurable limit, one combined progress pill, and a live queue with cancel / retry / redownload, long-press share / save, and bulk select; opens from the pill, a home shortcut, or settings **\***
|
||||
- Auto-retry dropped downloads — parks offline downloads and resumes them when the connection returns **\***
|
||||
- Save to RyukGram album — every download + share-sheet "Save to Photos" routes into a dedicated album with a customizable name **\***
|
||||
- Enhanced media resolution — IG's CDN ships higher-quality images **\***
|
||||
- Advanced encoding panel — codec (HW / libx264), preset, tune, H.264 profile + level, CRF / bitrate, pixel format, max resolution, frame rate, audio codec / bitrate / channels / sample rate, faststart, strip metadata **\***
|
||||
- Download confirmation dialog **\***
|
||||
- Output filenames formatted as `@username_context_timestamp` **\***
|
||||
- Output filenames formatted as `@username_context_timestamp` across every save surface (feed / reels / DMs / notes / comments / disappearing media) **\***
|
||||
- Legacy long-press gesture (deprecated, customizable finger count + hold time) **\***
|
||||
|
||||
### Gallery **\***
|
||||
- On-device gallery — every download can mirror into an in-app library **\***
|
||||
- Stores images, videos, audio (m4a/aac/mp3/ogg/opus/...) and animated GIFs **\***
|
||||
- Filter chips by type, source (feed / reels / stories / DMs / profile / notes / comments) and uploader; favorites; folders **\***
|
||||
- Group by user — sections or virtual folders alongside your real folders; filters apply inside folders **\***
|
||||
- Folder cells show a thumbnail collage + item count and last-activity date **\***
|
||||
- In-app preview carousel — image / video / audio scrubber / GIF playback **\***
|
||||
- Audio + GIF picker — DM Upload Audio and (in future surfaces) Comment GIF can pull straight from the gallery **\***
|
||||
- "Download to Gallery" submenu on every download surface when the gallery is enabled, with Photos / Gallery / Share options for audio **\***
|
||||
|
||||
### Stories and messages
|
||||
- Keep deleted messages **\***
|
||||
- Deleted messages log — dedicated UI for every unsent message type, including disappearing (view-once) media, grouped by chat (group chats show who unsent each), optional removed-reaction logging, unread count per chat, search, filter (incl. disappearing-only), per-chat exclude list, bulk Save / Share / Delete, edit history per message **\***
|
||||
- Read receipts — notifies and optionally logs when someone reads a message you sent (tap the notification to open the log), grouped by chat (group chats show each reader) with profile photos, an unread count per chat, username/date search & sort, a per-person/chat ignore list, group-chat support, and a notifications-only mode **\***
|
||||
- Keep app active in the background to catch unsends while you're away — optional, off by default (may use more battery)
|
||||
- Hide trailing action buttons on preserved messages
|
||||
- Warn before pull-to-refresh clears preserved messages **\***
|
||||
- Manually mark messages as seen (button or toggle mode) **\***
|
||||
@@ -131,15 +190,21 @@ A feature-rich iOS tweak for Instagram, forked from [SCInsta](https://github.com
|
||||
- Advance on story like **\***
|
||||
- Advance on story reply **\***
|
||||
- Per-chat read-receipt exclusion list with Block all / Block selected mode **\***
|
||||
- Send audio as file from DM plus menu **\***
|
||||
- Send audio as file — DM plus menu, or long-press the camera button while replying **\***
|
||||
- Download voice messages **\***
|
||||
- Disable typing status
|
||||
- Disable vanish mode swipe **\***
|
||||
- Hide voice/video call buttons (independent toggles) **\***
|
||||
- Hide send to group chat in the share sheet **\***
|
||||
- Bypass DM character limit **\***
|
||||
- Bypass "You can't send messages" — removes the blocked-composer banner and restores the text input in restricted threads **\***
|
||||
- Pin recipients on long-press in the share sheet — pinned chats render at the top **\***
|
||||
- Custom chat backgrounds — per-chat images injected into IG's native theme picker, library upload with built-in cropper, per-image opacity / blur / dim, auto bubble color across text, replies and voice notes (tint the other person's bubbles, yours, or both — solid or gradient (vertical, horizontal, or diagonal) with readable or custom text color, works with animated themes, editable from the in-chat picker), optional global default, per-account list of chats with backgrounds **\***
|
||||
- Unlimited replay of direct stories **\***
|
||||
- Full last active date **\***
|
||||
- Send files in DMs (experimental) **\***
|
||||
- Notes actions — copy text, download GIF/audio **\***
|
||||
- Hold the DM tab button to open the on-device gallery **\***
|
||||
- Notes actions — copy text, download GIF / audio (Photos or Gallery) **\***
|
||||
- Copy note text on long press **\***
|
||||
- Disable view-once limitations
|
||||
- Disable screenshot detection
|
||||
@@ -148,32 +213,47 @@ A feature-rich iOS tweak for Instagram, forked from [SCInsta](https://github.com
|
||||
- Manual mark story as seen (button or toggle mode) **\***
|
||||
- Long-press the story seen button for quick actions **\***
|
||||
- Per-user story seen-receipt exclusion list with Block all / Block selected mode **\***
|
||||
- Filter, sort, search & pin your story viewers list — reorder by mutuals, who follows you, verified, who liked, or A–Z; search by name or username; sticky settings; long-press to pin (pinned viewers stay on top, addable by username even before they view) **\***
|
||||
- Story audio mute/unmute toggle **\***
|
||||
- View story mentions **\***
|
||||
- View story mentions, with optional quick-access overlay button and count badge **\***
|
||||
- Hide stories midcards (Trending / Music) **\***
|
||||
- Stop story auto-advance **\***
|
||||
- Reveal poll/slider vote counts and quiz answers on stories and reels before interacting **\***
|
||||
- Force legacy Quiz sticker back into the story composer tray **\***
|
||||
- Disappearing DM media overlay — action button, mark-as-viewed eye, and audio toggle **\***
|
||||
- Download disappearing DM media **\***
|
||||
- Force legacy Quiz and Reveal stickers back into the story composer tray **\***
|
||||
- Bypass Reveal sticker — view stories blurred behind a Reveal sticker without DMing the author **\***
|
||||
- Allow video in photo sticker — story photo sticker picker accepts videos too **\***
|
||||
- Custom sticker colors — pick any solid or gradient color from the color wheel in sticker editors (music, lyrics, slider, question, prompt and more) **\***
|
||||
- Disappearing DM media overlay — action button, mark-as-viewed eye (optionally advancing to the next stacked message), and audio toggle **\***
|
||||
- Download disappearing DM media in full quality — videos go through the HD quality picker **\***
|
||||
- Reroute the native DM Save button — turn Instagram's built-in Save on DM photos & videos into Photos / Gallery / Share / Expand, configurable through the standard action-menu config **\***
|
||||
- Upload audio as voice message with built-in trim editor **\***
|
||||
- Disable instants creation
|
||||
- Send Instants from your photo album — gallery button on the Instants camera with a built-in square cropper, posts through IG's native capture flow; pick from the in-app gallery or Photos library when the gallery is enabled
|
||||
- Allow screenshots on Instants — bypasses the screenshot/screen-record block, scoped to the Instants viewer only
|
||||
- Instants action button — Expand / Save (Photos / Gallery) / Share / Save all, fully configurable through the standard action-menu config
|
||||
- Auto-save Instants — every Instant you view (including while swiping) saves to Photos or the Gallery automatically, each one only once
|
||||
- Auto advance after reaction — moves to the next Instant after you like or react **\***
|
||||
- Confirm Instants emoji reaction — optional confirmation before a quick-reaction sends
|
||||
- Confirm Instants capture + Confirm switching Instant
|
||||
- Save to Photos / Gallery from the expanded media viewer — share button surfaces a save / share menu, with username / source attribution carried through
|
||||
|
||||
### Navigation
|
||||
- Modify tab bar icon order
|
||||
### Interface **\***
|
||||
- Tab bar shortcuts — Home shortcut button + Action button icon picker, grouped at the top of the page
|
||||
- Notifications — universal in-app pill (Minimal / Colorful / Glow / Island), per-action routing (custom pill / IG-native / off), top or bottom position, master kill switch, swipe-to-dismiss, multi-pill stacking
|
||||
- Background mirroring — toasts that fire while Instagram is in the background are delivered to the iOS notification centre instead; tapping one opens the same thing as tapping the toast, with per-action overrides and auto-clear when the app opens
|
||||
- Burst summaries — a flood of the same toast (unsent messages, removed reactions, seen marks) collapses into one summary pill instead of stacking, while a single action still toasts instantly
|
||||
- Custom tab bar icon order — drag to reorder any tab, toggle tabs off to hide them (feed / explore / create / reels / messages / profile) **\***
|
||||
- Modify swiping between tabs
|
||||
- Hiding tabs
|
||||
- Hide feed tab
|
||||
- Hide explore tab
|
||||
- Hide reels tab
|
||||
- Hide create tab
|
||||
- Hide messages tab
|
||||
- Messages-only mode — inbox + profile only, launch straight into inbox **\***
|
||||
- Messages-only mode — inbox, search & profile only, launch straight into inbox **\***
|
||||
- Hide search tab sub-toggle — drop search too, leaving just inbox & profile **\***
|
||||
- Hide tab bar sub-toggle — floating settings gear replaces it **\***
|
||||
- Launch tab — pick which tab the app opens to **\***
|
||||
- Home shortcut button — extra button on the home top bar with a configurable multi-action menu (Gallery / Settings / Security & Privacy / Hidden chats / Locked chats / Profile Analyzer / Deleted messages / Read receipts / Follow Requests / Fake location / Clear cache / Changelog) **\***
|
||||
- Experimental flags
|
||||
|
||||
### Confirm actions
|
||||
- Confirm like: Posts/Stories
|
||||
- Confirm story emoji reaction **\***
|
||||
- Confirm note like + emoji reaction **\***
|
||||
- Confirm like: Reels
|
||||
- Confirm follow
|
||||
- Confirm unfollow **\***
|
||||
@@ -184,8 +264,9 @@ A feature-rich iOS tweak for Instagram, forked from [SCInsta](https://github.com
|
||||
- Confirm follow requests
|
||||
- Confirm vanish mode
|
||||
- Confirm posting comment
|
||||
- Confirm send to group chat **\***
|
||||
- Confirm changing direct message theme
|
||||
- Confirm sticker interaction (stories / highlights, separate toggles) **\***
|
||||
- Confirm sticker interaction (stories / highlights, per-surface: disabled / all / reaction stickers only) **\***
|
||||
|
||||
### Fake location **\***
|
||||
- Override location app-wide for any IG feature reading coordinates
|
||||
@@ -194,16 +275,29 @@ A feature-rich iOS tweak for Instagram, forked from [SCInsta](https://github.com
|
||||
- Quick toggle button on the Friends Map
|
||||
|
||||
### Theme **\***
|
||||
- Force dark mode
|
||||
- Full OLED — pure black app-wide
|
||||
- Theme picker — Off / Light / Dark / OLED, with optional Force theme to override the iOS appearance
|
||||
- OLED chat theme — pure black DM thread and incoming bubbles
|
||||
- Keyboard theme — dark or OLED
|
||||
- Apply & restart button
|
||||
- Keyboard theme — dark or OLED, sticks through search keyboard activations
|
||||
- The theme applies to Instagram only — RyukGram's own menus keep the stock iOS appearance
|
||||
- Apply & restart, plus Reset theme to revert every theme option
|
||||
|
||||
### Security & Privacy **\***
|
||||
- Device ID — change the device identity Instagram reports: masks the device ID and family device ID it sends, with a login-screen button and a Device ID menu in Settings → Advanced to roll a new fingerprint, set a custom ID, revert to your real one, or fully clear the device and relaunch fresh **\***
|
||||
- Passcode + biometric lock — gates tweak settings, gallery, deleted-messages log, Profile Analyzer, DM inbox, individual chats, and Instagram itself
|
||||
- Per-target idle timeout, re-lock on background, lock every time, independent session
|
||||
- Hidden chats — long-press a DM to hide it; managed under S&P
|
||||
- Per-account lists (excluded chats, hidden chats, locked chats, share-sheet pins) — switching IG accounts shows that account's own data
|
||||
- Locked, hidden, and excluded chat lists show real profile pictures, including group chat photos
|
||||
- App-switcher snapshot shroud — covers IG content when a locked surface is visible
|
||||
- Hide message preview for locked chats in the inbox
|
||||
|
||||
### Tweak settings **\***
|
||||
- Search bar with breadcrumbs across nested pages
|
||||
- What's new indicator — a dot marks newly added settings and clears once viewed **\***
|
||||
- Pause playback when opening settings **\***
|
||||
- Quick-access via long-press on feed tab **\***
|
||||
- Native Instagram icons throughout settings and in-app menus **\***
|
||||
- Disable all tweak options — one switch turns every feature off so Instagram runs stock; your settings are kept and restored when you turn it back off **\***
|
||||
|
||||
### Advanced experimental features **\***
|
||||
- Toggle hidden Instagram experiments: QuickSnap (Instants), Direct Notes reply types, Friend Map, Homecoming, Prism
|
||||
@@ -211,23 +305,24 @@ A feature-rich iOS tweak for Instagram, forked from [SCInsta](https://github.com
|
||||
- Auto-reset after 3 consecutive launch crashes
|
||||
|
||||
### Backup & Restore **\***
|
||||
- Export RyukGram settings as JSON
|
||||
- Import settings from JSON
|
||||
- Preview before saving or applying
|
||||
- Export any combination of settings, per-account filters, hidden & locked chats, Profile Analyzer, gallery, chat backgrounds, deleted messages and the read receipts log — settings stay plain JSON, bundles with media export as a compressed `.ryukbak`
|
||||
- Import as Replace or Merge — Merge folds the backup into your existing data, combining duplicates (galleries included)
|
||||
- Preview each section before saving or applying
|
||||
- Reset selected data
|
||||
|
||||
### Localization **\***
|
||||
- Multi-language UI with fallback to English **\***
|
||||
- Built-in language picker in Settings **\***
|
||||
- Currently shipping: **English**, **Spanish**, **Russian**, **Korean**, **Arabic**, **Chinese (Traditional)**
|
||||
- Currently shipping: **English**, **Spanish**, **Russian**, **Korean**, **Arabic**, **Chinese (Traditional)**, **Chinese (Simplified)**, **Portuguese (Brazil)**, **Turkish**
|
||||
|
||||
### Optimization
|
||||
- Clear Instagram cache on demand with optional auto-clear interval **\***
|
||||
- Clear Instagram cache on demand with optional auto-clear interval, with a toggle to preserve DMs, drafts, and Notes **\***
|
||||
|
||||
# Translating RyukGram
|
||||
Want to see RyukGram in your language? Two ways:
|
||||
|
||||
### Option A: In-app (fastest)
|
||||
1. Open **Settings → Debug → Localization → Export English strings** — share the base `.strings` file to yourself.
|
||||
1. Open **Settings → Debug → Localization → Export strings** — pick a language (English for a fresh start, or an existing one to fix) and share its `.strings` file to yourself.
|
||||
2. Translate the **right-hand side** of every `"key" = "value";` line. Never touch the left-hand side.
|
||||
3. Go to **Debug → Localization → Update → + Add new language** — enter your language code (e.g. `fr`), pick the translated file, restart.
|
||||
4. Your language now appears in the globe menu. Test it, tweak it, re-import as needed.
|
||||
@@ -245,7 +340,7 @@ Partial translations are welcome — untranslated keys fall back to English at r
|
||||
If you find a string that still renders in English on a translated build, open an issue with a screenshot.
|
||||
|
||||
## Known Issues
|
||||
- Preserved unsent messages cannot be removed using "Delete for you". Pull to refresh in the DMs tab clears all preserved messages (with optional confirmation if "Warn before clearing on refresh" is enabled).
|
||||
- Preserved unsent messages cannot be removed using "Delete for you". Pull to refresh in the DMs tab clears the active account's preserved messages (with optional confirmation if "Warn before clearing on refresh" is enabled).
|
||||
- "Delete for you" detection uses a ~2 second window after the local action. If a real other-party unsend happens to land in the same window, it may not be preserved. Rare in practice and limited to that specific overlap.
|
||||
- With Liquid Glass buttons + Hide UI on capture both on, the DM eye leaves an empty glass bubble in captures — IG draws that backdrop, not the tweak, so it's outside our redaction.
|
||||
|
||||
@@ -253,7 +348,7 @@ If you find a string that still renders in English on a translated build, open a
|
||||
|
||||
| | |
|
||||
|:-------------------------------------------:|:-------------------------------------------:|
|
||||
| <img src="https://i.imgur.com/uPMcugZ.png"> | <img src="https://i.imgur.com/ctIiL7i.png"> |
|
||||
| <img src="https://i.imgur.com/uPMcugZ.png"> | <img src="https://i.imgur.com/RUlsg4k.jpeg"> |
|
||||
|
||||
# Building from source
|
||||
### Prerequisites
|
||||
@@ -275,14 +370,16 @@ If you find a string that still renders in English on a translated build, open a
|
||||
### Run build script
|
||||
```sh
|
||||
$ chmod +x build.sh
|
||||
$ ./build.sh <sideload/rootless/rootful>
|
||||
$ ./build.sh <sideload/sidestore/rootless/rootful>
|
||||
```
|
||||
|
||||
# Credits
|
||||
- [SCInsta](https://github.com/SoCuul/SCInsta) by [@SoCuul](https://github.com/SoCuul) — original tweak this fork is based on
|
||||
- [@BandarHL](https://github.com/BandarHL) — creator of the original BHInstagram project
|
||||
- [@faroukbmiled](https://github.com/faroukbmiled) — RyukGram modifications and additional features
|
||||
- [Instaoled](https://t.me/ciesIPAs) by @VAXMG — OLED theme inspiration
|
||||
- [@euoradan](https://t.me/euoradan) (Radan) — experimental Instagram feature flag research
|
||||
- [@Mikasa-san](https://github.com/Mikasa-san) — code contributions
|
||||
- [@n3d1117](https://github.com/n3d1117) (Edoardo) — Following feed mode (ported from [InstaSane](https://github.com/n3d1117/InstaSane))
|
||||
- [@erupts0](https://github.com/erupts0) (John) — testing and feature suggestions
|
||||
- [BillyCurtis/OpenInstagramSafariExtension](https://github.com/BillyCurtis/OpenInstagramSafariExtension) — base for the bundled Safari extension
|
||||
- [@asdfzxcvbn](https://github.com/asdfzxcvbn) — [ipapatch](https://github.com/asdfzxcvbn/ipapatch) and [zxPluginsInject](https://github.com/asdfzxcvbn/zxPluginsInject)
|
||||
@@ -290,4 +387,13 @@ $ ./build.sh <sideload/rootless/rootful>
|
||||
- [@ch1tmdgus](https://github.com/ch1tmdgus) (N4C) — Korean translation
|
||||
- [ZomkaDEV](https://github.com/ZomkaDEV) — Russian translation
|
||||
- [@bruuhim](https://github.com/bruuhim) — Arabic translation
|
||||
- [@jaydenjcpy](https://github.com/jaydenjcpy) — Chinese (Traditional) translation
|
||||
- [@jaydenjcpy](https://github.com/jaydenjcpy) — Chinese (Traditional and Simplified) translation
|
||||
- Bruno ([@brunorainha](https://github.com/brunorainha)) — Portuguese (Brazil) translation
|
||||
- [@yesnt10](https://github.com/yesnt10) — Turkish translation
|
||||
|
||||
# Support
|
||||
|
||||
RyukGram is free and open source. If you'd like to support development:
|
||||
|
||||
- [☕ Donate to Ryuk (RyukGram)](https://buymeacoffee.com/axryuk)
|
||||
- [☕ Donate to SoCuul (original SCInsta)](https://ko-fi.com/SoCuul) — RyukGram wouldn't exist without SoCuul's original SCInsta, so showing them some love is always welcome
|
||||
|
||||
@@ -103,11 +103,30 @@ inject_bundle_into_deb() {
|
||||
|
||||
# Build zxPluginsInject.dylib -> packages/zxPluginsInject.dylib
|
||||
build_zxpi_dylib() {
|
||||
./wrapper/build-zxpi.sh >/dev/null
|
||||
[ -f packages/zxPluginsInject.dylib ] || {
|
||||
local MOD_DIR="modules/zxPluginsInject"
|
||||
local DYLIB_OUT="$MOD_DIR/.theos/obj/zxPluginsInject.dylib"
|
||||
|
||||
if [ -z "${THEOS:-}" ]; then
|
||||
if [ -d "$HOME/theos" ]; then
|
||||
export THEOS="$HOME/theos"
|
||||
else
|
||||
echo -e '\033[1m\033[0;31mTHEOS not set and ~/theos not found\033[0m' >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
( cd "$MOD_DIR" && make FINALPACKAGE=1 >/dev/null )
|
||||
|
||||
[ -f "$DYLIB_OUT" ] || {
|
||||
echo -e '\033[1m\033[0;31mzxPluginsInject.dylib build failed\033[0m' >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
mkdir -p packages
|
||||
cp "$DYLIB_OUT" packages/zxPluginsInject.dylib
|
||||
# Match the @rpath LC that ipapatch writes into target binaries.
|
||||
install_name_tool -id "@rpath/zxPluginsInject.dylib" \
|
||||
packages/zxPluginsInject.dylib 2>/dev/null || true
|
||||
}
|
||||
|
||||
# LC-inject zxPluginsInject.dylib into main exec + every .appex in the IPA.
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user