mirror of
https://github.com/faroukbmiled/RyukGram.git
synced 2026-07-25 13:40:53 +02:00
RyukGram
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
buy_me_a_coffee: axryuk
|
||||
github: faroukbmiled
|
||||
Executable
+94
@@ -0,0 +1,94 @@
|
||||
name: 🐛 Bug Report
|
||||
description: "Notice something isn't working quite right? Help improve the tweak by reporting issues that you experience."
|
||||
title: 'bug: '
|
||||
labels:
|
||||
- bug
|
||||
assignees:
|
||||
- faroukbmiled
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
<br>
|
||||
|
||||
>[!TIP]
|
||||
> If you are looking for support with the tweak, make sure to visit the [RyukGram discussions page](https://github.com/faroukbmiled/RyukGram/discussions) to get help.
|
||||
- type: checkboxes
|
||||
id: before-start
|
||||
attributes:
|
||||
label: Before creating a bug report...
|
||||
description: 'Please make sure you have done the following steps:'
|
||||
options:
|
||||
- label: >-
|
||||
I have read through the
|
||||
[FAQ](https://github.com/faroukbmiled/RyukGram/wiki/FAQ)
|
||||
required: true
|
||||
- label: I have made sure this issue has not already been reported previously
|
||||
required: true
|
||||
- label: >-
|
||||
I have made sure this issue is present in the latest version of
|
||||
RyukGram
|
||||
required: true
|
||||
- label: >-
|
||||
I am confident that this bug presents unintended behaviour within
|
||||
the tweak
|
||||
required: true
|
||||
- type: textarea
|
||||
id: description
|
||||
attributes:
|
||||
label: Description
|
||||
description: A clear and concise description of the problem
|
||||
placeholder: >-
|
||||
Provide as much information about the issue you are experiencing as
|
||||
possible!
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: reproduction
|
||||
attributes:
|
||||
label: Minimal Reproduction
|
||||
description: Provide steps and relevant information to reproduce the problem
|
||||
placeholder: >-
|
||||
If possible, providing screenshots & videos are extremely helpful when
|
||||
trying to fix an issue
|
||||
validations:
|
||||
required: true
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: '---'
|
||||
- type: input
|
||||
id: info-ryukgram-version
|
||||
attributes:
|
||||
label: RyukGram Version
|
||||
description: This can be found at the bottom of the tweak settings
|
||||
placeholder: e.g. v0.7.0
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
id: info-instagram-version
|
||||
attributes:
|
||||
label: Instagram Version
|
||||
description: This can be found as well at the bottom of the tweak settings
|
||||
placeholder: e.g. 382.0.0
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
id: info-install-type
|
||||
attributes:
|
||||
label: Install Type
|
||||
description: The method used to use to install RyukGram
|
||||
options:
|
||||
- Sideloaded
|
||||
- TrollStore
|
||||
- Jailbroken (Rootless)
|
||||
- Jailbroken (Rootful)
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: info-device-info
|
||||
attributes:
|
||||
label: Device Info
|
||||
description: Details about the phone running the tweak
|
||||
value: |-
|
||||
Model: [e.g. iPhone 15 Pro]
|
||||
iOS Version: [e.g. 18.4]
|
||||
Executable
+39
@@ -0,0 +1,39 @@
|
||||
name: ✨ Feature Request
|
||||
description: Have an idea for a new feature/enhancement? Let us know!
|
||||
title: 'feat: '
|
||||
labels:
|
||||
- enhancement
|
||||
assignees:
|
||||
- faroukbmiled
|
||||
body:
|
||||
- type: checkboxes
|
||||
id: before-start
|
||||
attributes:
|
||||
label: Before creating a feature request...
|
||||
description: 'Please make sure you have done the following steps:'
|
||||
options:
|
||||
- label: >-
|
||||
I have read through the
|
||||
[FAQ](https://github.com/faroukbmiled/RyukGram/wiki/FAQ)
|
||||
required: true
|
||||
- label: I have made sure this feature has not already been already suggested
|
||||
required: true
|
||||
- type: textarea
|
||||
id: description
|
||||
attributes:
|
||||
label: Description
|
||||
description: A clear and concise description of the problem or missing functionality
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: solution
|
||||
attributes:
|
||||
label: Describe the solution you'd like
|
||||
description: If you have a solution in mind, please describe it
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: alternatives
|
||||
attributes:
|
||||
label: Describe alternatives you've considered
|
||||
description: Have you considered any alternative solutions or workarounds?
|
||||
Executable
+8
@@ -0,0 +1,8 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: '💬 Browse Q&A'
|
||||
url: https://github.com/faroukbmiled/RyukGram/wiki/FAQ
|
||||
about: Find answers to the most commonly asked questions
|
||||
- name: '❓ Need Help?'
|
||||
url: https://github.com/faroukbmiled/RyukGram/discussions
|
||||
about: Visit the RyukGram discussions form to get support
|
||||
@@ -0,0 +1,279 @@
|
||||
name: Build sideloaded IPA from Release Assets
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
decrypted_instagram_url:
|
||||
description: "Decrypted Instagram IPA — direct URL"
|
||||
default: ""
|
||||
required: true
|
||||
type: string
|
||||
target:
|
||||
description: "Instagram version (410 needs a 410.x IPA above)"
|
||||
default: "latest"
|
||||
required: false
|
||||
type: choice
|
||||
options:
|
||||
- "latest"
|
||||
- "410"
|
||||
build_sideload:
|
||||
description: "Sideload IPA — with plugins"
|
||||
default: true
|
||||
required: false
|
||||
type: boolean
|
||||
build_noplugins:
|
||||
description: "No-plugins IPA — any sideloader / free account"
|
||||
default: false
|
||||
required: false
|
||||
type: boolean
|
||||
dup_bundle_id:
|
||||
description: "Bundle id (no-plugins only, blank = com.burbn.instagram)"
|
||||
default: ""
|
||||
required: false
|
||||
type: string
|
||||
dup_name:
|
||||
description: "App name on Home Screen (blank = Instagram)"
|
||||
default: ""
|
||||
required: false
|
||||
type: string
|
||||
release_tag:
|
||||
description: "Release tag (blank = latest)"
|
||||
default: ""
|
||||
required: false
|
||||
type: string
|
||||
upload_artifact:
|
||||
description: "Upload the built IPA"
|
||||
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
|
||||
env:
|
||||
DUP_ID: ${{ inputs.dup_bundle_id }}
|
||||
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
|
||||
if [ -n "$DUP_ID" ] && [ "${{ inputs.build_noplugins }}" != "true" ]; then
|
||||
echo "::error::A dup bundle id needs the no-plugins build. Enable 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 }}
|
||||
INPUT_TARGET: ${{ inputs.target }}
|
||||
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}"
|
||||
# 410 builds pull the RyukGram-410 deb and tag their output -410.
|
||||
SUF=""; [ "$INPUT_TARGET" = "410" ] && SUF="-410"
|
||||
echo "tag=${TAG}" >> "$GITHUB_OUTPUT"
|
||||
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
|
||||
echo "TAG=${TAG}" >> "$GITHUB_ENV"
|
||||
echo "VERSION=${VERSION}" >> "$GITHUB_ENV"
|
||||
echo "SUF=${SUF}" >> "$GITHUB_ENV"
|
||||
echo "Using release tag: ${TAG} (version ${VERSION}${SUF})"
|
||||
|
||||
- name: Download release assets (rootless deb + injection dylibs)
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
TARGET: ${{ inputs.target }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
mkdir -p packages release-assets
|
||||
|
||||
# 410 tweak lives in the RyukGram-410 deb; main in RyukGram_. The
|
||||
# plugin dylibs are shared, so both targets pull the same ones.
|
||||
if [ "$TARGET" = "410" ]; then DEBP="RyukGram-410_*_rootless.deb"; else DEBP="RyukGram_*_rootless.deb"; fi
|
||||
gh release download "$TAG" --repo "$UPSTREAM_REPO" --dir release-assets --pattern "$DEBP"
|
||||
DEB="$(ls -t release-assets/$DEBP 2>/dev/null | head -n1 || true)"
|
||||
[ -n "$DEB" ] || { echo "::error::Rootless .deb ($DEBP) 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 }}
|
||||
env:
|
||||
DUP_NAME: ${{ inputs.dup_name }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
rm -f packages/RyukGram-sideloaded.ipa
|
||||
NAME_ARGS=()
|
||||
[ -n "$DUP_NAME" ] && NAME_ARGS=(-n "$DUP_NAME")
|
||||
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 \
|
||||
${NAME_ARGS[@]+"${NAME_ARGS[@]}"}
|
||||
|
||||
# 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}${SUF}.ipa"
|
||||
ls -la packages
|
||||
|
||||
- name: Build no-plugins IPA (cyan + NoPluginsPatch, appex stripped)
|
||||
if: ${{ inputs.build_noplugins }}
|
||||
env:
|
||||
DUP_ID: ${{ inputs.dup_bundle_id }}
|
||||
DUP_NAME: ${{ inputs.dup_name }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
rm -f packages/RyukGram-noplugins.ipa
|
||||
DUP_ARGS=()
|
||||
[ -n "$DUP_ID" ] && DUP_ARGS+=(-b "$DUP_ID")
|
||||
[ -n "$DUP_NAME" ] && DUP_ARGS+=(-n "$DUP_NAME")
|
||||
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 \
|
||||
${DUP_ARGS[@]+"${DUP_ARGS[@]}"}
|
||||
|
||||
# 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"
|
||||
|
||||
OUT="RyukGram_noplugins_v${VERSION}${SUF}.ipa"
|
||||
[ -n "$DUP_ID" ] && OUT="RyukGram_noplugins_dup_v${VERSION}${SUF}.ipa"
|
||||
mv packages/RyukGram-noplugins.ipa "packages/${OUT}"
|
||||
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*.ipa
|
||||
if-no-files-found: error
|
||||
+54
@@ -0,0 +1,54 @@
|
||||
.DS_Store
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
Icon
|
||||
._*
|
||||
.DocumentRevisions-V100
|
||||
.fseventsd
|
||||
.Spotlight-V100
|
||||
.TemporaryItems
|
||||
.Trashes
|
||||
.VolumeIcon.icns
|
||||
.com.apple.timemachine.donotpresent
|
||||
.AppleDB
|
||||
.AppleDesktop
|
||||
Network Trash Folder
|
||||
Temporary Items
|
||||
.apdisk
|
||||
*.icloud
|
||||
|
||||
*.deb
|
||||
.debmake
|
||||
_
|
||||
obj
|
||||
.theos
|
||||
packages
|
||||
|
||||
.pyzule*
|
||||
.cyan*
|
||||
.ipapatch*
|
||||
dumps
|
||||
livecontainer
|
||||
|
||||
src/**/wip.x
|
||||
src/**/wip.xm
|
||||
|
||||
*.ipa
|
||||
*.dylib
|
||||
deploy.sh
|
||||
wrapper/
|
||||
scripts/*.py
|
||||
scripts/__pycache__/
|
||||
|
||||
# FFmpegKit frameworks
|
||||
modules/ffmpegkit/
|
||||
|
||||
# External reference tweaks
|
||||
exp_flags/
|
||||
|
||||
# Source packaging
|
||||
zip-src.sh
|
||||
RyukGram-src-*.zip
|
||||
RYG*.md
|
||||
*.zip
|
||||
*_diff.txt
|
||||
@@ -0,0 +1,56 @@
|
||||
RyukGram — Proprietary Software License
|
||||
Copyright (c) Ryuk. All rights reserved.
|
||||
|
||||
1. Definitions
|
||||
"Software" means RyukGram, including the compiled tweak, its bundled
|
||||
resources, and any accompanying materials distributed by the author.
|
||||
"Author" means Ryuk, the copyright holder.
|
||||
|
||||
2. Grant
|
||||
The Author grants you a personal, non-exclusive, non-transferable,
|
||||
revocable license to download and install the compiled Software on
|
||||
devices you own or control, solely for your own personal, non-commercial
|
||||
use.
|
||||
|
||||
3. Restrictions
|
||||
You may NOT, in whole or in part:
|
||||
(a) copy, redistribute, sublicense, sell, rent, lease, or otherwise make
|
||||
the Software available to any third party;
|
||||
(b) modify, adapt, translate, or create derivative works of the Software;
|
||||
(c) decompile, disassemble, reverse-engineer, or otherwise attempt to
|
||||
derive the source code, except to the limited extent this restriction
|
||||
is prohibited by applicable law;
|
||||
(d) remove, alter, or obscure any copyright, attribution, or proprietary
|
||||
notice contained in the Software;
|
||||
(e) use the Software, or any portion of it, to build, train, or assist a
|
||||
competing product.
|
||||
|
||||
4. Contributions
|
||||
Translation files and other materials contributed to the project's public
|
||||
repository are licensed to the Author under these same terms and may be
|
||||
incorporated into current and future versions of the Software.
|
||||
|
||||
5. Ownership
|
||||
The Software is licensed, not sold. The Author retains all right, title,
|
||||
and interest in and to the Software, including all intellectual property
|
||||
rights. No rights are granted except as expressly set out here.
|
||||
|
||||
6. No Warranty
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
|
||||
|
||||
7. Limitation of Liability
|
||||
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING
|
||||
FROM, OUT OF, OR IN CONNECTION WITH THE SOFTWARE OR ITS USE.
|
||||
|
||||
8. Termination
|
||||
This license terminates automatically if you breach any of its terms. On
|
||||
termination you must stop using and delete all copies of the Software.
|
||||
|
||||
9. Trademarks
|
||||
Instagram is a trademark of its respective owner. RyukGram is an
|
||||
independent project and is not affiliated with, endorsed by, or sponsored
|
||||
by Instagram or Meta. RyukGram was inspired by, but shares no source code
|
||||
with, other Instagram tweaks.
|
||||
@@ -0,0 +1,110 @@
|
||||
[release] RyukGram v1.3.3
|
||||
|
||||
Updated for Instagram 439.0.0.
|
||||
|
||||
### ✨ Highlights
|
||||
- **Call recording** — record voice and video calls, with auto-record, smart video grids and a per-person browser to play them back
|
||||
- **Activity notifications** — one log for who read your messages plus who came online, went offline or started typing, per person, with an accurate green dot
|
||||
- **Grid feed** — turn your home feed into a tappable grid of thumbnails with stats and author overlays, per account
|
||||
- **Stories archive** — saves every story you post before it expires, with its media and full viewer list, per account
|
||||
- **Story viewers list** — a searchable, filterable, sortable and pinnable "who viewed my story", with each viewer's reaction shown
|
||||
- **Instagram Plus** — turn on some Instagram's paid subscriber features inside the app
|
||||
- **Custom button icons** — pick any Instagram icon or iOS symbol for the action and home-shortcut buttons
|
||||
|
||||
### 🆕 New features
|
||||
|
||||
#### Messages
|
||||
- Activity notifications and Activity log — records who read your messages plus who came online, went offline or started typing, as a per-person timeline. Set each event to log silently, notify you, or both, and hold anyone to customise or mute them. A new accurate active-status option turns the green dot off the moment someone leaves. Filter by type and date, swipe or multi-select to delete, and lock the log behind your passcode
|
||||
- A dot in the DMs inbox to turn your active status on or off without opening settings
|
||||
- Keep deleted messages can now also keep the ones you unsend yourself, shown faded in chat and added to the deleted log
|
||||
- Mark chats seen locally — with read-receipt blocking on, opened chats look read on your device while the sender still gets no receipt; the eye button turns orange until you really mark seen
|
||||
- Hold the account name at the top of Direct to show or hide your hidden chats, with an optional passcode/Face ID lock
|
||||
- Messages-only mode is now its own menu, can turn on automatically during a daily window, and adds a notifications shortcut plus an optional home-shortcut button in the inbox header
|
||||
- Adding someone to a list (read-receipt blocking, hidden or locked chats, chat backgrounds, story viewer pins) now opens a picker of recent DMs with username search, instead of typing it in blind
|
||||
- The DM Draw feature can now send an image as your doodle — from the gallery, Photos, your Instagram or iOS stickers, or a pasted image — with an editor to crop, resize and remove the background
|
||||
- Custom chat backgrounds can now be videos or GIFs, framed with pan-zoom and trim, with the same opacity, blur and dim controls, and re-editable later
|
||||
- Hide suggested accounts and channels in Direct messages search
|
||||
|
||||
#### Stories
|
||||
- Stories archive saves every story you post before it expires, with its media and full viewer list, per account. Browse by date in a grid, see who viewed, liked or reacted, with filter, sort, pinned viewers, an unread badge, optional alerts and its own backup and storage entry
|
||||
- The "who viewed my story" list is now searchable — filter (mutuals, following, follows you, verified, reacted, pinned), sort, and pin anyone to the top. Shows avatars, verified badges and each viewer's reaction, loads every viewer, and can switch back to Instagram's own list. Pick which one opens first
|
||||
- Marked-seen indicator — stories you already marked as seen hide the eye button or fill it green for 48 hours, per account
|
||||
- New "Save image (no music)" story download option for photo stories that have Instagram music on them
|
||||
- Story tray long-press "Profile picture" now also works in Instagram's new subscriber story preview menu
|
||||
|
||||
#### Reels
|
||||
- New reels playback menu — hold the ⋯ or audio button for speed, seek (skip back/forward by a custom amount) and auto-scroll controls
|
||||
- Auto-scroll reels is back — Instagram default or RyukGram mode that keeps advancing after you swipe back
|
||||
- Filter reels by engagement — set a minimum for likes, comments, views or reposts and reels below it never show, plus an option to hide reels whose author hides their counts. Only the Reels tab is filtered by default, so reels you open from a post, profile or share stay untouched
|
||||
- Show when a reel was reposted — an optional date on the "reposted this reel" header
|
||||
|
||||
#### Feed & Explore
|
||||
- New Grid feed — turn your home feed into a grid of post thumbnails showing likes, comments, views, shares and the author. Pinch to change columns, pull to refresh, tap a post to open it, or hold for a menu to like, follow, view profile, expand, share or copy the link. Choose which stats show, square or taller tiles, and how you switch back to Instagram's feed. Loads instantly, works per account and remembers where you left off
|
||||
- Search and explore grids now show stat pills on posts and reels — views, likes, comments, shares, reposts and date — with a page to pick which appear, reorder them and toggle them
|
||||
- New date format options — swap Instagram's relative timestamps on posts, notes, comments, stories and DMs for a fixed date, a preset like dd/MM/yyyy, or your own template, with a relative-time threshold
|
||||
- New "Block surveys" toggle — hides Instagram's in-app surveys and feedback prompts, including the "Interested in this post?" cards
|
||||
- Confirm feed refresh — an optional alert before a pull-to-refresh reloads the home feed
|
||||
- Refresh stories only — pull-to-refresh reloads just the stories tray and leaves the feed where it is
|
||||
|
||||
#### Instants
|
||||
- Instants download now works on videos too — expand, save, share and download-all all handle video instants
|
||||
- Send a video from your gallery as an Instant — frame it square, trim any 7 seconds on a scrollable timeline, then hold to record
|
||||
- Confirm before capturing an Instant — an optional alert on a photo tap or held video, plus a confirm before tapping to switch Instants
|
||||
- Auto close the Instants viewer once you've seen them all
|
||||
|
||||
#### Downloads & Gallery
|
||||
- The download manager got a rebuild — thumbnails for finished media, live size, speed and time left, a filter row, and swipe a row to cancel, retry or remove
|
||||
- Downloads now stay listed after you close the app and can be downloaded again from the history — kept from 12 hours up to forever, and cleared or exported from Backup and Storage
|
||||
- Download quality picker has an advanced view — download a video with no audio, or pick any of its audio tracks
|
||||
- Gallery — import your own photos, videos and files from the ••• menu, saved under an Imported filter
|
||||
- Gallery browsing got more controls — combine a sort with images, videos or favorites first, filter by date, pick 2 to 5 columns, and long-press a user section to select all their media
|
||||
- The gallery now uses Instagram icons throughout, grid tiles show a date chip, and long-pressing an item shows its date, source and size
|
||||
|
||||
#### Profile
|
||||
- Profile card details now also show comment, share and repost counts, with a page to pick which stats appear, reorder them and toggle them
|
||||
- Followers and Following lists get a filter and sort button on Instagram's search bar — mutuals, following, follows you or verified, sorted by name or relationship
|
||||
- Profile Analyzer's badge now shows gains and losses — a green +N when a list grew, a red −N when it shrank
|
||||
- Profile Analyzer is out of beta
|
||||
|
||||
#### Interface & notifications
|
||||
- Action button and home-shortcut icons are now fully customisable — a searchable browser for any Instagram icon or iOS symbol, per button or shared, including Instagram's colourful pet stickers
|
||||
- Tab bar icon order is now a live tab bar preview — drag to reorder, drag one up to hide, tap a hidden icon to add it back
|
||||
- Story and disappearing-media overlay buttons can be repositioned by dragging them on a preview
|
||||
- The notification pill can be placed anywhere on a phone preview, not just top or bottom
|
||||
- Notifications mirrored to the iOS notification centre can now also show as system banners while you're using the app
|
||||
- The home shortcut button shows a red dot for new deleted messages, read receipts or call recordings, with a count next to each in its menu
|
||||
- Favorite GIFs long-press menu can now copy a GIF's link
|
||||
|
||||
#### Privacy & backup
|
||||
- Device ID masking now also hides the vendor ID and machine ID, can block Apple device attestation, and can reset fresh while keeping masking on. A Device ID button on the login screen gives the same controls while signed out
|
||||
- Follow requests tracker shows a badge for updates you haven't opened yet
|
||||
- Backup's "Feature data" now opens a list where you tick exactly which stores to export, import or reset, instead of all-or-nothing
|
||||
- Backups can be locked with a password when exporting (AES-256), asked for only when you restore them
|
||||
|
||||
#### General
|
||||
- Change Instagram's own interface language from the tweak — a picker with a full language list, including Arabic even if your device isn't set to it; restart to apply
|
||||
- New Instagram Plus menu in General — turns on Instagram's paid subscriber features inside the app, including story and message peek, fonts, the app icon picker and custom story lists, with a master on/off and reset
|
||||
- Tweak settings shows an occasional donate prompt after long-term use, easily dismissed or hidden for good
|
||||
|
||||
### 🛠 Fixes
|
||||
- Tapping someone in any RyukGram list now opens their profile inside RyukGram, so Back returns to the list instead of Instagram's home
|
||||
- Your gallery carries over to this update, with a one-time prompt to restore items saved by an older version, and gallery backups now import and export every item
|
||||
- The home shortcut button now shows on iPad
|
||||
- Custom chat background now fills behind the message input on Instagram 437 instead of leaving a black strip
|
||||
- Follow requests tracker no longer counts tapping "Following" on an already-followed account as a new request
|
||||
- Follow requests tracker no longer wrongly shows received requests as withdrawn, and loads pending requests reliably
|
||||
- Detailed color picker no longer crashes in the story drawing editor on Instagram 434
|
||||
- OLED theme no longer turns the RyukGram settings screens fully black
|
||||
- OLED theme no longer blacks out grey buttons like Follow/Following on profiles
|
||||
- Downloading reels or videos with newer Instagram audio (xHE-AAC) no longer fails
|
||||
- Feed scrolling is smoother, especially with the OLED theme enabled
|
||||
- Favorite GIFs now send and appear reliably in Direct messages
|
||||
- Deleted messages log now saves photos and videos at full quality instead of a low-res thumbnail
|
||||
- Deleted messages log no longer crashes when you pull to refresh right after leaving a chat
|
||||
- Reroute native Save now shows Instagram's Save and long-press Save on DM media even where Instagram hid them, including in vanish mode
|
||||
- Settings that need a restart now take effect after one restart instead of sometimes needing two
|
||||
- Auto-clear cache now runs reliably on the chosen interval and finishes even if you close Instagram mid-clear
|
||||
- Saving or sharing media now always uses a clean name (like username_stories_date) instead of the internal temporary filename
|
||||
- Reels action button stays visible on HDR reels, following Instagram's own tint like the like button does
|
||||
- No more crash when switching to the Reels tab on some accounts
|
||||
- Bulk saving Instants now labels each save with the account that posted it, even with several people's Instants on screen
|
||||
@@ -0,0 +1,279 @@
|
||||
<div align="center">
|
||||
|
||||
# RyukGram
|
||||
|
||||
**The Instagram tweak for iOS power users.**
|
||||
|
||||
`v1.3.3` · Instagram 439.0.0 | Instagram 410.1.0
|
||||
|
||||
<sub>The Instagram 410 build is for older devices and trails the main build on newer features.</sub>
|
||||
|
||||
<p>
|
||||
<a href="https://github.com/faroukbmiled/RyukGram/releases/latest"><img src="https://img.shields.io/badge/Download-Latest%20release-7C3AED?style=for-the-badge&labelColor=1F2430" alt="Latest release" height="32"></a>
|
||||
<a href="https://t.me/ryukgram"><img src="https://img.shields.io/badge/Telegram-Channel-2AABEE?style=for-the-badge&labelColor=1F2430" alt="Telegram" height="32"></a>
|
||||
<a href="https://buymeacoffee.com/axryuk"><img src="https://img.shields.io/badge/Donate-Support%20the%20project-E5484D?style=for-the-badge&labelColor=1F2430" alt="Donate" height="32"></a>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<a href="https://github.com/faroukbmiled/RyukGram/issues">Issues</a>
|
||||
·
|
||||
<a href="#translating">Translate</a>
|
||||
·
|
||||
<a href="#features">Features</a>
|
||||
</p>
|
||||
|
||||
</div>
|
||||
|
||||
---
|
||||
|
||||
> [!NOTE]
|
||||
> RyukGram is [closed source](#credits) for now and will open up again later. Builds and translations stay current here.
|
||||
|
||||
## Install
|
||||
|
||||
### Add it in one tap
|
||||
|
||||
<div align="center">
|
||||
|
||||
<a href="https://store.ryuksign.com"><img src="https://img.shields.io/badge/Add%20RyukGram-store.ryuksign.com-7C3AED?style=for-the-badge&labelColor=1F2430" alt="Add RyukGram" height="36"></a>
|
||||
|
||||
</div>
|
||||
|
||||
Open it on your phone and everything is one tap away. Add it once and updates arrive on their own.
|
||||
|
||||
- **Sideload.** Adds the source to **Feather** or **RyukSign**, **SideStore**, or **AltStore**. Pick the **plugins** build normally, or **no plugins** if you sign with a free Apple account, since free accounts cannot sign the bundled extensions.
|
||||
- **Jailbreak.** Adds the repo to **Sileo** or **Zebra**, then installs the build that matches your setup. To paste it by hand the repo is `https://source.ryuksign.com/apt/`.
|
||||
|
||||
### Build your own IPA
|
||||
|
||||
Instagram itself cannot be bundled here, so you bring the Instagram IPA and the build slots RyukGram into it.
|
||||
|
||||
**With GitHub Actions, no Mac needed.** Fork this repo, open the **Actions** tab, and run **Build sideloaded IPA from Release Assets**. Give it your Instagram IPA and it hands back a patched IPA ready to sign and install. Turn on the no-plugins option if you sign with a free account.
|
||||
|
||||
**Or by hand** with a tool like cyan, injecting into your own Instagram IPA:
|
||||
- Regular build. Inject `zxPluginsInject.dylib` into the app and its plugins. The normal one, with the bundled extensions.
|
||||
- No-plugins build. Inject `NoPluginsPatch.dylib` instead. For a plugin free sideload, or a free account where extensions cannot be signed.
|
||||
|
||||
### Download the .deb
|
||||
|
||||
Prefer the file? Both builds are on the [latest release](https://github.com/faroukbmiled/RyukGram/releases/latest).
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<th align="left">File</th>
|
||||
<th align="left">Build</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>RyukGram_x.x.x_rootless.deb</code></td>
|
||||
<td>Rootless</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>RyukGram_x.x.x_rootful.deb</code></td>
|
||||
<td>Rootful</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
The rootless .deb also carries the dylib and bundle the sideload builds use.
|
||||
|
||||
### TrollStore
|
||||
|
||||
Download `RyukGram_trollfools.zip` from the [latest release](https://github.com/faroukbmiled/RyukGram/releases/latest) and inject it into Instagram with TrollFools.
|
||||
|
||||
---
|
||||
|
||||
Once it is running, open the settings by holding the button at the top of your profile, or the home button in the tab bar. Screenshots are [below](#opening-settings).
|
||||
|
||||
## Features
|
||||
|
||||
### General
|
||||
- Hide ads, Meta AI, and like, comment and share counts
|
||||
- Hide the TestFlight popup and turn off app haptics
|
||||
- Copy captions, comment text, and profile info
|
||||
- Download, copy, or expand image and GIF comments
|
||||
- Send any Giphy link as a comment GIF, and pin the ones you favorite
|
||||
- Download audio from the reels audio page
|
||||
- Clean shared links for embeds and strip their tracking
|
||||
- Open links in an external browser or straight from the clipboard
|
||||
- Native color picker and teen app icons
|
||||
- Liquid glass controls, with a force off switch and tab bar behavior
|
||||
- Instagram Plus turns on Instagram's own paid features
|
||||
- Notes tweaks: hide the tray, hide the friends map, custom themes
|
||||
- Drop suggestions, trending, the explore grid, sensitive covers, and surveys
|
||||
- Stat pills on search and explore, with a page to pick and reorder them
|
||||
- Anonymous live viewing and toggleable live comments
|
||||
- Redact RyukGram's own buttons in screenshots and recordings
|
||||
|
||||
### Feed
|
||||
- Grid feed turns your home feed into thumbnails, each with its stats and author
|
||||
- Pick which stats show and their order, tile shape, columns by pinch, and the date format
|
||||
- Hold a tile to preview it, or to like, follow, expand, share, or copy the link
|
||||
- Switch back to Instagram's feed from the header heart or a floating button you place
|
||||
- Hide the stories tray, suggested stories, and highlights
|
||||
- View a profile picture from a story tray long press
|
||||
- Hide the whole feed, or just suggested posts, accounts, reels, and threads
|
||||
- Turn off video autoplay
|
||||
- Long press any media to open it full screen, muted if you want
|
||||
- Custom date format with your own template and relative times
|
||||
- Turn off background and home button refresh
|
||||
- Confirm before a pull to refresh, or refresh only the stories tray
|
||||
- Hide the feed repost button
|
||||
|
||||
### Reels
|
||||
- Custom tap controls and an auto scroll mode
|
||||
- Playback menu for speed, seek, and auto scroll
|
||||
- Always visible scrubber, no auto unmute, and refresh confirmation
|
||||
- Unlock password locked reels
|
||||
- Hide the header, repost button, friend avatars, and promo pills
|
||||
- Swipe left to open the author's profile
|
||||
- Show the repost date
|
||||
- Disable scrolling and cap how many reels you can watch in a row
|
||||
- Filter the reels feed by minimum likes, comments, views, or reposts
|
||||
- Enhanced pause and play mode
|
||||
|
||||
### Action buttons
|
||||
- Context aware menus on feed, reels, stories, DMs, and profiles
|
||||
- Configurable default tap, and a searchable browser of Instagram and system icons
|
||||
- Carousel and multi story bulk download
|
||||
- Save a photo post with its music as a video
|
||||
- Save a photo story as just the image
|
||||
- Repost through Instagram's own flow
|
||||
- Full screen viewer with zoom and swipe
|
||||
- Drag to arrange your overlay buttons on a live preview
|
||||
|
||||
### Profile
|
||||
- Zoom or save the profile picture
|
||||
- View highlight covers from a long press
|
||||
- Action button for info, the picture, and follower stats
|
||||
- Follow indicator that shows who follows you back
|
||||
- Copy notes, fake your stats, and reveal full counts
|
||||
- Sort and search follower and following lists by mutuals, verified, and more
|
||||
- Follow request tracker that logs every request, even ones cancelled before you answer
|
||||
|
||||
### Profile analyzer
|
||||
- Follower and following scans, with mutuals and non followbacks
|
||||
- New and lost trackers across scans
|
||||
- Change history for name, username, bio, and picture
|
||||
- Inline and batch follow, unfollow, and remove
|
||||
- A log of every profile you open, with filters
|
||||
- Per check toggles, with a badge for gains and losses since your last look
|
||||
|
||||
### Saving
|
||||
- HD downloads up to 1080p, with a quality picker and preview
|
||||
- Audio only and raw photo options
|
||||
- Download manager with live speed, filters, swipe actions, and bulk select
|
||||
- Download history that survives a restart, with redownload and a keep window
|
||||
- Auto retry for downloads that drop offline
|
||||
- Save into a dedicated RyukGram album
|
||||
- Advanced encoding panel for codec, bitrate, resolution, and more
|
||||
- Clean filenames on every save
|
||||
- Optional download confirmation
|
||||
|
||||
### Gallery
|
||||
- A private in app library that every download can mirror into
|
||||
- Images, video, audio, and animated GIFs
|
||||
- Filter by type, source, uploader, date, and favorites, with folders
|
||||
- Sort by date, name, or size, with images, videos, or favorites first
|
||||
- Group by user into sections or folders, from 2 to 5 columns
|
||||
- Long press a user section to select all their media
|
||||
- In app preview carousel
|
||||
- Pull audio and GIFs straight from the gallery
|
||||
- Import your own photos, videos and files into the gallery
|
||||
- Grid tiles show a date chip, long press an item for its date, source and size
|
||||
|
||||
### Stories and messages
|
||||
- Keep deleted messages, including your own unsends
|
||||
- A full quality log of every unsent message, grouped by chat and searchable
|
||||
- Activity notifications for reads, online, offline, and typing, set per person
|
||||
- An activity log that keeps it all as a timeline, filterable and swipe to delete
|
||||
- Accurate active status so the green dot turns off the moment someone leaves
|
||||
- Manual and automatic mark as seen
|
||||
- Mark chats seen on your device only, the eye button stays orange until you really send it
|
||||
- Stories you already marked seen hide or tint the eye button for 48 hours
|
||||
- Send audio as a file or a voice note, with a trim editor
|
||||
- Send an image as your doodle in Draw, with a crop, resize, and background remover
|
||||
- Download voice messages
|
||||
- Turn off typing status, the vanish swipe, and view once limits
|
||||
- Toggle your activity status from a dot in the DMs inbox
|
||||
- Custom chat backgrounds from an image, video, or GIF, with a built in editor
|
||||
- Filter, sort, search, and pin story viewers, and see who reacted with what
|
||||
- Archive your own stories before they expire, viewer list included, per account
|
||||
- View story mentions and reveal poll and quiz results
|
||||
- Bypass Reveal stickers and pick custom sticker colors
|
||||
- Download disappearing DM media in full quality
|
||||
- Send Instants from your album, with crop and trim editors
|
||||
- Auto close the Instants viewer once you have seen them all
|
||||
- Toggle the Instants switch confirmation from a button in the viewer
|
||||
- Record voice and video calls into an adaptive grid, browsed per person
|
||||
|
||||
### Interface
|
||||
- A universal notification pill you can place anywhere on screen
|
||||
- Mirror toasts to the iOS notification centre, in the background or while the app is open
|
||||
- Reorder and hide tab bar icons on a live tab bar preview
|
||||
- Messages only mode, with a daily schedule and inbox header shortcuts
|
||||
- Force Instagram into any supported language
|
||||
- Home shortcut button with new item badges
|
||||
- Experimental flags
|
||||
|
||||
### Confirm actions
|
||||
- Optional confirmations for likes, follows, reposts, calls, comments, and more
|
||||
|
||||
### Fake location
|
||||
- Override your location across the app, with a map picker and saved presets
|
||||
|
||||
### Theme
|
||||
- Off, light, dark, or OLED, applied to Instagram only
|
||||
- OLED chat theme and a matching keyboard theme
|
||||
|
||||
### Security and privacy
|
||||
- Mask the device identifiers Instagram reads, from settings or the login screen
|
||||
- Passcode and biometric lock for settings, chats, logs, recordings, and the app itself
|
||||
- Hidden chats and per account lists
|
||||
- App switcher shroud and hidden previews for locked chats
|
||||
|
||||
### Backup and restore
|
||||
- Export your settings and feature data as JSON or an encrypted bundle
|
||||
- Restore with replace or merge
|
||||
- Scope any export, import, or reset to the accounts you pick
|
||||
- See what RyukGram keeps on your device, by section and account, and clear it
|
||||
|
||||
### Localization
|
||||
- English, Spanish, French, Russian, Korean, Japanese, Arabic, Vietnamese, Chinese, Portuguese, and Turkish
|
||||
- In app language picker, with English as the fallback
|
||||
|
||||
### Optimization
|
||||
- Clear the Instagram cache on demand or on a timer
|
||||
- Smoother feed scrolling
|
||||
|
||||
## Translating
|
||||
|
||||
Want RyukGram in your language? Export the strings from **Settings, Debug, Localization**, translate the right side of each `"key" = "value";` line, and open a pull request with your file at `src/Localization/Resources/<code>.lproj/Localizable.strings`. Keep the format specifiers like `%@` and `%lu` exactly as they are. Missing lines fall back to English, so partial work is welcome. Anything you contribute is licensed to the project under the same terms as RyukGram.
|
||||
|
||||
## Opening settings
|
||||
|
||||
| | |
|
||||
|:-------------------------------------------:|:-------------------------------------------:|
|
||||
| <img src="https://i.imgur.com/OnjLpZK.png"> | <img src="https://i.imgur.com/pHIuYTm.jpeg"> |
|
||||
|
||||
## Credits
|
||||
|
||||
RyukGram got its start from [SCInsta](https://github.com/SoCuul/SCInsta) by [@SoCuul](https://github.com/SoCuul), and I'm grateful for the foundation it gave the project. That code has since been fully rewritten and none of it remains, so RyukGram is its own separate codebase. It went closed source because earlier releases were being lifted and resold as paid tweaks, which is something I can't keep feeding, and I know some of you valued it staying open. Thanks to @SoCuul and the wider iOS tweak scene for paving the way.
|
||||
|
||||
- [**@SoCuul**](https://github.com/SoCuul) for SCInsta, the spark for this project
|
||||
- [**@BandarHL**](https://github.com/BandarHL) for BHInstagram
|
||||
- [**@VAXMG**](https://t.me/ciesIPAs) for OLED theme inspiration
|
||||
- [**@euoradan**](https://t.me/euoradan) for experiment flag research
|
||||
- [**@n3d1117**](https://github.com/n3d1117) for the Following feed
|
||||
- [**BillyCurtis**](https://github.com/BillyCurtis/OpenInstagramSafariExtension) for the Safari extension base
|
||||
- [**@asdfzxcvbn**](https://github.com/asdfzxcvbn) for ipapatch and zxPluginsInject
|
||||
- Furamako, [@ZomkaDEV](https://github.com/ZomkaDEV), [@ch1tmdgus](https://github.com/ch1tmdgus), [@bruuhim](https://github.com/bruuhim), [@jaydenjcpy](https://github.com/jaydenjcpy), [@brunorainha](https://github.com/brunorainha), [@yesnt10](https://github.com/yesnt10), [@tranbinh02](https://github.com/tranbinh02), [@yannouuuu](https://github.com/yannouuuu), and [@willybilly981](https://github.com/willybilly981) for translations
|
||||
|
||||
## Support
|
||||
|
||||
If RyukGram earns a spot on your phone, you can keep it going here.
|
||||
|
||||
<div align="center">
|
||||
|
||||
<a href="https://buymeacoffee.com/axryuk"><img src="https://img.shields.io/badge/Donate-Support%20the%20project-E5484D?style=for-the-badge&labelColor=1F2430" alt="Donate" height="32"></a>
|
||||
<a href="https://github.com/faroukbmiled/RyukGram"><img src="https://img.shields.io/badge/Star-the%20repo-6B7280?style=for-the-badge&labelColor=1F2430" alt="Star the repo" height="32"></a>
|
||||
|
||||
</div>
|
||||
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
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user