├── .gitignore ├── .rspec ├── .cirrus.yml ├── Gemfile ├── lib └── real_world_rails │ ├── inspectors │ ├── models_inspector.rb │ ├── view_specs_inspector.rb │ ├── model_methods_inspector.rb │ ├── model_method_names_inspector.rb │ ├── constants_inspector.rb │ ├── view_naming_inspector.rb │ ├── inspector.rb │ └── shared_view_dirs_inspector.rb │ ├── parser_factory.rb │ ├── printer.rb │ └── filename_specification.rb ├── bin ├── rspec ├── rwr └── get_project_data ├── LICENSE ├── spec ├── filename_specification_spec.rb └── spec_helper.rb ├── Gemfile.lock ├── README.md ├── .gitmodules └── repos.md /.gitignore: -------------------------------------------------------------------------------- 1 | /.bundle 2 | /.ruby-version -------------------------------------------------------------------------------- /.rspec: -------------------------------------------------------------------------------- 1 | --color 2 | --require spec_helper 3 | --format documentation 4 | -------------------------------------------------------------------------------- /.cirrus.yml: -------------------------------------------------------------------------------- 1 | container: 2 | image: ruby:latest 3 | 4 | rspec_task: 5 | bundle_cache: 6 | folder: /usr/local/bundle 7 | fingerprint_script: echo $RUBY_VERSION && cat Gemfile.lock 8 | populate_script: bundle install 9 | rspec_script: bundle exec rspec spec 10 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | # Parser gem docs 4 | # https://whitequark.github.io/parser/ 5 | # https://github.com/whitequark/parser 6 | # https://github.com/whitequark/parser/blob/master/doc/AST_FORMAT.md 7 | gem 'parser', '~> 3.2.0.0' 8 | gem 'coderay', '~> 1.1.3' 9 | gem 'tty', '~> 0.7.0' 10 | gem 'pry' 11 | gem 'graphql-client' 12 | 13 | group :test do 14 | gem 'rspec', '~> 3.12.0' 15 | end 16 | -------------------------------------------------------------------------------- /lib/real_world_rails/inspectors/models_inspector.rb: -------------------------------------------------------------------------------- 1 | module RealWorldRails 2 | module Inspectors 3 | 4 | class ModelsInspector < Inspector 5 | 6 | inspects :models 7 | 8 | class Processor < BaseProcessor 9 | def on_class(node) 10 | class_name = node.children.first.children.last 11 | puts class_name 12 | end 13 | end 14 | 15 | end 16 | 17 | end 18 | end 19 | -------------------------------------------------------------------------------- /lib/real_world_rails/parser_factory.rb: -------------------------------------------------------------------------------- 1 | require 'parser/current' 2 | 3 | module ParserFactory 4 | 5 | def self.create 6 | parser = Parser::CurrentRuby.new 7 | parser.diagnostics.all_errors_are_fatal = false 8 | parser.diagnostics.ignore_warnings = true 9 | parser.diagnostics.consumer = lambda do |diagnostic| 10 | puts(diagnostic.render) 11 | end 12 | parser 13 | end 14 | 15 | end 16 | -------------------------------------------------------------------------------- /bin/rspec: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # 3 | # This file was generated by Bundler. 4 | # 5 | # The application 'rspec' is installed as part of a gem, and 6 | # this file is here to facilitate running it. 7 | # 8 | 9 | require 'pathname' 10 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile", 11 | Pathname.new(__FILE__).realpath) 12 | 13 | require 'rubygems' 14 | require 'bundler/setup' 15 | 16 | load Gem.bin_path('rspec-core', 'rspec') 17 | -------------------------------------------------------------------------------- /lib/real_world_rails/inspectors/view_specs_inspector.rb: -------------------------------------------------------------------------------- 1 | require 'coderay' 2 | 3 | module RealWorldRails 4 | module Inspectors 5 | 6 | class ViewSpecsInspector < Inspector 7 | 8 | inspects :specs, %r{/views/} 9 | 10 | def inspect_file(filename) 11 | buffer = create_buffer(filename) 12 | pretty_print_source source: buffer.source, filename: filename 13 | puts 14 | end 15 | end 16 | 17 | end 18 | end 19 | -------------------------------------------------------------------------------- /lib/real_world_rails/inspectors/model_methods_inspector.rb: -------------------------------------------------------------------------------- 1 | module RealWorldRails 2 | module Inspectors 3 | 4 | class ModelMethodsInspector < Inspector 5 | 6 | inspects :models 7 | 8 | class Processor < BaseProcessor 9 | def on_def(node) 10 | expression = node.location.expression 11 | filename = expression.source_buffer.name 12 | pretty_print_source source: expression.source, filename: filename 13 | puts 14 | end 15 | end 16 | 17 | end 18 | 19 | end 20 | end 21 | -------------------------------------------------------------------------------- /lib/real_world_rails/inspectors/model_method_names_inspector.rb: -------------------------------------------------------------------------------- 1 | module RealWorldRails 2 | module Inspectors 3 | 4 | class ModelMethodNamesInspector < Inspector 5 | 6 | inspects :models 7 | 8 | class Processor < BaseProcessor 9 | def on_def(node) 10 | method_name = node.children.first 11 | expression = node.location.expression 12 | filename = expression.source_buffer.name 13 | puts "#{method_name} (#{filename})" 14 | end 15 | end 16 | 17 | end 18 | 19 | end 20 | end 21 | -------------------------------------------------------------------------------- /lib/real_world_rails/inspectors/constants_inspector.rb: -------------------------------------------------------------------------------- 1 | module RealWorldRails 2 | module Inspectors 3 | 4 | class ConstantsInspector < Inspector 5 | 6 | inspects :all, except: [:gems, :tests, :specs, :generators] 7 | 8 | class Processor < BaseProcessor 9 | 10 | # on_casgn: on constant assignment 11 | def on_casgn(node) 12 | expression = node.location.expression 13 | filename = expression.source_buffer.name 14 | pretty_print_source source: expression.source, filename: filename 15 | puts 16 | end 17 | 18 | end 19 | 20 | end 21 | 22 | 23 | end 24 | end 25 | -------------------------------------------------------------------------------- /bin/rwr: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | require 'pathname' 4 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile", 5 | Pathname.new(__FILE__).realpath) 6 | 7 | require 'rubygems' 8 | require 'bundler/setup' 9 | 10 | $LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__)) 11 | require 'real_world_rails/parser_factory' 12 | require 'real_world_rails/inspectors/inspector' 13 | 14 | def init_inspector 15 | inspector_name = (ARGV.first || 'models').gsub('-', '_') + '_inspector' 16 | require "real_world_rails/inspectors/#{inspector_name}" 17 | 18 | inspector_class_name = inspector_name.capitalize.gsub(/_[a-z]/, &:upcase).gsub('_','') 19 | fully_qualified_inspector_class_name = "RealWorldRails::Inspectors::#{inspector_class_name}" 20 | inspector_class = Object.const_get fully_qualified_inspector_class_name 21 | inspector_class.new 22 | end 23 | 24 | init_inspector.run 25 | -------------------------------------------------------------------------------- /lib/real_world_rails/printer.rb: -------------------------------------------------------------------------------- 1 | module RealWorldRails 2 | module Printer 3 | 4 | SOURCE_OUTPUT_FORMAT_DEFAULT = :terminal 5 | LANGUAGE = :ruby 6 | MARKDOWN_CODE_FENCE = '```'.freeze 7 | 8 | def formatted_filename(filename) 9 | "File: #{filename}" 10 | end 11 | 12 | def pretty_print_source(source:, filename: nil) 13 | if output_markdown? 14 | puts "#{MARKDOWN_CODE_FENCE}#{LANGUAGE}" 15 | puts "# #{formatted_filename(filename)}" 16 | puts source 17 | puts MARKDOWN_CODE_FENCE 18 | else 19 | puts formatted_filename(filename) 20 | puts CodeRay::Duo[LANGUAGE, source_output_format].highlight(source) 21 | end 22 | end 23 | 24 | private 25 | 26 | MARKDOWN_FORMATS = [:md, :markdown] 27 | 28 | def output_markdown? 29 | MARKDOWN_FORMATS.include? source_output_format 30 | end 31 | 32 | def source_output_format 33 | @source_output_format ||= ENV.fetch("SOURCE_OUTPUT_FORMAT", SOURCE_OUTPUT_FORMAT_DEFAULT).to_sym 34 | end 35 | end 36 | end 37 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Eliot Sykes 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /spec/filename_specification_spec.rb: -------------------------------------------------------------------------------- 1 | require 'real_world_rails/filename_specification' 2 | 3 | module RealWorldRails 4 | describe FilenameSpecification do 5 | 6 | context :views do 7 | it 'is satisfied by view templates' do 8 | filename_specification = FilenameSpecification.build :views 9 | expect(filename_specification.satisfied_by?('apps/foo/app/views/bar/index.html.erb')).to eq true 10 | end 11 | 12 | it 'is not satisfied by view specs' do 13 | filename_specification = FilenameSpecification.build :views 14 | expect(filename_specification.satisfied_by?('apps/foo/spec/something/app/views/bar_spec.rb')).to eq false 15 | end 16 | 17 | it 'is not satisfied by view tests' do 18 | filename_specification = FilenameSpecification.build :views 19 | expect(filename_specification.satisfied_by?('apps/foo/test/something/app/views/bar_spec.rb')).to eq false 20 | end 21 | 22 | it 'is not satisfied by gems' do 23 | filename_specification = FilenameSpecification.build :views 24 | 25 | expect(filename_specification.satisfied_by?( 26 | 'apps/canvas-lms/gems/plugins/qti_exporter/app/views/plugins/_qti_converter_settings.html.erb' 27 | )).to eq false 28 | 29 | expect(filename_specification.satisfied_by?( 30 | 'apps/open-data-certificate/vendor/gems/surveyor-1.4.0/app/views/partials/_answer.html.haml' 31 | )).to eq false 32 | end 33 | 34 | it 'is not satified by dummy app views' do 35 | filename_specification = FilenameSpecification.build :views 36 | 37 | expect(filename_specification.satisfied_by?( 38 | 'apps/spina/test/dummy/app/views/default/pages/homepage.html.erb' 39 | )).to eq false 40 | end 41 | end 42 | 43 | end 44 | end 45 | -------------------------------------------------------------------------------- /lib/real_world_rails/inspectors/view_naming_inspector.rb: -------------------------------------------------------------------------------- 1 | require 'tty' 2 | 3 | module RealWorldRails 4 | module Inspectors 5 | 6 | class ViewNamingInspector < Inspector 7 | 8 | inspects :views 9 | 10 | def files_pattern 11 | "apps/**/*" 12 | end 13 | 14 | def inspect_file(filename) 15 | ViewTemplate.add filename 16 | end 17 | 18 | def after_inspect_files 19 | ViewTemplate.report 20 | end 21 | 22 | class ViewTemplate 23 | 24 | @@store = [] 25 | 26 | def self.add(filename) 27 | @@store << filename 28 | end 29 | 30 | def self.report 31 | analyze_view_directories 32 | end 33 | 34 | def self.analyze_view_directories 35 | 36 | view_dirs = Set.new 37 | prevent_devise_skewing_report = true 38 | devise_directory = '/devise/' 39 | 40 | @@store.each do |view_filename| 41 | if prevent_devise_skewing_report 42 | next if view_filename.include?(devise_directory) 43 | end 44 | 45 | view_dir = File.dirname(view_filename) 46 | view_dirs << view_dir 47 | end 48 | 49 | view_home_regex = %r{.+/app/views/} 50 | frequencies = Hash.new(0) 51 | 52 | view_dirs.each do |view_dir| 53 | relative_view_dir = view_dir.sub(view_home_regex, '') 54 | frequencies[relative_view_dir] += 1 55 | end 56 | 57 | headers = ['Frequency', 'View Directory'] 58 | rows = frequencies.sort_by {|view_dir, freq| -freq}.map {|view_dir, freq| [freq, view_dir]} 59 | table = TTY::Table.new headers, rows 60 | 61 | puts table.render(:unicode, alignments: [:right, :left]) 62 | end 63 | 64 | end 65 | end 66 | 67 | end 68 | end 69 | -------------------------------------------------------------------------------- /lib/real_world_rails/inspectors/inspector.rb: -------------------------------------------------------------------------------- 1 | require 'coderay' 2 | require_relative '../printer' 3 | require_relative '../filename_specification' 4 | 5 | module RealWorldRails 6 | module Inspectors 7 | class Inspector 8 | include Printer 9 | 10 | class << self 11 | attr_accessor :filename_specification 12 | end 13 | 14 | def self.inspects(*specifications) 15 | self.filename_specification = FilenameSpecification.build(*specifications) 16 | end 17 | 18 | def run 19 | before_inspect_files 20 | inspect_files 21 | after_inspect_files 22 | end 23 | 24 | # Before Hook 25 | def before_inspect_files 26 | end 27 | 28 | def inspect_files 29 | filenames.each { |filename| inspect_file(filename) } 30 | end 31 | 32 | # After Hook 33 | def after_inspect_files 34 | end 35 | 36 | def filenames 37 | glob_pattern = ENV.fetch('FILES_PATTERN', files_pattern) 38 | Dir.glob(glob_pattern).select { |filename| inspectable?(filename) } 39 | end 40 | 41 | def files_pattern 42 | "apps/**/*.rb" 43 | end 44 | 45 | def inspectable?(filename) 46 | File.file?(filename) && self.class.filename_specification.satisfied_by?(filename) 47 | end 48 | 49 | def inspect_file(filename) 50 | buffer = create_buffer(filename) 51 | ast = parser.reset.parse(buffer) 52 | processor.process(ast) 53 | end 54 | 55 | def create_buffer(filename) 56 | Parser::Source::Buffer.new(filename).read 57 | end 58 | 59 | def parser 60 | @parser ||= ParserFactory.create 61 | end 62 | 63 | def processor 64 | @processor ||= create_processor 65 | end 66 | 67 | def create_processor 68 | processor_class_name = "#{self.class}::Processor" 69 | processor_class = Object.const_get processor_class_name 70 | processor_class.new 71 | end 72 | 73 | class BaseProcessor < Parser::AST::Processor 74 | include Printer 75 | end 76 | 77 | end 78 | end 79 | end 80 | -------------------------------------------------------------------------------- /lib/real_world_rails/inspectors/shared_view_dirs_inspector.rb: -------------------------------------------------------------------------------- 1 | require 'tty' 2 | 3 | module RealWorldRails 4 | module Inspectors 5 | 6 | class SharedViewDirsInspector < Inspector 7 | 8 | inspects :views 9 | 10 | def files_pattern 11 | "apps/**/*" 12 | end 13 | 14 | def inspectable?(filename) 15 | File.directory?(filename) && self.class.filename_specification.satisfied_by?(filename) 16 | end 17 | 18 | def before_inspect_files 19 | puts "Searching the shared view directory used by each Rails app." 20 | puts "The following directory names are assumed to be shared view directories:" 21 | puts "shared, common, partials, application" 22 | end 23 | 24 | def inspect_file(dirname) 25 | SharedViewDir.add_if_shared dirname 26 | end 27 | 28 | def after_inspect_files 29 | SharedViewDir.report 30 | end 31 | 32 | class SharedViewDir 33 | 34 | @@store = {} 35 | 36 | PROJECT_SHARED_VIEW_DIR_REGEXP = %r{\Aapps/(?.+)(/.+)?/app/views/(?shared|common|partials|application)\z} 37 | 38 | def self.add_if_shared(dirname) 39 | project, shared_view_dir = extract_project_and_shared_view_dir(dirname) 40 | return unless project && shared_view_dir 41 | projects = @@store[shared_view_dir] || [] 42 | projects << "#{project} (#{dirname})" 43 | @@store[shared_view_dir] = projects 44 | end 45 | 46 | def self.report 47 | analyze_view_directories 48 | end 49 | 50 | def self.analyze_view_directories 51 | headers = ["Shared\nDir Name", "Usage\nCount", 'Projects'] 52 | rows = @@store.map do |shared_view_dir, projects| 53 | [shared_view_dir, projects.size, projects.join("\n")] 54 | end 55 | rows.sort_by! { |row| -(count = row[1]) } 56 | table = TTY::Table.new headers, rows 57 | puts table.render(:unicode, alignments: [:right, :right, :left], multiline: true, border: {separator: :each_row}) 58 | end 59 | 60 | private 61 | 62 | def self.extract_project_and_shared_view_dir(dirname) 63 | match = PROJECT_SHARED_VIEW_DIR_REGEXP.match(dirname) 64 | return match[:project], match[:shared_view_dir] if match 65 | end 66 | 67 | end 68 | end 69 | 70 | end 71 | end 72 | -------------------------------------------------------------------------------- /lib/real_world_rails/filename_specification.rb: -------------------------------------------------------------------------------- 1 | module RealWorldRails 2 | class FilenameSpecification 3 | attr_accessor :includes, :excludes 4 | 5 | MODEL_FILENAMES_REGEX = %r{\A.+/models/.+\.rb\z} 6 | VIEW_FILENAMES_REGEX = %r{\Aapps/(?!.*/(spec|test|gems)/).*app/views/.+\z} 7 | GENERATOR_FILENAMES_REGEX = %r{\A.+/lib/(.+/)?generators/} 8 | TEST_FILENAMES_REGEX = %r{_(test)\.rb\z} 9 | SPEC_FILENAMES_REGEX = %r{_(spec)\.rb\z} 10 | GEM_FILENAMES_REGEX = %r{canvas-lms/gems/} 11 | 12 | ALIASED_REGEXES = { 13 | models: MODEL_FILENAMES_REGEX, 14 | specs: SPEC_FILENAMES_REGEX, 15 | tests: TEST_FILENAMES_REGEX, 16 | generators: GENERATOR_FILENAMES_REGEX, 17 | gems: GEM_FILENAMES_REGEX 18 | } 19 | 20 | VALID_REGEX_ALIASES = ALIASED_REGEXES.keys.freeze 21 | 22 | def self.build(*specifications, except:[]) 23 | if [:views] == specifications 24 | # The views regex is precise and does not benefit from the excludes. 25 | filename_specification = self.new(only: VIEW_FILENAMES_REGEX) 26 | else 27 | filename_specification = self.new(*specifications, except: except) 28 | end 29 | filename_specification 30 | end 31 | 32 | def initialize(*specifications, except: [], only: nil) 33 | if !only.nil? 34 | raise ArgumentError, "`only:` limited to Regexps (for now)" unless only.is_a? Regexp 35 | self.includes = [only] 36 | self.excludes = [] 37 | else 38 | specifications.delete(:all) 39 | aliases = (specifications + except).delete_if { |option| option.is_a?(Regexp) } 40 | assert_valid_aliases(aliases) 41 | 42 | self.includes = specifications.map { |spec| ALIASED_REGEXES[spec] || spec } 43 | 44 | if except.empty? 45 | except = ALIASED_REGEXES.keys - specifications 46 | end 47 | 48 | self.excludes = except.map { |spec| ALIASED_REGEXES[spec] || spec } 49 | end 50 | end 51 | 52 | def satisfied_by?(filename) 53 | !excluded?(filename) && included?(filename) 54 | end 55 | 56 | private 57 | 58 | def assert_valid_aliases(aliases) 59 | unknown_aliases = aliases - VALID_REGEX_ALIASES 60 | if unknown_aliases.any? 61 | raise ArgumentError, "Unknown specification aliases: '#{unknown_aliases}'" 62 | end 63 | end 64 | 65 | def excluded?(filename) 66 | excludes.any? { |spec| filename.match(spec) } 67 | end 68 | 69 | def included?(filename) 70 | includes.all? { |spec| filename.match(spec) } 71 | end 72 | end 73 | end 74 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | activesupport (7.0.4.2) 5 | concurrent-ruby (~> 1.0, >= 1.0.2) 6 | i18n (>= 1.6, < 2) 7 | minitest (>= 5.1) 8 | tzinfo (~> 2.0) 9 | ast (2.4.2) 10 | coderay (1.1.3) 11 | concurrent-ruby (1.2.0) 12 | diff-lcs (1.3) 13 | equatable (0.5.0) 14 | graphql (2.0.16) 15 | graphql-client (0.18.0) 16 | activesupport (>= 3.0) 17 | graphql 18 | i18n (1.12.0) 19 | concurrent-ruby (~> 1.0) 20 | method_source (1.0.0) 21 | minitest (5.17.0) 22 | necromancer (0.4.0) 23 | parser (3.2.0.0) 24 | ast (~> 2.4.1) 25 | pastel (0.7.2) 26 | equatable (~> 0.5.0) 27 | tty-color (~> 0.4.0) 28 | pry (0.14.2) 29 | coderay (~> 1.1) 30 | method_source (~> 1.0) 31 | rspec (3.12.0) 32 | rspec-core (~> 3.12.0) 33 | rspec-expectations (~> 3.12.0) 34 | rspec-mocks (~> 3.12.0) 35 | rspec-core (3.12.0) 36 | rspec-support (~> 3.12.0) 37 | rspec-expectations (3.12.2) 38 | diff-lcs (>= 1.2.0, < 2.0) 39 | rspec-support (~> 3.12.0) 40 | rspec-mocks (3.12.3) 41 | diff-lcs (>= 1.2.0, < 2.0) 42 | rspec-support (~> 3.12.0) 43 | rspec-support (3.12.0) 44 | tty (0.7.0) 45 | equatable (~> 0.5.0) 46 | pastel (~> 0.7.0) 47 | tty-color (~> 0.4.0) 48 | tty-command (~> 0.4.0) 49 | tty-cursor (~> 0.4.0) 50 | tty-editor (~> 0.2.0) 51 | tty-file (~> 0.3.0) 52 | tty-pager (~> 0.7.0) 53 | tty-platform (~> 0.1.0) 54 | tty-progressbar (~> 0.10.0) 55 | tty-prompt (~> 0.12.0) 56 | tty-screen (~> 0.5.0) 57 | tty-spinner (~> 0.4.0) 58 | tty-table (~> 0.8.0) 59 | tty-which (~> 0.3.0) 60 | tty-color (0.4.3) 61 | tty-command (0.4.0) 62 | pastel (~> 0.7.0) 63 | tty-cursor (0.4.0) 64 | tty-editor (0.2.0) 65 | tty-prompt (~> 0.12.0) 66 | tty-which (~> 0.3.0) 67 | tty-file (0.3.0) 68 | diff-lcs (~> 1.3.0) 69 | pastel (~> 0.7.0) 70 | tty-prompt (~> 0.12.0) 71 | tty-pager (0.7.1) 72 | tty-screen (~> 0.5.0) 73 | tty-which (~> 0.3.0) 74 | verse (~> 0.5.0) 75 | tty-platform (0.1.0) 76 | tty-progressbar (0.10.1) 77 | tty-screen (~> 0.5.0) 78 | tty-prompt (0.12.0) 79 | necromancer (~> 0.4.0) 80 | pastel (~> 0.7.0) 81 | tty-cursor (~> 0.4.0) 82 | wisper (~> 1.6.1) 83 | tty-screen (0.5.1) 84 | tty-spinner (0.4.1) 85 | tty-table (0.8.0) 86 | equatable (~> 0.5.0) 87 | necromancer (~> 0.4.0) 88 | pastel (~> 0.7.0) 89 | tty-screen (~> 0.5.0) 90 | unicode-display_width (~> 1.1.0) 91 | verse (~> 0.5.0) 92 | tty-which (0.3.0) 93 | tzinfo (2.0.6) 94 | concurrent-ruby (~> 1.0) 95 | unicode-display_width (1.1.3) 96 | unicode_utils (1.4.0) 97 | verse (0.5.0) 98 | unicode-display_width (~> 1.1.0) 99 | unicode_utils (~> 1.4.0) 100 | wisper (1.6.1) 101 | 102 | PLATFORMS 103 | ruby 104 | 105 | DEPENDENCIES 106 | coderay (~> 1.1.3) 107 | graphql-client 108 | parser (~> 3.2.0.0) 109 | pry 110 | rspec (~> 3.12.0) 111 | tty (~> 0.7.0) 112 | 113 | BUNDLED WITH 114 | 2.1.2 115 | -------------------------------------------------------------------------------- /spec/spec_helper.rb: -------------------------------------------------------------------------------- 1 | # This file was generated by the `rspec --init` command. Conventionally, all 2 | # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. 3 | # The generated `.rspec` file contains `--require spec_helper` which will cause 4 | # this file to always be loaded, without a need to explicitly require it in any 5 | # files. 6 | # 7 | # Given that it is always loaded, you are encouraged to keep this file as 8 | # light-weight as possible. Requiring heavyweight dependencies from this file 9 | # will add to the boot time of your test suite on EVERY test run, even for an 10 | # individual file that may not need all of that loaded. Instead, consider making 11 | # a separate helper file that requires the additional dependencies and performs 12 | # the additional setup, and require it from the spec files that actually need 13 | # it. 14 | # 15 | # The `.rspec` file also contains a few flags that are not defaults but that 16 | # users commonly want. 17 | # 18 | # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration 19 | RSpec.configure do |config| 20 | # rspec-expectations config goes here. You can use an alternate 21 | # assertion/expectation library such as wrong or the stdlib/minitest 22 | # assertions if you prefer. 23 | config.expect_with :rspec do |expectations| 24 | # This option will default to `true` in RSpec 4. It makes the `description` 25 | # and `failure_message` of custom matchers include text for helper methods 26 | # defined using `chain`, e.g.: 27 | # be_bigger_than(2).and_smaller_than(4).description 28 | # # => "be bigger than 2 and smaller than 4" 29 | # ...rather than: 30 | # # => "be bigger than 2" 31 | expectations.include_chain_clauses_in_custom_matcher_descriptions = true 32 | end 33 | 34 | # rspec-mocks config goes here. You can use an alternate test double 35 | # library (such as bogus or mocha) by changing the `mock_with` option here. 36 | config.mock_with :rspec do |mocks| 37 | # Prevents you from mocking or stubbing a method that does not exist on 38 | # a real object. This is generally recommended, and will default to 39 | # `true` in RSpec 4. 40 | mocks.verify_partial_doubles = true 41 | end 42 | 43 | # The settings below are suggested to provide a good initial experience 44 | # with RSpec, but feel free to customize to your heart's content. 45 | =begin 46 | # These two settings work together to allow you to limit a spec run 47 | # to individual examples or groups you care about by tagging them with 48 | # `:focus` metadata. When nothing is tagged with `:focus`, all examples 49 | # get run. 50 | config.filter_run :focus 51 | config.run_all_when_everything_filtered = true 52 | 53 | # Allows RSpec to persist some state between runs in order to support 54 | # the `--only-failures` and `--next-failure` CLI options. We recommend 55 | # you configure your source control system to ignore this file. 56 | config.example_status_persistence_file_path = "spec/examples.txt" 57 | 58 | # Limits the available syntax to the non-monkey patched syntax that is 59 | # recommended. For more details, see: 60 | # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax 61 | # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ 62 | # - http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#new__config_option_to_disable_rspeccore_monkey_patching 63 | config.disable_monkey_patching! 64 | 65 | # This setting enables warnings. It's recommended, but in some cases may 66 | # be too noisy due to issues in dependencies. 67 | config.warnings = true 68 | 69 | # Many RSpec users commonly either run the entire suite or an individual 70 | # file, and it's useful to allow more verbose output when running an 71 | # individual spec file. 72 | if config.files_to_run.one? 73 | # Use the documentation formatter for detailed output, 74 | # unless a formatter has already been configured 75 | # (e.g. via a command-line flag). 76 | config.default_formatter = 'doc' 77 | end 78 | 79 | # Print the 10 slowest examples and example groups at the 80 | # end of the spec run, to help surface which specs are running 81 | # particularly slow. 82 | config.profile_examples = 10 83 | 84 | # Run specs in random order to surface order dependencies. If you find an 85 | # order dependency and want to debug it, you can fix the order by providing 86 | # the seed, which is printed after each run. 87 | # --seed 1234 88 | config.order = :random 89 | 90 | # Seed global randomization in this process using the `--seed` CLI option. 91 | # Setting this allows you to use `--seed` to deterministically reproduce 92 | # test failures related to randomization by passing the same `--seed` value 93 | # as the one that triggered the failure. 94 | Kernel.srand config.seed 95 | =end 96 | end 97 | -------------------------------------------------------------------------------- /bin/get_project_data: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | require 'pathname' 3 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', 4 | Pathname.new(__FILE__).realpath) 5 | 6 | require 'rubygems' 7 | require 'bundler/setup' 8 | 9 | 10 | 11 | # https://developer.github.com/early-access/graphql/explorer/ 12 | # https://stackoverflow.com/questions/39666940/how-to-batch-github-graphql-api-queries 13 | 14 | require 'graphql/client' 15 | require 'graphql/client/http' 16 | 17 | module Kernel 18 | # File activesupport/lib/active_support/core_ext/kernel/singleton_class.rb, line 3 19 | def class_eval(*args, &block) 20 | singleton_class.class_eval(*args, &block) 21 | end 22 | end 23 | 24 | class Repo 25 | REPO_PATTERN = %r{url = git@github.com:(?.+)/(?.+)\.git} 26 | 27 | attr_accessor :login, :name 28 | 29 | def initialize(login:, name:) 30 | self.login = login 31 | self.name = name 32 | end 33 | 34 | def self.all 35 | @repos ||= File.read('.gitmodules').scan(REPO_PATTERN).map do |login, name| 36 | new(login: login, name: name) 37 | end 38 | end 39 | 40 | def to_s 41 | "Repo: #{url}" 42 | end 43 | 44 | def url 45 | "https://github.com/#{login}/#{name}" 46 | end 47 | end 48 | 49 | class Project 50 | attr_accessor :homepage_url, :description, :description_html, :repo 51 | end 52 | 53 | module GitHub 54 | 55 | HTTP = GraphQL::Client::HTTP.new("https://api.github.com/graphql") do 56 | def headers(context) 57 | unless token = context[:access_token] || ENV['GITHUB_ACCESS_TOKEN'] 58 | # $ GITHUB_ACCESS_TOKEN=abc123 59 | # https://help.github.com/articles/creating-an-access-token-for-command-line-use 60 | # Get temporary access token from ~/.config/hub 61 | fail 'Missing GitHub access token. Get temporary access token from ~/.config/hub' 62 | end 63 | 64 | { 65 | 'Authorization' => "Bearer #{token}" 66 | } 67 | end 68 | end 69 | 70 | fetch_latest_schema = ENV['FETCH_LATEST_SCHEMA'] == 'true' 71 | 72 | if fetch_latest_schema 73 | Schema = GraphQL::Client.load_schema(HTTP) 74 | GraphQL::Client.dump_schema(HTTP, "lib/github/graphql/schema.json") 75 | else 76 | Schema = GraphQL::Client.load_schema("lib/github/graphql/schema.json") 77 | end 78 | 79 | Client = GraphQL::Client.new(schema: Schema, execute: HTTP) 80 | Client.allow_dynamic_queries = true 81 | 82 | MAX_ALLOWED_BATCH_SIZE_FOR_QUERY_COMPLEXITY = 29 83 | 84 | def self.fetch_all 85 | variables = {} 86 | client_context = { access_token: ENV['GITHUB_ACCESS_TOKEN'] } 87 | 88 | puts "# Real World Rails" 89 | puts "\n" 90 | 91 | missing_repos = [] 92 | 93 | Repo.all.each_slice(MAX_ALLOWED_BATCH_SIZE_FOR_QUERY_COMPLEXITY) do |repos| 94 | query_body = repos.each_with_index.inject('') do |q, (repo, i)| 95 | query_id = "query#{i}" 96 | q << <<-QUERY_BODY 97 | #{query_id}: repositoryOwner(login: "#{repo.login}") { 98 | repository(name: "#{repo.name}") { 99 | ...RepoFragment 100 | } 101 | } 102 | QUERY_BODY 103 | end 104 | 105 | query = GitHub::Client.parse <<-QUERY 106 | query { 107 | #{query_body} 108 | } 109 | 110 | fragment RepoFragment on Repository { 111 | name 112 | description 113 | homepageUrl 114 | } 115 | QUERY 116 | 117 | response = GitHub::Client.query(query, variables: variables, context: client_context) 118 | 119 | if response.errors.any? 120 | error_msg = response.errors.messages.values.join("/n") 121 | raise error_msg 122 | end 123 | 124 | response.data.to_h.each_with_index do |(query_id, result), i| 125 | repo = repos[i] 126 | if result.nil? || result['repository'].nil? 127 | missing_repos << repo 128 | else 129 | attributes = result['repository'] 130 | name, description, homepage_url = attributes.values_at('name', 'description' ,'homepageUrl') 131 | 132 | puts "\n### #{name}" 133 | 134 | has_description = description && description.length > 0 135 | has_homepage_url = homepage_url && homepage_url.length > 0 136 | 137 | description_and_link = '' 138 | if has_description 139 | description_and_link << description 140 | end 141 | 142 | if has_homepage_url 143 | description_and_link << ' ' if has_description 144 | description_and_link << "[#{homepage_url}](#{homepage_url})" 145 | end 146 | 147 | puts "#{description_and_link} " if description_and_link.length > 0 148 | puts "[#{repo.url}](#{repo.url})" 149 | end 150 | end 151 | end 152 | 153 | puts "\n\n## Moved/Missing/Deleted Repos" 154 | puts "TODO: check the repos below - moved, renamed or deleted?" 155 | puts 156 | missing_repos.each { |repo| puts "- #{repo.url}" } 157 | end 158 | 159 | end 160 | 161 | GitHub.fetch_all 162 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Real World Rails 2 | 3 | > Real World Rails applications and their open source codebases for developers to learn from 4 | 5 | This project brings 100+ (and growing) active, open source Rails apps and engines together in one repository, making it easier for developers to download the collected codebases and learn from Rails apps written by experienced developers. Reading open source code can be an invaluable learning aid. You’ll find the source code in the [`apps/`](apps/) and [`engines/`](engines/) subdirectories. 6 | 7 | Real World Rails was begun to help teach newer developers and to research and write about Rails development practices: 8 | 9 | - Find example usage of a method you’re unsure of 10 | - Learn how other developers use a gem you’d like to use 11 | - Discover how to write tests 12 | - See how Rails engines are built 13 | - …and much, much more. 14 | 15 | If you've got an idea for something that'd be interesting or fun to find out about these Real World Rails apps, [contribute your idea on the issue tracker](https://github.com/eliotsykes/real-world-rails/issues) — [_Eliot Sykes_](https://eliotsykes.com) 16 | 17 | ## How to install on your computer 18 | 19 | ```bash 20 | # Clone this git repo: 21 | git clone git@github.com:eliotsykes/real-world-rails.git 22 | 23 | cd real-world-rails/ 24 | 25 | # The Rails apps are linked to as git submodules. 26 | # This will take some time...(see comment below for possible speedup) 27 | git submodule update --init 28 | 29 | # OR If you've got git 2.9+ installed try to run updates in parallel: 30 | # git submodule update --init --jobs 4 31 | 32 | # The ruby-china project has a bad object. To work around it, disable git's fsck of fetched object temporarily: 33 | git config --global fetch.fsckobjects false 34 | 35 | # To run the `bin/rwr` inspectors, install gems: 36 | bundle install 37 | 38 | echo "All done! Why not run some inspections? Run bin/rwr" 39 | ``` 40 | 41 | ## Other Real World Codebase Collections 42 | 43 | - Real World Sinatra https://github.com/jeromedalbert/real-world-sinatra 44 | - Real World Ember https://github.com/eliotsykes/real-world-ember 45 | - Real World Ruby Apps https://github.com/jeromedalbert/real-world-ruby-apps 46 | - Real World React https://github.com/jeromedalbert/real-world-react 47 | - Know any others? Please open a PR and add the link here 48 | 49 | ## How you can analyze Real World Rails apps 50 | 51 | #### Find job subclasses 52 | 53 | This will find most, but not all job subclasses (requires [ag](https://github.com/ggreer/the_silver_searcher#installing)): 54 | 55 | ```bash 56 | # Outputs jobs source in terminal 57 | ag --ruby '< [A-Za-z]+Job\b' 58 | 59 | # Open each job in your editor (e.g. atom) 60 | ag --ruby -l '< [A-Za-z]+Job\b' | xargs atom 61 | ``` 62 | 63 | (used to research [Real World Rails Background Jobs](https://www.eliotsykes.com/real-world-rails-background-jobs)) 64 | 65 | #### List models from *every* Real World Rails application 66 | 67 | Interested in seeing how your fellow developers name their models? Run: 68 | 69 | ```bash 70 | bin/rwr models | sort -f | uniq -c | sort -k 1nr -k 2f 71 | ``` 72 | 73 | #### Show constants of every Real World Rails app 74 | 75 | ```bash 76 | bin/rwr constants 77 | ``` 78 | (this helped when researching [Magic Numbers in Ruby & How You Make Them Disappear](https://eliotsykes.com/magic-numbers)) 79 | 80 | #### Show view specs 81 | 82 | See the file path and source of every view spec in every app: 83 | ```bash 84 | bin/rwr view-specs 85 | ``` 86 | (this will show 250+ view specs, see them in [The Big List of View Specs](https://eliotsykes.com/view-specs)) 87 | 88 | #### Show model methods 89 | 90 | See just the model method names and file paths: 91 | ```bash 92 | bin/rwr model-method-names 93 | ``` 94 | 95 | See the model method source and file paths: 96 | ```bash 97 | bin/rwr model-methods 98 | ``` 99 | 100 | #### Find projects using gem 101 | 102 | ```bash 103 | find apps/ -name Gemfile.lock | xargs grep GEM_NAME_GOES_HERE 104 | 105 | # e.g. Find all projects using doorkeeper gem 106 | find apps/ -name Gemfile.lock | xargs grep doorkeeper 107 | ``` 108 | 109 | #### Analyze view naming practices 110 | 111 | ```bash 112 | bin/rwr shared-view-dirs 113 | bin/rwr view-naming 114 | ``` 115 | 116 | #### Find ideas on how to configure your foreman processes 117 | 118 | ```bash 119 | # Outputs contents from all Procfiles 120 | find apps/ -name 'Procfile*' | xargs cat 121 | ``` 122 | 123 | 124 | ## Settings 125 | 126 | #### Analyzing directories outside of `apps/` 127 | 128 | Prefix the `bin/rwr` command with the `FILES_PATTERN` environment variable: 129 | 130 | ```bash 131 | FILES_PATTERN=~/dev/my-rails-app/**/*.rb bin/rwr 132 | ``` 133 | 134 | #### Change source output format to markdown 135 | 136 | Prefix `bin/rwr` with the `SOURCE_OUTPUT_FORMAT` environment variable: 137 | ```bash 138 | SOURCE_OUTPUT_FORMAT=markdown bin/rwr view-specs 139 | ``` 140 | 141 | ## Information for Contributors 142 | 143 | #### How to add a Real World Rails app 144 | 145 | Given a GitHub repo for a Rails app `githubuser/foo`: 146 | 147 | ```bash 148 | # Inside real-world-rails root: 149 | git submodule add -b master git@github.com:githubuser/foo.git apps/foo 150 | ``` 151 | 152 | Regenerate [`repos.md`](repos.md): 153 | 154 | ```bash 155 | # Requires valid GITHUB_ACCESS_TOKEN 156 | bin/get_project_data > repos.md 157 | 158 | # OR, if GitHub GraphQL API v4 schema has changed, update cached copy of schema: 159 | FETCH_LATEST_SCHEMA=true bin/get_project_data > repos.md 160 | ``` 161 | 162 | #### Updating the Rails apps submodules to latest 163 | 164 | The Rails apps in `apps/` are git submodules. Git submodules are locked to a revision and don't stay in sync with the latest revision. 165 | 166 | To update the revisions, run: 167 | 168 | ```bash 169 | # This will take some time: 170 | git submodule foreach git pull 171 | ``` 172 | 173 | #### How to remove a git submodule 174 | 175 | Only use this if a previously public repo has been removed: 176 | 177 | ```bash 178 | # Remove the submodule from .git/config 179 | git submodule deinit -f path/to/submodule 180 | 181 | # Remove the submodule from .git/modules 182 | rm -rf .git/modules/path/to/submodule 183 | 184 | # Remove from .gitmodules and remove the submodule directory 185 | git rm -f path/to/submodule 186 | ``` 187 | 188 | #### Writing an Inspector? Some docs to help understand AST, Parser… 189 | 190 | The [inspectors](lib/real_world_rails/inspectors) are responsible for the analysis of the Rails apps. 191 | 192 | Review the existing [inspectors](lib/real_world_rails/inspectors) if you're looking for some info on how to write a new one, and see these API docs: 193 | 194 | - http://whitequark.github.io/ast/AST/Node.html 195 | - http://www.rubydoc.info/github/whitequark/parser/master/Parser/AST/Processor 196 | - http://whitequark.github.io/ast/AST/Processor.html 197 | 198 | --- 199 | 200 | # Contributors 201 | 202 | - Eliot Sykes https://eliotsykes.com/ 203 | - Contributions are welcome, fork the GitHub repo, make your changes, then submit your pull request! Reach out if you'd like some help. 204 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "apps/24pullrequests"] 2 | path = apps/24pullrequests 3 | url = git@github.com:24pullrequests/24pullrequests.git 4 | branch = main 5 | [submodule "apps/accelerated_claims"] 6 | path = apps/accelerated_claims 7 | url = git@github.com:ministryofjustice/accelerated_claims.git 8 | branch = master 9 | [submodule "apps/adopt-a-hydrant"] 10 | path = apps/adopt-a-hydrant 11 | url = git@github.com:codeforamerica/adopt-a-hydrant.git 12 | branch = master 13 | [submodule "apps/alaveteli"] 14 | path = apps/alaveteli 15 | url = git@github.com:mysociety/alaveteli.git 16 | branch = master 17 | [submodule "apps/alchemy_cms"] 18 | path = apps/alchemy_cms 19 | url = git@github.com:AlchemyCMS/alchemy_cms.git 20 | branch = main 21 | [submodule "apps/alonetone"] 22 | path = apps/alonetone 23 | url = git@github.com:sudara/alonetone.git 24 | branch = main 25 | ignore = dirty 26 | [submodule "apps/amahi-platform"] 27 | path = apps/amahi-platform 28 | url = git@github.com:amahi/platform.git 29 | branch = master 30 | [submodule "apps/askthem"] 31 | path = apps/askthem 32 | url = git@github.com:opengovernment/askthem.git 33 | branch = master 34 | [submodule "apps/atet"] 35 | path = apps/atet 36 | url = git@github.com:ministryofjustice/atet.git 37 | branch = master 38 | [submodule "apps/bender"] 39 | path = apps/bender 40 | url = git@github.com:collectiveidea/bender.git 41 | branch = master 42 | [submodule "apps/bike_index"] 43 | path = apps/bike_index 44 | url = git@github.com:bikeindex/bike_index.git 45 | branch = master 46 | [submodule "apps/blacklight"] 47 | path = apps/blacklight 48 | url = https://github.com/projectblacklight/blacklight 49 | branch = master 50 | [submodule "apps/bridge_troll"] 51 | path = apps/bridge_troll 52 | url = git@github.com:railsbridge/bridge_troll.git 53 | branch = master 54 | [submodule "apps/brimir"] 55 | path = apps/brimir 56 | url = git@github.com:ivaldi/brimir.git 57 | branch = master 58 | [submodule "apps/c2"] 59 | path = apps/c2 60 | url = git@github.com:18F/C2.git 61 | branch = master 62 | [submodule "apps/calagator"] 63 | path = apps/calagator 64 | url = git@github.com:calagator/calagator.git 65 | branch = main 66 | [submodule "apps/camaleon-cms"] 67 | path = apps/camaleon-cms 68 | url = git@github.com:owen2345/camaleon-cms.git 69 | branch = master 70 | [submodule "apps/canvas-lms"] 71 | path = apps/canvas-lms 72 | url = git@github.com:instructure/canvas-lms.git 73 | branch = master 74 | [submodule "apps/cartodb"] 75 | path = apps/cartodb 76 | url = git@github.com:CartoDB/cartodb.git 77 | branch = master 78 | [submodule "apps/case_file_editor"] 79 | path = apps/case_file_editor 80 | url = git@github.com:ministryofjustice/case_file_editor.git 81 | branch = master 82 | [submodule "apps/catarse"] 83 | path = apps/catarse 84 | url = git@github.com:catarse/catarse.git 85 | branch = master 86 | [submodule "apps/cfp-app"] 87 | path = apps/cfp-app 88 | url = git@github.com:rubycentral/cfp-app.git 89 | branch = main 90 | [submodule "apps/champaign"] 91 | path = apps/champaign 92 | url = git@github.com:SumOfUs/Champaign.git 93 | branch = master 94 | [submodule "apps/chatwoot"] 95 | path = apps/chatwoot 96 | url = https://github.com/chatwoot/chatwoot 97 | branch = master 98 | [submodule "apps/ciao"] 99 | path = apps/ciao 100 | url = https://github.com/brotandgames/ciao 101 | branch = master 102 | [submodule "apps/claim-for-crown-court-defence"] 103 | path = apps/claim-for-crown-court-defence 104 | url = git@github.com:ministryofjustice/Claim-for-Crown-Court-Defence.git 105 | branch = master 106 | [submodule "apps/classroom"] 107 | path = apps/classroom 108 | url = git@github.com:education/classroom.git 109 | branch = master 110 | [submodule "apps/cloudnet"] 111 | path = apps/cloudnet 112 | url = git@github.com:OnApp/cloudnet.git 113 | branch = master 114 | [submodule "apps/cm42-central"] 115 | path = apps/cm42-central 116 | url = git@github.com:Codeminer42/cm42-central.git 117 | branch = master 118 | [submodule "apps/code_fund_ads"] 119 | path = apps/code_fund_ads 120 | url = git@github.com:gitcoinco/code_fund_ads.git 121 | branch = master 122 | [submodule "apps/codemontage"] 123 | path = apps/codemontage 124 | url = git@github.com:CodeMontageHQ/codemontage.git 125 | branch = master 126 | [submodule "apps/codetriage"] 127 | path = apps/codetriage 128 | url = git@github.com:codetriage/codetriage.git 129 | branch = master 130 | [submodule "apps/contrib-hub"] 131 | path = apps/contrib-hub 132 | url = git@github.com:orendon/contrib-hub.git 133 | branch = master 134 | [submodule "apps/contribulator"] 135 | path = apps/contribulator 136 | url = git@github.com:andrew/contribulator.git 137 | branch = master 138 | [submodule "apps/coursemology2"] 139 | path = apps/coursemology2 140 | url = git@github.com:Coursemology/coursemology2.git 141 | branch = master 142 | [submodule "apps/courtfinder"] 143 | path = apps/courtfinder 144 | url = git@github.com:ministryofjustice/courtfinder.git 145 | branch = master 146 | [submodule "apps/crimethinc-website"] 147 | path = apps/crimethinc-website 148 | url = git@github.com:crimethinc/website.git 149 | branch = main 150 | [submodule "apps/csvlint"] 151 | path = apps/csvlint 152 | url = git@github.com:theodi/csvlint.git 153 | branch = master 154 | [submodule "apps/cuttlefish"] 155 | path = apps/cuttlefish 156 | url = git@github.com:mlandauer/cuttlefish.git 157 | branch = master 158 | [submodule "apps/dashing-rails"] 159 | path = apps/dashing-rails 160 | url = git@github.com:gottfrois/dashing-rails.git 161 | branch = master 162 | [submodule "apps/defence-request-service"] 163 | path = apps/defence-request-service 164 | url = git@github.com:ministryofjustice/defence-request-service.git 165 | branch = master 166 | [submodule "apps/defence-request-service-rota"] 167 | path = apps/defence-request-service-rota 168 | url = git@github.com:ministryofjustice/defence-request-service-rota.git 169 | branch = master 170 | [submodule "apps/dev.to"] 171 | path = apps/dev.to 172 | url = git@github.com:thepracticaldev/dev.to.git 173 | branch = main 174 | [submodule "apps/devise_authentication_api"] 175 | path = apps/devise_authentication_api 176 | url = git@github.com:ministryofjustice/devise_authentication_api.git 177 | branch = master 178 | [submodule "apps/diaspora"] 179 | path = apps/diaspora 180 | url = git@github.com:diaspora/diaspora.git 181 | branch = master 182 | [submodule "apps/discourse"] 183 | path = apps/discourse 184 | url = git@github.com:discourse/discourse.git 185 | branch = main 186 | [submodule "apps/ds-auth"] 187 | path = apps/ds-auth 188 | url = git@github.com:ministryofjustice/ds-auth.git 189 | branch = master 190 | [submodule "apps/e-manifest"] 191 | path = apps/e-manifest 192 | url = git@github.com:18F/e-manifest.git 193 | branch = master 194 | [submodule "apps/e-petitions"] 195 | path = apps/e-petitions 196 | url = git@github.com:alphagov/e-petitions.git 197 | branch = master 198 | [submodule "apps/earthdata-search"] 199 | path = apps/earthdata-search 200 | url = git@github.com:nasa/earthdata-search.git 201 | branch = master 202 | [submodule "apps/eff-action-center-platform"] 203 | path = apps/eff-action-center-platform 204 | url = git@github.com:EFForg/action-center-platform.git 205 | branch = master 206 | [submodule "apps/enki"] 207 | path = apps/enki 208 | url = git@github.com:xaviershay/enki.git 209 | branch = master 210 | [submodule "apps/envizon"] 211 | path = apps/envizon 212 | url = git@github.com:evait-security/envizon.git 213 | branch = master 214 | [submodule "apps/errbit"] 215 | path = apps/errbit 216 | url = git@github.com:errbit/errbit.git 217 | branch = main 218 | [submodule "apps/eventkit-rails"] 219 | path = apps/eventkit-rails 220 | url = git@github.com:sendgrid/eventkit-rails.git 221 | branch = master 222 | [submodule "apps/fab-manager"] 223 | path = apps/fab-manager 224 | url = https://github.com/sleede/fab-manager 225 | branch = master 226 | [submodule "apps/fat_free_crm"] 227 | path = apps/fat_free_crm 228 | url = git@github.com:fatfreecrm/fat_free_crm.git 229 | branch = master 230 | [submodule "apps/feedbin"] 231 | path = apps/feedbin 232 | url = git@github.com:feedbin/feedbin.git 233 | branch = master 234 | [submodule "apps/feedbunch"] 235 | path = apps/feedbunch 236 | url = git@github.com:amatriain/feedbunch.git 237 | branch = master 238 | [submodule "apps/followr"] 239 | path = apps/followr 240 | url = git@github.com:kevinchandler/followr.git 241 | branch = master 242 | [submodule "apps/foodsoft"] 243 | path = apps/foodsoft 244 | url = git@github.com:foodcoops/foodsoft.git 245 | branch = master 246 | [submodule "apps/foreman"] 247 | path = apps/foreman 248 | url = git@github.com:theforeman/foreman.git 249 | branch = develop 250 | [submodule "apps/fr-staffapp"] 251 | path = apps/fr-staffapp 252 | url = git@github.com:ministryofjustice/fr-staffapp.git 253 | branch = master 254 | [submodule "apps/freshfoodconnect"] 255 | path = apps/freshfoodconnect 256 | url = git@github.com:thoughtbot/freshfoodconnect.git 257 | branch = master 258 | [submodule "apps/frontend"] 259 | path = apps/frontend 260 | url = git@github.com:alphagov/frontend.git 261 | branch = main 262 | [submodule "apps/fulcrum"] 263 | path = apps/fulcrum 264 | url = git@github.com:fulcrum-agile/fulcrum.git 265 | branch = master 266 | [submodule "apps/girldevelopit"] 267 | path = apps/girldevelopit 268 | url = git@github.com:girldevelopit/gdi-new-site.git 269 | branch = production 270 | [submodule "apps/git-scm"] 271 | path = apps/git-scm 272 | url = git@github.com:git/git-scm.com.git 273 | branch = main 274 | [submodule "apps/github-awards"] 275 | path = apps/github-awards 276 | url = git@github.com:vdaubry/github-awards.git 277 | branch = master 278 | [submodule "apps/gitlab-ci"] 279 | path = apps/gitlab-ci 280 | url = git@github.com:gitlabhq/gitlab-ci.git 281 | branch = master 282 | [submodule "apps/gitlabhq"] 283 | path = apps/gitlabhq 284 | url = git@github.com:gitlabhq/gitlabhq.git 285 | branch = master 286 | [submodule "apps/growstuff"] 287 | path = apps/growstuff 288 | url = git@github.com:Growstuff/growstuff.git 289 | branch = dev 290 | [submodule "apps/heaven"] 291 | path = apps/heaven 292 | url = git@github.com:atmos/heaven.git 293 | branch = master 294 | [submodule "apps/helpy"] 295 | path = apps/helpy 296 | url = git@github.com:helpyio/helpy.git 297 | branch = master 298 | [submodule "apps/houdini"] 299 | path = apps/houdini 300 | url = https://github.com/houdiniproject/houdini 301 | branch = main 302 | [submodule "apps/hound"] 303 | path = apps/hound 304 | url = git@github.com:thoughtbot/hound.git 305 | branch = master 306 | [submodule "apps/hourglass"] 307 | path = apps/hourglass 308 | url = git@github.com:collectiveidea/hourglass.git 309 | branch = master 310 | [submodule "apps/hours"] 311 | path = apps/hours 312 | url = git@github.com:DefactoSoftware/Hours.git 313 | branch = master 314 | [submodule "apps/huboard-web"] 315 | path = apps/huboard-web 316 | url = git@github.com:huboard/huboard-web.git 317 | branch = master 318 | [submodule "apps/huginn"] 319 | path = apps/huginn 320 | url = git@github.com:cantino/huginn.git 321 | branch = master 322 | [submodule "apps/hummingbird"] 323 | path = apps/hummingbird 324 | url = git@github.com:hummingbird-me/hummingbird.git 325 | branch = master 326 | [submodule "apps/hyku"] 327 | path = apps/hyku 328 | url = git@github.com:samvera-labs/hyku.git 329 | branch = main 330 | [submodule "apps/identity-idp"] 331 | path = apps/identity-idp 332 | url = git@github.com:18F/identity-idp.git 333 | branch = main 334 | [submodule "apps/ifme"] 335 | path = apps/ifme 336 | url = git@github.com:julianguyen/ifme.git 337 | branch = main 338 | [submodule "apps/imminence"] 339 | path = apps/imminence 340 | url = git@github.com:alphagov/imminence.git 341 | branch = main 342 | [submodule "apps/inch_ci-web"] 343 | path = apps/inch_ci-web 344 | url = git@github.com:inch-ci/inch_ci-web.git 345 | branch = master 346 | [submodule "apps/jobsworth"] 347 | path = apps/jobsworth 348 | url = git@github.com:ari/jobsworth.git 349 | branch = master 350 | [submodule "apps/kandan"] 351 | path = apps/kandan 352 | url = git@github.com:kandanapp/kandan.git 353 | branch = master 354 | [submodule "apps/katello"] 355 | path = apps/katello 356 | url = git@github.com:Katello/katello.git 357 | branch = master 358 | [submodule "apps/kevlar"] 359 | path = apps/kevlar 360 | url = git@github.com:adambutler/kevlar.git 361 | branch = master 362 | [submodule "apps/klaxon"] 363 | path = apps/klaxon 364 | url = git@github.com:themarshallproject/klaxon.git 365 | branch = master 366 | [submodule "apps/lale-help"] 367 | path = apps/lale-help 368 | url = git@github.com:lale-help/lale-help.git 369 | branch = master 370 | [submodule "apps/libraries.io"] 371 | path = apps/libraries.io 372 | url = git@github.com:librariesio/libraries.io.git 373 | branch = main 374 | [submodule "apps/lobsters"] 375 | path = apps/lobsters 376 | url = git@github.com:jcs/lobsters.git 377 | branch = master 378 | [submodule "apps/locomotivecms-engine"] 379 | path = apps/locomotivecms-engine 380 | url = git@github.com:locomotivecms/engine.git 381 | branch = master 382 | [submodule "apps/loomio"] 383 | path = apps/loomio 384 | url = git@github.com:loomio/loomio.git 385 | branch = master 386 | [submodule "apps/manageiq"] 387 | path = apps/manageiq 388 | url = git@github.com:ManageIQ/manageiq.git 389 | branch = master 390 | [submodule "apps/markus"] 391 | path = apps/markus 392 | url = git@github.com:MarkUsProject/Markus.git 393 | branch = master 394 | [submodule "apps/mastodon"] 395 | path = apps/mastodon 396 | url = https://github.com/mastodon/mastodon 397 | branch = main 398 | [submodule "apps/metrics"] 399 | path = apps/metrics 400 | url = git@github.com:collectiveidea/metrics.git 401 | branch = master 402 | [submodule "apps/mission-of-mercy"] 403 | path = apps/mission-of-mercy 404 | url = git@github.com:mission-of-mercy/mission-of-mercy.git 405 | branch = master 406 | [submodule "apps/morph"] 407 | path = apps/morph 408 | url = git@github.com:openaustralia/morph.git 409 | branch = master 410 | [submodule "apps/obtvse2"] 411 | path = apps/obtvse2 412 | url = git@github.com:natew/obtvse2.git 413 | branch = master 414 | [submodule "apps/octobox"] 415 | path = apps/octobox 416 | url = git@github.com:octobox/octobox.git 417 | branch = master 418 | [submodule "apps/ohana-api"] 419 | path = apps/ohana-api 420 | url = git@github.com:codeforamerica/ohana-api.git 421 | branch = master 422 | [submodule "apps/on_ruby"] 423 | path = apps/on_ruby 424 | url = git@github.com:phoet/on_ruby.git 425 | branch = master 426 | [submodule "apps/onebody"] 427 | path = apps/onebody 428 | url = git@github.com:churchio/onebody.git 429 | branch = master 430 | [submodule "apps/open-build-service"] 431 | path = apps/open-build-service 432 | url = git@github.com:openSUSE/open-build-service.git 433 | branch = master 434 | [submodule "apps/open-data-certificate"] 435 | path = apps/open-data-certificate 436 | url = git@github.com:theodi/open-data-certificate.git 437 | branch = master 438 | [submodule "apps/open-source-billing"] 439 | path = apps/open-source-billing 440 | url = git@github.com:vteams/open-source-billing.git 441 | branch = master 442 | [submodule "apps/openfoodnetwork"] 443 | path = apps/openfoodnetwork 444 | url = git@github.com:openfoodfoundation/openfoodnetwork.git 445 | branch = master 446 | [submodule "apps/opengovernment"] 447 | path = apps/opengovernment 448 | url = git@github.com:opengovernment/opengovernment.git 449 | branch = master 450 | [submodule "apps/openproject"] 451 | path = apps/openproject 452 | url = git@github.com:opf/openproject.git 453 | branch = dev 454 | [submodule "apps/openstreetmap-website"] 455 | path = apps/openstreetmap-website 456 | url = git@github.com:openstreetmap/openstreetmap-website.git 457 | branch = master 458 | [submodule "apps/orientation"] 459 | path = apps/orientation 460 | url = git@github.com:orientation/orientation.git 461 | branch = master 462 | [submodule "apps/osem"] 463 | path = apps/osem 464 | url = git@github.com:openSUSE/osem.git 465 | branch = master 466 | [submodule "apps/panamax-ui"] 467 | path = apps/panamax-ui 468 | url = git@github.com:CenturyLinkLabs/panamax-ui.git 469 | branch = master 470 | [submodule "apps/panopticon"] 471 | path = apps/panopticon 472 | url = git@github.com:alphagov/panopticon.git 473 | branch = master 474 | [submodule "apps/parliamentary-questions"] 475 | path = apps/parliamentary-questions 476 | url = git@github.com:ministryofjustice/parliamentary-questions.git 477 | branch = main 478 | [submodule "apps/peatio"] 479 | path = apps/peatio 480 | url = git@github.com:peatio/peatio.git 481 | branch = master 482 | [submodule "apps/pester"] 483 | path = apps/pester 484 | url = git@github.com:thoughtbot/pester.git 485 | branch = master 486 | [submodule "apps/phez"] 487 | path = apps/phez 488 | url = git@github.com:phezco/phez.git 489 | branch = master 490 | [submodule "apps/planningalerts"] 491 | path = apps/planningalerts 492 | url = git@github.com:openaustralia/planningalerts.git 493 | branch = master 494 | [submodule "apps/plots2"] 495 | path = apps/plots2 496 | url = https://github.com/publiclab/plots2 497 | branch = main 498 | [submodule "apps/politwoops"] 499 | path = apps/politwoops 500 | url = git@github.com:sunlightlabs/politwoops.git 501 | branch = master 502 | [submodule "apps/postal"] 503 | path = apps/postal 504 | url = git@github.com:atech/postal.git 505 | branch = master 506 | [submodule "apps/prague-server"] 507 | path = apps/prague-server 508 | url = git@github.com:controlshift/prague-server.git 509 | branch = master 510 | [submodule "apps/prison-visits"] 511 | path = apps/prison-visits 512 | url = git@github.com:ministryofjustice/prison-visits.git 513 | branch = master 514 | [submodule "apps/projectmonitor"] 515 | path = apps/projectmonitor 516 | url = git@github.com:pivotal/projectmonitor.git 517 | branch = master 518 | [submodule "apps/publicwhip"] 519 | path = apps/publicwhip 520 | url = git@github.com:openaustralia/publicwhip.git 521 | branch = master 522 | [submodule "apps/publify"] 523 | path = apps/publify 524 | url = git@github.com:publify/publify.git 525 | branch = master 526 | [submodule "apps/publisher"] 527 | path = apps/publisher 528 | url = git@github.com:alphagov/publisher.git 529 | branch = main 530 | [submodule "apps/pupilfirst"] 531 | path = apps/pupilfirst 532 | url = git@github.com:pupilfirst/pupilfirst.git 533 | branch = master 534 | [submodule "apps/radiant"] 535 | path = apps/radiant 536 | url = git@github.com:radiant/radiant.git 537 | branch = master 538 | [submodule "apps/rails-contributors"] 539 | path = apps/rails-contributors 540 | url = git@github.com:fxn/rails-contributors.git 541 | branch = master 542 | [submodule "apps/railsdevs.com"] 543 | path = apps/railsdevs.com 544 | url = https://github.com/joemasilotti/railsdevs.com 545 | branch = main 546 | [submodule "apps/rave-server"] 547 | path = apps/rave-server 548 | url = git@github.com:ministryofjustice/rave-server.git 549 | branch = master 550 | [submodule "apps/redmine"] 551 | path = apps/redmine 552 | url = git@github.com:edavis10/redmine.git 553 | branch = master 554 | [submodule "apps/refinerycms"] 555 | path = apps/refinerycms 556 | url = git@github.com:refinery/refinerycms.git 557 | branch = master 558 | [submodule "apps/remit"] 559 | path = apps/remit 560 | url = git@github.com:mysociety/remit.git 561 | branch = master 562 | [submodule "apps/rescue-rails"] 563 | path = apps/rescue-rails 564 | url = git@github.com:ophrescue/RescueRails.git 565 | branch = master 566 | [submodule "apps/reservations"] 567 | path = apps/reservations 568 | url = git@github.com:YaleSTC/reservations.git 569 | branch = master 570 | [submodule "apps/ror_ecommerce"] 571 | path = apps/ror_ecommerce 572 | url = git@github.com:drhenner/ror_ecommerce.git 573 | branch = master 574 | [submodule "apps/ruby-bench-web"] 575 | path = apps/ruby-bench-web 576 | url = git@github.com:ruby-bench/ruby-bench-web.git 577 | branch = master 578 | [submodule "apps/ruby-china"] 579 | path = apps/ruby-china 580 | url = git@github.com:ruby-china/ruby-china.git 581 | branch = main 582 | [submodule "apps/rubyapi"] 583 | path = apps/rubyapi 584 | url = https://github.com/rubyapi/rubyapi 585 | branch = main 586 | [submodule "apps/rubygems"] 587 | path = apps/rubygems 588 | url = git@github.com:rubygems/rubygems.org.git 589 | branch = master 590 | [submodule "apps/rubyland"] 591 | path = apps/rubyland 592 | url = https://github.com/jrochkind/rubyland 593 | branch = master 594 | [submodule "apps/rubytogether.org"] 595 | path = apps/rubytogether.org 596 | url = git@github.com:rubytogether/rubytogether.org.git 597 | branch = main 598 | [submodule "apps/rubytoolbox"] 599 | path = apps/rubytoolbox 600 | url = git@github.com:rubytoolbox/rubytoolbox.git 601 | branch = main 602 | [submodule "apps/samson"] 603 | path = apps/samson 604 | url = git@github.com:zendesk/samson.git 605 | branch = master 606 | [submodule "apps/scumblr"] 607 | path = apps/scumblr 608 | url = git@github.com:Netflix/Scumblr.git 609 | branch = master 610 | [submodule "apps/sharetribe"] 611 | path = apps/sharetribe 612 | url = git@github.com:sharetribe/sharetribe.git 613 | branch = master 614 | [submodule "apps/shinycms-ruby"] 615 | path = apps/shinycms-ruby 616 | url = git@github.com:denny/ShinyCMS-ruby.git 617 | branch = main 618 | [submodule "apps/showterm.io"] 619 | path = apps/showterm.io 620 | url = git@github.com:ConradIrwin/showterm.io.git 621 | branch = master 622 | [submodule "apps/signonotron2"] 623 | path = apps/signonotron2 624 | url = git@github.com:alphagov/signonotron2.git 625 | branch = main 626 | [submodule "apps/simple-server"] 627 | path = apps/simple-server 628 | url = https://github.com/simpledotorg/simple-server 629 | branch = master 630 | [submodule "apps/snibox"] 631 | path = apps/snibox 632 | url = git@github.com:snibox/snibox.git 633 | branch = master 634 | [submodule "apps/solidus"] 635 | path = apps/solidus 636 | url = git@github.com:solidusio/solidus.git 637 | branch = master 638 | [submodule "apps/speakerinnen_liste"] 639 | path = apps/speakerinnen_liste 640 | url = git@github.com:rubymonsters/speakerinnen_liste.git 641 | branch = master 642 | [submodule "apps/speakerline"] 643 | path = apps/speakerline 644 | url = git@github.com:nodunayo/speakerline.git 645 | branch = master 646 | [submodule "apps/spectre"] 647 | path = apps/spectre 648 | url = git@github.com:wearefriday/spectre.git 649 | branch = master 650 | [submodule "apps/spina"] 651 | path = apps/spina 652 | url = git@github.com:denkGroot/Spina.git 653 | branch = master 654 | [submodule "apps/spree"] 655 | path = apps/spree 656 | url = git@github.com:spree/spree.git 657 | branch = main 658 | [submodule "apps/squash-web"] 659 | path = apps/squash-web 660 | url = git@github.com:SquareSquash/web.git 661 | branch = master 662 | [submodule "apps/storytime"] 663 | path = apps/storytime 664 | url = git@github.com:FlyoverWorks/storytime.git 665 | branch = master 666 | [submodule "apps/test_track"] 667 | path = apps/test_track 668 | url = git@github.com:Betterment/test_track.git 669 | branch = master 670 | [submodule "apps/theodinproject"] 671 | path = apps/theodinproject 672 | url = git@github.com:TheOdinProject/theodinproject.git 673 | branch = main 674 | [submodule "apps/timeoverflow"] 675 | path = apps/timeoverflow 676 | url = git@github.com:coopdevs/timeoverflow.git 677 | branch = develop 678 | [submodule "apps/tomatoes"] 679 | path = apps/tomatoes 680 | url = git@github.com:potomak/tomatoes.git 681 | branch = master 682 | [submodule "apps/tracks"] 683 | path = apps/tracks 684 | url = git@github.com:TracksApp/tracks.git 685 | branch = master 686 | [submodule "apps/trailmix"] 687 | path = apps/trailmix 688 | url = git@github.com:codecation/trailmix.git 689 | branch = master 690 | [submodule "apps/tryshoppe"] 691 | path = apps/tryshoppe 692 | url = https://github.com/jackregnart/core.git 693 | branch = master 694 | [submodule "apps/twist"] 695 | path = apps/twist 696 | url = git@github.com:radar/twist.git 697 | branch = master 698 | [submodule "apps/uberzeit"] 699 | path = apps/uberzeit 700 | url = git@github.com:ninech/uberzeit.git 701 | branch = master 702 | [submodule "apps/uk-postcodes"] 703 | path = apps/uk-postcodes 704 | url = git@github.com:theodi/uk-postcodes.git 705 | branch = master 706 | [submodule "apps/upcase"] 707 | path = apps/upcase 708 | url = git@github.com:thoughtbot/upcase.git 709 | branch = master 710 | [submodule "apps/verboice"] 711 | path = apps/verboice 712 | url = git@github.com:instedd/verboice.git 713 | branch = master 714 | [submodule "apps/vglist"] 715 | path = apps/vglist 716 | url = https://github.com/connorshea/vglist 717 | branch = main 718 | [submodule "apps/whitehall"] 719 | path = apps/whitehall 720 | url = git@github.com:alphagov/whitehall.git 721 | branch = main 722 | [submodule "apps/wiki_edu_dashboard"] 723 | path = apps/wiki_edu_dashboard 724 | url = git@github.com:WikiEducationFoundation/WikiEduDashboard.git 725 | branch = master 726 | [submodule "apps/worldcubeassociation.org"] 727 | path = apps/worldcubeassociation.org 728 | url = git@github.com:thewca/worldcubeassociation.org.git 729 | branch = master 730 | [submodule "apps/xrono"] 731 | path = apps/xrono 732 | url = git@github.com:isotope11/xrono.git 733 | branch = master 734 | [submodule "apps/zammad"] 735 | path = apps/zammad 736 | url = git@github.com:zammad/zammad.git 737 | branch = develop 738 | [submodule "engines/administrate"] 739 | path = engines/administrate 740 | url = git@github.com:thoughtbot/administrate.git 741 | branch = main 742 | [submodule "engines/ahoy"] 743 | path = engines/ahoy 744 | url = git@github.com:ankane/ahoy.git 745 | branch = master 746 | [submodule "engines/ahoy_email"] 747 | path = engines/ahoy_email 748 | url = git@github.com:ankane/ahoy_email.git 749 | branch = master 750 | [submodule "engines/attachinary"] 751 | path = engines/attachinary 752 | url = git@github.com:assembler/attachinary.git 753 | branch = master 754 | [submodule "engines/blazer"] 755 | path = engines/blazer 756 | url = git@github.com:ankane/blazer.git 757 | branch = master 758 | [submodule "engines/browse-everything"] 759 | path = engines/browse-everything 760 | url = git@github.com:projecthydra/browse-everything.git 761 | branch = main 762 | [submodule "engines/cangaroo"] 763 | path = engines/cangaroo 764 | url = git@github.com:nebulab/cangaroo.git 765 | branch = master 766 | [submodule "engines/chartkick"] 767 | path = engines/chartkick 768 | url = git@github.com:ankane/chartkick.git 769 | branch = master 770 | [submodule "engines/communityengine"] 771 | path = engines/communityengine 772 | url = git@github.com:bborn/communityengine.git 773 | branch = master 774 | [submodule "engines/dbhero"] 775 | path = engines/dbhero 776 | url = git@github.com:catarse/dbhero.git 777 | branch = master 778 | [submodule "engines/easymon"] 779 | path = engines/easymon 780 | url = git@github.com:basecamp/easymon.git 781 | branch = master 782 | [submodule "engines/exception_notification"] 783 | path = engines/exception_notification 784 | url = git@github.com:smartinez87/exception_notification.git 785 | branch = master 786 | [submodule "engines/field_test"] 787 | path = engines/field_test 788 | url = git@github.com:ankane/field_test.git 789 | branch = master 790 | [submodule "engines/flip"] 791 | path = engines/flip 792 | url = git@github.com:pda/flip.git 793 | branch = master 794 | [submodule "engines/french_toast"] 795 | path = engines/french_toast 796 | url = git@github.com:thoughtbot/french_toast.git 797 | branch = master 798 | [submodule "engines/griddler"] 799 | path = engines/griddler 800 | url = git@github.com:thoughtbot/griddler.git 801 | branch = master 802 | [submodule "engines/health-monitor-rails"] 803 | path = engines/health-monitor-rails 804 | url = git@github.com:lbeder/health-monitor-rails.git 805 | branch = master 806 | [submodule "engines/heya"] 807 | path = engines/heya 808 | url = git@github.com:honeybadger-io/heya.git 809 | branch = master 810 | [submodule "engines/high_voltage"] 811 | path = engines/high_voltage 812 | url = git@github.com:thoughtbot/high_voltage.git 813 | branch = master 814 | [submodule "engines/hyrax"] 815 | path = engines/hyrax 816 | url = git@github.com:samvera/hyrax.git 817 | branch = main 818 | [submodule "engines/lentil"] 819 | path = engines/lentil 820 | url = git@github.com:NCSU-Libraries/lentil.git 821 | branch = master 822 | [submodule "engines/letter_opener_web"] 823 | path = engines/letter_opener_web 824 | url = git@github.com:fgrehm/letter_opener_web.git 825 | branch = master 826 | [submodule "engines/local_time"] 827 | path = engines/local_time 828 | url = git@github.com:basecamp/local_time.git 829 | branch = main 830 | [submodule "engines/mailkick"] 831 | path = engines/mailkick 832 | url = git@github.com:ankane/mailkick.git 833 | branch = master 834 | [submodule "engines/merit"] 835 | path = engines/merit 836 | url = https://github.com/merit-gem/merit 837 | branch = master 838 | [submodule "engines/motorhead"] 839 | path = engines/motorhead 840 | url = git@github.com:amatsuda/motorhead.git 841 | branch = master 842 | [submodule "engines/notable"] 843 | path = engines/notable 844 | url = git@github.com:ankane/notable.git 845 | branch = master 846 | [submodule "engines/noticed"] 847 | path = engines/noticed 848 | url = https://github.com/excid3/noticed 849 | branch = master 850 | [submodule "engines/pageflow"] 851 | path = engines/pageflow 852 | url = git@github.com:codevise/pageflow.git 853 | branch = master 854 | [submodule "engines/payola"] 855 | path = engines/payola 856 | url = git@github.com:peterkeen/payola.git 857 | branch = master 858 | [submodule "engines/pghero"] 859 | path = engines/pghero 860 | url = git@github.com:ankane/pghero.git 861 | branch = master 862 | [submodule "engines/plutus"] 863 | path = engines/plutus 864 | url = git@github.com:mbulat/plutus.git 865 | branch = master 866 | [submodule "engines/postgresql_lo_streamer"] 867 | path = engines/postgresql_lo_streamer 868 | url = git@github.com:diogob/postgresql_lo_streamer.git 869 | branch = master 870 | [submodule "engines/quick_search"] 871 | path = engines/quick_search 872 | url = git@github.com:NCSU-Libraries/quick_search.git 873 | branch = master 874 | [submodule "engines/rapidfire"] 875 | path = engines/rapidfire 876 | url = git@github.com:code-mancers/rapidfire.git 877 | branch = master 878 | [submodule "engines/rapporteur"] 879 | path = engines/rapporteur 880 | url = git@github.com:envylabs/rapporteur.git 881 | branch = master 882 | [submodule "engines/rucaptcha"] 883 | path = engines/rucaptcha 884 | url = git@github.com:huacnlee/rucaptcha.git 885 | branch = main 886 | [submodule "engines/sail"] 887 | path = engines/sail 888 | url = git@github.com:vinistock/sail.git 889 | branch = master 890 | [submodule "engines/searchjoy"] 891 | path = engines/searchjoy 892 | url = git@github.com:ankane/searchjoy.git 893 | branch = master 894 | [submodule "engines/shipit-engine"] 895 | path = engines/shipit-engine 896 | url = git@github.com:Shopify/shipit-engine.git 897 | branch = master 898 | [submodule "engines/shopify_app"] 899 | path = engines/shopify_app 900 | url = git@github.com:Shopify/shopify_app.git 901 | branch = main 902 | [submodule "engines/simple_discussion"] 903 | path = engines/simple_discussion 904 | url = https://github.com/excid3/simple_discussion 905 | branch = master 906 | [submodule "engines/stripe_event"] 907 | path = engines/stripe_event 908 | url = git@github.com:integrallis/stripe_event.git 909 | branch = master 910 | [submodule "engines/talking_stick"] 911 | path = engines/talking_stick 912 | url = git@github.com:mojolingo/talking_stick.git 913 | branch = master 914 | [submodule "engines/thredded"] 915 | path = engines/thredded 916 | url = git@github.com:thredded/thredded.git 917 | branch = master 918 | [submodule "engines/tolk"] 919 | path = engines/tolk 920 | url = git@github.com:tolk/tolk.git 921 | branch = master 922 | [submodule "engines/versioncake"] 923 | path = engines/versioncake 924 | url = https://github.com/bwillis/versioncake 925 | branch = master 926 | -------------------------------------------------------------------------------- /repos.md: -------------------------------------------------------------------------------- 1 | # Real World Rails 2 | 3 | 4 | ### trailmix 5 | Trailmix. A private place to write. [https://www.trailmix.life](https://www.trailmix.life) 6 | [https://github.com/codecation/trailmix](https://github.com/codecation/trailmix) 7 | 8 | ### spree 9 | Spree is an open source E-commerce platform for Rails 6 with a modern UX, optional PWA frontend, REST API, GraphQL, several official extensions and 3rd party integrations. Over 1 million downloads and counting! Check it out: [https://spreecommerce.org](https://spreecommerce.org) 10 | [https://github.com/spree/spree](https://github.com/spree/spree) 11 | 12 | ### discourse 13 | A platform for community discussion. Free, open, simple. [https://www.discourse.org](https://www.discourse.org) 14 | [https://github.com/discourse/discourse](https://github.com/discourse/discourse) 15 | 16 | ### diaspora 17 | A privacy-aware, distributed, open source social network. [https://diasporafoundation.org/](https://diasporafoundation.org/) 18 | [https://github.com/diaspora/diaspora](https://github.com/diaspora/diaspora) 19 | 20 | ### enki 21 | A Ruby on Rails blogging app for the fashionable developer. It's better than Mephisto or SimpleLog 22 | [https://github.com/xaviershay/enki](https://github.com/xaviershay/enki) 23 | 24 | ### refinerycms 25 | An extendable Ruby on Rails CMS that supports Rails 6.0+ [https://www.refinerycms.com/](https://www.refinerycms.com/) 26 | [https://github.com/refinery/refinerycms](https://github.com/refinery/refinerycms) 27 | 28 | ### radiant 29 | Radiant is a no-fluff, open source content management system designed for small teams. [http://radiantcms.org/](http://radiantcms.org/) 30 | [https://github.com/radiant/radiant](https://github.com/radiant/radiant) 31 | 32 | ### gitlabhq 33 | GitLab CE Mirror | Please open new issues in our issue tracker on GitLab.com [https://about.gitlab.com/getting-help/](https://about.gitlab.com/getting-help/) 34 | [https://github.com/gitlabhq/gitlabhq](https://github.com/gitlabhq/gitlabhq) 35 | 36 | ### fat_free_crm 37 | Ruby on Rails CRM platform [http://www.fatfreecrm.com](http://www.fatfreecrm.com) 38 | [https://github.com/fatfreecrm/fat_free_crm](https://github.com/fatfreecrm/fat_free_crm) 39 | 40 | ### errbit 41 | The open source error catcher that's Airbrake API compliant [http://errbit.github.com/errbit/](http://errbit.github.com/errbit/) 42 | [https://github.com/errbit/errbit](https://github.com/errbit/errbit) 43 | 44 | ### dashing-rails 45 | The exceptionally handsome dashboard framework for Rails. 46 | [https://github.com/gottfrois/dashing-rails](https://github.com/gottfrois/dashing-rails) 47 | 48 | ### onebody 49 | This repo has moved. [https://github.com/seven1m/onebody](https://github.com/seven1m/onebody) 50 | [https://github.com/churchio/onebody](https://github.com/churchio/onebody) 51 | 52 | ### fulcrum 53 | An agile project planning tool [http://wholemeal.co.nz/projects/fulcrum.html](http://wholemeal.co.nz/projects/fulcrum.html) 54 | [https://github.com/fulcrum-agile/fulcrum](https://github.com/fulcrum-agile/fulcrum) 55 | 56 | ### web 57 | Squash’s front-end and API host. [http://www.squash.io](http://www.squash.io) 58 | [https://github.com/SquareSquash/web](https://github.com/SquareSquash/web) 59 | 60 | ### obtvse2 61 | A clean and simple markdown blogging platform on Rails. 62 | [https://github.com/natew/obtvse2](https://github.com/natew/obtvse2) 63 | 64 | ### engine 65 | A platform to create, publish and edit sites [http://www.locomotivecms.com](http://www.locomotivecms.com) 66 | [https://github.com/locomotivecms/engine](https://github.com/locomotivecms/engine) 67 | 68 | ### redmine 69 | Redmine is a flexible project management web application written using Ruby on Rails framework. http://github.com/edavis10/redmine is the official git mirror of the svn repository [http://www.redmine.org](http://www.redmine.org) 70 | [https://github.com/edavis10/redmine](https://github.com/edavis10/redmine) 71 | 72 | ### platform 73 | Core of the Amahi Platform, a web app in RoR 74 | [https://github.com/amahi/platform](https://github.com/amahi/platform) 75 | 76 | ### catarse 77 | The first open source crowdfunding platform for creative projects in the world [http://catarse.me](http://catarse.me) 78 | [https://github.com/catarse/catarse](https://github.com/catarse/catarse) 79 | 80 | ### canvas-lms 81 | The open LMS by Instructure, Inc. [https://github.com/instructure/canvas-lms/wiki](https://github.com/instructure/canvas-lms/wiki) 82 | [https://github.com/instructure/canvas-lms](https://github.com/instructure/canvas-lms) 83 | 84 | ### Hours 85 | Time registration that doesn't suck [https://happyhours.io](https://happyhours.io) 86 | [https://github.com/DefactoSoftware/Hours](https://github.com/DefactoSoftware/Hours) 87 | 88 | ### loomio 89 | Loomio helps people make decisions together [https://www.loomio.org](https://www.loomio.org) 90 | [https://github.com/loomio/loomio](https://github.com/loomio/loomio) 91 | 92 | ### help 93 | Small help requests system. Subscribe to topic so people can ask you for help or who subscribed where and ask them for help [https://netguru.co/opensource](https://netguru.co/opensource) 94 | [https://github.com/netguru/help](https://github.com/netguru/help) 95 | 96 | ### tracks 97 | Tracks is a GTD™ web application, built with Ruby on Rails [https://www.getontracks.org/](https://www.getontracks.org/) 98 | [https://github.com/TracksApp/tracks](https://github.com/TracksApp/tracks) 99 | 100 | ### rubygems.org 101 | The Ruby community's gem hosting service. [https://rubygems.org](https://rubygems.org) 102 | [https://github.com/rubygems/rubygems.org](https://github.com/rubygems/rubygems.org) 103 | 104 | ### calagator 105 | An open source community calendar platform written in Ruby on Rails [https://calagator.org](https://calagator.org) 106 | [https://github.com/calagator/calagator](https://github.com/calagator/calagator) 107 | 108 | ### 24pullrequests 109 | :christmas_tree: Giving back to open source for the holidays [https://24pullrequests.com/](https://24pullrequests.com/) 110 | [https://github.com/24pullrequests/24pullrequests](https://github.com/24pullrequests/24pullrequests) 111 | 112 | ### publify 113 | A self hosted Web publishing platform on Rails. [http://publify.github.io/](http://publify.github.io/) 114 | [https://github.com/publify/publify](https://github.com/publify/publify) 115 | 116 | ### openstreetmap-website 117 | The Rails application that powers OpenStreetMap [https://www.openstreetmap.org/](https://www.openstreetmap.org/) 118 | [https://github.com/openstreetmap/openstreetmap-website](https://github.com/openstreetmap/openstreetmap-website) 119 | 120 | ### alaveteli 121 | Provide a Freedom of Information request system for your jurisdiction [https://alaveteli.org](https://alaveteli.org) 122 | [https://github.com/mysociety/alaveteli](https://github.com/mysociety/alaveteli) 123 | 124 | ### open-source-billing 125 | Open Source Billing a super simple way to create and send invoices and receive payments online. [http://opensourcebilling.org](http://opensourcebilling.org) 126 | [https://github.com/vteams/open-source-billing](https://github.com/vteams/open-source-billing) 127 | 128 | ### brimir 129 | Email helpdesk built using Ruby on Rails and Zurb Foundation [http://getbrimir.com](http://getbrimir.com) 130 | [https://github.com/ivaldi/brimir](https://github.com/ivaldi/brimir) 131 | 132 | ### Spina 133 | Spina CMS [http://www.spinacms.com](http://www.spinacms.com) 134 | [https://github.com/denkGroot/Spina](https://github.com/denkGroot/Spina) 135 | 136 | ### peatio 137 | An open-source assets exchange. [http://peatio.com](http://peatio.com) 138 | [https://github.com/peatio/peatio](https://github.com/peatio/peatio) 139 | 140 | ### bridge_troll 141 | Event management system for all the Bridges (RailsBridge, MobileBridge, GoBridge, etc!) [https://www.bridgetroll.org](https://www.bridgetroll.org) 142 | [https://github.com/railsbridge/bridge_troll](https://github.com/railsbridge/bridge_troll) 143 | 144 | ### shoppe 145 | A attractive and complete Rails engine providing e-commerce functionality for any Rails 4 application. [http://tryshoppe.com](http://tryshoppe.com) 146 | [https://github.com/tryshoppe/shoppe](https://github.com/tryshoppe/shoppe) 147 | 148 | ### whitehall 149 | Publishes government content on GOV.UK [https://docs.publishing.service.gov.uk/apps/whitehall.html](https://docs.publishing.service.gov.uk/apps/whitehall.html) 150 | [https://github.com/alphagov/whitehall](https://github.com/alphagov/whitehall) 151 | 152 | ### adopt-a-hydrant 153 | A web application that allows citizens to "adopt" civic infrastructure, such as fire hydrants that need to be shoveled out after it snows. [http://adopt-a-hydrant.herokuapp.com/](http://adopt-a-hydrant.herokuapp.com/) 154 | [https://github.com/codeforamerica/adopt-a-hydrant](https://github.com/codeforamerica/adopt-a-hydrant) 155 | 156 | ### showterm.io 157 | The website for showterm! 158 | [https://github.com/ConradIrwin/showterm.io](https://github.com/ConradIrwin/showterm.io) 159 | 160 | ### inch_ci-web 161 | Web frontend for Inch CI [http://inch-ci.org/](http://inch-ci.org/) 162 | [https://github.com/inch-ci/inch_ci-web](https://github.com/inch-ci/inch_ci-web) 163 | 164 | ### heaven 165 | :walking: Rails app for GitHub Flow 166 | [https://github.com/atmos/heaven](https://github.com/atmos/heaven) 167 | 168 | ### codemontage 169 | CodeMontage empowers coders to improve their impact on the world. Find open source software projects with a social impact and save the world. [http://codemontage.com](http://codemontage.com) 170 | [https://github.com/CodeMontageHQ/codemontage](https://github.com/CodeMontageHQ/codemontage) 171 | 172 | ### ohana-api 173 | The open source API directory of community social services. [http://ohana-api-demo.herokuapp.com/api](http://ohana-api-demo.herokuapp.com/api) 174 | [https://github.com/codeforamerica/ohana-api](https://github.com/codeforamerica/ohana-api) 175 | 176 | ### askthem 177 | Monitor and interact with local governments in the United States 178 | [https://github.com/opengovernment/askthem](https://github.com/opengovernment/askthem) 179 | 180 | ### opengovernment 181 | OpenGovernment -- a project of the Participatory Politics Foundation [http://opengovernment.org/home](http://opengovernment.org/home) 182 | [https://github.com/opengovernment/opengovernment](https://github.com/opengovernment/opengovernment) 183 | 184 | ### growstuff 185 | Open data project for small-scale food growers [http://growstuff.org/](http://growstuff.org/) 186 | [https://github.com/Growstuff/growstuff](https://github.com/Growstuff/growstuff) 187 | 188 | ### huboard-web 189 | GitHub issues made awesome [https://huboard.com](https://huboard.com) 190 | [https://github.com/huboard/huboard-web](https://github.com/huboard/huboard-web) 191 | 192 | ### camaleon-cms 193 | Camaleon CMS is a dynamic and advanced content management system based on Ruby on Rails [http://camaleon.tuzitio.com/](http://camaleon.tuzitio.com/) 194 | [https://github.com/owen2345/camaleon-cms](https://github.com/owen2345/camaleon-cms) 195 | 196 | ### contrib-hub 197 | Open source lovers, making easier to find cool projects to hack on! Wanna help? [http://contribhub.org](http://contribhub.org) 198 | [https://github.com/orendon/contrib-hub](https://github.com/orendon/contrib-hub) 199 | 200 | ### solidus 201 | 🛒Solidus, Rails eCommerce System [https://solidus.io/](https://solidus.io/) 202 | [https://github.com/solidusio/solidus](https://github.com/solidusio/solidus) 203 | 204 | ### e-petitions 205 | This is the code base for the UK Government's e-petitions service (https://petition.parliament.uk) [https://petition.parliament.uk](https://petition.parliament.uk) 206 | [https://github.com/alphagov/e-petitions](https://github.com/alphagov/e-petitions) 207 | 208 | ### verboice 209 | Open source toolkit for voice services; with special focus to the needs of medium- and low-income countries, scalable services, and interacting with vulnerable populations [http://verboice.instedd.org/](http://verboice.instedd.org/) 210 | [https://github.com/instedd/verboice](https://github.com/instedd/verboice) 211 | 212 | ### publisher 213 | Publishes mainstream content on GOV.UK [https://docs.publishing.service.gov.uk/apps/publisher.html](https://docs.publishing.service.gov.uk/apps/publisher.html) 214 | [https://github.com/alphagov/publisher](https://github.com/alphagov/publisher) 215 | 216 | ### frontend 217 | Serves the homepage, transactions and some index pages on GOV.UK [https://docs.publishing.service.gov.uk/apps/frontend.html](https://docs.publishing.service.gov.uk/apps/frontend.html) 218 | [https://github.com/alphagov/frontend](https://github.com/alphagov/frontend) 219 | 220 | ### open-data-certificate 221 | The mark of quality and trust for open data [https://certificates.theodi.org/](https://certificates.theodi.org/) 222 | [https://github.com/theodi/open-data-certificate](https://github.com/theodi/open-data-certificate) 223 | 224 | ### uk-postcodes 225 | [https://github.com/theodi/uk-postcodes](https://github.com/theodi/uk-postcodes) 226 | 227 | ### panopticon 228 | Retired. App that holds some of the content on GOV.UK 229 | [https://github.com/alphagov/panopticon](https://github.com/alphagov/panopticon) 230 | 231 | ### kevlar 232 | Secrets created by kevlar.io are kept until they are accessed, they are then deleted permanently from the server. [http://kevlar.io](http://kevlar.io) 233 | [https://github.com/adambutler/kevlar](https://github.com/adambutler/kevlar) 234 | 235 | ### C2 236 | an approval process automation tool [https://cap.18f.gov](https://cap.18f.gov) 237 | [https://github.com/18F/C2](https://github.com/18F/C2) 238 | 239 | ### kandan 240 | Kandan is an Open Source Alternative to HipChat 241 | [https://github.com/kandanapp/kandan](https://github.com/kandanapp/kandan) 242 | 243 | ### feedbin 244 | Follow your passions with RSS, email newsletters, and Twitter. [https://feedbin.com](https://feedbin.com) 245 | [https://github.com/feedbin/feedbin](https://github.com/feedbin/feedbin) 246 | 247 | ### gitlab-ci 248 | DEPRECATED - Please use the GitLab.com issue tracker [https://gitlab.com/gitlab-org/gitlab-ce/issues](https://gitlab.com/gitlab-org/gitlab-ce/issues) 249 | [https://github.com/gitlabhq/gitlab-ci](https://github.com/gitlabhq/gitlab-ci) 250 | 251 | ### panamax-ui 252 | The Web GUI for Panamax [http://panamax.io](http://panamax.io) 253 | [https://github.com/CenturyLinkLabs/panamax-ui](https://github.com/CenturyLinkLabs/panamax-ui) 254 | 255 | ### git-scm.com 256 | The git-scm.com website. Note that this repository is only for the website; issues with git itself should go to https://git-scm.com/community. [https://git-scm.com/](https://git-scm.com/) 257 | [https://github.com/git/git-scm.com](https://github.com/git/git-scm.com) 258 | 259 | ### ror_ecommerce 260 | Ruby on Rails Ecommerce platform, perfect for your small business solution. [www.ror-e.com](www.ror-e.com) 261 | [https://github.com/drhenner/ror_ecommerce](https://github.com/drhenner/ror_ecommerce) 262 | 263 | ### cartodb 264 | Location Intelligence & Data Visualization tool [http://carto.com](http://carto.com) 265 | [https://github.com/CartoDB/cartodb](https://github.com/CartoDB/cartodb) 266 | 267 | ### classroom 268 | GitHub Classroom automates repository creation and access control, making it easy for teachers to distribute starter code and collect assignments on GitHub. [https://classroom.github.com](https://classroom.github.com) 269 | [https://github.com/education/classroom](https://github.com/education/classroom) 270 | 271 | ### Markus 272 | Git repository of MarkUs 273 | [https://github.com/MarkUsProject/Markus](https://github.com/MarkUsProject/Markus) 274 | 275 | ### twist 276 | Book review application for LeanPub's Markdown format 277 | [https://github.com/radar/twist](https://github.com/radar/twist) 278 | 279 | ### mission-of-mercy 280 | Management application for Mission of Mercy free dental clinics 281 | [https://github.com/mission-of-mercy/mission-of-mercy](https://github.com/mission-of-mercy/mission-of-mercy) 282 | 283 | ### cloudnet 284 | The Global Cloud Hosting Marketplace 285 | [https://github.com/OnApp/cloudnet](https://github.com/OnApp/cloudnet) 286 | 287 | ### phez 288 | Phez - the free speech platform 289 | [https://github.com/phezco/phez](https://github.com/phezco/phez) 290 | 291 | ### parliamentary-questions 292 | Webapp to manage the workflow in Parliamentary Questions 293 | [https://github.com/ministryofjustice/parliamentary-questions](https://github.com/ministryofjustice/parliamentary-questions) 294 | 295 | ### github-awards 296 | Discover your ranking on github : [http://git-awards.com](http://git-awards.com) 297 | [https://github.com/vdaubry/github-awards](https://github.com/vdaubry/github-awards) 298 | 299 | ### prison-visits 300 | Old incarnation of the Prison Visits service. [https://www.prisonvisits.service.gov.uk](https://www.prisonvisits.service.gov.uk) 301 | [https://github.com/ministryofjustice/prison-visits](https://github.com/ministryofjustice/prison-visits) 302 | 303 | ### case_file_editor 304 | An editor for digital case files. 305 | [https://github.com/ministryofjustice/case_file_editor](https://github.com/ministryofjustice/case_file_editor) 306 | 307 | ### accelerated_claims 308 | ** Unmaintained repository! ** Accelerated Claims app 309 | [https://github.com/ministryofjustice/accelerated_claims](https://github.com/ministryofjustice/accelerated_claims) 310 | 311 | ### courtfinder 312 | ** Unmaintained repository! ** Admin app for the Court and Tribunal Finder [http://courttribunalfinder.service.gov.uk/](http://courttribunalfinder.service.gov.uk/) 313 | [https://github.com/ministryofjustice/courtfinder](https://github.com/ministryofjustice/courtfinder) 314 | 315 | ### ds-auth 316 | Digital Services SSO Provider 317 | [https://github.com/ministryofjustice/ds-auth](https://github.com/ministryofjustice/ds-auth) 318 | 319 | ### defence-request-service-rota 320 | Defence Request Service - Rota Handling 321 | [https://github.com/ministryofjustice/defence-request-service-rota](https://github.com/ministryofjustice/defence-request-service-rota) 322 | 323 | ### defence-request-service 324 | DSDS - Defence Solicitor Request Service - Base App 325 | [https://github.com/ministryofjustice/defence-request-service](https://github.com/ministryofjustice/defence-request-service) 326 | 327 | ### rave-server 328 | RESTful Anti-Virus Endpoint server - provides a HTTPS endpoint to scan files for malware as-a-service 329 | [https://github.com/ministryofjustice/rave-server](https://github.com/ministryofjustice/rave-server) 330 | 331 | ### devise_authentication_api 332 | [https://github.com/ministryofjustice/devise_authentication_api](https://github.com/ministryofjustice/devise_authentication_api) 333 | 334 | ### orientation 335 | Your best weapon in the fight against outdated documentation. [http://orientation.io](http://orientation.io) 336 | [https://github.com/orientation/orientation](https://github.com/orientation/orientation) 337 | 338 | ### eventkit-rails 339 | An open source project for integrating with SendGrid's Event Webhook. 340 | [https://github.com/sendgrid/eventkit-rails](https://github.com/sendgrid/eventkit-rails) 341 | 342 | ### imminence 343 | "Find My Nearest" API and management tools on GOV.UK [https://docs.publishing.service.gov.uk/apps/imminence.html](https://docs.publishing.service.gov.uk/apps/imminence.html) 344 | [https://github.com/alphagov/imminence](https://github.com/alphagov/imminence) 345 | 346 | ### foodsoft 347 | Web-based software to manage a non-profit food coop (product catalog, ordering, accounting, job scheduling). [https://foodcoops.net/](https://foodcoops.net/) 348 | [https://github.com/foodcoops/foodsoft](https://github.com/foodcoops/foodsoft) 349 | 350 | ### foreman 351 | an application that automates the lifecycle of servers [https://theforeman.org](https://theforeman.org) 352 | [https://github.com/theforeman/foreman](https://github.com/theforeman/foreman) 353 | 354 | ### katello 355 | Katello integrates open source systems management tools into a single solution for controlling the lifecycle of your machines. [https://theforeman.org/plugins/katello/](https://theforeman.org/plugins/katello/) 356 | [https://github.com/Katello/katello](https://github.com/Katello/katello) 357 | 358 | ### earthdata-search 359 | Earthdata Search is a web application developed by NASA EOSDIS to enable data discovery, search, comparison, visualization, and access across EOSDIS' Earth Science data holdings. [https://search.earthdata.nasa.gov](https://search.earthdata.nasa.gov) 360 | [https://github.com/nasa/earthdata-search](https://github.com/nasa/earthdata-search) 361 | 362 | ### RescueRails 363 | Helps save cute cuddly puppies! [http://ophrescue.org](http://ophrescue.org) 364 | [https://github.com/ophrescue/RescueRails](https://github.com/ophrescue/RescueRails) 365 | 366 | ### manageiq 367 | ManageIQ Open-Source Management Platform [https://www.manageiq.org/](https://www.manageiq.org/) 368 | [https://github.com/ManageIQ/manageiq](https://github.com/ManageIQ/manageiq) 369 | 370 | ### samson 371 | Web interface for deployments, with plugin architecture and kubernetes support 372 | [https://github.com/zendesk/samson](https://github.com/zendesk/samson) 373 | 374 | ### sharetribe 375 | Sharetribe Go is a source available marketplace software, also available as a hosted, no-code SaaS product. For a headless, API-first marketplace solution, check out Sharetribe Flex: https://www.sharetribe.com/flex. [https://www.sharetribe.com](https://www.sharetribe.com) 376 | [https://github.com/sharetribe/sharetribe](https://github.com/sharetribe/sharetribe) 377 | 378 | ### cfp-app 379 | Rails app for managing a conference CFP 380 | [https://github.com/rubycentral/cfp-app](https://github.com/rubycentral/cfp-app) 381 | 382 | ### Champaign 383 | SumOfUs Online Campaign Platform. 384 | [https://github.com/SumOfUs/Champaign](https://github.com/SumOfUs/Champaign) 385 | 386 | ### ruby-bench-web 387 | Long Running Ruby Benchmarks [https://rubybench.org](https://rubybench.org) 388 | [https://github.com/ruby-bench/ruby-bench-web](https://github.com/ruby-bench/ruby-bench-web) 389 | 390 | ### alonetone 391 | A free, open source, non-commercial home for musicians and their music [https://alonetone.com](https://alonetone.com) 392 | [https://github.com/sudara/alonetone](https://github.com/sudara/alonetone) 393 | 394 | ### alchemy_cms 395 | AlchemyCMS is a Rails CMS engine [https://alchemy-cms.com](https://alchemy-cms.com) 396 | [https://github.com/AlchemyCMS/alchemy_cms](https://github.com/AlchemyCMS/alchemy_cms) 397 | 398 | ### jobsworth 399 | Project Management, Collaboration and Time Tracking. 400 | [https://github.com/ari/jobsworth](https://github.com/ari/jobsworth) 401 | 402 | ### openproject 403 | OpenProject is the leading open source project management software. [https://www.openproject.org](https://www.openproject.org) 404 | [https://github.com/opf/openproject](https://github.com/opf/openproject) 405 | 406 | ### e-manifest 407 | The EPA e-Manifest project 408 | [https://github.com/18F/e-manifest](https://github.com/18F/e-manifest) 409 | 410 | ### helpy 411 | Helpy is a modern, open source helpdesk customer support application. Features include knowledgebase, community discussions and support tickets integrated with email. [http://helpy.io/?source=ghh](http://helpy.io/?source=ghh) 412 | [https://github.com/helpyio/helpy](https://github.com/helpyio/helpy) 413 | 414 | ### thredded 415 | The best Rails forums engine ever. [https://thredded.org](https://thredded.org) 416 | [https://github.com/thredded/thredded](https://github.com/thredded/thredded) 417 | 418 | ### administrate 419 | A Rails engine that helps you put together a super-flexible admin dashboard. [http://administrate-prototype.herokuapp.com](http://administrate-prototype.herokuapp.com) 420 | [https://github.com/thoughtbot/administrate](https://github.com/thoughtbot/administrate) 421 | 422 | ### griddler 423 | Simplify receiving email in Rails [http://griddler.io/](http://griddler.io/) 424 | [https://github.com/thoughtbot/griddler](https://github.com/thoughtbot/griddler) 425 | 426 | ### letter_opener_web 427 | A web interface for browsing Ruby on Rails sent emails 428 | [https://github.com/fgrehm/letter_opener_web](https://github.com/fgrehm/letter_opener_web) 429 | 430 | ### pghero 431 | A performance dashboard for Postgres 432 | [https://github.com/ankane/pghero](https://github.com/ankane/pghero) 433 | 434 | ### rubytogether.org 435 | The Ruby Together website [rubytogether.org](rubytogether.org) 436 | [https://github.com/rubytogether/rubytogether.org](https://github.com/rubytogether/rubytogether.org) 437 | 438 | ### exception_notification 439 | Exception Notifier Plugin for Rails [http://smartinez87.github.com/exception_notification](http://smartinez87.github.com/exception_notification) 440 | [https://github.com/smartinez87/exception_notification](https://github.com/smartinez87/exception_notification) 441 | 442 | ### high_voltage 443 | Easily include static pages in your Rails app. [http://thoughtbot.github.io/high_voltage](http://thoughtbot.github.io/high_voltage) 444 | [https://github.com/thoughtbot/high_voltage](https://github.com/thoughtbot/high_voltage) 445 | 446 | ### plutus 447 | A Ruby on Rails Engine which provides a double entry accounting system for your application 448 | [https://github.com/mbulat/plutus](https://github.com/mbulat/plutus) 449 | 450 | ### libraries.io 451 | :books: The Open Source Discovery Service [https://libraries.io](https://libraries.io) 452 | [https://github.com/librariesio/libraries.io](https://github.com/librariesio/libraries.io) 453 | 454 | ### rapidfire 455 | Making dynamic surveys should be easy! [https://rapidfire.herokuapp.com](https://rapidfire.herokuapp.com) 456 | [https://github.com/code-mancers/rapidfire](https://github.com/code-mancers/rapidfire) 457 | 458 | ### bender 459 | [https://github.com/collectiveidea/bender](https://github.com/collectiveidea/bender) 460 | 461 | ### metrics 462 | A tool for tracking arbitrary metrics via Slack 463 | [https://github.com/collectiveidea/metrics](https://github.com/collectiveidea/metrics) 464 | 465 | ### hourglass 466 | Client and internal time management with Harvest [hourglass.collectiveidea.com](hourglass.collectiveidea.com) 467 | [https://github.com/collectiveidea/hourglass](https://github.com/collectiveidea/hourglass) 468 | 469 | ### blazer 470 | Business intelligence made simple 471 | [https://github.com/ankane/blazer](https://github.com/ankane/blazer) 472 | 473 | ### searchjoy 474 | Search analytics made easy 475 | [https://github.com/ankane/searchjoy](https://github.com/ankane/searchjoy) 476 | 477 | ### ahoy 478 | Simple, powerful, first-party analytics for Rails 479 | [https://github.com/ankane/ahoy](https://github.com/ankane/ahoy) 480 | 481 | ### ahoy_email 482 | Email analytics for Rails 483 | [https://github.com/ankane/ahoy_email](https://github.com/ankane/ahoy_email) 484 | 485 | ### chartkick 486 | Create beautiful JavaScript charts with one line of Ruby [https://chartkick.com](https://chartkick.com) 487 | [https://github.com/ankane/chartkick](https://github.com/ankane/chartkick) 488 | 489 | ### notable 490 | Track notable requests and background jobs 491 | [https://github.com/ankane/notable](https://github.com/ankane/notable) 492 | 493 | ### mailkick 494 | Email unsubscribes for Rails 495 | [https://github.com/ankane/mailkick](https://github.com/ankane/mailkick) 496 | 497 | ### osem 498 | Open Source Event Manager. An event management tool tailored to Free and Open Source Software conferences. [http://osem.io](http://osem.io) 499 | [https://github.com/openSUSE/osem](https://github.com/openSUSE/osem) 500 | 501 | ### open-build-service 502 | Build and distribute Linux packages from sources in an automatic, consistent and reproducible way #obs [http://openbuildservice.org/](http://openbuildservice.org/) 503 | [https://github.com/openSUSE/open-build-service](https://github.com/openSUSE/open-build-service) 504 | 505 | ### reservations 506 | Manage equipment loans & reservations. Who can borrow what, for how long? [yalestc.github.io/reservations](yalestc.github.io/reservations) 507 | [https://github.com/YaleSTC/reservations](https://github.com/YaleSTC/reservations) 508 | 509 | ### prague-server 510 | Server for the ControlShift Prague donation application 511 | [https://github.com/controlshift/prague-server](https://github.com/controlshift/prague-server) 512 | 513 | ### spectre 514 | A simple UI for browsing and inspecting diffs, and an API for runner scripts to submit screenshots to and receive a pass or fail in real time. (For use with Wraith, Backstop, Selenium etc) 515 | [https://github.com/wearefriday/spectre](https://github.com/wearefriday/spectre) 516 | 517 | ### remit 518 | Research Management Information Tool (ReMIT) for Médecins Sans Frontieres' Manson Unit 519 | [https://github.com/mysociety/remit](https://github.com/mysociety/remit) 520 | 521 | ### planningalerts 522 | Find out and have your say about what's being built and knocked down in your area. [https://www.planningalerts.org.au](https://www.planningalerts.org.au) 523 | [https://github.com/openaustralia/planningalerts](https://github.com/openaustralia/planningalerts) 524 | 525 | ### morph 526 | Take the hassle out of web scraping [https://morph.io](https://morph.io) 527 | [https://github.com/openaustralia/morph](https://github.com/openaustralia/morph) 528 | 529 | ### cuttlefish 530 | Transactional email server with a lovely web interface [http://cuttlefish.io](http://cuttlefish.io) 531 | [https://github.com/mlandauer/cuttlefish](https://github.com/mlandauer/cuttlefish) 532 | 533 | ### publicwhip 534 | Making parliamentary voting information accessible, understandable, and easy to use so that you can hold your elected representatives to account. [https://theyvoteforyou.org.au/](https://theyvoteforyou.org.au/) 535 | [https://github.com/openaustralia/publicwhip](https://github.com/openaustralia/publicwhip) 536 | 537 | ### cangaroo 538 | Connect Any App to Any Service [https://github.com/nebulab/cangaroo](https://github.com/nebulab/cangaroo) 539 | [https://github.com/nebulab/cangaroo](https://github.com/nebulab/cangaroo) 540 | 541 | ### pageflow 542 | Multimedia story telling for the web. [http://pageflow.io](http://pageflow.io) 543 | [https://github.com/codevise/pageflow](https://github.com/codevise/pageflow) 544 | 545 | ### klaxon 546 | Klaxon enables reporters and editors to monitor scores of sites on the web for newsworthy changes. [https://newsklaxon.org](https://newsklaxon.org) 547 | [https://github.com/themarshallproject/klaxon](https://github.com/themarshallproject/klaxon) 548 | 549 | ### cm42-central 550 | Fork and Evolution of the Fulcrum project - An agile project planning tool and Pivotal Tracker drop-in replacement [https://central.cm42.io](https://central.cm42.io) 551 | [https://github.com/Codeminer42/cm42-central](https://github.com/Codeminer42/cm42-central) 552 | 553 | ### shipit-engine 554 | Deployment coordination [https://shopifyengineering.myshopify.com/blogs/engineering/introducing-shipit](https://shopifyengineering.myshopify.com/blogs/engineering/introducing-shipit) 555 | [https://github.com/Shopify/shipit-engine](https://github.com/Shopify/shipit-engine) 556 | 557 | ### shopify_app 558 | A Rails Engine for building Shopify Apps [http://shopify.github.io/shopify_app](http://shopify.github.io/shopify_app) 559 | [https://github.com/Shopify/shopify_app](https://github.com/Shopify/shopify_app) 560 | 561 | ### test_track 562 | Server app for the TestTrack multi-platform split-testing and feature-gating system 563 | [https://github.com/Betterment/test_track](https://github.com/Betterment/test_track) 564 | 565 | ### CodeTriage 566 | Discover the best way to get started contributing to Open Source projects [https://www.codetriage.com](https://www.codetriage.com) 567 | [https://github.com/codetriage/codetriage](https://github.com/codetriage/codetriage) 568 | 569 | ### tolk 570 | Tolk is a web interface for doing i18n translations packaged as an engine for Rails 4 applications 571 | [https://github.com/tolk/tolk](https://github.com/tolk/tolk) 572 | 573 | ### health-monitor-rails 574 | A Rails plugin which provides a health checking and monitoring API of various services and application aspects. 575 | [https://github.com/lbeder/health-monitor-rails](https://github.com/lbeder/health-monitor-rails) 576 | 577 | ### rapporteur 578 | A Rails Engine which provides a customizable status page on your application. [http://rubygems.org/gems/rapporteur](http://rubygems.org/gems/rapporteur) 579 | [https://github.com/envylabs/rapporteur](https://github.com/envylabs/rapporteur) 580 | 581 | ### rucaptcha 582 | Captcha gem for Rails Application. No dependencies. No ImageMagick, No RMagick. [http://huacnlee.com/rucaptcha](http://huacnlee.com/rucaptcha) 583 | [https://github.com/huacnlee/rucaptcha](https://github.com/huacnlee/rucaptcha) 584 | 585 | ### talking_stick 586 | Rails Engine providing easy WebRTC group communication 587 | [https://github.com/mojolingo/talking_stick](https://github.com/mojolingo/talking_stick) 588 | 589 | ### stripe_event 590 | Stripe webhook integration for Rails applications. [https://rubygems.org/gems/stripe_event](https://rubygems.org/gems/stripe_event) 591 | [https://github.com/integrallis/stripe_event](https://github.com/integrallis/stripe_event) 592 | 593 | ### attachinary 594 | Attachments handler for Rails that uses Cloudinary for storage. 595 | [https://github.com/assembler/attachinary](https://github.com/assembler/attachinary) 596 | 597 | ### flip 598 | Flip lets you declare and manage feature flags, backed by cookies (private testing) and database (site-wide). 599 | [https://github.com/pda/flip](https://github.com/pda/flip) 600 | 601 | ### postgresql_lo_streamer 602 | A Rails engine to stream PostgreSQL Large Objects to clients [http://diogob.github.com/postgresql_lo_streamer/](http://diogob.github.com/postgresql_lo_streamer/) 603 | [https://github.com/diogob/postgresql_lo_streamer](https://github.com/diogob/postgresql_lo_streamer) 604 | 605 | ### dbhero 606 | DBHero is a simple and elegant web interface to extract data clips from your app database. just plug and play ;) 607 | [https://github.com/catarse/dbhero](https://github.com/catarse/dbhero) 608 | 609 | ### octobox 610 | 📮Untangle your GitHub Notifications 611 | [https://github.com/octobox/octobox](https://github.com/octobox/octobox) 612 | 613 | ### worldcubeassociation.org 614 | All of the code that runs on worldcubeassociation.org [https://www.worldcubeassociation.org/](https://www.worldcubeassociation.org/) 615 | [https://github.com/thewca/worldcubeassociation.org](https://github.com/thewca/worldcubeassociation.org) 616 | 617 | ### field_test 618 | A/B testing for Rails 619 | [https://github.com/ankane/field_test](https://github.com/ankane/field_test) 620 | 621 | ### uberzeit 622 | Time and activity tracking web application for the rest of us. 623 | [https://github.com/ninech/uberzeit](https://github.com/ninech/uberzeit) 624 | 625 | ### local_time 626 | Rails engine for cache-friendly, client-side local time 627 | [https://github.com/basecamp/local_time](https://github.com/basecamp/local_time) 628 | 629 | ### easymon 630 | Easy Monitoring 631 | [https://github.com/basecamp/easymon](https://github.com/basecamp/easymon) 632 | 633 | ### motorhead 634 | A Rails Engine framework that helps safe and rapid feature prototyping 635 | [https://github.com/amatsuda/motorhead](https://github.com/amatsuda/motorhead) 636 | 637 | ### speakerline 638 | Showcasing speakers' proposals and timelines in an effort to demystify the CFP process and help new speakers get started. [http://speakerline.io](http://speakerline.io) 639 | [https://github.com/nodunayo/speakerline](https://github.com/nodunayo/speakerline) 640 | 641 | ### feedbunch 642 | A simple and elegant feed reader. [http://feedbunch.com](http://feedbunch.com) 643 | [https://github.com/amatriain/feedbunch](https://github.com/amatriain/feedbunch) 644 | 645 | ### lale-help 646 | A collaborative platform for volunteer refugee support. [http://lale.help](http://lale.help) 647 | [https://github.com/lale-help/lale-help](https://github.com/lale-help/lale-help) 648 | 649 | ### timeoverflow 650 | A time banking system [https://www.timeoverflow.org](https://www.timeoverflow.org) 651 | [https://github.com/coopdevs/timeoverflow](https://github.com/coopdevs/timeoverflow) 652 | 653 | ### openfoodnetwork 654 | Connect suppliers, distributors and consumers to trade local produce [http://openfoodnetwork.org/](http://openfoodnetwork.org/) 655 | [https://github.com/openfoodfoundation/openfoodnetwork](https://github.com/openfoodfoundation/openfoodnetwork) 656 | 657 | ### communityengine 658 | Adds basic social networking capabilities to your existing application, including users, blogs, photos, clippings, favorites, and more. [http://www.communityengine.org](http://www.communityengine.org) 659 | [https://github.com/bborn/communityengine](https://github.com/bborn/communityengine) 660 | 661 | ### quick_search 662 | QuickSearch is a toolkit for easily creating custom bento-box search applications [https://www.lib.ncsu.edu/projects/quicksearch](https://www.lib.ncsu.edu/projects/quicksearch) 663 | [https://github.com/NCSU-Libraries/quick_search](https://github.com/NCSU-Libraries/quick_search) 664 | 665 | ### lentil 666 | Lentil is no longer supported. Lentil is a Ruby on Rails Engine that supports the harvesting of images from Instagram. [https://lib.ncsu.edu/projects/my-huntlibrary](https://lib.ncsu.edu/projects/my-huntlibrary) 667 | [https://github.com/NCSU-Libraries/lentil](https://github.com/NCSU-Libraries/lentil) 668 | 669 | ### pester 670 | Automatically ask for a PR review 671 | [https://github.com/thoughtbot/pester](https://github.com/thoughtbot/pester) 672 | 673 | ### freshfoodconnect 674 | [https://github.com/thoughtbot/freshfoodconnect](https://github.com/thoughtbot/freshfoodconnect) 675 | 676 | ### french_toast 677 | Communicate information about background jobs 678 | [https://github.com/thoughtbot/french_toast](https://github.com/thoughtbot/french_toast) 679 | 680 | ### website 681 | Ruby on Rails app that powers crimethinc.com [https://crimethinc.com](https://crimethinc.com) 682 | [https://github.com/crimethinc/website](https://github.com/crimethinc/website) 683 | 684 | ### Claim-for-Crown-Court-Defence 685 | Claim for Crown Court Defence, formerly Advocate Defence Payments (ADP), aka Crime Billing Online (CBO) 686 | [https://github.com/ministryofjustice/Claim-for-Crown-Court-Defence](https://github.com/ministryofjustice/Claim-for-Crown-Court-Defence) 687 | 688 | ### bike_index 689 | All the code for Bike Index, because we love you [https://bikeindex.org](https://bikeindex.org) 690 | [https://github.com/bikeindex/bike_index](https://github.com/bikeindex/bike_index) 691 | 692 | ### coursemology2 693 | Rails 5 re-write of Coursemology [https://coursemology.org](https://coursemology.org) 694 | [https://github.com/Coursemology/coursemology2](https://github.com/Coursemology/coursemology2) 695 | 696 | ### hyrax 697 | Hyrax is a front-end based on the robust Samvera framework, providing a user interface for common repository features [http://hyrax.samvera.org/](http://hyrax.samvera.org/) 698 | [https://github.com/samvera/hyrax](https://github.com/samvera/hyrax) 699 | 700 | ### WikiEduDashboard 701 | Wiki Education Foundation's Wikipedia course dashboard system [https://dashboard.wikiedu.org](https://dashboard.wikiedu.org) 702 | [https://github.com/WikiEducationFoundation/WikiEduDashboard](https://github.com/WikiEducationFoundation/WikiEduDashboard) 703 | 704 | ### envizon 705 | network visualization & vulnerability management/reporting [https://evait-security.github.io/envizon/](https://evait-security.github.io/envizon/) 706 | [https://github.com/evait-security/envizon](https://github.com/evait-security/envizon) 707 | 708 | ### snibox 709 | Self-hosted snippet manager [https://snibox.github.io/](https://snibox.github.io/) 710 | [https://github.com/snibox/snibox](https://github.com/snibox/snibox) 711 | 712 | ### zammad 713 | Zammad is a web based open source helpdesk/customer support system [https://zammad.org](https://zammad.org) 714 | [https://github.com/zammad/zammad](https://github.com/zammad/zammad) 715 | 716 | ### rubytoolbox 717 | Find actively maintained & popular open source software libraries for the Ruby programming language [https://www.ruby-toolbox.com](https://www.ruby-toolbox.com) 718 | [https://github.com/rubytoolbox/rubytoolbox](https://github.com/rubytoolbox/rubytoolbox) 719 | 720 | ### code_fund_ads 721 | CodeFund is an open source platform that helps fund maintainers, bloggers, and builders through non-tracking ethical ads [https://codefund.io](https://codefund.io) 722 | [https://github.com/gitcoinco/code_fund_ads](https://github.com/gitcoinco/code_fund_ads) 723 | 724 | ### speakerinnen_liste 725 | International Women* Speaker Directory [ https://speakerinnen.org]( https://speakerinnen.org) 726 | [https://github.com/rubymonsters/speakerinnen_liste](https://github.com/rubymonsters/speakerinnen_liste) 727 | 728 | ### on_ruby 729 | :gem: :diamonds: Whitelabel Site for Ruby Communities [http://www.onruby.eu](http://www.onruby.eu) 730 | [https://github.com/phoet/on_ruby](https://github.com/phoet/on_ruby) 731 | 732 | ### action-center-platform 733 | The EFF Action Center Platform 734 | [https://github.com/EFForg/action-center-platform](https://github.com/EFForg/action-center-platform) 735 | 736 | ### heya 737 | Heya 👋 is a campaign mailer for Rails. Think of it like ActionMailer, but for timed email sequences. It can also perform other actions like sending a text message. [https://www.heya.email](https://www.heya.email) 738 | [https://github.com/honeybadger-io/heya](https://github.com/honeybadger-io/heya) 739 | 740 | ### mastodon 741 | Your self-hosted, globally interconnected microblogging community [https://joinmastodon.org](https://joinmastodon.org) 742 | [https://github.com/tootsuite/mastodon](https://github.com/tootsuite/mastodon) 743 | 744 | ### identity-idp 745 | Login.gov Core App: Identity Provider (IdP) [https://secure.login.gov/](https://secure.login.gov/) 746 | [https://github.com/18F/identity-idp](https://github.com/18F/identity-idp) 747 | 748 | ### upcase 749 | Sharpen your programming skills. [https://thoughtbot.com/upcase](https://thoughtbot.com/upcase) 750 | [https://github.com/thoughtbot/upcase](https://github.com/thoughtbot/upcase) 751 | 752 | ### pupilfirst 753 | A learning management system (LMS) that lets you run an asynchronous online school, where learning is achieved through focused tasks, directed feedback, an iterative workflow, and community interaction. [https://www.pupilfirst.com](https://www.pupilfirst.com) 754 | [https://github.com/pupilfirst/pupilfirst](https://github.com/pupilfirst/pupilfirst) 755 | 756 | ### ShinyCMS-ruby 757 | ShinyCMS is an open-source CMS built in Ruby on Rails, with support for themes, plugins, and cloud hosting. [https://shinycms.org](https://shinycms.org) 758 | [https://github.com/denny/ShinyCMS-ruby](https://github.com/denny/ShinyCMS-ruby) 759 | 760 | ### theodinproject 761 | Main Website for The Odin Project [http://www.theodinproject.com](http://www.theodinproject.com) 762 | [https://github.com/TheOdinProject/theodinproject](https://github.com/TheOdinProject/theodinproject) 763 | 764 | ### sail 765 | Sail is a lightweight Rails engine that brings an admin panel for managing configuration settings on a live Rails app 766 | [https://github.com/vinistock/sail](https://github.com/vinistock/sail) 767 | 768 | 769 | ## Moved/Missing/Deleted Repos 770 | TODO: check the repos below - moved, renamed or deleted? 771 | 772 | - https://github.com/jcs/lobsters 773 | - https://github.com/cantino/huginn 774 | - https://github.com/FlyoverWorks/storytime 775 | - https://github.com/pivotal/projectmonitor 776 | - https://github.com/thoughtbot/hound 777 | - https://github.com/fxn/rails-contributors 778 | - https://github.com/potomak/tomatoes 779 | - https://github.com/Netflix/Scumblr 780 | - https://github.com/girldevelopit/gdi-new-site 781 | - https://github.com/isotope11/xrono 782 | - https://github.com/alphagov/signonotron2 783 | - https://github.com/theodi/csvlint 784 | - https://github.com/ruby-china/ruby-china 785 | - https://github.com/hummingbird-me/hummingbird 786 | - https://github.com/andrew/contribulator 787 | - https://github.com/sunlightlabs/politwoops 788 | - https://github.com/ministryofjustice/atet 789 | - https://github.com/ministryofjustice/fr-staffapp 790 | - https://github.com/peterkeen/payola 791 | - https://github.com/julianguyen/ifme 792 | - https://github.com/benjaminayres/o_cms 793 | - https://github.com/projecthydra/browse-everything 794 | - https://github.com/kevinchandler/followr 795 | - https://github.com/atech/postal 796 | - https://github.com/samvera-labs/hyku 797 | - https://github.com/thepracticaldev/dev.to 798 | --------------------------------------------------------------------------------