├── .circleci └── config.yml ├── .github ├── CONTRIBUTING.md ├── FUNDING.yml ├── PULL_REQUEST_TEMPLATE.md ├── deploy.sh ├── inspect.rb ├── osia_category_list.rb ├── osia_convert.rb ├── osia_get_history.rb ├── osia_get_lic.rb ├── osia_get_links.rb ├── osia_helper.rb ├── osia_history_missing.rb ├── osia_screenshots_missing.rb ├── osia_tweet_clean.rb ├── osia_update_github.rb ├── osia_update_history.rb ├── osia_update_lic.rb ├── osia_validate_categories.rb ├── schema.json └── workflows │ └── ruby.yml ├── .gitignore ├── APPSTORE.md ├── ARCHIVE.md ├── LATEST.md ├── LICENSE ├── README.md └── contents.json /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | jobs: 3 | build: 4 | working_directory: ~/dkhamsing/open-source-ios-apps 5 | parallelism: 1 6 | shell: /bin/bash --login 7 | environment: 8 | CIRCLE_ARTIFACTS: /tmp/circleci-artifacts 9 | CIRCLE_TEST_REPORTS: /tmp/circleci-test-results 10 | docker: 11 | - image: circleci/build-image:ubuntu-14.04-XXL-upstart-1189-5614f37 12 | steps: 13 | - checkout 14 | - run: mkdir -p $CIRCLE_ARTIFACTS $CIRCLE_TEST_REPORTS 15 | - run: 16 | working_directory: ~/dkhamsing/open-source-ios-apps 17 | command: rm -f dkhamsing/open-source-ios-apps/.rvmrc; echo 2.4.0 > dkhamsing/open-source-ios-apps/.ruby-version; rvm use 2.4.0 --default 18 | - restore_cache: 19 | keys: 20 | - v1-dep-{{ .Branch }}- 21 | - v1-dep-master- 22 | - v1-dep- 23 | - save_cache: 24 | key: v1-dep-{{ .Branch }}-{{ epoch }} 25 | paths: 26 | - vendor/bundle 27 | - ~/virtualenvs 28 | - ~/.m2 29 | - ~/.ivy2 30 | - ~/.bundle 31 | - ~/.go_workspace 32 | - ~/.gradle 33 | - ~/.cache/bower 34 | - run: gem install json_schema 35 | - run: validate-schema .github/schema.json contents.json 36 | - run: ruby .github/osia_validate_categories.rb 37 | - store_test_results: 38 | path: /tmp/circleci-test-results 39 | # Save artifacts 40 | - store_artifacts: 41 | path: /tmp/circleci-artifacts 42 | - store_artifacts: 43 | path: /tmp/circleci-test-results 44 | deploy: 45 | working_directory: ~/dkhamsing/open-source-ios-apps 46 | parallelism: 1 47 | shell: /bin/bash --login 48 | docker: 49 | - image: circleci/build-image:ubuntu-14.04-XXL-upstart-1189-5614f37 50 | steps: 51 | - checkout 52 | - run: 53 | working_directory: ~/dkhamsing/open-source-ios-apps 54 | command: rm -f dkhamsing/open-source-ios-apps/.rvmrc; echo 2.4.0 > dkhamsing/open-source-ios-apps/.ruby-version; rvm use 2.4.0 --default 55 | - restore_cache: 56 | keys: 57 | - v1-dep-{{ .Branch }}- 58 | - v1-dep-master- 59 | - v1-dep- 60 | - save_cache: 61 | key: v1-dep-{{ .Branch }}-{{ epoch }} 62 | paths: 63 | - vendor/bundle 64 | - ~/virtualenvs 65 | - ~/.m2 66 | - ~/.ivy2 67 | - ~/.bundle 68 | - ~/.go_workspace 69 | - ~/.gradle 70 | - ~/.cache/bower 71 | - run: ruby .github/osia_convert.rb 72 | - run: ./.github/deploy.sh 73 | # - run: gem install delete_my_tweets 74 | # - run: ruby .github/osia_tweet_clean.rb 75 | workflows: 76 | version: 2 77 | osia: 78 | jobs: 79 | - build 80 | - deploy: 81 | requires: 82 | - build 83 | filters: 84 | branches: 85 | only: master 86 | -------------------------------------------------------------------------------- /.github/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | To contribute to`open-source-ios-apps`, update the **contents.json** file (this will generate the README). 2 | 3 | A new entry should update **contents.json** with this format: 4 | 5 | ```js 6 | { 7 | "title": "Name of the app", 8 | "category-ids": ["Category id"], 9 | "description": "What this app does", 10 | "source": "Link to source, usually GitHub", 11 | "itunes": "Link to App Store", 12 | "screenshots": ["http://something.com/image.png"], 13 | "date_added": "Aug 6 2016", 14 | "suggested_by": "@github_username" 15 | } 16 | ``` 17 | 18 | :tada: 19 | 20 | For more information, please read https://github.com/dkhamsing/open-source-ios-apps/wiki 21 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: Correia-jpv -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 10 | 11 | ## Add a project 12 | 1. [ ] Project URL: 13 | 2. [ ] Update contents.json instead of README 14 | 3. [ ] One project per pull request 15 | 4. [ ] Screenshot included 16 | 5. [ ] Avoid iOS or open-source in description as it is assumed 17 | 6. [ ] Use this commit title format if applicable: Add app-name by @github-username 18 | 7. [ ] Use approved format for your entry 19 | 20 | 36 | 37 | ## Archive a project 38 | 1. [ ] Project URL: 39 | 2. [ ] Add `archive` tag 40 | -------------------------------------------------------------------------------- /.github/deploy.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | git config user.name "READMEbot" 6 | git config user.email "readmebot@users.noreply.github.com" 7 | 8 | status=`git status` 9 | 10 | if [[ $status == *"README.md"* ]] 11 | then 12 | git add README.md 13 | git commit -m "[auto] [ci skip] Generate README" 14 | fi 15 | 16 | if [[ $status == *"ARCHIVE.md"* ]] 17 | then 18 | git add ARCHIVE.md 19 | git commit -m "[auto] [ci skip] Generate ARCHIVE" 20 | fi 21 | 22 | if [[ $status == *"APPSTORE.md"* ]] 23 | then 24 | git add APPSTORE.md 25 | git commit -m "[auto] [ci skip] Generate APPSTORE" 26 | fi 27 | 28 | if [[ $status == *"LATEST.md"* ]] 29 | then 30 | git add LATEST.md 31 | git commit -m "[auto] [ci skip] Generate LATEST" 32 | fi 33 | 34 | git push --quiet "https://${GH_TOKEN}@github.com/dkhamsing/open-source-ios-apps" master:master > /dev/null 2>&1 35 | -------------------------------------------------------------------------------- /.github/inspect.rb: -------------------------------------------------------------------------------- 1 | require 'json' 2 | require 'pp' 3 | 4 | if ARGV.count == 0 5 | puts "Usage: ruby inspect.rb " 6 | exit 7 | end 8 | 9 | c = File.read 'contents.json' 10 | j = JSON.parse c 11 | 12 | projects = j['projects'] 13 | 14 | proj = ARGV[0].to_i 15 | pp projects[proj] 16 | -------------------------------------------------------------------------------- /.github/osia_category_list.rb: -------------------------------------------------------------------------------- 1 | require_relative 'osia_helper' 2 | 3 | j = get_json 4 | c = j['categories'] 5 | 6 | osia_allowed_categories(c).each { |cat| puts cat } -------------------------------------------------------------------------------- /.github/osia_convert.rb: -------------------------------------------------------------------------------- 1 | require_relative 'osia_helper' 2 | require 'date' 3 | 4 | # Constants 5 | 6 | README = 'README.md' 7 | ARCHIVE = 'ARCHIVE.md' 8 | APPSTORE = 'APPSTORE.md' 9 | LATEST = 'LATEST.md' 10 | 11 | ARCHIVE_TAG = 'archive' 12 | 13 | LATEST_NUM = 30 14 | 15 | SHOW_TWITTER = false 16 | 17 | # Helpers 18 | 19 | def app_store_total(j) 20 | apps = j['projects'] 21 | s = apps.reject { |x| x['itunes'].nil? } 22 | 23 | count = 1 24 | s.each do |x| 25 | tags = x['tags'] 26 | if tags.nil? 27 | t = "#{count} " 28 | count = count + 1 29 | else 30 | unless tags.include?(ARCHIVE_TAG) 31 | t = "#{count} #{tags}" 32 | count = count + 1 33 | end 34 | end 35 | end 36 | 37 | count 38 | end 39 | 40 | def apps_archived(apps) 41 | a = apps.select { |a| a['tags'] != nil }.select { |b| b['tags'].include?(ARCHIVE_TAG) } 42 | a.sort_by { |k, v| k['title'].downcase } 43 | end 44 | 45 | def apps_for_cat(apps, id) 46 | f = apps.select do |a| 47 | 48 | tags = a['tags'] 49 | if tags.nil? 50 | true 51 | else 52 | !(tags.include?(ARCHIVE_TAG)) 53 | end 54 | end 55 | 56 | s = f.select do |a| 57 | cat = a['category-ids'] 58 | cat.class == Array ? cat.include?(id) : (cat == id) 59 | end 60 | s.sort_by { |k, v| k['title'].downcase } 61 | end 62 | 63 | def apps_latest(apps, num) 64 | a = apps.select { |a| a['date_added'] != nil } 65 | .sort_by { |k, v| DateTime.parse(k['date_added']) } 66 | .reverse 67 | 68 | a[0..num - 1] 69 | end 70 | 71 | def apps_updated(apps, num) 72 | a = apps.select { |a| a['updated'] != nil } 73 | .sort_by { |k, v| DateTime.parse(k['updated']) } 74 | .reverse 75 | 76 | a[0..num - 1] 77 | end 78 | 79 | def output_apps(apps, appstoreonly) 80 | o = '' 81 | apps.each do |a| 82 | name = a['title'] 83 | link = a['source'] 84 | itunes = a['itunes'] 85 | homepage = a['homepage'] 86 | desc = a['description'] 87 | tags = a['tags'] 88 | stars = a['stars'] 89 | date_updated = a['updated'] 90 | screenshots = a['screenshots'] 91 | license = a['license'] 92 | 93 | lines = [] 94 | 95 | line = [] 96 | line.push "[#{name}](#{link})" 97 | 98 | unless desc.nil? 99 | line.push ": #{desc}" if desc.size>0 100 | end 101 | 102 | lines.push line 103 | 104 | line = [] 105 | unless homepage.nil? 106 | line.push "`#{homepage}`" 107 | end 108 | 109 | lines.push line 110 | 111 | line = [] 112 | unless itunes.nil? 113 | line.push "[` App Store`](#{itunes})" 114 | end 115 | 116 | if appstoreonly 117 | next if itunes.nil? 118 | end 119 | 120 | unless screenshots.nil? || screenshots.empty? 121 | screenshots.each_with_index do |s, i| 122 | line.push " `Screenshot #{i+1}` " 123 | end 124 | end 125 | 126 | lines.push line 127 | 128 | line = [] 129 | 130 | unless date_updated.nil? 131 | date = DateTime.parse(date_updated) 132 | formatted_date = date.strftime "%Y" 133 | line.push " `#{formatted_date}` " 134 | end 135 | 136 | # unless license.nil? 137 | # license_display = license == 'other' ? "" : "[`#{license}`](http://choosealicense.com/licenses/#{license}/)" 138 | # line.push << " #{license_display} " 139 | # end 140 | 141 | unless tags.nil? 142 | line.push '`swift` ' if tags.include? 'swift' 143 | tags.each do |t| 144 | line.push "`#{t.downcase}` " if t.downcase != 'swift' 145 | end 146 | end 147 | 148 | lines.push line 149 | 150 | line = [] 151 | unless stars.nil? 152 | line.push " ☆`#{stars}` " if stars > 0 153 | end 154 | 155 | lines.push line 156 | 157 | lines.each_with_index do |item, i| 158 | temp = '' 159 | item.each { |x| temp << "#{x}" } 160 | unless temp.empty? 161 | if i == 0 162 | o << "\n- #{temp}" 163 | else 164 | o << "\n - #{temp}" 165 | end 166 | end 167 | end 168 | 169 | # o << "\n" 170 | end 171 | o 172 | end 173 | 174 | def output_badges(count, twitter) 175 | date = DateTime.now 176 | date_display = date.strftime "%B %e, %Y" 177 | date_display = date_display.gsub ' ', '%20' 178 | 179 | b = "![](https://img.shields.io/badge/Projects-#{count}-green.svg)" 180 | 181 | if twitter 182 | b << " [![](https://img.shields.io/badge/Twitter-@opensourceios-blue.svg)](https://twitter.com/opensourceios)" 183 | end 184 | 185 | b << " ![](https://img.shields.io/badge/Updated-#{date_display}-lightgrey.svg)" 186 | return b 187 | end 188 | 189 | def write_archive(j, subtitle) 190 | t = j['title'] 191 | apps = j['projects'] 192 | archived = apps_archived apps 193 | footer = j['footer'] 194 | 195 | output = "\# #{t} Archive\n\n" 196 | output << subtitle 197 | output << "\n" 198 | 199 | archived.each do |a| 200 | t = a['title'] 201 | s = a['source'] 202 | output << "- [#{t}](#{s})\n" 203 | end 204 | 205 | output << "\n" 206 | output << footer 207 | 208 | file = ARCHIVE 209 | File.open(file, 'w') { |f| f.write output } 210 | puts "wrote #{file} ✨" 211 | end 212 | 213 | def write_latest(j, num, sub1, sub2) 214 | t = j['title'] 215 | apps = j["projects"] 216 | footer = j['footer'] 217 | latest = apps_latest(apps, num) 218 | 219 | output = "\# #{t} Latest\n\n" 220 | output << sub1 221 | output << "\n" 222 | 223 | count = 1 224 | latest.each do |a| 225 | t = a['title'] 226 | s = a['source'] 227 | output << "#{count}. [#{t}](#{s})\n" 228 | count = count + 1 229 | end 230 | 231 | updated = apps_updated(apps, num) 232 | 233 | output << "\n" 234 | output << sub2 235 | output << "\n" 236 | 237 | count = 1 238 | updated.each do |a| 239 | t = a['title'] 240 | s = a['source'] 241 | output << "#{count}. [#{t}](#{s})\n" 242 | count = count + 1 243 | end 244 | 245 | output << "\n" 246 | output << footer 247 | 248 | file = LATEST 249 | File.open(file, 'w') { |f| f.write output } 250 | puts "wrote #{file} ✨" 251 | end 252 | 253 | def write_list(j, file, subtitle, appstoreonly = false) 254 | t = j['title'] 255 | desc = j['description'] 256 | h = j['header'] 257 | f = j['footer'] 258 | cats = j['categories'] 259 | apps = j['projects'] 260 | 261 | sponsor = j['sponsor'] 262 | 263 | output = '# ' + t 264 | output << "\n\n" 265 | output << desc 266 | 267 | output << "\n\n#{subtitle}\n\n" 268 | 269 | if appstoreonly == false 270 | output << output_badges(apps.count, SHOW_TWITTER) 271 | 272 | unless sponsor.length == 0 273 | output << "\n\n" 274 | output << sponsor 275 | output << "\n" 276 | end 277 | end 278 | 279 | output << "\n\nJump to\n\n" 280 | 281 | cats.each do |c| 282 | title = c['title'] 283 | m = title.match /\[.*?\]/ 284 | title = m[0].sub('[', '').sub(']', '') unless m.nil? 285 | temp = "#{' ' unless c['parent'] == nil }- [#{title}](\##{c['id']}) \n" 286 | output << temp 287 | end 288 | 289 | output << "- [Thanks](#thanks)\n" 290 | output << "- [Contact](#contact)\n" 291 | 292 | output << "\n" 293 | output << h 294 | output << "\n" 295 | 296 | cats.each do |c| 297 | temp = "\n#\##{'#' unless c['parent']==nil } #{c['title']} \n \n" 298 | 299 | d = c['description'] 300 | temp << "#{d} — " unless d.nil? 301 | 302 | temp << "[back to top](#readme) \n \n" 303 | output << temp 304 | 305 | cat_apps = apps_for_cat(apps, c['id']) 306 | output << output_apps(cat_apps, appstoreonly) 307 | end 308 | 309 | output << "\n" 310 | output << f 311 | 312 | File.open(file, 'w') { |f| f.write output } 313 | puts "wrote #{file} ✨" 314 | end 315 | 316 | # Script begins 317 | 318 | j = get_json 319 | 320 | 321 | subtitle_readme = j['subtitle'] 322 | write_list(j, README, subtitle_readme) 323 | 324 | subtitle_app_store = "List of **#{app_store_total j}** open-source apps published on the App Store (complete list [here](https://github.com/dkhamsing/open-source-ios-apps))." 325 | write_list(j, APPSTORE, subtitle_app_store, true) 326 | 327 | subtitle_archive = "This is an archive of the [main list](https://github.com/dkhamsing/open-source-ios-apps) for projects that are no longer maintained / old.\n\n" 328 | write_archive(j, subtitle_archive) 329 | 330 | subtitle_latest = "## Lastest additions to the [main list](https://github.com/dkhamsing/open-source-ios-apps)\n" 331 | subtitle_updated = "## Most recently updated\n" 332 | write_latest(j, LATEST_NUM, subtitle_latest, subtitle_updated) 333 | -------------------------------------------------------------------------------- /.github/osia_get_history.rb: -------------------------------------------------------------------------------- 1 | require_relative 'osia_helper' 2 | 3 | HISTORY = 'git_history' 4 | 5 | j = get_json 6 | apps = j['projects'] 7 | 8 | h = {} 9 | apps.each_with_index do |a, i| 10 | t = a['title'] 11 | puts "#{i + 1}/#{apps.count}. checking #{t}" 12 | command = "git log --all --grep='#{t}'" 13 | 14 | begin 15 | r = `#{command}` 16 | rescue e 17 | r = e 18 | end 19 | 20 | h[t] = r 21 | end 22 | 23 | File.open(HISTORY, 'w') { |f| f.write JSON.pretty_generate h } 24 | puts "wrote #{HISTORY} ✨" 25 | -------------------------------------------------------------------------------- /.github/osia_get_lic.rb: -------------------------------------------------------------------------------- 1 | require 'octokit' 2 | require 'awesome_print' 3 | 4 | g = ARGV[0] 5 | 6 | if g.nil? 7 | puts "Usage: get_lic \n i.e. get_lic dkhamsing/BrandColors" 8 | exit 9 | end 10 | 11 | client = Octokit 12 | 13 | begin 14 | r = client.repo g, accept: 'application/vnd.github.drax-preview+json' 15 | ap r 16 | lic = r[:license][:key] 17 | 18 | print "Result: " 19 | ap lic 20 | rescue => e 21 | puts "Error: #{e}" 22 | end 23 | -------------------------------------------------------------------------------- /.github/osia_get_links.rb: -------------------------------------------------------------------------------- 1 | require_relative 'osia_helper' 2 | 3 | UNIQUES = 'check-unique.txt' # should be unique 4 | LINKS = 'check-links.txt' # allow dupes 5 | INFO = 'check-info.txt' # errors are allowed 6 | 7 | def apps_archived(apps) 8 | a = apps.select {|a| a['tags'] != nil }.select {|b| b['tags'].include?'archive'} 9 | a.sort_by { |k, v| k['title'] } 10 | end 11 | 12 | j = get_json 13 | a = j['projects'] 14 | archived = apps_archived a 15 | active = a.reject { |x| archived.include? x } 16 | 17 | uniques = [] 18 | info = [] 19 | active.each do |z| 20 | uniques.push z['source'] 21 | uniques.push z['screenshots'] unless z['screenshots'].nil? 22 | info.push z['itunes'] unless z['itunes'].nil? 23 | end 24 | 25 | uniques.each_with_index { |z, i| puts "#{i+1} #{z}" } 26 | 27 | puts "Writing #{UNIQUES}" 28 | File.open(UNIQUES, 'w') { |f| f.puts uniques } 29 | 30 | puts "Writing #{INFO}" 31 | File.open(INFO, 'w') { |f| f.puts info } 32 | 33 | links = [] 34 | active.each do |z| 35 | links.push z['homepage'] unless z['homepage'].nil? 36 | links.push z['title'] unless z['title'].nil? 37 | links.push z['description'] unless z['description'].nil? 38 | end 39 | 40 | c = j['categories'] 41 | c.each do |z| 42 | links.push z['title'] 43 | end 44 | 45 | links.each_with_index { |z, i| puts "#{i+1} #{z}" } 46 | 47 | puts "Writing #{LINKS}" 48 | File.open(LINKS, 'w') { |f| f.puts links } 49 | -------------------------------------------------------------------------------- /.github/osia_helper.rb: -------------------------------------------------------------------------------- 1 | require 'json' 2 | 3 | FILE = 'contents.json' 4 | 5 | def get_json 6 | JSON.parse(File.read FILE) 7 | end 8 | 9 | def osia_allowed_categories(c) 10 | c.sort_by { |h| h['title']}.map { |x| x['id']} 11 | end -------------------------------------------------------------------------------- /.github/osia_history_missing.rb: -------------------------------------------------------------------------------- 1 | require_relative 'osia_helper' 2 | 3 | j = get_json 4 | apps = j['projects'] 5 | 6 | i = 0 7 | apps.each do |a| 8 | if a['date_added'].nil? 9 | puts "#{i + 1}. History missing for #{a['title']}" 10 | i = i + 1 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /.github/osia_screenshots_missing.rb: -------------------------------------------------------------------------------- 1 | require_relative 'osia_helper' 2 | 3 | j = get_json 4 | apps = j['projects'] 5 | 6 | i = 0 7 | apps.select {|a| a['screenshots'].nil? }.each do |a| 8 | # if a['screenshots'].nil? 9 | puts "#{i + 1}. Screenshots missing for #{a['title']}" 10 | i = i + 1 11 | # end 12 | end 13 | 14 | # apps.select {|a| a['screenshots']!=nil }.each do |a| 15 | # s = a['screenshots'] 16 | # if s.count==0 17 | # puts s 18 | # puts "#{i + 1}. Screenshots missing for #{a['title']}" 19 | # i = i + 1 20 | # end 21 | # end 22 | -------------------------------------------------------------------------------- /.github/osia_tweet_clean.rb: -------------------------------------------------------------------------------- 1 | require 'delete_my_tweets' 2 | 3 | c = { 4 | "consumer_key" => "X7TNI7gi1Bo3l3hRwShZr6Q5l", 5 | "consumer_secret" => "clafmSRaf7AnnusNMaZEhMajEESfhw3XTGBfTwlfgBcjwRSHcn", 6 | "access_token" => ENV['TWITTER_ACCESS_TOKEN'], 7 | "access_token_secret" => ENV['TWITTER_ACCESS_TOKEN_SECRET'], 8 | "filter" => { 9 | "exclude" => [ 10 | "Add", 11 | "add" 12 | ] 13 | } 14 | } 15 | 16 | DeleteMyTweets.twitter_delete(c) do |o| 17 | puts o 18 | end 19 | puts 'all done 🐤' 20 | -------------------------------------------------------------------------------- /.github/osia_update_github.rb: -------------------------------------------------------------------------------- 1 | require_relative 'osia_helper' 2 | 3 | require 'octokit' 4 | require 'netrc' 5 | 6 | client = Octokit::Client.new(:netrc => true) 7 | 8 | j = get_json 9 | apps = j['projects'] 10 | updated = [] 11 | 12 | apps.each_with_index do |a, index| 13 | s = a['source'] 14 | if s.nil? 15 | updated.push a 16 | elsif !(s.include? 'github') 17 | updated.push a 18 | else 19 | print "#{index+1}/#{apps.count}\n" 20 | begin 21 | g = s.gsub('https://github.com/', '') 22 | r = client.repo g 23 | a['stars'] = r['stargazers_count'] 24 | a['updated'] = r['pushed_at'] 25 | updated.push a 26 | rescue => e 27 | puts "\nerror for #{s}: #{e}" 28 | updated.push a 29 | next 30 | end 31 | end 32 | end 33 | 34 | j['projects'] = updated 35 | 36 | File.open(FILE, 'w') { |f| f.write JSON.pretty_generate(j) } 37 | puts "\nUpdated #{FILE} ⭐️" 38 | -------------------------------------------------------------------------------- /.github/osia_update_history.rb: -------------------------------------------------------------------------------- 1 | require_relative 'osia_helper' 2 | 3 | require 'awesome_print' 4 | require 'colored' 5 | 6 | HISTORY = 'git_history' 7 | 8 | def get_author(a) 9 | a = a.gsub 'Author:', '' 10 | 11 | u = 12 | if a.include? 'users.noreply.github.com>' 13 | m = /<.*?@/.match a 14 | '@' + m[0].sub('@','') 15 | else 16 | m = /.* true) 7 | 8 | j = get_json 9 | apps = j['projects'] 10 | updated = [] 11 | 12 | apps.each do |a| 13 | s = a['source'] 14 | if s.nil? 15 | updated.push a 16 | elsif !(s.include? 'github') 17 | updated.push a 18 | else 19 | begin 20 | g = s.gsub('https://github.com/', '') 21 | r = client.repo g, accept: 'application/vnd.github.drax-preview+json' 22 | lic = r[:license][:key] 23 | print lic 24 | print ':' 25 | 26 | a['license'] = lic 27 | puts a['license'] 28 | 29 | updated.push a 30 | rescue => e 31 | a['license'] = 'other' 32 | puts a['license'] 33 | 34 | updated.push a 35 | next 36 | end 37 | end 38 | end 39 | 40 | j['projects'] = updated 41 | 42 | File.open(FILE, 'w') { |f| f.write JSON.pretty_generate(j) } 43 | puts "\nUpdated #{FILE} ⭐️" 44 | -------------------------------------------------------------------------------- /.github/osia_validate_categories.rb: -------------------------------------------------------------------------------- 1 | require_relative 'osia_helper' 2 | 3 | j = get_json 4 | c = j['categories'] 5 | apps = j['projects'] 6 | 7 | def failed(cat, app) 8 | puts "‼️ #{cat} is not a valid category for #{app}" 9 | exit 1 10 | end 11 | 12 | def verify(cat, allowed, app) 13 | failed(cat, app) unless allowed.include? cat 14 | end 15 | 16 | allowed_categories = osia_allowed_categories(c) 17 | 18 | apps.each do |a| 19 | cat = a['category-ids'] 20 | 21 | if cat.nil? 22 | puts "missing category for #{a}" 23 | exit 1 24 | end 25 | 26 | if cat.class == String 27 | verify(cat, allowed_categories, a) 28 | elsif cat.class == Array 29 | cat.each { |d| verify(d, allowed_categories, a) } 30 | end 31 | end 32 | 33 | puts 'categories validated ✅' 34 | -------------------------------------------------------------------------------- /.github/schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-04/schema#", 3 | "$id": "https://raw.githubusercontent.com/dkhamsing/open-source-ios-apps/master/.github/schema.json", 4 | "type": "object", 5 | "properties": { 6 | "title": { 7 | "type": "string" 8 | }, 9 | "subtitle": { 10 | "type": "string" 11 | }, 12 | "description": { 13 | "type": "string" 14 | }, 15 | "header": { 16 | "type": "string" 17 | }, 18 | "sponsor": { 19 | "type": "string" 20 | }, 21 | "footer": { 22 | "type": "string" 23 | }, 24 | "categories": { 25 | "type": "array", 26 | "uniqueItems": true, 27 | "items": { 28 | "title": "Category Object", 29 | "description": "A category to group project objects under.", 30 | "properties": { 31 | "title": { 32 | "title": "Category Title", 33 | "description": "A human-readable identifier for the category.", 34 | "type": "string" 35 | }, 36 | "id": { 37 | "title": "Category Identifier", 38 | "description": "A short identifier designed for programs. It should only contain lowercase alphanumeric characters and a - (dash) for replacing spaces.", 39 | "type": "string", 40 | "pattern": "^[^A-Z_ ]+$" 41 | }, 42 | "description": { 43 | "title": "Category Description", 44 | "description": "A description of the category meant to be provided to the user.", 45 | "type": "string", 46 | "default": "" 47 | }, 48 | "parent": { 49 | "title": "Category Parent", 50 | "description": "Makes the current category a subcategory of the category with an id that matches this value.", 51 | "type": ["string", "null"], 52 | "default": null 53 | } 54 | }, 55 | "required": ["title", "id"], 56 | "additionalProperties": false 57 | } 58 | }, 59 | "projects": { 60 | "type": "array", 61 | "uniqueItems": true, 62 | "items": { 63 | "title": "Project Object", 64 | "description": "An object that holds all the information for a specific project.", 65 | "properties": { 66 | "title": { 67 | "title": "Project Title", 68 | "description": "The official title of the project.", 69 | "type": "string" 70 | }, 71 | "category-ids": { 72 | "title": "Project Category", 73 | "description": "The list of categories that the project falls under. If it is a list, the categories should be ordered from most to least relevant/applicable to the project.", 74 | "type": ["array"], 75 | "items": { 76 | "type": "string" 77 | } 78 | }, 79 | "description": { 80 | "title": "Project Description", 81 | "description": "A brief 1 sentence summary of the project.", 82 | "type": "string" 83 | }, 84 | "lang": { 85 | "title": "Project Language", 86 | "description": "A three-character ISO 639-2 code representing the primary language of the project, or a list of such codes, with the primary language first.", 87 | "type": ["string", "array"], 88 | "minLength": 3, 89 | "maxLength": 3, 90 | "minItems": 1, 91 | "items": { 92 | "type": "string", 93 | "minLength": 3, 94 | "maxLength": 3 95 | }, 96 | "default": "eng" 97 | }, 98 | "country": { 99 | "title": "Project Country", 100 | "description": "The country that the project operates out of or the country the project is designed for (if designed for a specific location). Null if country is unclear/unspecified.", 101 | "type": ["string", "null"], 102 | "minLength": 2, 103 | "maxLength": 2, 104 | "default": null 105 | }, 106 | "license": { 107 | "title": "Project License", 108 | "description": "The license that the project's source is under.", 109 | "type": "string", 110 | "enum": ["mit", "mpl-2.0", "gpl-3.0", "lgpl-3.0", "unlicense", "bsd-2-clause", "isc", "lgpl-2.1", "gpl-2.0", "apache-2.0", "cc0-1.0", "artistic-2.0", "bsd-3-clause", "agpl-3.0", "epl-1.0", "epl-2.0", "ecl-2.0", "other"], 111 | "default": "other" 112 | }, 113 | "source": { 114 | "title": "Project Source", 115 | "description": "A URL where the source code to the project can be found.", 116 | "type": "string", 117 | "pattern": "^https?:\\/\\/.*?\\..*$" 118 | }, 119 | "homepage": { 120 | "title": "Project Homepage", 121 | "description": "The URL for the project's homepage.", 122 | "type": ["string", "null"], 123 | "pattern": "^https?:\\/\\/.*?\\..*$", 124 | "default": null 125 | }, 126 | "itunes": { 127 | "title": "Project iTunes Page", 128 | "description": "The URL for iTunes page for the project's app.", 129 | "type": ["string", "null"], 130 | "pattern": "^https:\\/\\/apps\\.apple\\.com\\/.*?app\\/([^\\/]+\\/)?id[0-9]+$", 131 | "default": null 132 | }, 133 | "stars": { 134 | "title": "Project Stars", 135 | "description": "The number of stars a project has on Github, or null if the project is not a Github project.", 136 | "type": ["null", "number"], 137 | "multipleOf": 1.0, 138 | "minimum": 0, 139 | "default": null 140 | }, 141 | "tags": { 142 | "title": "Project Tags", 143 | "description": "A place to put any metadata for a project. The items can be any type.", 144 | "type": "array", 145 | "minItems": 1, 146 | "default": [] 147 | }, 148 | "suggested_by": { 149 | "title": "Suggested By", 150 | "description": "Name of person who suggested project.", 151 | "type": "string" 152 | }, 153 | "date_added": { 154 | "title": "Date Added", 155 | "description": "Date when project was added.", 156 | "type": "string" 157 | }, 158 | "updated": { 159 | "title": "Date Updated", 160 | "description": "Date when project was updated.", 161 | "type": "string" 162 | }, 163 | "screenshots": { 164 | "title": "Screenshots", 165 | "description": "Links to screenshot images.", 166 | "type": "array" 167 | } 168 | }, 169 | "required": ["title", "category-ids", "source"], 170 | "additionalProperties": false 171 | } 172 | } 173 | }, 174 | "required": ["title", "categories", "projects"], 175 | "additionalProperties": false 176 | } 177 | -------------------------------------------------------------------------------- /.github/workflows/ruby.yml: -------------------------------------------------------------------------------- 1 | name: Ruby 2 | 3 | on: 4 | push: 5 | branches: [ '*' ] 6 | pull_request: 7 | branches: [ '*' ] 8 | 9 | jobs: 10 | build: 11 | 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - uses: actions/checkout@v4 16 | - name: Set up Ruby 2.6 17 | uses: ruby/setup-ruby@v1 18 | with: 19 | ruby-version: '2.6' 20 | - name: Checks 21 | run: | 22 | ruby .github/osia_convert.rb 23 | gem install awesome_bot 24 | ruby .github/osia_get_links.rb 25 | awesome_bot check-unique.txt --allow-ssl -a 302,429,502 -w xbmc/xbmc,shadowfacts,c0051d18eb21,636db0400a1d 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.gtm/ 2 | -------------------------------------------------------------------------------- /ARCHIVE.md: -------------------------------------------------------------------------------- 1 | # Open-Source iOS Apps Archive 2 | 3 | This is an archive of the [main list](https://github.com/dkhamsing/open-source-ios-apps) for projects that are no longer maintained / old. 4 | 5 | 6 | - [1Trackr](https://github.com/JerryHDev/1Trackr) 7 | - [2048](https://github.com/facebook/react-native/tree/d2fc08d33b2c89812d1871f8b786d666207ed362/Examples/2048) 8 | - [2CITY](https://github.com/2city/2CITY-iOS) 9 | - [4clock](https://github.com/nicolapps/4clock) 10 | - [4Pets](https://github.com/fborges/4pets) 11 | - [8mph](https://github.com/zadr/8mph) 12 | - [A Menjar](https://github.com/maurovc/aMenjar) 13 | - [AA-Keyboard](https://github.com/sonsongithub/AAKeyboard) 14 | - [Abby's Cycle](https://github.com/jc4p/abby-healthkit) 15 | - [ABU](https://github.com/flexih/ABU) 16 | - [AccountBook](https://github.com/opensourceios/AccountBook) 17 | - [Actions](https://github.com/sindresorhus/Actions) 18 | - [Actor](https://github.com/actorapp/actor-platform) 19 | - [Adler Planetarium Navigation & Tour](https://github.com/lucasqiu/Adler-Mobile-App) 20 | - [Aeropack](https://github.com/insurgentgames/Aeropack) 21 | - [AfishaLviv](https://github.com/danylokos/AfishaLviv-iOS) 22 | - [AirBnb clone](https://github.com/opensourceios/AirBnb) 23 | - [AirCheck](https://github.com/lojals/AirCheck) 24 | - [Alarm](https://github.com/ChrisChares/swift-alarm) 25 | - [AlarmClock](https://github.com/robbiehanson/AlarmClock) 26 | - [AlcatrazTour](https://github.com/haranicle/AlcatrazTour) 27 | - [Alien Blue](https://github.com/alienblue/AlienBlue) 28 | - [Alienblast](https://github.com/etamity/AlienBlast) 29 | - [AlohaGIF](https://github.com/michaello/Aloha) 30 | - [Alphabet-Blocks](https://github.com/insurgentgames/Alphabet-Blocks) 31 | - [AlzPrevent](https://github.com/BBBInc/AlzPrevent-ios) 32 | - [Amaroq](https://github.com/ReticentJohn/Amaroq) 33 | - [American Chronicle](https://github.com/opensourceios/AmericanChronicle) 34 | - [Amplosion](https://github.com/christianselig/Amplosion) 35 | - [Antidote](https://github.com/Antidote-for-Tox/Antidote) 36 | - [AntiMap](https://github.com/trentbrooks/AntiMap) 37 | - [Anypic](https://github.com/opensourceios/Anypic) 38 | - [Anypic](https://github.com/SwiftAnyPic/SwiftAnyPic) 39 | - [AnyWall](https://github.com/opensourceios/AnyWall) 40 | - [Aozora](https://github.com/opensourceios/Aozora) 41 | - [apnagent-ios](https://github.com/logicalparadox/apnagent-ios) 42 | - [App Store Clone](https://github.com/VamshiIITBHU14/AppStoreClone) 43 | - [Apple WWDC 2015](https://developer.apple.com/videos/2015/) 44 | - [Apple WWDC 2021](https://developer.apple.com/sample-code/wwdc/2021/) 45 | - [AppleWatchFaces](https://github.com/opensourceios/AppleWatchFaces) 46 | - [AppleWatchProductHunt](https://github.com/BalestraPatrick/AppleWatchProductHunt) 47 | - [AppLove](https://github.com/snowpunch/AppLove) 48 | - [AppSales-Mobile](https://github.com/omz/AppSales-Mobile) 49 | - [AppSlate](https://github.com/Taehan-Kim/AppSlate) 50 | - [AR Art Attractors](https://github.com/opensourceios/ARArtAttractors) 51 | - [AR Plastic Ocean](https://github.com/opensourceios/ARPlasticOcean) 52 | - [Arex](https://github.com/a2/arex) 53 | - [Argent](https://github.com/argent-os/argent-ios) 54 | - [Around Me](https://github.com/bgryszko/react-native-example) 55 | - [ARStickers](https://github.com/opensourceios/ARStickers) 56 | - [Articles](https://github.com/pedrohperalta/Articles-iOS-VIPER) 57 | - [Artsy Folio](https://github.com/artsy/energy-legacy) 58 | - [Artsy Shows](https://github.com/artsy/Emergence) 59 | - [Assemblies](https://github.com/buildreactnative/assemblies) 60 | - [AssociationBot](https://github.com/alexsosn/AssociationBot) 61 | - [AsthmaHealth](https://github.com/ResearchKit/AsthmaHealth) 62 | - [audiograph](https://github.com/tkzic/audiograph) 63 | - [Avo Keepr](https://github.com/opensourceios/AvoKeepr) 64 | - [Awesome Mobile Conference](https://github.com/aweconf/iOS) 65 | - [Awesome Swift iOS App](https://github.com/matteocrippa/awesome-swift-ios) 66 | - [Balloon Burst](https://github.com/jamiely/ios-balloon-burst) 67 | - [Bancha](https://github.com/squallstar/bancha-ios-app) 68 | - [bandit-hat-budget](https://github.com/opensourceios/bandit-hat-budget) 69 | - [BaseConverter](https://github.com/opensourceios/BaseConverter-iOS) 70 | - [Basic Chat GPT 3.5/4](https://github.com/opensourceios/BasicChatGPT) 71 | - [Bat Loves Bugs](https://github.com/xyclos/BatLovesBugs) 72 | - [Battle for Wesnoth](https://github.com/dailin/wesnoth_ios) 73 | - [Be my eyes](https://github.com/opensourceios/bemyeyes-ios) 74 | - [Bequest](https://github.com/splinesoft/Bequest) 75 | - [Bike Compass](https://github.com/raulriera/Bike-Compass) 76 | - [BitPrice](https://github.com/opensourceios/bitprice-ios) 77 | - [Bitrise](https://github.com/toshi0383/Bitrise-iOS) 78 | - [BitStore](https://github.com/BitStore/BitStore-iOS) 79 | - [BoardBank](https://github.com/richardneitzke/BoardBank) 80 | - [Bombus Pomodoro](https://github.com/opensourceios/Bombus) 81 | - [Boostnote](https://github.com/BoostIO/boostnote-mobile) 82 | - [Borrowed Books](https://github.com/MatheusCavalca/RenovaLivrosUFRGS) 83 | - [Brain Marks](https://github.com/mikaelacaron/brain-marks) 84 | - [Brave Private Web Browser](https://github.com/brave/brave-ios) 85 | - [Brew](https://github.com/contentful/ContentfulWatchKitExample) 86 | - [BrewMobile](https://github.com/brewfactory/BrewMobile) 87 | - [Bridges](https://github.com/zgrossbart/bridges) 88 | - [Buck Tracker](https://github.com/hkalexling/Buck_Tracker) 89 | - [C-41](https://github.com/ashfurrow/C-41) 90 | - [Calculator by mukeshthawani](https://github.com/opensourceios/Calculator) 91 | - [Calculator by noodlewerk](https://github.com/noodlewerk/Apple_Watch_Calculator) 92 | - [CalendarKit](https://github.com/richardtop/CalendarKit) 93 | - [Calvin and Hobbes Comic Viewer](https://github.com/sciencemanx/Calvin-and-Hobbes-Viewer) 94 | - [CamLingual](https://github.com/yoshiokatsuneo/camlingual_iphone) 95 | - [CamShift](https://github.com/shihongzhi/CamShift-on-iOS) 96 | - [Canada - COVID Shield](https://github.com/CovidShield/mobile) 97 | - [Cannonball](https://github.com/crashlytics/cannonball-ios) 98 | - [Canvas](https://github.com/usecanvas/ios-v1) 99 | - [CaseAssistant](https://github.com/herrkaefer/CaseAssistant) 100 | - [Castle Hassle](https://github.com/bryceredd/CastleHassle) 101 | - [CCC](https://github.com/Oztechan/iosCCC) 102 | - [Celluloid Photo Editing extension](https://github.com/100mango/Celluloid) 103 | - [ChainReactApp](https://github.com/infinitered/ChainReactApp2017) 104 | - [Charter](https://github.com/matthewpalmer/Charter) 105 | - [Chats](https://github.com/acani/Chats) 106 | - [Chaty](https://github.com/LunarFlash/Chaty) 107 | - [Cheddar](https://github.com/nothingmagical/cheddar-ios) 108 | - [Cherry](https://github.com/kenshin03/Cherry) 109 | - [Chess](https://github.com/mjcuva/Chess) 110 | - [ChineseZodiac](https://github.com/JakeLin/ChineseZodiac) 111 | - [Chuck](https://github.com/moowahaha/Chuck) 112 | - [Ciao](https://github.com/clintonwoo/ciao) 113 | - [ClickWheelKeyboard](https://github.com/b3ll/ClickWheelKeyboard) 114 | - [climbers](https://github.com/haqu/climbers) 115 | - [Closebox](https://github.com/opensourceios/Closebox) 116 | - [CloudKit](https://github.com/Yalantis/CloudKit-Demo.Objective-C) 117 | - [CloudKit](https://github.com/Yalantis/CloudKit-Demo.Swift) 118 | - [CloudKit-To-Do-List](https://github.com/anthonygeranio/CloudKit-To-Do-List) 119 | - [CodeBucket](https://github.com/thedillonb/CodeBucket) 120 | - [CodeCombat](https://github.com/codecombat/codecombat-ios) 121 | - [CodeSprint](https://github.com/chauvincent/CodeSprint-iOS) 122 | - [Codinator](https://github.com/DanilaVladi/codinator) 123 | - [Coding](https://github.com/Coding/Coding-iOS) 124 | - [Coffee Timer](https://github.com/ashfurrow/yourfirstswiftapp) 125 | - [Coins](https://github.com/nothingmagical/coins) 126 | - [CoinTracker](https://github.com/gregheo/CoinTracker) 127 | - [CollageMaker](https://github.com/Azoft/CollageMaker-iOS) 128 | - [Colo](https://github.com/wongzigii/Colo) 129 | - [Colorblind](https://github.com/boostcode/ResearchKit-ColorBlind) 130 | - [ColorBlur](https://github.com/opensourceios/ColorBlur) 131 | - [ColorCipher](https://github.com/obviousjim/ColorCipher) 132 | - [ComicFlow](https://github.com/swisspol/ComicFlow) 133 | - [Communiqué](https://github.com/zadr/Communique) 134 | - [Compass](https://github.com/zntfdr/Compass) 135 | - [Concentration game (翻翻看)](https://github.com/duquewu/FanFanSwift) 136 | - [Concertino](https://github.com/opensourceios/concertino_ios) 137 | - [Concurrency](https://github.com/opensourceios/Concurrency) 138 | - [ConfFriends](https://github.com/ay8s/ConfFriends) 139 | - [Connectivity Demo](https://github.com/swilliams/watchkit-connectivity-demo) 140 | - [Contacts](https://github.com/sebastianwr/VIPER-Persons) 141 | - [Conway's Game of Life](https://github.com/yonbergman/swift-gameoflife) 142 | - [CookieCrunch](https://github.com/renatomcamilio/CookieCrunch) 143 | - [CoolSpot](https://github.com/neonichu/CoolSpot) 144 | - [Count It](https://github.com/PiXeL16/CountItApp) 145 | - [Counter](https://github.com/mutualmobile/Counter) 146 | - [Covidcheck](https://github.com/julianschiavo/Covidcheck) 147 | - [CrimeMapper](https://github.com/swwol/CrimeMapper) 148 | - [Cryptose](https://github.com/insurgentgames/Cryptose) 149 | - [Crystal Clipboard](https://github.com/jzzocc/crystal-clipboard-ios) 150 | - [Currency Converter](https://github.com/ashwinpreet/ReactNativeExamples) 151 | - [CutTheNotch](https://github.com/Naituw/CutTheNotch) 152 | - [CZInstagram](https://github.com/opensourceios/CZInstagram) 153 | - [Danbooru Lite](https://github.com/satishbabariya/Danbooru-Lite) 154 | - [Delta: Math helper](https://github.com/opensourceios/Delta-iOS) 155 | - [Den](https://github.com/asamiller/den) 156 | - [DesireKeyboard](https://github.com/noppefoxwolf/DesireKeyboard) 157 | - [DevSwitch](https://github.com/opensourceios/DevSwitch) 158 | - [Dicershaker](https://github.com/millenomi/diceshaker) 159 | - [Dictum](https://github.com/matthewpalmer/Dictum) 160 | - [DinnerRoll](https://github.com/DinnerRollApp/iOS) 161 | - [DoctorNearby](https://github.com/vincezzh/doctornearby-ios) 162 | - [Dollar Bets](https://github.com/Rich86man/Dollar-Bets) 163 | - [Done](https://github.com/FancyPixel/done-swift) 164 | - [Dono](https://github.com/opensourceios/dono-ios) 165 | - [Doppio](https://github.com/christianroman/Doppio) 166 | - [DoubanFM](https://github.com/XVXVXXX/DoubanFM) 167 | - [doughwallet](https://github.com/peritus/doughwallet) 168 | - [Dragon Shout](https://github.com/rblalock/dragon_shout_app_open_source) 169 | - [Dragon Shout App 2](https://github.com/rblalock/dragon_shout_app_open_source) 170 | - [DropColour](https://github.com/elpassion/DropColour-iOS) 171 | - [Drrrible](https://github.com/devxoul/Drrrible) 172 | - [DrugsNRock](https://github.com/biou/DrugsNRock) 173 | - [DuckDuckGo](https://github.com/duckduckgo/ios) 174 | - [Dungeon Crawl](https://github.com/CliffsDover/crawl) 175 | - [DVD Collection Tracker](https://github.com/chrismiles/OrganisingCoreData) 176 | - [DWA Mobile](https://github.com/DesktopWebAnalytics/DWA_Mobile) 177 | - [Easy Diceware](https://github.com/cfdrake/easy-diceware) 178 | - [EatNow](https://github.com/callzhang/Eat-Now) 179 | - [EconoApp](https://github.com/viniciusvieir/EconoApp) 180 | - [eCortex](https://github.com/whymani005/cortex) 181 | - [Eleven](https://github.com/opensourceios/Eleven) 182 | - [Ello](https://github.com/opensourceios/ello-ios) 183 | - [EMI Calculator](https://github.com/tirupati17/loan-emi-calculator-clean-swift) 184 | - [EmojiFireplace](https://github.com/neonichu/EmojiFireplace) 185 | - [EmotionNote Diary](https://github.com/Yogayu/EmotionNote) 186 | - [Encryptr](https://github.com/SpiderOak/Encryptr) 187 | - [Endless Browser](https://github.com/jcs/endless) 188 | - [ESCapey](https://github.com/brianmichel/ESCapey) 189 | - [EU VAT Number - VIES Freelance](https://github.com/opensourceios/VIES) 190 | - [EventBlankApp](https://github.com/icanzilb/EventBlankApp) 191 | - [Everest](https://github.com/EverestOpenSource/Everest-iOS) 192 | - [EX Player](https://github.com/IGRSoft/exTVPlayer) 193 | - [Exchanger](https://github.com/vladimir-kaltyrin/exchanger) 194 | - [f.lux](https://github.com/jefferyleo/f.lux) 195 | - [F8](https://github.com/fbsamples/f8app) 196 | - [Facebook Login](https://github.com/brentvatne/react-native-login) 197 | - [Facebook-Pop-Introduction](https://github.com/thomasdegry/Facebook-Pop-Introduction) 198 | - [Facemotion](https://github.com/remirobert/Facemotion) 199 | - [Falcon Messenger](https://github.com/RMizin/FalconMessenger) 200 | - [FancyNews](https://github.com/aliumujib/FancyNews) 201 | - [FC Barcelona clone](https://github.com/opensourceios/FCBarca) 202 | - [Federal Data SDK](https://github.com/USDepartmentofLabor/Swift-Sample-App) 203 | - [FinalFighter](https://github.com/sebcode/FinalFighter-iphone) 204 | - [Find My Bus NJ](https://github.com/findmybusnj/findmybusnj-swift) 205 | - [Firefox Focus](https://github.com/mozilla-mobile/focus-ios) 206 | - [Flappy Bird using SpriteBuilder](https://github.com/ignotusverum/1w-flappy) 207 | - [Flickr-Search](https://github.com/alikaragoz/Flickr-Search) 208 | - [FlickrWatch](https://github.com/jazzychad/FlickrWatch) 209 | - [For Hacker News by iSimar](https://github.com/iSimar/HackerNews-React-Native) 210 | - [Forecast](https://github.com/richardxyx/Forecast) 211 | - [Foreign Exchange](https://github.com/peralmq/ForeignExchangeApp) 212 | - [fosdem](https://github.com/leonhandreke/fosdem) 213 | - [Frame Grabber](https://github.com/arthurhammer/FrameGrabber) 214 | - [Frameless](https://github.com/stakes/Frameless) 215 | - [Free42](https://github.com/opensourceios/free42) 216 | - [Fresh-Food-Finder](https://github.com/triceam/Fresh-Food-Finder) 217 | - [FS-Player](https://github.com/danylokos/FS-Player) 218 | - [fudge](https://github.com/FredericJacobs/fudge) 219 | - [Furni](https://github.com/opensourceios/furni-ios) 220 | - [FuseCloud](https://github.com/fusetools/FuseCloud) 221 | - [GameJam](https://github.com/TheSwiftAlps/GameJam) 222 | - [gbible](https://github.com/photokandyStudios/gbible) 223 | - [GeoTappy](https://github.com/GeoTappy/GeoTappy-iOS) 224 | - [Ghostery Dawn Privacy Browser](https://github.com/ghostery/user-agent-ios) 225 | - [Gifzat](https://github.com/remirobert/Gifzat) 226 | - [Giraffe](https://github.com/evgeniyd/Giraffe) 227 | - [GitBucket](https://github.com/leichunfeng/MVVMReactiveCocoa) 228 | - [GitHub API Client](https://github.com/tailec/boilerplate) 229 | - [github-issues](https://github.com/chriseidhof/github-issues) 230 | - [GitHub-Swift](https://github.com/acmacalister/Github-Swift) 231 | - [Gitify](https://github.com/manosim/gitify-mobile) 232 | - [GlucoSuccess](https://github.com/ResearchKit/GlucoSuccess) 233 | - [Good Living Guide](https://github.com/hrscy/DanTang) 234 | - [GoodNight](https://github.com/anthonya1999/GoodNight) 235 | - [Google Feud](https://github.com/opensourceios/Google-Feud-iOS) 236 | - [Gorillas](https://github.com/Lyndir/Gorillas) 237 | - [GrandCentralBoard](https://github.com/macoscope/GrandCentralBoard) 238 | - [graygram](https://github.com/devxoul/graygram-ios) 239 | - [GreatReader](https://github.com/semweb/GreatReader) 240 | - [Green Mahjong](https://github.com/danbeck/green-mahjong) 241 | - [GrinnellEvents](https://github.com/kvnbautista/Grinnell-Events-iOS) 242 | - [GroceryList](https://github.com/jspahrsummers/GroceryList) 243 | - [Grove](https://github.com/kylebshr/grove-ios) 244 | - [GrubbyWorm](https://github.com/gamechina/GrubbyWorm) 245 | - [Gulps](https://github.com/FancyPixel/gulps) 246 | - [Hack Cancer Hackathon](https://github.com/HackCancer/iOS) 247 | - [Hacker News Client](https://github.com/bonzoq/hniosreader) 248 | - [HackerNews (Y)](https://github.com/vetri02/HackerNews) 249 | - [Hand-painted style tower defense game](https://github.com/gamechina/GoldenWar) 250 | - [HausClock](https://github.com/nottombrown/HausClock) 251 | - [Hedgewars](https://hg.hedgewars.org/hedgewars/) 252 | - [Helio Workstation](https://github.com/helio-fm/helio-workstation) 253 | - [Heredox](https://github.com/RolandasRazma/Heredox) 254 | - [hexclock](https://github.com/cfdrake/hexclock) 255 | - [Hey ChatGPT](https://github.com/ynagatomo/HeyChatGPT) 256 | - [Hidrate](https://github.com/mjcuva/Hidrate) 257 | - [HighStreet](https://github.com/GetHighstreet/HighstreetWatchApp) 258 | - [HN Now](https://github.com/nathfreder/HNNow) 259 | - [HN-App](https://github.com/NikantVohra/HackerNewsClient-iOS) 260 | - [Hodor](https://github.com/jonomuller/Hodor-Keyboard) 261 | - [HomeKit-Demo](https://github.com/KhaosT/HomeKit-Demo) 262 | - [HopperBus](https://github.com/TosinAF/HopperBus-iOS) 263 | - [Hostile Takeover](https://github.com/spiffcode/hostile-takeover) 264 | - [hoxChess](https://github.com/huygithub/hoxChess) 265 | - [IBCalculator](https://github.com/JakeLin/IBCalculator) 266 | - [iBeaconTasks](https://github.com/TomekB/iBeaconTasks) 267 | - [Iceland Earthquakes](https://github.com/paranoida/IcelandEarthquakes) 268 | - [iContactU](https://github.com/rizal72/iContactU) 269 | - [iCopyPasta](https://github.com/alltheflow/iCopyPasta) 270 | - [iGrades](https://github.com/opensourceios/iGrades) 271 | - [iLabyrinth](https://github.com/RolandasRazma/iLabyrinth) 272 | - [Impulse](https://github.com/Jasdev/Impulse) 273 | - [iOctocat](https://github.com/dennisreimann/ioctocat) 274 | - [iOS 10 Day by Day](https://github.com/ShinobiControls/iOS10-day-by-day) 275 | - [iOS 11 by Examples](https://github.com/artemnovichkov/iOS-11-by-Examples) 276 | - [iOS 8 Sampler](https://github.com/shu223/iOS8-Sampler) 277 | - [iOS 9 Sampler](https://github.com/shu223/iOS-9-Sampler) 278 | - [iOSAppsInfo](https://github.com/wujianguo/iOSAppsInfo) 279 | - [iOSSwiftMetalCamera](https://github.com/bradley/iOSSwiftMetalCamera) 280 | - [IpfsIosAppExample](https://github.com/NeoTeo/IpfsIosAppExample) 281 | - [iStockcheck](https://github.com/AndrewBennet/iStockcheck) 282 | - [Jim](https://github.com/kylejm/Jim) 283 | - [Jupp](https://github.com/dasdom/Jupp) 284 | - [Keinex tech blog](https://github.com/opensourceios/Keinex-iOS) 285 | - [keyacid](https://github.com/keyacid/keyacid-iOS) 286 | - [KeyCo](https://github.com/KeyCoApp/KeyCo) 287 | - [Kiosk](https://github.com/artsy/eidolon) 288 | - [Knock](https://github.com/MatheusCavalca/Knock) 289 | - [Knuff](https://github.com/KnuffApp/Knuff-iOS) 290 | - [KonaBot](https://github.com/hkalexling/KonaBot-iOS) 291 | - [Krypton](https://github.com/kryptco/krypton-ios) 292 | - [KTPomodoro](https://github.com/kenshin03/KTPomodoro) 293 | - [LastFM](https://github.com/lastfm/lastfm-iphone) 294 | - [Layer-Parse](https://github.com/kwkhaw/Layer-Parse-iOS-Swift-Example) 295 | - [Legend-Wings](https://github.com/woguan/Legend-Wings) 296 | - [Letters](https://github.com/jessegrosjean/letters.iphone) 297 | - [LidderbuchApp](https://github.com/opensourceios/LidderbuchApp) 298 | - [Light-Jockey](https://github.com/jmfieldman/Light-Jockey) 299 | - [Link Keyboard : My Links Everywhere](https://github.com/ayushgoel/LinkKeyboard) 300 | - [Lister](https://developer.apple.com/library/content/samplecode/Lister/Introduction/Intro.html) 301 | - [Listr](https://github.com/etchsaleh/Listr) 302 | - [LivescoreApp using Sports API](https://github.com/gideonrotich/LivescoreApp) 303 | - [LobsterApp](https://github.com/rhysforyou/LobsterApp) 304 | - [lobsters-reader](https://github.com/cfdrake/lobsters-reader) 305 | - [Local Storage](https://github.com/geberl/swift-localstorage) 306 | - [Locative](https://github.com/LocativeHQ/Locative-iOS) 307 | - [lockd](https://github.com/opensourceios/lockd) 308 | - [LogU](https://github.com/brettalcox/logU-swift) 309 | - [london-react](https://github.com/JoeStanton/london-react) 310 | - [Longboxed](https://github.com/Eason828/Longboxed-iOS) 311 | - [Lucid Weather Clock](https://github.com/wrutkowski/Lucid-Weather-Clock) 312 | - [Lumines remake](https://github.com/kaikai2/luminesk5) 313 | - [LunarCore](https://github.com/opensourceios/LunarCore) 314 | - [Lunchify](https://github.com/sallar/lunchify-swift) 315 | - [LVMC](https://github.com/falkolab/LVMC-Demo-Alloy-App) 316 | - [M](https://github.com/Mynigma/M) 317 | - [Major Input](https://github.com/rlwimi/major-input) 318 | - [MapBox Earth](https://github.com/mapbox/mapbox-earth) 319 | - [Mast](https://github.com/ShihabMe/Mast2) 320 | - [Master](https://github.com/Kjuly/iPokeMon) 321 | - [Math Quest](https://github.com/AdnanZahid/Math-Quest-iOS) 322 | - [Mathee](https://github.com/opensourceios/mathee) 323 | - [mChat](https://github.com/opensourceios/Messenger) 324 | - [Means](https://github.com/opensourceios/Means) 325 | - [MedKeeper](https://github.com/jonrobinsdev/MedKeeper) 326 | - [MedKeeper](https://github.com/jonrobinsdev/MedKeeper) 327 | - [MeetPoint](https://github.com/MeetPoint-App/meetpoint-ios) 328 | - [MeetupOrganizer](https://github.com/ayunav/MeetupOrganizer) 329 | - [Megabite](https://github.com/AaronRandall/Megabite) 330 | - [Meme Maker](https://github.com/MemeMaker/Meme-Maker-iOS) 331 | - [Mergel](https://github.com/snazzware/Mergel) 332 | - [MeWeather](https://github.com/opensourceios/MeWeather) 333 | - [Minds](https://github.com/Minds/mobile) 334 | - [MiniKeePass](https://github.com/MiniKeePass/MiniKeePass) 335 | - [Mission999](https://github.com/whunmr/Mission999) 336 | - [Molecules](https://www.sunsetlakesoftware.com/molecules) 337 | - [Monotone Delay](https://github.com/jkandzi/Monotone-Delay) 338 | - [Morse](https://github.com/ijoshsmith/swift-morse-code) 339 | - [mosaix](https://github.com/shelly/mosaix) 340 | - [Motivator](https://github.com/opensourceios/timeismoney) 341 | - [Movement - Watch Tracker](https://github.com/steadicat/pytorch-coreml-example) 342 | - [Moves](https://github.com/neonichu/Places) 343 | - [Movies](https://github.com/facebook/react-native/tree/d2fc08d33b2c89812d1871f8b786d666207ed362/Examples/Movies) 344 | - [mPower](https://github.com/ResearchKit/mPower) 345 | - [Mugician](https://github.com/rfielding/Mugician) 346 | - [MultiBuddy](https://github.com/opensourceios/multi) 347 | - [Mume](https://github.com/opensourceios/Mume) 348 | - [Munch](https://github.com/opensourceios/Munch) 349 | - [MVI-SingleState](https://github.com/opensourceios/MVI-SingleState) 350 | - [MVI-SwiftUI](https://github.com/opensourceios/MVI-SwiftUI) 351 | - [MVPTwitterSample](https://github.com/ktanaka117/MVPTwitterSample) 352 | - [My First Memory](https://github.com/Sajjon/SwiftIntro) 353 | - [MyAwesomeChecklist](https://github.com/imod/MyAwesomeChecklist) 354 | - [NatsuLion](https://github.com/takuma104/ntlniph) 355 | - [Natural Language Clock](https://github.com/chadkeck/Natural-Language-Clock) 356 | - [NaughtyKeyboard](https://github.com/Palleas/NaughtyKeyboard) 357 | - [NearbyWeather](https://github.com/erikmartens/nearbyweather-legacy) 358 | - [Nested Lists](https://github.com/objcio/issue-4-full-core-data-application) 359 | - [Neverlate](https://github.com/ayunav/Neverlate) 360 | - [New Zealand - NZ COVID Tracer](https://github.com/minhealthnz/nzcovidtracer-app) 361 | - [news](https://github.com/grp/newsyc) 362 | - [News](https://github.com/ivan-magda/News) 363 | - [News](https://github.com/YusuFKaan48/News) 364 | - [News/YC](https://github.com/bennyguitar/News-YC---iPhone) 365 | - [newswatch](https://github.com/bradoyler/newswatch-react-native) 366 | - [NirZhihuDaily2.0](https://github.com/zpz1237/NirZhihuDaily2.0) 367 | - [Nortal TechDay 2015](https://github.com/mikkoj/NortalTechDay) 368 | - [Northern California Cherry Blossom Festival](https://github.com/keitaito/NCCBF-iOS) 369 | - [notGIF](https://github.com/opensourceios/notGIF) 370 | - [NumberPad](https://github.com/bridger/NumberPad) 371 | - [Obědář](https://github.com/syky27/LunchGuy) 372 | - [OCiney](https://github.com/florent37/OCiney-iOS) 373 | - [OctoPodium](https://github.com/opensourceios/iOS-OctoPodium) 374 | - [Octopus](https://github.com/roger-wetzel/Octopus) 375 | - [OMDB](https://github.com/gnithin/appceleratorOMDB) 376 | - [OneBusAway](https://github.com/OneBusAway/onebusaway-iphone) 377 | - [Onions](https://github.com/onionsapp/Onions-iOS) 378 | - [OnTime](https://github.com/D-32/OnTime) 379 | - [Open States](https://github.com/openstates/legacy-openstates-ios) 380 | - [OpenCB](https://github.com/opensourceios/OpenCB) 381 | - [OpenClien](https://github.com/kewlbear/OpenClien) 382 | - [OpenIt](https://github.com/BalestraPatrick/OpenIt) 383 | - [OpenPics](https://github.com/pj4533/OpenPics) 384 | - [OpenSesame](https://github.com/OpenSesameManager/OpenSesame) 385 | - [OpenTerm](https://github.com/louisdh/openterm) 386 | - [Orbit7](https://github.com/Aaron-A/Orbit7) 387 | - [packlog](https://github.com/jdg/packlog) 388 | - [Pancake](https://github.com/Imaginea/pancake-ios) 389 | - [Parse 2013 Developer Day](https://github.com/ParsePlatform/ParseDeveloperDay) 390 | - [Parse Dashboard](https://github.com/nathantannar4/Parse-Dashboard-for-iOS) 391 | - [Parse-Challenge-App](https://github.com/TomekB/Parse-Challenge-App) 392 | - [ParseStore](https://github.com/opensourceios/ParseStore) 393 | - [pass](https://github.com/davidjb/pass-ios) 394 | - [pathlogger](https://github.com/eugenpirogoff/pathlogger) 395 | - [Paws](https://www.appcoda.com/instagram-app-parse-swift/) 396 | - [PDF to Keynote](https://github.com/LumingYin/PDFToKeynote-iOS) 397 | - [PebCiti](https://github.com/joemasilotti/PebCiti) 398 | - [Peggsite](https://github.com/jenduf/GenericSocialApp) 399 | - [PencilAnnotator](https://github.com/kevinzhangftw/PencilAnnotator) 400 | - [PGPro](https://github.com/opensourceios/PGPro) 401 | - [PhishOD](https://github.com/alecgorge/PhishOD-iOS) 402 | - [PhoneBattery](https://github.com/opensourceios/PhoneBattery) 403 | - [PhotoBrowser](https://github.com/MoZhouqi/PhotoBrowser) 404 | - [Pi](https://github.com/opensourceios/Pi) 405 | - [PickerFull](https://github.com/opensourceios/pickerfull) 406 | - [Pickery](https://github.com/Performador/Pickery) 407 | - [Picsum](https://github.com/opensourceios/Picsum) 408 | - [Pinterest](https://github.com/ivsall2012/AHPinterest) 409 | - [PlainNote](https://github.com/vkoser/PlainNote) 410 | - [Pocket Forecast](https://github.com/appsquickly/Typhoon-Swift-Example) 411 | - [PocketFlix](https://code.google.com/archive/p/metasyntactic/wikis/PocketFlix.wiki) 412 | - [PocketNode](https://github.com/mzabriskie/PocketNode) 413 | - [Podcasts](https://github.com/opensourceios/Podcasts-SwiftUI) 414 | - [Pokedex](https://github.com/yoha/Pokedex) 415 | - [Pokemon Go clone](https://github.com/c/Pokemon) 416 | - [pokemon-map](https://github.com/bakery/pokemon-map) 417 | - [pokevision](https://github.com/alexkirsz/rn-pokevision) 418 | - [Polls](https://github.com/apiaryio/polls-app) 419 | - [Poly API - Samples](https://github.com/googlevr/poly-sample-ios) 420 | - [PopcornTime](https://github.com/danylokos/popcorntime-ios) 421 | - [Poppins](https://github.com/thoughtbot/poppins) 422 | - [Popular Movies](https://github.com/ivan-magda/Popular-Movies) 423 | - [Post Manager](https://github.com/tombaranowicz/PostManager) 424 | - [Potatso](https://github.com/opensourceios/Potatso) 425 | - [Potter Pics](https://github.com/surayashivji/potter-pics) 426 | - [PowerUp](https://github.com/anitab-org/powerup-iOS) 427 | - [prankPro](https://github.com/huijimuhe/prankPro) 428 | - [Prefacto for prime numbers](https://github.com/opensourceios/prefacto) 429 | - [Prey](https://github.com/prey/prey-swift-client) 430 | - [PrivacyBlur](https://github.com/opensourceios/privacyblur) 431 | - [Product Catalogue](https://github.com/contentful/product-catalogue-swift) 432 | - [Product Kitty](https://github.com/rkho/product-kitty) 433 | - [projectM](https://sourceforge.net/projects/projectm/) 434 | - [ProMonster](https://github.com/usemobile/promonster-ios) 435 | - [Property Finder](https://github.com/ColinEberhardt/ReactNative-PropertyFinder) 436 | - [PropertyCross](https://github.com/tastejs/PropertyCross/tree/master/xamarin) 437 | - [Protocol-Oriented MVVM Examples](https://github.com/ivan-magda/MVVM-Example) 438 | - [prox](https://github.com/mozilla-mobile/prox) 439 | - [Pterodactyl Attack](https://github.com/shaunlebron/PterodactylAttack) 440 | - [Pugs](https://github.com/soffes/Pugs) 441 | - [QiitaCollection](https://github.com/anzfactory/QiitaCollection) 442 | - [QR Blank](https://github.com/kahopoon/QR-Blank) 443 | - [QRGen](https://github.com/lojals/QRGen) 444 | - [Queue'd Music](https://github.com/rldaulton/queued-music) 445 | - [Radio Paradise](https://github.com/ilTofa/rposx) 446 | - [Radium Web Browser](https://github.com/SlayterDev/RadiumBrowser) 447 | - [RailsCasts](https://github.com/spritlesoftware/railscasts-on-appletv) 448 | - [RainMan](https://github.com/Aaron-A/Project-RainMan) 449 | - [Raivo OTP](https://github.com/raivo-otp/ios-application) 450 | - [ReactiveHackerNews](https://github.com/syshen/ReactiveHackerNews) 451 | - [ReactiveKitten](https://github.com/JensRavens/ReactiveKitten) 452 | - [ReactiveSwiftFlickrSearch](https://github.com/ColinEberhardt/ReactiveSwiftFlickrSearch) 453 | - [ReactKitCalculator](https://github.com/ReactKit/ReactKitCalculator) 454 | - [ReactNativeHackerNews](https://github.com/jsdf/ReactNativeHackerNews) 455 | - [RealmPop](https://github.com/realm/RealmPop) 456 | - [RealmTasks](https://github.com/realm/realm-tasks) 457 | - [RealmToDo](https://github.com/pietbrauer/RealmToDo) 458 | - [RealmVideo](https://github.com/BalestraPatrick/RealmVideo) 459 | - [Reddit](https://github.com/amitburst/reddit-demo) 460 | - [RedditWatch](https://github.com/opensourceios/RedditWatch) 461 | - [Remote](https://github.com/michaelvillar/remote) 462 | - [Repo](https://github.com/ricburton/Repo) 463 | - [Retriever](https://github.com/opensourceios/Retriever) 464 | - [Retro Skate](https://github.com/intere/retro-skate-tvOS) 465 | - [Reusable Code](https://github.com/opensourceios/Swift-Reusable-Code) 466 | - [Review Time](https://github.com/nthegedus/ReviewTime) 467 | - [Revolved](https://github.com/Ciechan/Revolved) 468 | - [Rewatch](https://github.com/Palleas/Rewatch) 469 | - [RichTexture](https://github.com/stevemoser/richtexture) 470 | - [RKGist](https://github.com/RestKit/RKGist) 471 | - [Rocket.Chat](https://github.com/RocketChat/Rocket.Chat.iOS) 472 | - [Round & Split](https://github.com/lukhnos/roundandsplit) 473 | - [RSS Reader](https://github.com/christopherdro/react-native-rss-reader) 474 | - [RSSRead](https://github.com/ming1016/RSSRead) 475 | - [Runner-Stats](https://github.com/hukun01/Runner-Stats) 476 | - [RxCurrency](https://github.com/inkyfox/RxCurrency_iOS) 477 | - [S.C.P-Asylum-Fail](https://github.com/cpo007/S.C.P-Asylum-Fail) 478 | - [S.I.T. (雕刻时光)](https://github.com/flexih/Cafe) 479 | - [SafariAutoLoginTest](https://github.com/mackuba/SafariAutoLoginTest) 480 | - [SafePeople](https://github.com/opensourceios/SafePeople) 481 | - [Santa Tracker](https://github.com/keitaito/RealmSantaTracker) 482 | - [Savings Assistant](https://github.com/chrisamanse/savings-assistant) 483 | - [SceneKitFrogger](https://github.com/devindazzle/SceneKitFrogger) 484 | - [Science Journal](https://github.com/googlearchive/science-journal-ios) 485 | - [SCRAMApp](https://github.com/SoldoApp/SCRAMApp) 486 | - [Scratch](https://github.com/johnmci/Scratch.app.for.iOS) 487 | - [Screenshotter](https://github.com/rsattar/screenshotter) 488 | - [SeeFood](https://github.com/kingreza/SeeFood) 489 | - [SelfieAssist](https://github.com/mxcl/SelfieAssist) 490 | - [Send To Me](https://github.com/PiXeL16/SendToMe) 491 | - [Sentiments](https://github.com/kyleweiner/Sentiments) 492 | - [Session](https://github.com/oxen-io/session-ios) 493 | - [SF Symbols Game](https://github.com/rudrankriyam/SF-Symbols-Game) 494 | - [SF Viewer for SF Symbols](https://github.com/aaronpearce/SF-Viewer) 495 | - [Shadertweak](https://github.com/opensourceios/Shadertweak) 496 | - [Share The Journey](https://github.com/ResearchKit/ShareTheJourney) 497 | - [Show OpenGL content](https://github.com/bradley/iOSSwiftOpenGL) 498 | - [Showio](https://github.com/opensourceios/showio-app) 499 | - [Shuttle-Tracker](https://github.com/AbstractedSheep/Shuttle-Tracker) 500 | - [Siesta GitHub Browser](https://github.com/bustoutsolutions/siesta/tree/master/Examples/GithubBrowser) 501 | - [SimpleAuth](https://github.com/calebd/SimpleAuth) 502 | - [SimpleMemo](https://github.com/lijuncode/SimpleMemo) 503 | - [Simplistic](https://github.com/e7711bbear/Simplistic) 504 | - [SkeletonKey](https://github.com/chrishulbert/SkeletonKey) 505 | - [Skiff Mail](https://github.com/skiff-org/skiff-apps) 506 | - [Smart Traveller (UberGuide)](https://github.com/hACKbUSTER/UberGuide-iOS) 507 | - [SmileWeather](https://github.com/liu044100/SmileWeather) 508 | - [Snapchat clone](https://github.com/opensourceios/SnapChat) 509 | - [Sol](https://github.com/comyar/Sol) 510 | - [Songkick](https://github.com/ArnaudRinquin/sk-react-native) 511 | - [Soon](https://github.com/sandofsky/soon) 512 | - [SoundCloudSwift](https://github.com/opensourceios/SoundCloudSwift) 513 | - [Sounds](https://ericasadun.com/2020/06/05/building-a-silly-watchkit-app/) 514 | - [Space Zero](https://github.com/xyclos/space_squared) 515 | - [Spacepics](https://github.com/campezzi/react-native-spacepics) 516 | - [Spare Parts](https://github.com/adamwulf/spare-parts-app) 517 | - [SparkleShare](https://github.com/darvin/SparkleShare-iOS) 518 | - [Speak](https://github.com/opensourceios/speakability) 519 | - [Spontaneous - Random quotes](https://github.com/opensourceios/DiscoverRandomQuotes) 520 | - [Starship](https://github.com/kylef-archive/Starship) 521 | - [Startups - Mapped In Israel](https://github.com/sugarso/MappedInIsrael) 522 | - [Stay](https://github.com/shenruisi/Stay) 523 | - [Steps](https://github.com/gizmosachin/Steps) 524 | - [Stocks-iOS](https://github.com/MauriceArikoglu/stocks-ios) 525 | - [Stopwatch](https://github.com/toggl/stopwatch) 526 | - [StreetMusicMap](https://github.com/henriquevelloso/StreetMusicMap) 527 | - [Strife Veteran Edition](https://github.com/svkaiser/strife-ve) 528 | - [Sudoku](https://github.com/christopherdro/react-native-sudoku) 529 | - [SudokuBreaker](https://github.com/popei69/SudokuBreaker) 530 | - [SudokuResolv](https://github.com/Haoest/SudokuResolv) 531 | - [Superday](https://github.com/opensourceios/superday) 532 | - [surespot](https://github.com/opensourceios/surespot-ios) 533 | - [Swab](https://github.com/pkamb/swab) 534 | - [Swiflytics](https://github.com/aciidb0mb3r/Swiflytics) 535 | - [Swift Off](https://github.com/opensourceios/swift-off-todo) 536 | - [Swift-Gif](https://github.com/pjchavarria/Swift-Gif) 537 | - [Swift-Walk-Tracker](https://github.com/kevinvanderlugt/Swift-Walk-Tracker) 538 | - [SwiftBlog](https://github.com/BalestraPatrick/SwiftBlog) 539 | - [Swifteroid](https://github.com/eugenpirogoff/swifteroid) 540 | - [SwiftFanorona](https://github.com/jenduf/SwiftFanorona) 541 | - [SwiftFlickrApp](https://github.com/synboo/SwiftFlickrApp) 542 | - [SwiftHub](https://github.com/sahandnayebaziz/StateView-Samples-SwiftHub) 543 | - [SwiftNote](https://github.com/mslathrop/SwiftNote) 544 | - [SwiftRACGoogleImages](https://github.com/Adlai-Holler/SwiftRACGoogleImages) 545 | - [SwiftSnake](https://github.com/caleb0/SwiftSnake) 546 | - [SwiftSpace](https://github.com/FlexMonkey/SwiftSpace) 547 | - [SwiftStrike](https://developer.apple.com/documentation/realitykit/swiftstrike_creating_a_game_with_realitykit) 548 | - [SwiftTextClock](https://github.com/MichMich/SwiftTextClock) 549 | - [SwipeIt](https://github.com/ivanbruel/SwipeIt) 550 | - [Tack](https://github.com/stig/Tack) 551 | - [Task Coach](https://sourceforge.net/projects/taskcoach/) 552 | - [TaskPaper](https://github.com/jessegrosjean/NOTTaskPaperForIOS) 553 | - [TechTavta](https://github.com/LUGM/TechTatva-15) 554 | - [teh internets](https://github.com/insurgentgames/teh-internets) 555 | - [Telemat-tvOS](https://github.com/omichde/Telemat-tvOS) 556 | - [Tenere News Reader](https://github.com/yavuz/Tenere) 557 | - [Terrarium](https://github.com/penk/terrarium-app) 558 | - [Tether](https://github.com/chrisballinger/Tether-iOS) 559 | - [Textbook](https://github.com/JohnWong/textbook) 560 | - [TextEthan](https://github.com/thii/TextEthan) 561 | - [Textor](https://github.com/louisdh/textor) 562 | - [That Movie With](https://github.com/jayhickey/thatmoviewith) 563 | - [The Oakland Post](https://github.com/aclissold/the-oakland-post) 564 | - [The Spin Zone](https://github.com/opensourceios/Spin-Zone) 565 | - [theNews](https://github.com/TosinAF/thenews-objc) 566 | - [TheReservist](https://github.com/kimar/TheReservist) 567 | - [Theseus](https://github.com/lazerwalker/Theseus) 568 | - [Tic-tac-toe](https://github.com/ijoshsmith/swift-tic-tac-toe) 569 | - [TicTacToe](https://github.com/facebook/react-native/tree/d2fc08d33b2c89812d1871f8b786d666207ed362/Examples/TicTacToe) 570 | - [TicTacToe Ultimatum](https://github.com/mkhrapov/tictactoe-ultimatum) 571 | - [Tinder clone](https://github.com/opensourceios/Tinder) 572 | - [Tiny Wings Remake](https://github.com/haqu/tiny-wings) 573 | - [Tinylog](https://github.com/binarylevel/Tinylog-iOS) 574 | - [Tip Calculator](https://github.com/tirupati17/tip-calculator-auto-layout-viper-objective-c) 575 | - [TKeyboard](https://github.com/music4kid/TKeyboard) 576 | - [To do](https://github.com/objcio/issue-13-viper) 577 | - [To Do List](https://github.com/joemaddalone/react-native-todo) 578 | - [Tob](https://github.com/JRock007/Tob) 579 | - [TodayMind](https://github.com/cyanzhong/TodayMind) 580 | - [TodayStocks](https://github.com/premnirmal/TodayStocks) 581 | - [Todo](https://github.com/JakeLin/Todo) 582 | - [Todo Combine SwiftUI](https://github.com/jamfly/SwiftUI-Combine-todo-example) 583 | - [Todo.txt](https://github.com/todotxt/todo.txt-ios) 584 | - [Toggl Timer](https://github.com/opensourceios/toggle-mobile) 585 | - [Toggl Timer](https://github.com/opensourceios/mobileapp) 586 | - [tootbot](https://github.com/tootbot/tootbot) 587 | - [ToThePenny](https://github.com/ivan-magda/ToThePenny) 588 | - [Tracker 4 Compassion](https://github.com/fokkezb/tracker) 589 | - [Triggy](https://github.com/jnordberg/triggy) 590 | - [Tripletz Tic Tac Toe](https://github.com/Aaron-A/Tripletz) 591 | - [TrollDrop](https://github.com/a2/TrollDrop) 592 | - [Trust](https://github.com/TrustWallet/trust-wallet-ios) 593 | - [try! Swift](https://github.com/opensourceios/trySwiftApp) 594 | - [tweedie](https://github.com/aanon4/tweedie) 595 | - [tweejump](https://github.com/haqu/tweejump) 596 | - [Twitter clone](https://github.com/opensourceios/Twitter) 597 | - [UitzendingGemist by jeffkreeftmeijer](https://github.com/jeffkreeftmeijer/UitzendingGemist) 598 | - [UK](https://github.com/nhsx/COVID-19-app-iOS-BETA) 599 | - [Ulangi](https://github.com/subconcept-labs/ulangi) 600 | - [Uncle Nagy's House](https://github.com/kenmickles/unh_tvos) 601 | - [Valio Con 2014 Schedule](https://github.com/soffes/valio) 602 | - [Vegan Lists UK](https://github.com/dsgriffin/vegan-lists-uk) 603 | - [Vesper](https://github.com/brentsimmons/Vesper) 604 | - [Vim](https://github.com/applidium/Vim) 605 | - [VIPER-SWIFT](https://github.com/mutualmobile/VIPER-SWIFT) 606 | - [VisitBCN](https://github.com/opensourceios/visitBCN) 607 | - [VPN On](https://github.com/lexrus/VPNOn) 608 | - [WaniKani](https://github.com/haawa799/-WaniKani2) 609 | - [warpedAR](https://github.com/Trevorrwarduk/warpedAR-Open-Source) 610 | - [WatchKit tutorials](https://github.com/kostiakoval/WatchKit-Apps) 611 | - [Watchman](https://github.com/DanToml/Watchman) 612 | - [WatchNotes](https://github.com/azamsharp/WatchNotes) 613 | - [watchOS-2-Sampler](https://github.com/shu223/watchOS-2-Sampler) 614 | - [WatchSnake](https://github.com/davidcairns/-WatchSnake) 615 | - [WatchStocks](https://github.com/G2Jose/WatchStocks) 616 | - [Weather by JakeLin](https://github.com/JakeLin/ReactNativeWeather) 617 | - [WeatherMap](https://github.com/TakefiveInteractive/WeatherMap) 618 | - [Whatsapp clone](https://github.com/opensourceios/whatsapp) 619 | - [WhatsUp Chat](https://github.com/satishbabariya/WhatsUp) 620 | - [Wheelmap](https://github.com/sozialhelden/wheelmap-iphone2) 621 | - [WhiteHouse](https://github.com/WhiteHouse/wh-app-ios) 622 | - [wikiHow](https://github.com/tderouin/wikiHow-iPhone-Application) 623 | - [wildcats](https://github.com/pietbrauer/wildcats) 624 | - [windmill](https://github.com/qnoid/windmill-ios) 625 | - [Wizard War](https://github.com/seanhess/wizardwar) 626 | - [Wordflick](https://github.com/opensourceios/wordflick-ios) 627 | - [Words](https://github.com/soffes/words) 628 | - [Workdays](https://github.com/mpak/Workdays) 629 | - [Wunderschnell](https://github.com/contentful-graveyard/Wunderschnell) 630 | - [WWDC Family](https://github.com/Foreverland/ios) 631 | - [WWDCTV](https://github.com/azzoor/WWDCTV) 632 | - [XPilot](https://7b5labs.com/xpilot.git/) 633 | - [YaleMobile](https://github.com/kiokoo/YaleMobile) 634 | - [Yep](https://github.com/CatchChat/Yep) 635 | - [Yorkie](https://github.com/opensourceios/YorkieApp) 636 | - [Zeplin](https://github.com/anonrig/zeplin-ios) 637 | - [ZeroStore](https://github.com/kylebshr/zerostore-ios) 638 | - [ZXing](https://github.com/zxing/zxing) 639 | - [花灰](https://github.com/lexrus/Huahui) 640 | 641 | ## Thanks 642 | 643 | This list was inspired by [awesome-ios](https://github.com/vsouza/awesome-ios) and [awesome-swift](https://github.com/matteocrippa/awesome-swift). Thanks to all the [contributors](https://github.com/dkhamsing/open-source-ios-apps/graphs/contributors) 🎉 644 | 645 | ## Contact 646 | 647 | - [github.com/dkhamsing](https://github.com/dkhamsing) 648 | - [twitter.com/dkhamsing](https://twitter.com/dkhamsing) 649 | -------------------------------------------------------------------------------- /LATEST.md: -------------------------------------------------------------------------------- 1 | # Open-Source iOS Apps Latest 2 | 3 | ## Lastest additions to the [main list](https://github.com/dkhamsing/open-source-ios-apps) 4 | 5 | 1. [Berkeley Mobile](https://github.com/asuc-octo/berkeley-mobile-ios) 6 | 2. [LegitURL](https://github.com/sigfault-byte/LegitURL) 7 | 3. [Moblin](https://github.com/eerimoq/moblin) 8 | 4. [Feather](https://github.com/khcrysalis/Feather) 9 | 5. [Sora](https://github.com/cranci1/Sora) 10 | 6. [Off-Day](https://github.com/zizicici/Off-Day) 11 | 7. [Clearcam](https://github.com/roryclear/clearcam) 12 | 8. [Simple.](https://github.com/basarsubasi/simplefitnessapp) 13 | 9. [DuckDuckGo browser](https://github.com/duckduckgo/apple-browsers) 14 | 10. [CraftOS-PC](https://github.com/MCJack123/craftos2) 15 | 11. [StoicQuotes](https://github.com/il1ane/StoicQuotes) 16 | 12. [Recap AI](https://github.com/Visual-Studio-Coder/Recap) 17 | 13. [QR Share Pro](https://github.com/Visual-Studio-Coder/QR-Share-Pro) 18 | 14. [Mr.Tip](https://github.com/csprasad/Mr-Tip) 19 | 15. [OnionShare](https://github.com/onionshare/onionshare) 20 | 16. [Saber](https://github.com/saber-notes/saber) 21 | 17. [Goruma IRC](https://codeberg.org/emersion/goguma) 22 | 18. [Mindustry](https://github.com/Anuken/Mindustry) 23 | 19. [orgro](https://github.com/amake/orgro) 24 | 20. [SaxWeather](https://github.com/saxobroko/SaxWeather) 25 | 21. [PomPadDo](https://github.com/amikhaylin/pompaddo) 26 | 22. [Pushpin for Pinboard](https://github.com/lionheart/Pushpin) 27 | 23. [SameBoy](https://github.com/LIJI32/SameBoy) 28 | 24. [Delta](https://github.com/rileytestut/Delta) 29 | 25. [Foqos](https://github.com/awaseem/foqos) 30 | 26. [Twine RSS Reader](https://github.com/msasikanth/twine) 31 | 27. [Piecelet for NeoDB](https://github.com/Piecelet/neodb-app) 32 | 28. [PhotoApp](https://github.com/chunkyguy/PhotoApp) 33 | 29. [Pixelfed](https://github.com/pixelfed/pixelfed-rn) 34 | 30. [Element X](https://github.com/element-hq/element-x-ios) 35 | 36 | ## Most recently updated 37 | 38 | 1. [Immich](https://github.com/immich-app/immich) 39 | 2. [Off-Day](https://github.com/zizicici/Off-Day) 40 | 3. [Monal](https://github.com/monal-im/Monal) 41 | 4. [Invoice Ninja](https://github.com/invoiceninja/admin-portal) 42 | 5. [PPSSPP](https://github.com/hrydgard/ppsspp) 43 | 6. [RetroArch](https://github.com/libretro/RetroArch) 44 | 7. [FeedFlow](https://github.com/prof18/feed-flow) 45 | 8. [Twine RSS Reader](https://github.com/msasikanth/twine) 46 | 9. [PeopleInSpace](https://github.com/joreilly/PeopleInSpace) 47 | 10. [deltachat](https://github.com/deltachat/deltachat-ios) 48 | 11. [OsmAnd Maps](https://github.com/osmandapp/Osmand) 49 | 12. [VLC](https://github.com/videolan/vlc) 50 | 13. [Firefox](https://github.com/mozilla-mobile/firefox-ios) 51 | 14. [osu!](https://github.com/ppy/osu) 52 | 15. [Kiwix](https://github.com/kiwix/kiwix-apple) 53 | 16. [Wire](https://github.com/wireapp/wire-ios) 54 | 17. [Logseq](https://github.com/logseq/logseq) 55 | 18. [SameBoy](https://github.com/LIJI32/SameBoy) 56 | 19. [Nextcloud](https://github.com/nextcloud/ios) 57 | 20. [violet](https://github.com/project-violet/violet) 58 | 21. [Home Assistant Companion](https://github.com/home-assistant/iOS) 59 | 22. [Kodi Remote](https://github.com/xbmc/xbmc) 60 | 23. [Kodi](https://github.com/xbmc/xbmc) 61 | 24. [Mindustry](https://github.com/Anuken/Mindustry) 62 | 25. [Nextcloud Talk](https://github.com/nextcloud/talk-ios) 63 | 26. [QZ - qdomyos-zwift](https://github.com/cagnulein/qdomyos-zwift) 64 | 27. [Swiftfin](https://github.com/jellyfin/Swiftfin) 65 | 28. [Quickstart Samples](https://github.com/firebase/quickstart-ios) 66 | 29. [DuckDuckGo browser](https://github.com/duckduckgo/apple-browsers) 67 | 30. [Rainbow](https://github.com/rainbow-me/rainbow) 68 | 69 | ## Thanks 70 | 71 | This list was inspired by [awesome-ios](https://github.com/vsouza/awesome-ios) and [awesome-swift](https://github.com/matteocrippa/awesome-swift). Thanks to all the [contributors](https://github.com/dkhamsing/open-source-ios-apps/graphs/contributors) 🎉 72 | 73 | ## Contact 74 | 75 | - [github.com/dkhamsing](https://github.com/dkhamsing) 76 | - [twitter.com/dkhamsing](https://twitter.com/dkhamsing) 77 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Creative Commons Legal Code 2 | 3 | CC0 1.0 Universal 4 | 5 | CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE 6 | LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN 7 | ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS 8 | INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES 9 | REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS 10 | PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM 11 | THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED 12 | HEREUNDER. 13 | 14 | Statement of Purpose 15 | 16 | The laws of most jurisdictions throughout the world automatically confer 17 | exclusive Copyright and Related Rights (defined below) upon the creator 18 | and subsequent owner(s) (each and all, an "owner") of an original work of 19 | authorship and/or a database (each, a "Work"). 20 | 21 | Certain owners wish to permanently relinquish those rights to a Work for 22 | the purpose of contributing to a commons of creative, cultural and 23 | scientific works ("Commons") that the public can reliably and without fear 24 | of later claims of infringement build upon, modify, incorporate in other 25 | works, reuse and redistribute as freely as possible in any form whatsoever 26 | and for any purposes, including without limitation commercial purposes. 27 | These owners may contribute to the Commons to promote the ideal of a free 28 | culture and the further production of creative, cultural and scientific 29 | works, or to gain reputation or greater distribution for their Work in 30 | part through the use and efforts of others. 31 | 32 | For these and/or other purposes and motivations, and without any 33 | expectation of additional consideration or compensation, the person 34 | associating CC0 with a Work (the "Affirmer"), to the extent that he or she 35 | is an owner of Copyright and Related Rights in the Work, voluntarily 36 | elects to apply CC0 to the Work and publicly distribute the Work under its 37 | terms, with knowledge of his or her Copyright and Related Rights in the 38 | Work and the meaning and intended legal effect of CC0 on those rights. 39 | 40 | 1. Copyright and Related Rights. A Work made available under CC0 may be 41 | protected by copyright and related or neighboring rights ("Copyright and 42 | Related Rights"). Copyright and Related Rights include, but are not 43 | limited to, the following: 44 | 45 | i. the right to reproduce, adapt, distribute, perform, display, 46 | communicate, and translate a Work; 47 | ii. moral rights retained by the original author(s) and/or performer(s); 48 | iii. publicity and privacy rights pertaining to a person's image or 49 | likeness depicted in a Work; 50 | iv. rights protecting against unfair competition in regards to a Work, 51 | subject to the limitations in paragraph 4(a), below; 52 | v. rights protecting the extraction, dissemination, use and reuse of data 53 | in a Work; 54 | vi. database rights (such as those arising under Directive 96/9/EC of the 55 | European Parliament and of the Council of 11 March 1996 on the legal 56 | protection of databases, and under any national implementation 57 | thereof, including any amended or successor version of such 58 | directive); and 59 | vii. other similar, equivalent or corresponding rights throughout the 60 | world based on applicable law or treaty, and any national 61 | implementations thereof. 62 | 63 | 2. Waiver. To the greatest extent permitted by, but not in contravention 64 | of, applicable law, Affirmer hereby overtly, fully, permanently, 65 | irrevocably and unconditionally waives, abandons, and surrenders all of 66 | Affirmer's Copyright and Related Rights and associated claims and causes 67 | of action, whether now known or unknown (including existing as well as 68 | future claims and causes of action), in the Work (i) in all territories 69 | worldwide, (ii) for the maximum duration provided by applicable law or 70 | treaty (including future time extensions), (iii) in any current or future 71 | medium and for any number of copies, and (iv) for any purpose whatsoever, 72 | including without limitation commercial, advertising or promotional 73 | purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each 74 | member of the public at large and to the detriment of Affirmer's heirs and 75 | successors, fully intending that such Waiver shall not be subject to 76 | revocation, rescission, cancellation, termination, or any other legal or 77 | equitable action to disrupt the quiet enjoyment of the Work by the public 78 | as contemplated by Affirmer's express Statement of Purpose. 79 | 80 | 3. Public License Fallback. Should any part of the Waiver for any reason 81 | be judged legally invalid or ineffective under applicable law, then the 82 | Waiver shall be preserved to the maximum extent permitted taking into 83 | account Affirmer's express Statement of Purpose. In addition, to the 84 | extent the Waiver is so judged Affirmer hereby grants to each affected 85 | person a royalty-free, non transferable, non sublicensable, non exclusive, 86 | irrevocable and unconditional license to exercise Affirmer's Copyright and 87 | Related Rights in the Work (i) in all territories worldwide, (ii) for the 88 | maximum duration provided by applicable law or treaty (including future 89 | time extensions), (iii) in any current or future medium and for any number 90 | of copies, and (iv) for any purpose whatsoever, including without 91 | limitation commercial, advertising or promotional purposes (the 92 | "License"). The License shall be deemed effective as of the date CC0 was 93 | applied by Affirmer to the Work. Should any part of the License for any 94 | reason be judged legally invalid or ineffective under applicable law, such 95 | partial invalidity or ineffectiveness shall not invalidate the remainder 96 | of the License, and in such case Affirmer hereby affirms that he or she 97 | will not (i) exercise any of his or her remaining Copyright and Related 98 | Rights in the Work or (ii) assert any associated claims and causes of 99 | action with respect to the Work, in either case contrary to Affirmer's 100 | express Statement of Purpose. 101 | 102 | 4. Limitations and Disclaimers. 103 | 104 | a. No trademark or patent rights held by Affirmer are waived, abandoned, 105 | surrendered, licensed or otherwise affected by this document. 106 | b. Affirmer offers the Work as-is and makes no representations or 107 | warranties of any kind concerning the Work, express, implied, 108 | statutory or otherwise, including without limitation warranties of 109 | title, merchantability, fitness for a particular purpose, non 110 | infringement, or the absence of latent or other defects, accuracy, or 111 | the present or absence of errors, whether or not discoverable, all to 112 | the greatest extent permissible under applicable law. 113 | c. Affirmer disclaims responsibility for clearing rights of other persons 114 | that may apply to the Work or any use thereof, including without 115 | limitation any person's Copyright and Related Rights in the Work. 116 | Further, Affirmer disclaims responsibility for obtaining any necessary 117 | consents, permissions or other rights required for any use of the 118 | Work. 119 | d. Affirmer understands and acknowledges that Creative Commons is not a 120 | party to this document and has no duty or obligation with respect to 121 | this CC0 or use of the Work. 122 | --------------------------------------------------------------------------------