Feather Documentation

Free on-device iOS/iPadOS application manager/installer, using certificates part of the Apple Developer Program.

4,882 stars Swift Swift 1 file ยท ~6,036 tokens #esign#ios#ipa#ipados#kravasign#sideload#sideloading#sign
RAW Doc

File: app-repo.json

{
"name": "Feather Repository",
"identifier": "kh.crysalis.feather-repo",
"iconURL": "https://github.com/khcrysalis/Feather/blob/v1.x/iOS/Resources/Icons/Main/[email protected]?raw=true",
"website": "https://github.com/khcrysalis/Feather",
"apps": [
{
"name": "Feather",
"bundleIdentifier": "thewonderofyou.Feather",
"developerName": "Samara",
"iconURL": "https://github.com/khcrysalis/Feather/blob/v1.x/iOS/Resources/Icons/Main/[email protected]?raw=true",
"localizedDescription": "Feather is a free on-device iOS application manager/installer built with UIKit for quality.",
"subtitle": "On-device signing application",
"tintColor": "848ef9",
"versions": [
{
"version": "2.9.0",
"date": "2026-07-05T02:11:53Z",
"size": 12598584,
"downloadURL": "https://github.com/claration/Feather/releases/download/v2.9.0/Feather.ipa"
}
],
"appPermissions": {},
"screenshotURLs": [
"https://github.com/khcrysalis/Feather/blob/v1.x/Images/Library.png?raw=true",
"https://github.com/khcrysalis/Feather/blob/v1.x/Images/Repos.png?raw=true",
"https://github.com/khcrysalis/Feather/blob/v1.x/Images/Sign.png?raw=true",
"https://github.com/khcrysalis/Feather/blob/v1.x/Images/Store.png?raw=true"
],
"version": "2.9.0",
"versionDate": "2026-07-05T02:11:53Z",
"size": 12598584,
"downloadURL": "https://github.com/claration/Feather/releases/download/v2.9.0/Feather.ipa"
}
],
"news": [
{
"title": "Donate",
"identifier": "feather-donate",
"caption": "Feather is a free project and is not made possible without my sponsors! Feel free to donate, it helps keep me motivated in making new updates for this app, and thank you everyone.",
"tintColor": "848ef9",
"imageURL": "https://github.com/khcrysalis/Feather/blob/v1.x/Images/donate.png?raw=true",
"date": "2025-02-04",
"url": "https://github.com/sponsors/khcrysalis",
"notify": false
},
{
"title": "About Feather",
"identifier": "feather-about",
"caption": "Feather allows you to use an Apple Developer Account to sign and install applications on device without needing a computer on stock iOS versions, while allowing easy management with its applications.\n\nDue to limitations, it's hard to tell if the application is actually installed, so you will need to keep track of whats on your device. This is an entirely stock application and uses built-in features to be able to do this!",
"tintColor": "8A28F7",
"imageURL": "https://media.idownloadblog.com/wp-content/uploads/2024/08/Feather-on-device-signing-UI-app.jpg",
"url": "https://github.com/khcrysalis/feather",
"date": "2025-02-03",
"notify": true
}
]
}


File: Feather/Resources/AppIcon.icon/icon.json

{
"fill" : {
"linear-gradient" : [
"srgb:0.47451,0.52157,0.97647,1.00000",
"srgb:0.39928,0.44985,0.96515,1.00000"
],
"orientation" : {
"start" : {
"x" : 0.5,
"y" : 0
},
"stop" : {
"x" : 0.5,
"y" : 0.7
}
}
},
"groups" : [
{
"layers" : [

text
],
  "shadow" : {
    "kind" : "neutral",
    "opacity" : 0.5
  },
  "translucency" : {
    "enabled" : true,
    "value" : 0.5
  }
},
{
  "layers" : [
    {
      "image-name" : "feather.png",
      "name" : "feather"
    },
    {
      "glass" : false,
      "image-name" : "feather 5.png",
      "name" : "feather 5",
      "opacity" : 0.14
    }
  ],
  "shadow" : {
    "kind" : "neutral",
    "opacity" : 0.5
  },
  "translucency" : {
    "enabled" : true,
    "value" : 0.5
  }
}

],
"supported-platforms" : {
"circles" : [
"watchOS"
],
"squares" : "shared"
}
}


File: Feather/Resources/Assets.xcassets/Contents.json

{
"info" : {
"author" : "xcode",
"version" : 1
}
}


File: Feather/Resources/Assets.xcassets/App_Unknown.imageset/Contents.json

{
"images" : [
{
"filename" : "unknown2.png",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}


File: Feather/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json

{
"images" : [
{
"filename" : "feather.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "feather_dark.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "tinted"
}
],
"filename" : "feather_tint.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "16x16"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "16x16"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "32x32"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "32x32"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "128x128"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "128x128"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "256x256"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "256x256"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "512x512"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "512x512"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}


File: Feather/Resources/Assets.xcassets/Cert.imageset/Contents.json

{
"images" : [
{
"filename" : "Cert.png",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}


File: Feather/Resources/Assets.xcassets/Glyph.imageset/Contents.json

{
"images" : [
{
"filename" : "feather.png",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}


File: Feather/Resources/Assets.xcassets/Repositories.imageset/Contents.json

{
"images" : [
{
"filename" : "nekofiles_folder.png",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}


File: .github/README.md




Features

  • User friendly, and clean UI.
  • Sign and install applications.
  • Supports AltStore repositories.
  • View detailed information about apps and your certificates.
  • Configurable signing options mainly for modifying the app, such as appearance and allowing support for the files app.
    • This includes patching apps for compatibility and Liquid Glass.
  • Tweak support for advanced users, using Ellekit for injection.
    • Supports injecting .deb and .dylib files.
  • Actively maintained: always ensuring most apps get installed properly.
  • No tracking or analytics, ensuring user privacy.
  • Of course, open source and free.

Download

Visit releases and get the latest .ipa.

Translating

Feather now has translation support, all localizations are located in Feather/Resources/Localizable.xcstrings.

To add a new language, open Xcode and use the interface to add/contribute to languages.

To properly contribute and test potentially test localizations, you can head over to the contributing guide.

Sponsors

Thanks to all my sponsors!!
"samara is cute" - Vendicated

Acknowledgements

  • Samara - The maker
  • idevice - Backend for builds with this included, used for communication with installd.
  • *.backloop.dev - localhost with public CA signed SSL certificate
  • Vapor - A server-side Swift HTTP web framework.
  • Zsign - Allowing to sign on-device, reimplimented to work on other platforms such as iOS.
  • LiveContainer - Fixes/some help
  • Nuke - Image caching.
  • Asspp - Some code for setting up the http server.
  • plistserver - Hosted on https://api.palera.in.

License

This project is licensed under the GPL-3.0 license. You can see the full details of the license here. It's under this specific license because I wanted to make a project that is transparent to the user thats related to certificate paired sideloading, before this project there weren't any open source projects that filled in this gap.

By contributing to this project, you agree to license your code under the GPL-3.0 license as well (including agreeing to license exceptions), ensuring that your work, like all other contributions, remains freely accessible and open.


File: .github/CODE_OF_CONDUCT.md

Code of Conduct

Welcome to Feather's Code of Conduct! This document outlines essential guidelines and important information regarding interacting with the repository.

Rules

  • Be respectful when interacting in issues or us in general.
    • This includes any comments that may be harmful to a specific individual or group of people.
    • This includes different opinions.
  • Give good criticism! Most issues and pull-requests will be noticed, if some are actually required we will do something about it.
  • No piracy.
  • No trolling or spam.

Multiple violations of these rules could end up you being restricted from the repository.


File: .github/CONTRIBUTING.md

Contributing

Feather is a sideloading app meant to be used on stock versions, to keep compatibility we have to utililize stock features to keep it working. As such, we have specific contribution rules in place to maintain this and Feathers integrity.

Any contributions should follow the Code of Conduct.

Rules

[!WARNING]
Warning for AI Usage

Using AI to generate your pull request will result in your pull request automatically closed, and "vibecoded" contributions will lead to same results. Pull requests are also reviewed by an actual human and not an AI, so avoid wasting peoples time by actually following this rule.

  • No usage of any exploits of any kind.
  • No contributions related to retrieving any signing certificates owned by companies.
  • Modifying any hardcoded links should be discussed before changing.
  • If you're planning on making a large contribution, please make an issue beforehand.
  • Your contributions should be licensed appropriately.
    • Feather: GPLv3
    • AltSourceKit: MIT
    • NimbleKit: MIT
    • Zsign: MIT
  • Typo contributions are okay, just make sure they are appropriate.
    • This includes localizations
  • Code cleaning contributions are okay.

Contributing to Feather

Compiling requirements

  • Xcode 16.0
  • Swift 6.0
  • iOS 16.0
  1. Clone repository

    sh
    git clone https://github.com/khcrysalis/Feather --recursive
    • Zsign is a submodule, recursive is required.
  2. Opening with Xcode

    sh
    cd Feather && open Feather.xcworkspace

Localizations

  • For localizations, you will need Xcode 15 or higher to edit the Feather/Resources/Localizable.xcstrings file, or some alternative software which allows you to edit an .xcstrings file.
  • We use a newer format for convenience, but at a cost of less accessibility when it comes to actually editing it.
    • Disclaimer: do NOT edit by hand.
  • Some localizations were imported from V1, if they don't make sense please feel free to change them.
  • After localizing, please have another person review your localizations (unless the owners have asked you personally to help translate).
    • We want high quality localizations and have them actually make sense when in the application.
    • They will not be merged unless the latter was done.

Making a pull request

  • Make sure your contributions stay isolated in their own branch, and not main.
  • When contributing don't be afraid of any reviewers requesting changes or judging how you wrote something, it's all to keep the project clean and tidy.

Contributing to Zsign

When contributing to Zsign, head over to khcrysalis/Zsign-Package and make your contributions.

Any contributions to here will be immediately updated to here, to keep things consistent.

Contributing to the wiki

  • If you want to add a page or suggest edits, make an issue with your proposed changes.

File: .github/FUNDING.yml

github: [claration, Nyasami]


File: .github/HOW_IT_WORKS.md

How does it work?

How Feather works is a bit complicated, with having multiple ways to install, app management, tweaks, etc. However, I'll point out how the important features work here.

To start off, we need a validly signed IPA. We can achieve this with Zsign, using a provided IPA using a .p12 and .mobileprovision pair.

Install (Server)

  • Use a locally hosted server for hosting the IPA files used for installation, including other assets such as icons, etc.
    • On iOS 18, we need a few entitlements: Associated Domains, Custom Network Protocol, MDM Managed Associated Domains, Network Extensions
  • Make sure to include valid https SSL certificates as the next URL requires a valid HTTPS connection, for us we use *.backloop.dev.
  • We then use itms-services://?action=download-manifest&url= to attempt to initiate an install, by using UIApplication.open.

However, due to the changes with iOS 18 with entitlements we will need to provide an alternative way of installing. We have two options here, a way to install locally fully using the local server (the one I have just shown) or use an external HTTPS server that serves as our middle man for our PLIST_URL, while having the files still local to us. Lets show the latter.

  • This time, lets not include https SSL certificates, rather just have a plain insecure local server.
  • Instead of a locally hosting our PLIST_URL, we use plistserver to host a server online specifically for retrieving it. This still requires a valid HTTPS connection.
  • Now, to even initiate the install (due to lack of entitlements from the former) we need to trick iOS into opening the itms-services:// URL, we can do this by summoning a Safari webview to a locally hosted HTML page with a script to forcefully redirect us to that itms-services URL.

Since itms-services initiates the install automatically, we don't need to do anything extra after the process. Though, what we do is monitor the streaming progress of the IPA being sent.

Install (Pairing)

  • Establish a heartbeat with a TCP provider (the app will need this for later).
  • Once we have these and the connection was successfully established, we can move on to the installation part.
    • Before installing, we need to check for the connection to the socket that has been created, routed to 10.7.0.1, if this succeeds we're ready.
  • When preparing for installation, we need to establish another connection but for AFC using the TCP provider.
  • Once the connection was established we need to created a staging directory to /PublicStaging/ and upload our IPA there.
  • Then, using our connection to AFC we can command it to install that IPA directly. Similar to ideviceinstaller, but fully on your phone.

Due to how it works right now we need both a VPN and a lockdownd pairing file, this means you will need a computer for its initial setup. Though, if you don't want to do these you can just use the server way of installing instead (but at a cost of less reliability).


File: .github/ISSUE_TEMPLATE/blank.yml

name: Create Blank Issue
body:

  • type: markdown
    attributes:
    value: >-
    Make sure you read the Code of
    Conduct

    before making an issue, and make sure there aren't already the same bug
    reported.

  • type: textarea
    id: text
    attributes:
    label: Content
    validations:
    required: true

  • type: checkboxes
    id: agreement
    attributes:
    label: Request Agreement
    options:
    - label: I have read the requirements for opening an issue above
    required: true


File: .github/ISSUE_TEMPLATE/bug.yml

name: Create Bug Report
title: '[Bug] '
labels:

  • bug

body:

  • type: markdown
    attributes:
    value: >-
    Make sure you read the Code of
    Conduct

    before making an issue, and make sure there aren't already the same bug
    reported.

  • type: textarea
    id: text
    attributes:
    label: Report
    validations:
    required: true

  • type: checkboxes
    id: agreement
    attributes:
    label: Request Agreement
    options:
    - label: I have read the requirements for opening an issue above
    required: true

  • type: checkboxes
    id: agreement2
    attributes:
    label: Contributor Checks
    options:
    - label: I am willing to attempt to make a pull request to fix this bug
    required: false


File: .github/ISSUE_TEMPLATE/config.yml

blank_issues_enabled: false


File: .github/ISSUE_TEMPLATE/feature.yml

name: Create Feature Request
title: '[Feature] '
labels:

  • enhancement

body:

  • type: markdown
    attributes:
    value: >-
    Make sure you read the Code of
    Conduct

    before making an issue, and make sure there aren't already the same bug
    reported.

  • type: textarea
    id: text
    attributes:
    label: Request
    validations:
    required: true

  • type: checkboxes
    id: agreement
    attributes:
    label: Request Agreement
    options:
    - label: I have read the requirements for opening an issue above
    required: true

  • type: checkboxes
    id: agreement2
    attributes:
    label: Contributor Checks
    options:
    - label: I am willing to attempt to make a pull request with these requested features
    required: false


File: .github/ISSUE_TEMPLATE/repo.yml

name: Create Repo Support Request
title: '[Repo Support] '
labels:

  • enhancement

body:

  • type: markdown
    attributes:
    value: >-
    Make sure you read the Code of
    Conduct

    before making an issue, and make sure there aren't already the same bug
    reported.

    When it comes to requesting a repository to be supported, please make sure to include any generator websites you may have used for these.

    If possible link any reference guides you may have used when creating said repository.

    If you haven't created the repository yourself but you want it to be supported, please do also link it below (only AltStore repositories will be used in Feather, no other repositories like you've seen in Scarlet, or APT repositories).

  • type: input
    id: repo
    attributes:
    label: Repository
    placeholder: AltStore repository or anything similar
    validations:
    required: true

  • type: textarea
    id: text
    attributes:
    label: Request
    validations:
    required: true

  • type: checkboxes
    id: agreement
    attributes:
    label: Request Agreement
    options:
    - label: I have read the requirements for opening an issue above
    required: true


File: .github/workflows/release.yml

name: Release

on:
push:
tags:
- v*
workflow_dispatch:

jobs:
build:
runs-on: macos-latest
steps:
- name: Checkout
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
submodules: 'true'

text
- name: Prepare dependencies (Xcode)
    run: |
      sudo xcode-select -s /Applications/Xcode_26.3.0.app

  - name: Build
    run: | 
      agvtool new-version -all $(git rev-parse HEAD)
      make

  - name: Get Version
    id: get_version
    run: |
      VERSION=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" _build/Payload/*.app/Info.plist)
      echo "VERSION=${VERSION}" >> $GITHUB_ENV

  - name: Create Release
    if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
    uses: softprops/action-gh-release@3bb12739c298aeb8a4eeaf626c5b8d85266b0e65 # v3.0.2
    with:
      name: Feather v${{ env.VERSION }}
      tag_name: v${{ env.VERSION }}
      files: |
        packages/*
      generate_release_notes: true
      fail_on_unmatched_files: true
      draft: true
    env:
      GITHUB_TOKEN: ${{ env.GITHUB_TOKEN }}

File: .github/workflows/update_repo.yml

name: Update Repository

on:
release:
types: [published]

jobs:
build:
runs-on: macos-latest

text
steps:
  - uses: actions/checkout@v3
    with:
      fetch-depth: 0
      ref: main

  - name: Dependencies
    run: brew install jq

  - name: Update app-repo.json
    run: |
      TAG="${{ github.event.release.tag_name }}"
      DATE="${{ github.event.release.published_at }}"
      VERSION="${TAG#v}"

      DOWNLOAD_URL="https://github.com/${{ github.repository }}/releases/download/${TAG}/Feather.ipa"

      jq \
        --arg version "$VERSION" \
        --arg date "$DATE" \
        --arg url "$DOWNLOAD_URL" \
        '
        .apps[0].version = $version |
        .apps[0].versionDate = $date |
        .apps[0].downloadURL = $url |
        .apps[0].versions[0].version = $version |
        .apps[0].versions[0].date = $date |
        .apps[0].versions[0].downloadURL = $url
        ' app-repo.json > tmp.json

      mv tmp.json app-repo.json

  - name: Commit and push changes
    run: |
      git config user.name "github-actions[bot]"
      git config user.email "41898282+github-actions[bot]@users.noreply.github.com"

      git add app-repo.json

      git diff --cached --quiet && echo "No changes" && exit 0

      git commit -m "chore: update repo for ${{ github.event.release.tag_name }}"

      git push origin main