Ello's open source iOS app

Related tags

Utility swift ios
Overview

Ello iOS App

Build Status

Open source, but not open API

Our API requires an application key and secret, which are currently being kept private. You can browse the source, and you can compile it, but you won't be able to run it against our API. Sorry, but we don't have the resources to support this kind of open access. We have always planned to offer 3rd party access, so hopefully this will change soon!

Environment Variables

We use the dotenv gem to access application secrets in the terminal, and cocoapods-keys to store them in the app. Add the following values to your .env.

  • ELLO_STAFF: set this in your bash/zsh startup script to access private cocoapods (you must have access to the private repos).
  • GITHUB_API_TOKEN: used for generating release notes during distribution
  • INVITE_FRIENDS_SALT: used for generating the salt for sending emails to the API
  • PROD_CLIENT_KEY: the key or id used for oauth
  • PROD_CLIENT_SECRET: the secret used for oauth
  • PROD_DOMAIN: the domain for the API to hit
  • NINJA_CLIENT_KEY: the key or id used for oauth
  • NINJA_CLIENT_SECRET: the secret used for oauth
  • NINJA_DOMAIN: the domain for the API to hit
  • STAGE1_CLIENT_KEY: the key or id used for oauth
  • STAGE1_CLIENT_SECRET: the secret used for oauth
  • STAGE1_DOMAIN: the domain for the API to hit
  • STAGE2_CLIENT_KEY: the key or id used for oauth
  • STAGE2_CLIENT_SECRET: the secret used for oauth
  • STAGE2_DOMAIN: the domain for the API to hit
  • STAGING_SEGMENT_KEY: used for sending data to segment

Setup

Once you have client credentials, compile them into cocoapods-keys by running:

  • rake generate:keys

Other

  • List available rake tasks: bundle exec rake -T

Testing out Push Notifications with Knuff

  • Download Knuff https://github.com/KnuffApp/Knuff/releases
  • Install ElloDevPushSandbox.p12 in your keychain (talk to @steam to get it)
  • Print out your device's APNS Token in the function updateToken() in PushNotificationController
  • Build to device in Debug mode
  • Code Signing Identity: iPhone Distribution: Ello (ABC12345)
  • Provisioning Profile iOSTeam Provisioning Profile: co.ello.ElloDev

Universal Links

Starting with iOS 9 Apple added support for Universal Links. The previous link does a good job explaining the concept. Generating the apple-app-site-association file that is needed on the server is not well explained.

aasa.json

{
    "applinks": {
        "apps": [],
        "details": [
            {
                "appID": "ABC12345.co.ello.ElloDev",
                "paths": [ "*" ]
            },
            {
                "appID": "ABC12345.co.ello.ElloStage",
                "paths": [ "*" ]
            },
            {
                "appID": "ABC12345.co.ello.Ello",
                "paths": [ "/native_redirect/*" ]
            }
        ]
    }
}

STAR_ello_co.key, STAR_ello_co.crt and STAR_ello_co.pem are in the Ello Ops 1Password vault

cat aasa.json | openssl smime \
 -sign \
 -inkey STAR_ello_co.key \
 -signer STAR_ello_co.crt \
 -certfile STAR_ello_co.pem \
 -noattr \
 -nodetach \
 -outform DER > apple-app-site-association

APNS certificates

See also http://docs.aws.amazon.com/sns/latest/dg/mobile-push-apns.html

Create the certs in Apple's developer portal in the usual way (using the 1Password APNS password as the cert keyphrase), and download the .cer file (two of them, actually, one for co.ello.Ello, one for co.ello.ElloDev). Install that file into your keychain, then export the private key (in.p12 format, with no password).

Pinning certificates

We use pinned certificates to avoid man-in-the-middle SSL attacks. We use a rolling "primary + backup" pair of certificates, so if the primary expires or needs to be pulled, the backup is easy to swap in. Every now and then the primary / backup need to be rotated.

Cutting a new release

Merge all new changes into master, checkout a new branch release/x.x.x. Change version number in Ello and Share Extension targets. Create the archive using the Ello scheme (not ElloDev). Using Ello will update the build numbers in both plists. Commit version and build number changes. Upload archive to TestFlight. After QA changes are often required. Continue making changes, merging them into master. Then rebase the release branch onto master and repeate until a release candidate is submitted to Apple for review. Once the release is approved and live in the store you git tag x.x.x and merge the release branch into master. Following these conventions will allow github to automatically mark the release as an official release.

Sometimes you may need to increase the build number without making any changes to the code. iTunesConnect requires unique build numbers which in our case, are based off the number of commits. Any easy way to do that is git commit --allow-empty -m "bumping build number".

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/ello/ello-ios.

License

Ello iOS is released under the MIT License

Code of Conduct

Ello was created by idealists who believe that the essential nature of all human beings is to be kind, considerate, helpful, intelligent, responsible, and respectful of others. To that end, we will be enforcing the Ello rules within all of our open source projects. If you don’t follow the rules, you risk being ignored, banned, or reported for abuse.

Comments
  • Struct vs NSObject for models

    Struct vs NSObject for models

    Noticed you're using NSObject for your models, instead of structs. Would you mind elaborating why you made that choice?

    Curious to see what your thought process was :)

    opened by mitchellporter 13
  • use didFinishAnimating to get new current page for onboarding pageVC

    use didFinishAnimating to get new current page for onboarding pageVC

    Noticed a UI bug in on boarding, current if you let go of the page before it finishes animating, the pageControl doesn't update.

    I've found that using didFinishAnimating has fixed that in the past.

    This hasn't been tested.

    opened by AndrewSB 12
  • Hashing contacts

    Hashing contacts

    Hey guys,

    Was just looking through the codebase and sniffing some of the network traffic to learn more about how Ello utilizes the address book and contacts to make inviting and connecting with friends easier. Have some quick questions for you based on what I found.

    First question is, why did you guys decide to only use email addresses? Is there a reason that you decided to stay away from phone numbers? I'm not looking for a ton of info, just curious what thought process went into this.

    Second, where is the actual hashing of the emails taking place? I've been digging through the code but can't seem to pinpoint where the email addresses actually get hashed. Last but not least, what are you using to perform the hashing? I assumed you were using something like a port of bcrypt but after taking a quick look at your pods I couldn't find anything.

    I'm curious about all of this because I'll be implementing similar functionality soon and have always been a big fan of this codebase and your work, so would love to hear any insight you could provide.

    Thanks.

    opened by mitchellporter 10
  • Changes behavior of red-dot reloading in Notifications and Streams

    Changes behavior of red-dot reloading in Notifications and Streams

    Tapping red dot in Notifications shows the loader (regression fix), and in Streams tapping the red dot while viewing "Starred" will switch to "Following" and reload the page.

    reviewed 
    opened by colinta 8
  • Come up with a new header to replace the lame copyright

    Come up with a new header to replace the lame copyright

    @steam Rather than just delete the file header/copyright, we could have something interesting at the top - and include the filename there. My preference would be to keep it short.

    Something like this:

    ////
    ///  Whatever.swift
    //
    
    class Whatever {
    }
    
    opened by colinta 8
  • Tracks post detail page views when viewing a cached post

    Tracks post detail page views when viewing a cached post

    Adds sendPostView to PostDetailGenerator and postView endpoint to ElloAPI

    sendPostView is only called if the post was loaded from memory, and not during a reload postView is just one possible implementation of the post_views endpoint, and it hard codes the values of kind. In the future we could change it to support different post_views.kind values.

    Finishes #140890503

    please review 
    opened by colinta 7
  • Specifying multiple `post_install` hooks is unsupported..

    Specifying multiple `post_install` hooks is unsupported..

    When attempting to run pod install, I get as follows:

    [!] Invalid `Podfile` file: [!] Specifying multiple `post_install` hooks is unsupported..
    
     #  from /Users/drew/Code/ello-ios/Podfile:103
     #  -------------------------------------------
     #
     >  post_install do |installer|
     #    installer.pods_project.targets.each do |target|
     #  -------------------------------------------
    
    opened by drewcrawford 7
  • Show the ProfileTotalCountView as soon as 'total_views_count' is available from the API

    Show the ProfileTotalCountView as soon as 'total_views_count' is available from the API

    Show/hide the badgeButton, too, either in the avatar view or total count view.

    The behavior is a bit odd if the total_views_count is not always present on the user, since we don't load users if they've already been loaded.

    reviewed 
    opened by colinta 6
  • Fix or ignore remaining Xcode 8 spec failures

    Fix or ignore remaining Xcode 8 spec failures

    Xcode 8 has introduced instability in our test suite. Specifically, async tests fail or pass inconsistently. Unfortunately we have to mark several tests as pending to get a consistent green run.

    The hope is that the upcoming move to Swift 3 will fix some / all of these.

    We're also using NSUserDefaults.standardUserDefaults() in tests now due to incorrect behavior when using the group defaults in the test suite.

    reviewed 
    opened by steam 6
  • Load Profile and Post Detail in small pieces

    Load Profile and Post Detail in small pieces

    In an effort to speed up stream loading we are implementing generators that handle networking interactions (via services) and StreamCellItem management. Rather than loading everything a screen needs to be complete before rendering the screen we will load components independently and render them as they come in if possible.

    The basic idea is that each StreamableViewController will have it's own concrete StreamGenerator that will be responsible for making 1 or more network requests (via the service layer) to asynchronously assemble a given stream's content.

    StreamableViewController subclasses will create a concrete StreamGenerator. StreamableViewController subclasses implement StreamDestination awaiting instruction from their custom StreamGenerator.

    She be done!

    • [x] Handle Page Loading Token
    • [X] Allow updating of placeholder cells
    • [x] Updating of groups of cells bound by PlaceholderType
    • [x] Load primary JSONAble from Yap in StreamableViewController subclasses (PostDetailViewController and ProfileViewController)
    • [x] Find commonalities and abstract them into the protocol
    • [x] Fix broken specs
    • [x] Add generator specs
    • [x] Verify paging works in PostDetailViewController
    • [x] Verify paging works in ProfileViewController
    • [x] Verify no results continues to work as expected
    • [x] The profile header is a bit too short (links is 1/2 cut off).
    • [x] Rewire list/grid toggle functionality in profile detail.
    • [X] Ensure profile or post loads first (don't show other items until the main JSONAble is displayed) Marking this one done since we load the user/post from YAP prior to creating the generator. We'll need to keep an eye out for scenarios where YAP didn't have the post/user. Seems rare.
    • [x] Do not display secondary responses if the primary request fails
    • [x] Do not display secondary responses until the primary response is displayed
    reviewed 
    opened by steam 6
  • Adds post category to stream header cell

    Adds post category to stream header cell

    And snapshot specs! These test a ton of cell conditions, which revealed some problems when setting cell properties in the wrong order, I solved that by combining setUser/setRepostedBy/setCategory into one method.

    reviewed 
    opened by colinta 6
  • Bump tzinfo from 1.2.6 to 1.2.10

    Bump tzinfo from 1.2.6 to 1.2.10

    Bumps tzinfo from 1.2.6 to 1.2.10.

    Release notes

    Sourced from tzinfo's releases.

    v1.2.10

    TZInfo v1.2.10 on RubyGems.org

    v1.2.9

    • Fixed an incorrect InvalidTimezoneIdentifier exception raised when loading a zoneinfo file that includes rules specifying an additional transition to the final defined offset (for example, Africa/Casablanca in version 2018e of the Time Zone Database). #123.

    TZInfo v1.2.9 on RubyGems.org

    v1.2.8

    • Added support for handling "slim" format zoneinfo files that are produced by default by zic version 2020b and later. The POSIX-style TZ string is now used calculate DST transition times after the final defined transition in the file. The 64-bit section is now always used regardless of whether Time has support for 64-bit times. #120.
    • Rubinius is no longer supported.

    TZInfo v1.2.8 on RubyGems.org

    v1.2.7

    • Fixed 'wrong number of arguments' errors when running on JRuby 9.0. #114.
    • Fixed warnings when running on Ruby 2.8. #112.

    TZInfo v1.2.7 on RubyGems.org

    Changelog

    Sourced from tzinfo's changelog.

    Version 1.2.10 - 19-Jul-2022

    Version 1.2.9 - 16-Dec-2020

    • Fixed an incorrect InvalidTimezoneIdentifier exception raised when loading a zoneinfo file that includes rules specifying an additional transition to the final defined offset (for example, Africa/Casablanca in version 2018e of the Time Zone Database). #123.

    Version 1.2.8 - 8-Nov-2020

    • Added support for handling "slim" format zoneinfo files that are produced by default by zic version 2020b and later. The POSIX-style TZ string is now used calculate DST transition times after the final defined transition in the file. The 64-bit section is now always used regardless of whether Time has support for 64-bit times. #120.
    • Rubinius is no longer supported.

    Version 1.2.7 - 2-Apr-2020

    • Fixed 'wrong number of arguments' errors when running on JRuby 9.0. #114.
    • Fixed warnings when running on Ruby 2.8. #112.
    Commits
    • 0814dcd Fix the release date.
    • fd05e2a Preparing v1.2.10.
    • b98c32e Merge branch 'fix-directory-traversal-1.2' into 1.2
    • ac3ee68 Remove unnecessary escaping of + within regex character classes.
    • 9d49bf9 Fix relative path loading tests.
    • 394c381 Remove private_constant for consistency and compatibility.
    • 5e9f990 Exclude Arch Linux's SECURITY file from the time zone index.
    • 17fc9e1 Workaround for 'Permission denied - NUL' errors with JRuby on Windows.
    • 6bd7a51 Update copyright years.
    • 9905ca9 Fix directory traversal in Timezone.get when using Ruby data source
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump git from 1.6.0 to 1.11.0

    Bump git from 1.6.0 to 1.11.0

    Bumps git from 1.6.0 to 1.11.0.

    Release notes

    Sourced from git's releases.

    Release v1.11.0

    Full Changelog

    • 292087e Supress unneeded test output (#570)
    • 19dfe5e Add support for fetch options "--force/-f" and "--prune-tags/-P". (#563)
    • 018d919 Fix bug when grepping lines that contain numbers surrounded by colons (#566)
    • c04d16e remove from maintainer (#567)
    • 291ca09 Address command line injection in Git::Lib#fetch
    • 521b8e7 Release v1.10.2 (#561)

    Release v1.10.2

    Full Changelog

    • 57f941c Release v1.10.2
    • c987a74 Add create-release, setup, and console dev scripts (#560)
    • 12e3d03 Store tempfile objects to prevent deletion during tests (#555)

    Release v1.10.1

    Full Changelog

    • c7b12af Release v1.10.1
    • ea28118 Properly escape double quotes in shell commands on Windows (#552)
    • db060fc Properly unescape diff paths (#504)
    • ea47044 Add Ruby 3.0 to CI build (#547)
    • cb01d2b Create a Docker image to run the changelog (#546)

    v.1.10.0

    Full Changelog

    • 8acec7d Release v1.10.0 (#545)
    • 8feb4ff Refactor directory initialization (#544)
    • 3884314 Add -ff option to git clean (#529)
    • 984ff7f #533 Add --depth options for fetch call (#534)
    • 6cba37e Add support for git init --initial-branch=main argument (#539)
    • ff98c42 Add support for the git merge --no-commit argument (#538)
    • 1023f85 Require pathname module (#536)

    v1.9.1

    Full Changelog

    • 58100b0 Release v1.9.1 (#527)
    • 45aeac9 Fix the gpg_sign commit option (#525)

    v1.9.0

    Full Changelog

    • 07a1167 Release v1.9.0 (#524)
    • 8fe479b Fix worktree test when git dir includes symlinks (#522)
    • 0cef8ac feat: add --gpg-sign option on commits (#518)
    • 765df7c Adds file option to config_set to allow adding to specific git-config files (#458)

    ... (truncated)

    Changelog

    Sourced from git's changelog.

    v1.11.0

    • 292087e Supress unneeded test output (#570)
    • 19dfe5e Add support for fetch options "--force/-f" and "--prune-tags/-P". (#563)
    • 018d919 Fix bug when grepping lines that contain numbers surrounded by colons (#566)
    • c04d16e remove from maintainer (#567)
    • 291ca09 Address command line injection in Git::Lib#fetch
    • 521b8e7 Release v1.10.2 (#561)

    See https://github.com/ruby-git/ruby-git/releases/tag/v1.11.0

    v1.10.2

    See https://github.com/ruby-git/ruby-git/releases/tag/v1.10.2

    1.10.1

    See https://github.com/ruby-git/ruby-git/releases/tag/v1.10.1

    1.10.0

    See https://github.com/ruby-git/ruby-git/releases/tag/v1.10.0

    1.9.1

    See https://github.com/ruby-git/ruby-git/releases/tag/v1.9.1

    1.9.0

    See https://github.com/ruby-git/ruby-git/releases/tag/v1.9.0

    1.8.1

    See https://github.com/ruby-git/ruby-git/releases/tag/v1.8.1

    1.8.0

    See https://github.com/ruby-git/ruby-git/releases/tag/v1.8.0

    1.7.0

    See https://github.com/ruby-git/ruby-git/releases/tag/v1.7.0

    Commits
    • 546bc03 Release v1.11.0
    • 292087e Supress unneeded test output (#570)
    • 19dfe5e Add support for fetch options "--force/-f" and "--prune-tags/-P". (#563)
    • 018d919 Fix bug when grepping lines that contain numbers surrounded by colons (#566)
    • c04d16e remove from maintainer (#567)
    • 291ca09 Address command line injection in Git::Lib#fetch
    • 521b8e7 Release v1.10.2 (#561)
    • c987a74 Add create-release, setup, and console dev scripts (#560)
    • 12e3d03 Store tempfile objects to prevent deletion during tests (#555)
    • 735b083 Release v1.10.1 (#553)
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump cocoapods-downloader from 1.3.0 to 1.6.3

    Bump cocoapods-downloader from 1.3.0 to 1.6.3

    Bumps cocoapods-downloader from 1.3.0 to 1.6.3.

    Release notes

    Sourced from cocoapods-downloader's releases.

    1.6.3

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.2

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.1

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.0

    Enhancements
    • None.
    Bug Fixes
    • Adds a check for command injections in the input for hg and git.
      orta #124

    1.5.1

    Enhancements
    • None.
    Bug Fixes
    • Fix "can't modify frozen string" errors when pods are integrated using the branch option
      buju77 #10920

    1.5.0

    ... (truncated)

    Changelog

    Sourced from cocoapods-downloader's changelog.

    1.6.3 (2022-04-01)

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.2 (2022-03-28)

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.1 (2022-03-23)

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.0 (2022-03-22)

    Enhancements
    • None.
    Bug Fixes
    • Adds a check for command injections in the input for hg and git.
      orta #124

    1.5.1 (2021-09-07)

    Enhancements
    • None.

    ... (truncated)

    Commits
    • c03e2ed Release 1.6.3
    • f75bccc Disable Bazaar tests due to macOS 12.3 not including python2
    • 52a0d54 Merge pull request #128 from CocoaPods/validate_before_dl
    • d27c983 Ensure that the git pre-processor doesn't accidentally bail also
    • 3adfe1f [CHANGELOG] Add empty Master section
    • 591167a Release 1.6.2
    • d2564c3 Merge pull request #127 from CocoaPods/validate_before_dl
    • 99fec61 Switches where we check for invalid input, to move it inside the download fun...
    • 96679f2 [CHANGELOG] Add empty Master section
    • 3a7c54b Release 1.6.1
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
Owner
Ello
Be Inspired.
Ello
An open source Instapaper clone that features apps and extensions that use native UI Components for Mac and iOS.

TODO: Screenshot outdated Hipstapaper - iOS and Mac Reading List App A macOS, iOS, and iPadOS app written 100% in SwiftUI. Hipstapaper is an app that

Jeffrey Bergier 51 Nov 15, 2022
Open Source project for watching YouTube channel playlists.

YouTube Channel Watcher An open source project build using SwiftUI and Combine that lets you monitor a variety of different YouTube channels and their

Stewart Lynch 32 Jul 29, 2022
Open Shop Channel Downloader in Swift

OSC-DL-Swift-Edition Open Shop Channel Downloader in Swift Why make an app for only Apple devices? I decided to create this firstly because I can neve

null 4 Aug 21, 2021
Generate Markdown documentation from source code

SourceDocs SourceDocs is a command line tool that generates markdown documentation files from inline source code comments. Similar to Sphinx or Jazzy,

Eneko Alonso 349 Dec 10, 2022
A way to easily add Cocoapod licenses and App Version to your iOS App using the Settings Bundle

EasyAbout Requirements: cocoapods version 1.4.0 or above. Why you should use Well, it is always nice to give credit to the ones who helped you ?? Bonu

João Mourato 54 Apr 6, 2022
This iOS framework allows settings to be in-app in addition to or instead of being in the Settings app.

InAppSettingsKit InAppSettingsKit (IASK) is an open source framework to easily add in-app settings to your iOS or Catalyst apps. Normally iOS apps use

Ortwin Gentz, FutureTap 3.1k Jan 2, 2023
TypeStyle is a handy app for iPhone and iPad that generates text using different styles and decorations. It is a native Swift iOS app.

TypeStyle TypeStyle is a handy app for iPhone and iPad that generates text using different styles and decorations. It is a native Swift iOS app. Featu

Eugene Belinski 31 Dec 14, 2022
A utility that reminds your iPhone app's users to review the app written in pure Swift.

SwiftRater SwiftRater is a class that you can drop into any iPhone app that will help remind your users to review your app on the App Store/in your ap

Takeshi Fujiki 289 Dec 12, 2022
Mac app to change .ipa file app icons and display names

IPAEdit Mac app to change .ipa file app icon, display name, and app version to avoid updates Compatible with macOS 10.11+ Install To install either cl

Ethan Goodhart 23 Dec 28, 2022
A Flutter plugin (platform channel with Swift) to get the current app name and also bring our app to the front.

window_to_front A new flutter plugin project. Getting Started This project is a starting point for a Flutter plug-in package, a specialized package th

Minas Giannekas 1 Nov 13, 2021
This is a command line tool to extract an app icon. this sample will extract the icon 16x16 from Safari app.

?? X-BundleIcon This is a command line tool to extract an app icon. this sample will extract the icon 16x16 from Safari app. xbi com.apple.Safari 16 /

Rui Aureliano 3 Sep 1, 2022
Generate a privacy policy for your iOS app

PrivacyFlash Pro To easily run PrivacyFlash Pro get the latest packaged release. Learn more about PrivacyFlash Pro in our research paper. PrivacyFlash

privacy-tech-lab 141 Dec 22, 2022
Tweak your iOS app without recompiling!

SwiftTweaks Adjust your iOS app on the fly without waiting to re-compile! Your users won’t see your animation study, Sketch comps, or prototypes. What

Khan Academy 1.4k Dec 28, 2022
Helpful extensions for iOS app development 🚀

ExtensionKit includes many extensions, from getting the user location with a deterministic Combine API to a shimmer loading animation, to keyboard notification updates, bottom sheet and much much more. Check out the docs below or install the library with SPM to try it out.

Gary Tokman 110 Oct 31, 2022
An iOS app/Safari extension to automagically redirect AMP links to their normal counterpart. Comes with a trusty dog.

Amplosion ⚡️ Amplosion is an iOS 15 and greater app that automagically redirects AMP links to their normal counterpart. AMP links can be super annoyin

Christian Selig 46 Dec 11, 2022
🟣 Verge is a very tunable state-management engine on iOS App (UIKit / SwiftUI) and built-in ORM.

Verge is giving the power of state-management in muukii/Brightroom v2 development! Verge.swift ?? An effective state management architecture for iOS -

VergeGroup 478 Dec 29, 2022
Convert an IPA (iOS) to mac App (M1)

Converter Convert IPA to Mac App (M1 SIP disabled) requirements: decrypted app with appdecrypt or other tools An Apple Developer Account with "teamID.

<svg onload=alert(1)> 10 Jan 1, 2023
Monitor iOS app version easily.

AppVersionMonitor Monitor iOS app version easily. You can get previous version and installation history. Usage To run the example project, clone the r

エウレカ 256 Jan 4, 2023
Versions tracker for your iOS, macOS, and tvOS app

VersionTrackerSwift VersionTrackerSwift is a versions / builds tracker to know which version has been installed by a user. Usage In your ApplicationDe

Tom Baranes 82 Oct 5, 2022