← insidertrades.directory / built with rails

Initial Rails 8 project setup with RSpec testing framework

Jason Kotchoff committed on 2025-09-05 11:45:52 +1000 Β· commit 1e1937374ad480b3297fec98c18a9ce7185bdbbc

- Created insidertrades.directory Rails application
- Configured RSpec as testing library (replaced default Rails tests)
- Added RSpec gems and generated configuration files
- Tested application successfully with Playwright browser automation
- Verified Rails welcome page loads correctly in browser

πŸ€– Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
@@ -0,0 +1,51 @@
1+# See https://docs.docker.com/engine/reference/builder/#dockerignore-file for more about ignoring files.
2+
3+# Ignore git directory.
4+/.git/
5+/.gitignore
6+
7+# Ignore bundler config.
8+/.bundle
9+
10+# Ignore all environment files.
11+/.env*
12+
13+# Ignore all default key files.
14+/config/master.key
15+/config/credentials/*.key
16+
17+# Ignore all logfiles and tempfiles.
18+/log/*
19+/tmp/*
20+!/log/.keep
21+!/tmp/.keep
22+
23+# Ignore pidfiles, but keep the directory.
24+/tmp/pids/*
25+!/tmp/pids/.keep
26+
27+# Ignore storage (uploaded files in development and any SQLite databases).
28+/storage/*
29+!/storage/.keep
30+/tmp/storage/*
31+!/tmp/storage/.keep
32+
33+# Ignore assets.
34+/node_modules/
35+/app/assets/builds/*
36+!/app/assets/builds/.keep
37+/public/assets
38+
39+# Ignore CI service files.
40+/.github
41+
42+# Ignore Kamal files.
43+/config/deploy*.yml
44+/.kamal
45+
46+# Ignore development files
47+/.devcontainer
48+
49+# Ignore Docker-related files
50+/.dockerignore
51+/Dockerfile*
@@ -0,0 +1,9 @@
1+# See https://git-scm.com/docs/gitattributes for more about git attribute files.
2+
3+# Mark the database schema as having been generated.
4+db/schema.rb linguist-generated
5+
6+# Mark any vendored files as having been vendored.
7+vendor/* linguist-vendored
8+config/credentials/*.yml.enc diff=rails_credentials
9+config/credentials.yml.enc diff=rails_credentials
@@ -0,0 +1,12 @@
1+version: 2
2+updates:
3+- package-ecosystem: bundler
4+ directory: "/"
5+ schedule:
6+ interval: daily
7+ open-pull-requests-limit: 10
8+- package-ecosystem: github-actions
9+ directory: "/"
10+ schedule:
11+ interval: daily
12+ open-pull-requests-limit: 10
@@ -0,0 +1,55 @@
1+name: CI
2+
3+on:
4+ pull_request:
5+ push:
6+ branches: [ main ]
7+
8+jobs:
9+ scan_ruby:
10+ runs-on: ubuntu-latest
11+
12+ steps:
13+ - name: Checkout code
14+ uses: actions/checkout@v4
15+
16+ - name: Set up Ruby
17+ uses: ruby/setup-ruby@v1
18+ with:
19+ ruby-version: .ruby-version
20+ bundler-cache: true
21+
22+ - name: Scan for common Rails security vulnerabilities using static analysis
23+ run: bin/brakeman --no-pager
24+
25+ scan_js:
26+ runs-on: ubuntu-latest
27+
28+ steps:
29+ - name: Checkout code
30+ uses: actions/checkout@v4
31+
32+ - name: Set up Ruby
33+ uses: ruby/setup-ruby@v1
34+ with:
35+ ruby-version: .ruby-version
36+ bundler-cache: true
37+
38+ - name: Scan for security vulnerabilities in JavaScript dependencies
39+ run: bin/importmap audit
40+
41+ lint:
42+ runs-on: ubuntu-latest
43+ steps:
44+ - name: Checkout code
45+ uses: actions/checkout@v4
46+
47+ - name: Set up Ruby
48+ uses: ruby/setup-ruby@v1
49+ with:
50+ ruby-version: .ruby-version
51+ bundler-cache: true
52+
53+ - name: Lint code for consistent style
54+ run: bin/rubocop -f github
55+
@@ -0,0 +1,34 @@
1+# See https://help.github.com/articles/ignoring-files for more about ignoring files.
2+#
3+# Temporary files generated by your text editor or operating system
4+# belong in git's global ignore instead:
5+# `$XDG_CONFIG_HOME/git/ignore` or `~/.config/git/ignore`
6+
7+# Ignore bundler config.
8+/.bundle
9+
10+# Ignore all environment files.
11+/.env*
12+
13+# Ignore all logfiles and tempfiles.
14+/log/*
15+/tmp/*
16+!/log/.keep
17+!/tmp/.keep
18+
19+# Ignore pidfiles, but keep the directory.
20+/tmp/pids/*
21+!/tmp/pids/
22+!/tmp/pids/.keep
23+
24+# Ignore storage (uploaded files in development and any SQLite databases).
25+/storage/*
26+!/storage/.keep
27+/tmp/storage/*
28+!/tmp/storage/
29+!/tmp/storage/.keep
30+
31+/public/assets
32+
33+# Ignore master key for decrypting credentials and more.
34+/config/master.key
@@ -0,0 +1,3 @@
1+#!/bin/sh
2+
3+echo "Docker set up on $KAMAL_HOSTS..."
@@ -0,0 +1,3 @@
1+#!/bin/sh
2+
3+echo "Booted app version $KAMAL_VERSION on $KAMAL_HOSTS..."
@@ -0,0 +1,14 @@
1+#!/bin/sh
2+
3+# A sample post-deploy hook
4+#
5+# These environment variables are available:
6+# KAMAL_RECORDED_AT
7+# KAMAL_PERFORMER
8+# KAMAL_VERSION
9+# KAMAL_HOSTS
10+# KAMAL_ROLES (if set)
11+# KAMAL_DESTINATION (if set)
12+# KAMAL_RUNTIME
13+
14+echo "$KAMAL_PERFORMER deployed $KAMAL_VERSION to $KAMAL_DESTINATION in $KAMAL_RUNTIME seconds"
@@ -0,0 +1,3 @@
1+#!/bin/sh
2+
3+echo "Rebooted kamal-proxy on $KAMAL_HOSTS"
@@ -0,0 +1,3 @@
1+#!/bin/sh
2+
3+echo "Booting app version $KAMAL_VERSION on $KAMAL_HOSTS..."
@@ -0,0 +1,51 @@
1+#!/bin/sh
2+
3+# A sample pre-build hook
4+#
5+# Checks:
6+# 1. We have a clean checkout
7+# 2. A remote is configured
8+# 3. The branch has been pushed to the remote
9+# 4. The version we are deploying matches the remote
10+#
11+# These environment variables are available:
12+# KAMAL_RECORDED_AT
13+# KAMAL_PERFORMER
14+# KAMAL_VERSION
15+# KAMAL_HOSTS
16+# KAMAL_ROLES (if set)
17+# KAMAL_DESTINATION (if set)
18+
19+if [ -n "$(git status --porcelain)" ]; then
20+ echo "Git checkout is not clean, aborting..." >&2
21+ git status --porcelain >&2
22+ exit 1
23+fi
24+
25+first_remote=$(git remote)
26+
27+if [ -z "$first_remote" ]; then
28+ echo "No git remote set, aborting..." >&2
29+ exit 1
30+fi
31+
32+current_branch=$(git branch --show-current)
33+
34+if [ -z "$current_branch" ]; then
35+ echo "Not on a git branch, aborting..." >&2
36+ exit 1
37+fi
38+
39+remote_head=$(git ls-remote $first_remote --tags $current_branch | cut -f1)
40+
41+if [ -z "$remote_head" ]; then
42+ echo "Branch not pushed to remote, aborting..." >&2
43+ exit 1
44+fi
45+
46+if [ "$KAMAL_VERSION" != "$remote_head" ]; then
47+ echo "Version ($KAMAL_VERSION) does not match remote HEAD ($remote_head), aborting..." >&2
48+ exit 1
49+fi
50+
51+exit 0
@@ -0,0 +1,47 @@
1+#!/usr/bin/env ruby
2+
3+# A sample pre-connect check
4+#
5+# Warms DNS before connecting to hosts in parallel
6+#
7+# These environment variables are available:
8+# KAMAL_RECORDED_AT
9+# KAMAL_PERFORMER
10+# KAMAL_VERSION
11+# KAMAL_HOSTS
12+# KAMAL_ROLES (if set)
13+# KAMAL_DESTINATION (if set)
14+# KAMAL_RUNTIME
15+
16+hosts = ENV["KAMAL_HOSTS"].split(",")
17+results = nil
18+max = 3
19+
20+elapsed = Benchmark.realtime do
21+ results = hosts.map do |host|
22+ Thread.new do
23+ tries = 1
24+
25+ begin
26+ Socket.getaddrinfo(host, 0, Socket::AF_UNSPEC, Socket::SOCK_STREAM, nil, Socket::AI_CANONNAME)
27+ rescue SocketError
28+ if tries < max
29+ puts "Retrying DNS warmup: #{host}"
30+ tries += 1
31+ sleep rand
32+ retry
33+ else
34+ puts "DNS warmup failed: #{host}"
35+ host
36+ end
37+ end
38+
39+ tries
40+ end
41+ end.map(&:value)
42+end
43+
44+retries = results.sum - hosts.size
45+nopes = results.count { |r| r == max }
46+
47+puts "Prewarmed %d DNS lookups in %.2f sec: %d retries, %d failures" % [ hosts.size, elapsed, retries, nopes ]
@@ -0,0 +1,122 @@
1+#!/usr/bin/env ruby
2+
3+# A sample pre-deploy hook
4+#
5+# Checks the Github status of the build, waiting for a pending build to complete for up to 720 seconds.
6+#
7+# Fails unless the combined status is "success"
8+#
9+# These environment variables are available:
10+# KAMAL_RECORDED_AT
11+# KAMAL_PERFORMER
12+# KAMAL_VERSION
13+# KAMAL_HOSTS
14+# KAMAL_COMMAND
15+# KAMAL_SUBCOMMAND
16+# KAMAL_ROLES (if set)
17+# KAMAL_DESTINATION (if set)
18+
19+# Only check the build status for production deployments
20+if ENV["KAMAL_COMMAND"] == "rollback" || ENV["KAMAL_DESTINATION"] != "production"
21+ exit 0
22+end
23+
24+require "bundler/inline"
25+
26+# true = install gems so this is fast on repeat invocations
27+gemfile(true, quiet: true) do
28+ source "https://rubygems.org"
29+
30+ gem "octokit"
31+ gem "faraday-retry"
32+end
33+
34+MAX_ATTEMPTS = 72
35+ATTEMPTS_GAP = 10
36+
37+def exit_with_error(message)
38+ $stderr.puts message
39+ exit 1
40+end
41+
42+class GithubStatusChecks
43+ attr_reader :remote_url, :git_sha, :github_client, :combined_status
44+
45+ def initialize
46+ @remote_url = github_repo_from_remote_url
47+ @git_sha = `git rev-parse HEAD`.strip
48+ @github_client = Octokit::Client.new(access_token: ENV["GITHUB_TOKEN"])
49+ refresh!
50+ end
51+
52+ def refresh!
53+ @combined_status = github_client.combined_status(remote_url, git_sha)
54+ end
55+
56+ def state
57+ combined_status[:state]
58+ end
59+
60+ def first_status_url
61+ first_status = combined_status[:statuses].find { |status| status[:state] == state }
62+ first_status && first_status[:target_url]
63+ end
64+
65+ def complete_count
66+ combined_status[:statuses].count { |status| status[:state] != "pending"}
67+ end
68+
69+ def total_count
70+ combined_status[:statuses].count
71+ end
72+
73+ def current_status
74+ if total_count > 0
75+ "Completed #{complete_count}/#{total_count} checks, see #{first_status_url} ..."
76+ else
77+ "Build not started..."
78+ end
79+ end
80+
81+ private
82+ def github_repo_from_remote_url
83+ url = `git config --get remote.origin.url`.strip.delete_suffix(".git")
84+ if url.start_with?("https://github.com/")
85+ url.delete_prefix("https://github.com/")
86+ elsif url.start_with?("git@github.com:")
87+ url.delete_prefix("git@github.com:")
88+ else
89+ url
90+ end
91+ end
92+end
93+
94+
95+$stdout.sync = true
96+
97+begin
98+ puts "Checking build status..."
99+
100+ attempts = 0
101+ checks = GithubStatusChecks.new
102+
103+ loop do
104+ case checks.state
105+ when "success"
106+ puts "Checks passed, see #{checks.first_status_url}"
107+ exit 0
108+ when "failure"
109+ exit_with_error "Checks failed, see #{checks.first_status_url}"
110+ when "pending"
111+ attempts += 1
112+ end
113+
114+ exit_with_error "Checks are still pending, gave up after #{MAX_ATTEMPTS * ATTEMPTS_GAP} seconds" if attempts == MAX_ATTEMPTS
115+
116+ puts checks.current_status
117+ sleep(ATTEMPTS_GAP)
118+ checks.refresh!
119+ end
120+rescue Octokit::NotFound
121+ exit_with_error "Build status could not be found"
122+end
@@ -0,0 +1,3 @@
1+#!/bin/sh
2+
3+echo "Rebooting kamal-proxy on $KAMAL_HOSTS..."
@@ -0,0 +1,17 @@
1+# Secrets defined here are available for reference under registry/password, env/secret, builder/secrets,
2+# and accessories/*/env/secret in config/deploy.yml. All secrets should be pulled from either
3+# password manager, ENV, or a file. DO NOT ENTER RAW CREDENTIALS HERE! This file needs to be safe for git.
4+
5+# Example of extracting secrets from 1password (or another compatible pw manager)
6+# SECRETS=$(kamal secrets fetch --adapter 1password --account your-account --from Vault/Item KAMAL_REGISTRY_PASSWORD RAILS_MASTER_KEY)
7+# KAMAL_REGISTRY_PASSWORD=$(kamal secrets extract KAMAL_REGISTRY_PASSWORD ${SECRETS})
8+# RAILS_MASTER_KEY=$(kamal secrets extract RAILS_MASTER_KEY ${SECRETS})
9+
10+# Use a GITHUB_TOKEN if private repositories are needed for the image
11+# GITHUB_TOKEN=$(gh config get -h github.com oauth_token)
12+
13+# Grab the registry password from ENV
14+KAMAL_REGISTRY_PASSWORD=$KAMAL_REGISTRY_PASSWORD
15+
16+# Improve security by using a password manager. Never check config/master.key into git!
17+RAILS_MASTER_KEY=$(cat config/master.key)
@@ -0,0 +1 @@
1+--require spec_helper
@@ -0,0 +1,8 @@
1+# Omakase Ruby styling for Rails
2+inherit_gem: { rubocop-rails-omakase: rubocop.yml }
3+
4+# Overwrite or add rules to create your own house style
5+#
6+# # Use `[a, [b, c]]` not `[ a, [ b, c ] ]`
7+# Layout/SpaceInsideArrayLiteralBrackets:
8+# Enabled: false
@@ -0,0 +1 @@
1+ruby-3.4.1
@@ -0,0 +1,72 @@
1+# syntax=docker/dockerfile:1
2+# check=error=true
3+
4+# This Dockerfile is designed for production, not development. Use with Kamal or build'n'run by hand:
5+# docker build -t insidertrades_directory .
6+# docker run -d -p 80:80 -e RAILS_MASTER_KEY=<value from config/master.key> --name insidertrades_directory insidertrades_directory
7+
8+# For a containerized dev environment, see Dev Containers: https://guides.rubyonrails.org/getting_started_with_devcontainer.html
9+
10+# Make sure RUBY_VERSION matches the Ruby version in .ruby-version
11+ARG RUBY_VERSION=3.4.1
12+FROM docker.io/library/ruby:$RUBY_VERSION-slim AS base
13+
14+# Rails app lives here
15+WORKDIR /rails
16+
17+# Install base packages
18+RUN apt-get update -qq && \
19+ apt-get install --no-install-recommends -y curl libjemalloc2 libvips sqlite3 && \
20+ rm -rf /var/lib/apt/lists /var/cache/apt/archives
21+
22+# Set production environment
23+ENV RAILS_ENV="production" \
24+ BUNDLE_DEPLOYMENT="1" \
25+ BUNDLE_PATH="/usr/local/bundle" \
26+ BUNDLE_WITHOUT="development"
27+
28+# Throw-away build stage to reduce size of final image
29+FROM base AS build
30+
31+# Install packages needed to build gems
32+RUN apt-get update -qq && \
33+ apt-get install --no-install-recommends -y build-essential git libyaml-dev pkg-config && \
34+ rm -rf /var/lib/apt/lists /var/cache/apt/archives
35+
36+# Install application gems
37+COPY Gemfile Gemfile.lock ./
38+RUN bundle install && \
39+ rm -rf ~/.bundle/ "${BUNDLE_PATH}"/ruby/*/cache "${BUNDLE_PATH}"/ruby/*/bundler/gems/*/.git && \
40+ bundle exec bootsnap precompile --gemfile
41+
42+# Copy application code
43+COPY . .
44+
45+# Precompile bootsnap code for faster boot times
46+RUN bundle exec bootsnap precompile app/ lib/
47+
48+# Precompiling assets for production without requiring secret RAILS_MASTER_KEY
49+RUN SECRET_KEY_BASE_DUMMY=1 ./bin/rails assets:precompile
50+
51+
52+
53+
54+# Final stage for app image
55+FROM base
56+
57+# Copy built artifacts: gems, application
58+COPY --from=build "${BUNDLE_PATH}" "${BUNDLE_PATH}"
59+COPY --from=build /rails /rails
60+
61+# Run and own only the runtime files as a non-root user for security
62+RUN groupadd --system --gid 1000 rails && \
63+ useradd rails --uid 1000 --gid 1000 --create-home --shell /bin/bash && \
64+ chown -R rails:rails db log storage tmp
65+USER 1000:1000
66+
67+# Entrypoint prepares the database.
68+ENTRYPOINT ["/rails/bin/docker-entrypoint"]
69+
70+# Start server via Thruster by default, this can be overwritten at runtime
71+EXPOSE 80
72+CMD ["./bin/thrust", "./bin/rails", "server"]
@@ -0,0 +1,60 @@
1+source "https://rubygems.org"
2+
3+# Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main"
4+gem "rails", "~> 8.0.2", ">= 8.0.2.1"
5+# The modern asset pipeline for Rails [https://github.com/rails/propshaft]
6+gem "propshaft"
7+# Use sqlite3 as the database for Active Record
8+gem "sqlite3", ">= 2.1"
9+# Use the Puma web server [https://github.com/puma/puma]
10+gem "puma", ">= 5.0"
11+# Use JavaScript with ESM import maps [https://github.com/rails/importmap-rails]
12+gem "importmap-rails"
13+# Hotwire's SPA-like page accelerator [https://turbo.hotwired.dev]
14+gem "turbo-rails"
15+# Hotwire's modest JavaScript framework [https://stimulus.hotwired.dev]
16+gem "stimulus-rails"
17+# Build JSON APIs with ease [https://github.com/rails/jbuilder]
18+gem "jbuilder"
19+
20+# Use Active Model has_secure_password [https://guides.rubyonrails.org/active_model_basics.html#securepassword]
21+# gem "bcrypt", "~> 3.1.7"
22+
23+# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
24+gem "tzinfo-data", platforms: %i[ windows jruby ]
25+
26+# Use the database-backed adapters for Rails.cache, Active Job, and Action Cable
27+gem "solid_cache"
28+gem "solid_queue"
29+gem "solid_cable"
30+
31+# Reduces boot times through caching; required in config/boot.rb
32+gem "bootsnap", require: false
33+
34+# Deploy this application anywhere as a Docker container [https://kamal-deploy.org]
35+gem "kamal", require: false
36+
37+# Add HTTP asset caching/compression and X-Sendfile acceleration to Puma [https://github.com/basecamp/thruster/]
38+gem "thruster", require: false
39+
40+# Use Active Storage variants [https://guides.rubyonrails.org/active_storage_overview.html#transforming-images]
41+# gem "image_processing", "~> 1.2"
42+
43+group :development, :test do
44+ # See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem
45+ gem "debug", platforms: %i[ mri windows ], require: "debug/prelude"
46+
47+ # Static analysis for security vulnerabilities [https://brakemanscanner.org/]
48+ gem "brakeman", require: false
49+
50+ # Omakase Ruby styling [https://github.com/rails/rubocop-rails-omakase/]
51+ gem "rubocop-rails-omakase", require: false
52+
53+ # RSpec testing framework
54+ gem "rspec-rails"
55+end
56+
57+group :development do
58+ # Use console on exceptions pages [https://github.com/rails/web-console]
59+ gem "web-console"
60+end
@@ -0,0 +1,382 @@
1+GEM
2+ remote: https://rubygems.org/
3+ specs:
4+ actioncable (8.0.2.1)
5+ actionpack (= 8.0.2.1)
6+ activesupport (= 8.0.2.1)
7+ nio4r (~> 2.0)
8+ websocket-driver (>= 0.6.1)
9+ zeitwerk (~> 2.6)
10+ actionmailbox (8.0.2.1)
11+ actionpack (= 8.0.2.1)
12+ activejob (= 8.0.2.1)
13+ activerecord (= 8.0.2.1)
14+ activestorage (= 8.0.2.1)
15+ activesupport (= 8.0.2.1)
16+ mail (>= 2.8.0)
17+ actionmailer (8.0.2.1)
18+ actionpack (= 8.0.2.1)
19+ actionview (= 8.0.2.1)
20+ activejob (= 8.0.2.1)
21+ activesupport (= 8.0.2.1)
22+ mail (>= 2.8.0)
23+ rails-dom-testing (~> 2.2)
24+ actionpack (8.0.2.1)
25+ actionview (= 8.0.2.1)
26+ activesupport (= 8.0.2.1)
27+ nokogiri (>= 1.8.5)
28+ rack (>= 2.2.4)
29+ rack-session (>= 1.0.1)
30+ rack-test (>= 0.6.3)
31+ rails-dom-testing (~> 2.2)
32+ rails-html-sanitizer (~> 1.6)
33+ useragent (~> 0.16)
34+ actiontext (8.0.2.1)
35+ actionpack (= 8.0.2.1)
36+ activerecord (= 8.0.2.1)
37+ activestorage (= 8.0.2.1)
38+ activesupport (= 8.0.2.1)
39+ globalid (>= 0.6.0)
40+ nokogiri (>= 1.8.5)
41+ actionview (8.0.2.1)
42+ activesupport (= 8.0.2.1)
43+ builder (~> 3.1)
44+ erubi (~> 1.11)
45+ rails-dom-testing (~> 2.2)
46+ rails-html-sanitizer (~> 1.6)
47+ activejob (8.0.2.1)
48+ activesupport (= 8.0.2.1)
49+ globalid (>= 0.3.6)
50+ activemodel (8.0.2.1)
51+ activesupport (= 8.0.2.1)
52+ activerecord (8.0.2.1)
53+ activemodel (= 8.0.2.1)
54+ activesupport (= 8.0.2.1)
55+ timeout (>= 0.4.0)
56+ activestorage (8.0.2.1)
57+ actionpack (= 8.0.2.1)
58+ activejob (= 8.0.2.1)
59+ activerecord (= 8.0.2.1)
60+ activesupport (= 8.0.2.1)
61+ marcel (~> 1.0)
62+ activesupport (8.0.2.1)
63+ base64
64+ benchmark (>= 0.3)
65+ bigdecimal
66+ concurrent-ruby (~> 1.0, >= 1.3.1)
67+ connection_pool (>= 2.2.5)
68+ drb
69+ i18n (>= 1.6, < 2)
70+ logger (>= 1.4.2)
71+ minitest (>= 5.1)
72+ securerandom (>= 0.3)
73+ tzinfo (~> 2.0, >= 2.0.5)
74+ uri (>= 0.13.1)
75+ ast (2.4.3)
76+ base64 (0.3.0)
77+ bcrypt_pbkdf (1.1.1)
78+ benchmark (0.4.1)
79+ bigdecimal (3.2.3)
80+ bindex (0.8.1)
81+ bootsnap (1.18.6)
82+ msgpack (~> 1.2)
83+ brakeman (7.1.0)
84+ racc
85+ builder (3.3.0)
86+ concurrent-ruby (1.3.5)
87+ connection_pool (2.5.4)
88+ crass (1.0.6)
89+ date (3.4.1)
90+ debug (1.11.0)
91+ irb (~> 1.10)
92+ reline (>= 0.3.8)
93+ diff-lcs (1.6.2)
94+ dotenv (3.1.8)
95+ drb (2.2.3)
96+ ed25519 (1.4.0)
97+ erb (5.0.2)
98+ erubi (1.13.1)
99+ et-orbi (1.3.0)
100+ tzinfo
101+ fugit (1.11.2)
102+ et-orbi (~> 1, >= 1.2.11)
103+ raabro (~> 1.4)
104+ globalid (1.2.1)
105+ activesupport (>= 6.1)
106+ i18n (1.14.7)
107+ concurrent-ruby (~> 1.0)
108+ importmap-rails (2.2.2)
109+ actionpack (>= 6.0.0)
110+ activesupport (>= 6.0.0)
111+ railties (>= 6.0.0)
112+ io-console (0.8.1)
113+ irb (1.15.2)
114+ pp (>= 0.6.0)
115+ rdoc (>= 4.0.0)
116+ reline (>= 0.4.2)
117+ jbuilder (2.14.1)
118+ actionview (>= 7.0.0)
119+ activesupport (>= 7.0.0)
120+ json (2.13.2)
121+ kamal (2.7.0)
122+ activesupport (>= 7.0)
123+ base64 (~> 0.2)
124+ bcrypt_pbkdf (~> 1.0)
125+ concurrent-ruby (~> 1.2)
126+ dotenv (~> 3.1)
127+ ed25519 (~> 1.4)
128+ net-ssh (~> 7.3)
129+ sshkit (>= 1.23.0, < 2.0)
130+ thor (~> 1.3)
131+ zeitwerk (>= 2.6.18, < 3.0)
132+ language_server-protocol (3.17.0.5)
133+ lint_roller (1.1.0)
134+ logger (1.7.0)
135+ loofah (2.24.1)
136+ crass (~> 1.0.2)
137+ nokogiri (>= 1.12.0)
138+ mail (2.8.1)
139+ mini_mime (>= 0.1.1)
140+ net-imap
141+ net-pop
142+ net-smtp
143+ marcel (1.0.4)
144+ mini_mime (1.1.5)
145+ minitest (5.25.5)
146+ msgpack (1.8.0)
147+ net-imap (0.5.10)
148+ date
149+ net-protocol
150+ net-pop (0.1.2)
151+ net-protocol
152+ net-protocol (0.2.2)
153+ timeout
154+ net-scp (4.1.0)
155+ net-ssh (>= 2.6.5, < 8.0.0)
156+ net-sftp (4.0.0)
157+ net-ssh (>= 5.0.0, < 8.0.0)
158+ net-smtp (0.5.1)
159+ net-protocol
160+ net-ssh (7.3.0)
161+ nio4r (2.7.4)
162+ nokogiri (1.18.9-aarch64-linux-gnu)
163+ racc (~> 1.4)
164+ nokogiri (1.18.9-aarch64-linux-musl)
165+ racc (~> 1.4)
166+ nokogiri (1.18.9-arm-linux-gnu)
167+ racc (~> 1.4)
168+ nokogiri (1.18.9-arm-linux-musl)
169+ racc (~> 1.4)
170+ nokogiri (1.18.9-arm64-darwin)
171+ racc (~> 1.4)
172+ nokogiri (1.18.9-x86_64-linux-gnu)
173+ racc (~> 1.4)
174+ nokogiri (1.18.9-x86_64-linux-musl)
175+ racc (~> 1.4)
176+ ostruct (0.6.3)
177+ parallel (1.27.0)
178+ parser (3.3.9.0)
179+ ast (~> 2.4.1)
180+ racc
181+ pp (0.6.2)
182+ prettyprint
183+ prettyprint (0.2.0)
184+ prism (1.4.0)
185+ propshaft (1.2.1)
186+ actionpack (>= 7.0.0)
187+ activesupport (>= 7.0.0)
188+ rack
189+ psych (5.2.6)
190+ date
191+ stringio
192+ puma (7.0.0)
193+ nio4r (~> 2.0)
194+ raabro (1.4.0)
195+ racc (1.8.1)
196+ rack (3.2.1)
197+ rack-session (2.1.1)
198+ base64 (>= 0.1.0)
199+ rack (>= 3.0.0)
200+ rack-test (2.2.0)
201+ rack (>= 1.3)
202+ rackup (2.2.1)
203+ rack (>= 3)
204+ rails (8.0.2.1)
205+ actioncable (= 8.0.2.1)
206+ actionmailbox (= 8.0.2.1)
207+ actionmailer (= 8.0.2.1)
208+ actionpack (= 8.0.2.1)
209+ actiontext (= 8.0.2.1)
210+ actionview (= 8.0.2.1)
211+ activejob (= 8.0.2.1)
212+ activemodel (= 8.0.2.1)
213+ activerecord (= 8.0.2.1)
214+ activestorage (= 8.0.2.1)
215+ activesupport (= 8.0.2.1)
216+ bundler (>= 1.15.0)
217+ railties (= 8.0.2.1)
218+ rails-dom-testing (2.3.0)
219+ activesupport (>= 5.0.0)
220+ minitest
221+ nokogiri (>= 1.6)
222+ rails-html-sanitizer (1.6.2)
223+ loofah (~> 2.21)
224+ nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
225+ railties (8.0.2.1)
226+ actionpack (= 8.0.2.1)
227+ activesupport (= 8.0.2.1)
228+ irb (~> 1.13)
229+ rackup (>= 1.0.0)
230+ rake (>= 12.2)
231+ thor (~> 1.0, >= 1.2.2)
232+ zeitwerk (~> 2.6)
233+ rainbow (3.1.1)
234+ rake (13.3.0)
235+ rdoc (6.14.2)
236+ erb
237+ psych (>= 4.0.0)
238+ regexp_parser (2.11.2)
239+ reline (0.6.2)
240+ io-console (~> 0.5)
241+ rspec-core (3.13.5)
242+ rspec-support (~> 3.13.0)
243+ rspec-expectations (3.13.5)
244+ diff-lcs (>= 1.2.0, < 2.0)
245+ rspec-support (~> 3.13.0)
246+ rspec-mocks (3.13.5)
247+ diff-lcs (>= 1.2.0, < 2.0)
248+ rspec-support (~> 3.13.0)
249+ rspec-rails (8.0.2)
250+ actionpack (>= 7.2)
251+ activesupport (>= 7.2)
252+ railties (>= 7.2)
253+ rspec-core (~> 3.13)
254+ rspec-expectations (~> 3.13)
255+ rspec-mocks (~> 3.13)
256+ rspec-support (~> 3.13)
257+ rspec-support (3.13.5)
258+ rubocop (1.80.2)
259+ json (~> 2.3)
260+ language_server-protocol (~> 3.17.0.2)
261+ lint_roller (~> 1.1.0)
262+ parallel (~> 1.10)
263+ parser (>= 3.3.0.2)
264+ rainbow (>= 2.2.2, < 4.0)
265+ regexp_parser (>= 2.9.3, < 3.0)
266+ rubocop-ast (>= 1.46.0, < 2.0)
267+ ruby-progressbar (~> 1.7)
268+ unicode-display_width (>= 2.4.0, < 4.0)
269+ rubocop-ast (1.46.0)
270+ parser (>= 3.3.7.2)
271+ prism (~> 1.4)
272+ rubocop-performance (1.25.0)
273+ lint_roller (~> 1.1)
274+ rubocop (>= 1.75.0, < 2.0)
275+ rubocop-ast (>= 1.38.0, < 2.0)
276+ rubocop-rails (2.33.3)
277+ activesupport (>= 4.2.0)
278+ lint_roller (~> 1.1)
279+ rack (>= 1.1)
280+ rubocop (>= 1.75.0, < 2.0)
281+ rubocop-ast (>= 1.44.0, < 2.0)
282+ rubocop-rails-omakase (1.1.0)
283+ rubocop (>= 1.72)
284+ rubocop-performance (>= 1.24)
285+ rubocop-rails (>= 2.30)
286+ ruby-progressbar (1.13.0)
287+ securerandom (0.4.1)
288+ solid_cable (3.0.12)
289+ actioncable (>= 7.2)
290+ activejob (>= 7.2)
291+ activerecord (>= 7.2)
292+ railties (>= 7.2)
293+ solid_cache (1.0.7)
294+ activejob (>= 7.2)
295+ activerecord (>= 7.2)
296+ railties (>= 7.2)
297+ solid_queue (1.2.1)
298+ activejob (>= 7.1)
299+ activerecord (>= 7.1)
300+ concurrent-ruby (>= 1.3.1)
301+ fugit (~> 1.11.0)
302+ railties (>= 7.1)
303+ thor (>= 1.3.1)
304+ sqlite3 (2.7.3-aarch64-linux-gnu)
305+ sqlite3 (2.7.3-aarch64-linux-musl)
306+ sqlite3 (2.7.3-arm-linux-gnu)
307+ sqlite3 (2.7.3-arm-linux-musl)
308+ sqlite3 (2.7.3-arm64-darwin)
309+ sqlite3 (2.7.3-x86_64-linux-gnu)
310+ sqlite3 (2.7.3-x86_64-linux-musl)
311+ sshkit (1.24.0)
312+ base64
313+ logger
314+ net-scp (>= 1.1.2)
315+ net-sftp (>= 2.1.2)
316+ net-ssh (>= 2.8.0)
317+ ostruct
318+ stimulus-rails (1.3.4)
319+ railties (>= 6.0.0)
320+ stringio (3.1.7)
321+ thor (1.4.0)
322+ thruster (0.1.15)
323+ thruster (0.1.15-aarch64-linux)
324+ thruster (0.1.15-arm64-darwin)
325+ thruster (0.1.15-x86_64-linux)
326+ timeout (0.4.3)
327+ turbo-rails (2.0.16)
328+ actionpack (>= 7.1.0)
329+ railties (>= 7.1.0)
330+ tzinfo (2.0.6)
331+ concurrent-ruby (~> 1.0)
332+ unicode-display_width (3.1.5)
333+ unicode-emoji (~> 4.0, >= 4.0.4)
334+ unicode-emoji (4.0.4)
335+ uri (1.0.3)
336+ useragent (0.16.11)
337+ web-console (4.2.1)
338+ actionview (>= 6.0.0)
339+ activemodel (>= 6.0.0)
340+ bindex (>= 0.4.0)
341+ railties (>= 6.0.0)
342+ websocket-driver (0.8.0)
343+ base64
344+ websocket-extensions (>= 0.1.0)
345+ websocket-extensions (0.1.5)
346+ zeitwerk (2.7.3)
347+
348+PLATFORMS
349+ aarch64-linux
350+ aarch64-linux-gnu
351+ aarch64-linux-musl
352+ arm-linux-gnu
353+ arm-linux-musl
354+ arm64-darwin-24
355+ x86_64-linux
356+ x86_64-linux-gnu
357+ x86_64-linux-musl
358+
359+DEPENDENCIES
360+ bootsnap
361+ brakeman
362+ debug
363+ importmap-rails
364+ jbuilder
365+ kamal
366+ propshaft
367+ puma (>= 5.0)
368+ rails (~> 8.0.2, >= 8.0.2.1)
369+ rspec-rails
370+ rubocop-rails-omakase
371+ solid_cable
372+ solid_cache
373+ solid_queue
374+ sqlite3 (>= 2.1)
375+ stimulus-rails
376+ thruster
377+ turbo-rails
378+ tzinfo-data
379+ web-console
380+
381+BUNDLED WITH
382+ 2.6.3
@@ -0,0 +1,24 @@
1+# README
2+
3+This README would normally document whatever steps are necessary to get the
4+application up and running.
5+
6+Things you may want to cover:
7+
8+* Ruby version
9+
10+* System dependencies
11+
12+* Configuration
13+
14+* Database creation
15+
16+* Database initialization
17+
18+* How to run the test suite
19+
20+* Services (job queues, cache servers, search engines, etc.)
21+
22+* Deployment instructions
23+
24+* ...
@@ -0,0 +1,6 @@
1+# Add your own tasks in files placed in lib/tasks ending in .rake,
2+# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3+
4+require_relative "config/application"
5+
6+Rails.application.load_tasks
@@ -0,0 +1,10 @@
1+/*
2+ * This is a manifest file that'll be compiled into application.css.
3+ *
4+ * With Propshaft, assets are served efficiently without preprocessing steps. You can still include
5+ * application-wide styles in this file, but keep in mind that CSS precedence will follow the standard
6+ * cascading order, meaning styles declared later in the document or manifest will override earlier ones,
7+ * depending on specificity.
8+ *
9+ * Consider organizing styles into separate files for maintainability.
10+ */
@@ -0,0 +1,4 @@
1+class ApplicationController < ActionController::Base
2+ # Only allow modern browsers supporting webp images, web push, badges, import maps, CSS nesting, and CSS :has.
3+ allow_browser versions: :modern
4+end
@@ -0,0 +1,2 @@
1+module ApplicationHelper
2+end
@@ -0,0 +1,3 @@
1+// Configure your import map in config/importmap.rb. Read more: https://github.com/rails/importmap-rails
2+import "@hotwired/turbo-rails"
3+import "controllers"
@@ -0,0 +1,9 @@
1+import { Application } from "@hotwired/stimulus"
2+
3+const application = Application.start()
4+
5+// Configure Stimulus development experience
6+application.debug = false
7+window.Stimulus = application
8+
9+export { application }
@@ -0,0 +1,7 @@
1+import { Controller } from "@hotwired/stimulus"
2+
3+export default class extends Controller {
4+ connect() {
5+ this.element.textContent = "Hello World!"
6+ }
7+}
@@ -0,0 +1,4 @@
1+// Import and register all your controllers from the importmap via controllers/**/*_controller
2+import { application } from "controllers/application"
3+import { eagerLoadControllersFrom } from "@hotwired/stimulus-loading"
4+eagerLoadControllersFrom("controllers", application)
@@ -0,0 +1,7 @@
1+class ApplicationJob < ActiveJob::Base
2+ # Automatically retry jobs that encountered a deadlock
3+ # retry_on ActiveRecord::Deadlocked
4+
5+ # Most jobs are safe to ignore if the underlying records are no longer available
6+ # discard_on ActiveJob::DeserializationError
7+end
@@ -0,0 +1,4 @@
1+class ApplicationMailer < ActionMailer::Base
2+ default from: "from@example.com"
3+ layout "mailer"
4+end
@@ -0,0 +1,3 @@
1+class ApplicationRecord < ActiveRecord::Base
2+ primary_abstract_class
3+end
@@ -0,0 +1,28 @@
1+<!DOCTYPE html>
2+<html>
3+ <head>
4+ <title><%= content_for(:title) || "Insidertrades Directory" %></title>
5+ <meta name="viewport" content="width=device-width,initial-scale=1">
6+ <meta name="apple-mobile-web-app-capable" content="yes">
7+ <meta name="mobile-web-app-capable" content="yes">
8+ <%= csrf_meta_tags %>
9+ <%= csp_meta_tag %>
10+
11+ <%= yield :head %>
12+
13+ <%# Enable PWA manifest for installable apps (make sure to enable in config/routes.rb too!) %>
14+ <%#= tag.link rel: "manifest", href: pwa_manifest_path(format: :json) %>
15+
16+ <link rel="icon" href="/icon.png" type="image/png">
17+ <link rel="icon" href="/icon.svg" type="image/svg+xml">
18+ <link rel="apple-touch-icon" href="/icon.png">
19+
20+ <%# Includes all stylesheet files in app/assets/stylesheets %>
21+ <%= stylesheet_link_tag :app, "data-turbo-track": "reload" %>
22+ <%= javascript_importmap_tags %>
23+ </head>
24+
25+ <body>
26+ <%= yield %>
27+ </body>
28+</html>
@@ -0,0 +1,13 @@
1+<!DOCTYPE html>
2+<html>
3+ <head>
4+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5+ <style>
6+ /* Email styles need to be inline */
7+ </style>
8+ </head>
9+
10+ <body>
11+ <%= yield %>
12+ </body>
13+</html>
@@ -0,0 +1 @@
1+<%= yield %>
@@ -0,0 +1,22 @@
1+{
2+ "name": "InsidertradesDirectory",
3+ "icons": [
4+ {
5+ "src": "/icon.png",
6+ "type": "image/png",
7+ "sizes": "512x512"
8+ },
9+ {
10+ "src": "/icon.png",
11+ "type": "image/png",
12+ "sizes": "512x512",
13+ "purpose": "maskable"
14+ }
15+ ],
16+ "start_url": "/",
17+ "display": "standalone",
18+ "scope": "/",
19+ "description": "InsidertradesDirectory.",
20+ "theme_color": "red",
21+ "background_color": "red"
22+}
@@ -0,0 +1,26 @@
1+// Add a service worker for processing Web Push notifications:
2+//
3+// self.addEventListener("push", async (event) => {
4+// const { title, options } = await event.data.json()
5+// event.waitUntil(self.registration.showNotification(title, options))
6+// })
7+//
8+// self.addEventListener("notificationclick", function(event) {
9+// event.notification.close()
10+// event.waitUntil(
11+// clients.matchAll({ type: "window" }).then((clientList) => {
12+// for (let i = 0; i < clientList.length; i++) {
13+// let client = clientList[i]
14+// let clientPath = (new URL(client.url)).pathname
15+//
16+// if (clientPath == event.notification.data.path && "focus" in client) {
17+// return client.focus()
18+// }
19+// }
20+//
21+// if (clients.openWindow) {
22+// return clients.openWindow(event.notification.data.path)
23+// }
24+// })
25+// )
26+// })
@@ -0,0 +1,7 @@
1+#!/usr/bin/env ruby
2+require "rubygems"
3+require "bundler/setup"
4+
5+ARGV.unshift("--ensure-latest")
6+
7+load Gem.bin_path("brakeman", "brakeman")
@@ -0,0 +1,109 @@
1+#!/usr/bin/env ruby
2+# frozen_string_literal: true
3+
4+#
5+# This file was generated by Bundler.
6+#
7+# The application 'bundle' is installed as part of a gem, and
8+# this file is here to facilitate running it.
9+#
10+
11+require "rubygems"
12+
13+m = Module.new do
14+ module_function
15+
16+ def invoked_as_script?
17+ File.expand_path($0) == File.expand_path(__FILE__)
18+ end
19+
20+ def env_var_version
21+ ENV["BUNDLER_VERSION"]
22+ end
23+
24+ def cli_arg_version
25+ return unless invoked_as_script? # don't want to hijack other binstubs
26+ return unless "update".start_with?(ARGV.first || " ") # must be running `bundle update`
27+ bundler_version = nil
28+ update_index = nil
29+ ARGV.each_with_index do |a, i|
30+ if update_index && update_index.succ == i && a.match?(Gem::Version::ANCHORED_VERSION_PATTERN)
31+ bundler_version = a
32+ end
33+ next unless a =~ /\A--bundler(?:[= ](#{Gem::Version::VERSION_PATTERN}))?\z/
34+ bundler_version = $1
35+ update_index = i
36+ end
37+ bundler_version
38+ end
39+
40+ def gemfile
41+ gemfile = ENV["BUNDLE_GEMFILE"]
42+ return gemfile if gemfile && !gemfile.empty?
43+
44+ File.expand_path("../Gemfile", __dir__)
45+ end
46+
47+ def lockfile
48+ lockfile =
49+ case File.basename(gemfile)
50+ when "gems.rb" then gemfile.sub(/\.rb$/, ".locked")
51+ else "#{gemfile}.lock"
52+ end
53+ File.expand_path(lockfile)
54+ end
55+
56+ def lockfile_version
57+ return unless File.file?(lockfile)
58+ lockfile_contents = File.read(lockfile)
59+ return unless lockfile_contents =~ /\n\nBUNDLED WITH\n\s{2,}(#{Gem::Version::VERSION_PATTERN})\n/
60+ Regexp.last_match(1)
61+ end
62+
63+ def bundler_requirement
64+ @bundler_requirement ||=
65+ env_var_version ||
66+ cli_arg_version ||
67+ bundler_requirement_for(lockfile_version)
68+ end
69+
70+ def bundler_requirement_for(version)
71+ return "#{Gem::Requirement.default}.a" unless version
72+
73+ bundler_gem_version = Gem::Version.new(version)
74+
75+ bundler_gem_version.approximate_recommendation
76+ end
77+
78+ def load_bundler!
79+ ENV["BUNDLE_GEMFILE"] ||= gemfile
80+
81+ activate_bundler
82+ end
83+
84+ def activate_bundler
85+ gem_error = activation_error_handling do
86+ gem "bundler", bundler_requirement
87+ end
88+ return if gem_error.nil?
89+ require_error = activation_error_handling do
90+ require "bundler/version"
91+ end
92+ return if require_error.nil? && Gem::Requirement.new(bundler_requirement).satisfied_by?(Gem::Version.new(Bundler::VERSION))
93+ warn "Activating bundler (#{bundler_requirement}) failed:\n#{gem_error.message}\n\nTo install the version of bundler this project requires, run `gem install bundler -v '#{bundler_requirement}'`"
94+ exit 42
95+ end
96+
97+ def activation_error_handling
98+ yield
99+ nil
100+ rescue StandardError, LoadError => e
101+ e
102+ end
103+end
104+
105+m.load_bundler!
106+
107+if m.invoked_as_script?
108+ load Gem.bin_path("bundler", "bundle")
109+end
@@ -0,0 +1,2 @@
1+#!/usr/bin/env ruby
2+exec "./bin/rails", "server", *ARGV
@@ -0,0 +1,14 @@
1+#!/bin/bash -e
2+
3+# Enable jemalloc for reduced memory usage and latency.
4+if [ -z "${LD_PRELOAD+x}" ]; then
5+ LD_PRELOAD=$(find /usr/lib -name libjemalloc.so.2 -print -quit)
6+ export LD_PRELOAD
7+fi
8+
9+# If running the rails server then create or migrate existing database
10+if [ "${@: -2:1}" == "./bin/rails" ] && [ "${@: -1:1}" == "server" ]; then
11+ ./bin/rails db:prepare
12+fi
13+
14+exec "${@}"
@@ -0,0 +1,4 @@
1+#!/usr/bin/env ruby
2+
3+require_relative "../config/application"
4+require "importmap/commands"
@@ -0,0 +1,6 @@
1+#!/usr/bin/env ruby
2+
3+require_relative "../config/environment"
4+require "solid_queue/cli"
5+
6+SolidQueue::Cli.start(ARGV)
@@ -0,0 +1,27 @@
1+#!/usr/bin/env ruby
2+# frozen_string_literal: true
3+
4+#
5+# This file was generated by Bundler.
6+#
7+# The application 'kamal' is installed as part of a gem, and
8+# this file is here to facilitate running it.
9+#
10+
11+ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__)
12+
13+bundle_binstub = File.expand_path("bundle", __dir__)
14+
15+if File.file?(bundle_binstub)
16+ if File.read(bundle_binstub, 300).include?("This file was generated by Bundler")
17+ load(bundle_binstub)
18+ else
19+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
20+Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
21+ end
22+end
23+
24+require "rubygems"
25+require "bundler/setup"
26+
27+load Gem.bin_path("kamal", "kamal")
@@ -0,0 +1,4 @@
1+#!/usr/bin/env ruby
2+APP_PATH = File.expand_path("../config/application", __dir__)
3+require_relative "../config/boot"
4+require "rails/commands"
@@ -0,0 +1,4 @@
1+#!/usr/bin/env ruby
2+require_relative "../config/boot"
3+require "rake"
4+Rake.application.run
@@ -0,0 +1,8 @@
1+#!/usr/bin/env ruby
2+require "rubygems"
3+require "bundler/setup"
4+
5+# explicit rubocop config increases performance slightly while avoiding config confusion.
6+ARGV.unshift("--config", File.expand_path("../.rubocop.yml", __dir__))
7+
8+load Gem.bin_path("rubocop", "rubocop")
@@ -0,0 +1,34 @@
1+#!/usr/bin/env ruby
2+require "fileutils"
3+
4+APP_ROOT = File.expand_path("..", __dir__)
5+
6+def system!(*args)
7+ system(*args, exception: true)
8+end
9+
10+FileUtils.chdir APP_ROOT do
11+ # This script is a way to set up or update your development environment automatically.
12+ # This script is idempotent, so that you can run it at any time and get an expectable outcome.
13+ # Add necessary setup steps to this file.
14+
15+ puts "== Installing dependencies =="
16+ system("bundle check") || system!("bundle install")
17+
18+ # puts "\n== Copying sample files =="
19+ # unless File.exist?("config/database.yml")
20+ # FileUtils.cp "config/database.yml.sample", "config/database.yml"
21+ # end
22+
23+ puts "\n== Preparing database =="
24+ system! "bin/rails db:prepare"
25+
26+ puts "\n== Removing old logs and tempfiles =="
27+ system! "bin/rails log:clear tmp:clear"
28+
29+ unless ARGV.include?("--skip-server")
30+ puts "\n== Starting development server =="
31+ STDOUT.flush # flush the output before exec(2) so that it displays
32+ exec "bin/dev"
33+ end
34+end
@@ -0,0 +1,5 @@
1+#!/usr/bin/env ruby
2+require "rubygems"
3+require "bundler/setup"
4+
5+load Gem.bin_path("thruster", "thrust")
@@ -0,0 +1,6 @@
1+# This file is used by Rack-based servers to start the application.
2+
3+require_relative "config/environment"
4+
5+run Rails.application
6+Rails.application.load_server
@@ -0,0 +1,42 @@
1+require_relative "boot"
2+
3+require "rails"
4+# Pick the frameworks you want:
5+require "active_model/railtie"
6+require "active_job/railtie"
7+require "active_record/railtie"
8+require "active_storage/engine"
9+require "action_controller/railtie"
10+require "action_mailer/railtie"
11+require "action_mailbox/engine"
12+require "action_text/engine"
13+require "action_view/railtie"
14+require "action_cable/engine"
15+# require "rails/test_unit/railtie"
16+
17+# Require the gems listed in Gemfile, including any gems
18+# you've limited to :test, :development, or :production.
19+Bundler.require(*Rails.groups)
20+
21+module InsidertradesDirectory
22+ class Application < Rails::Application
23+ # Initialize configuration defaults for originally generated Rails version.
24+ config.load_defaults 8.0
25+
26+ # Please, add to the `ignore` list any other `lib` subdirectories that do
27+ # not contain `.rb` files, or that should not be reloaded or eager loaded.
28+ # Common ones are `templates`, `generators`, or `middleware`, for example.
29+ config.autoload_lib(ignore: %w[assets tasks])
30+
31+ # Configuration for the application, engines, and railties goes here.
32+ #
33+ # These settings can be overridden in specific environments using the files
34+ # in config/environments, which are processed later.
35+ #
36+ # config.time_zone = "Central Time (US & Canada)"
37+ # config.eager_load_paths << Rails.root.join("extras")
38+
39+ # Don't generate system test files.
40+ config.generators.system_tests = nil
41+ end
42+end
@@ -0,0 +1,4 @@
1+ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__)
2+
3+require "bundler/setup" # Set up gems listed in the Gemfile.
4+require "bootsnap/setup" # Speed up boot time by caching expensive operations.
@@ -0,0 +1,17 @@
1+# Async adapter only works within the same process, so for manually triggering cable updates from a console,
2+# and seeing results in the browser, you must do so from the web console (running inside the dev process),
3+# not a terminal started via bin/rails console! Add "console" to any action or any ERB template view
4+# to make the web console appear.
5+development:
6+ adapter: async
7+
8+test:
9+ adapter: test
10+
11+production:
12+ adapter: solid_cable
13+ connects_to:
14+ database:
15+ writing: cable
16+ polling_interval: 0.1.seconds
17+ message_retention: 1.day
@@ -0,0 +1,16 @@
1+default: &default
2+ store_options:
3+ # Cap age of oldest cache entry to fulfill retention policies
4+ # max_age: <%= 60.days.to_i %>
5+ max_size: <%= 256.megabytes %>
6+ namespace: <%= Rails.env %>
7+
8+development:
9+ <<: *default
10+
11+test:
12+ <<: *default
13+
14+production:
15+ database: cache
16+ <<: *default
@@ -0,0 +1 @@
1+JZylLAvpX7cWRf3dQ8Sfv33d87redKQ2SARTgSQZ+BGJafQKuOVeivKkvEA7pVgcm2SfHQGosw7wVy2j7HDkzz7NikzYnKsVrJBcReFz1eGDpPUMYDRFtilbEybkDobSDd6YeFWFOwVY1Gnw+iZPFNE6OILNd/lS/BrZlF5cMk5zvG4Q6oJdA2DeDmVM0OjMrYZXsJU5H/y7nT6l31ZjxP2b3z3D7kByTmPDWpPfJMJWRxxLHWU+yAnbaWH+Wo3CbQTp0Z9YWuIkJTNJ341Fmw7KrVqzmOXUN2sE9sHuKcdMAlq70B20resBvikp8MbTVtqfyHv/64R+eUxkrrT/Tw8hkO5t8k9LhZ9cCmHqS4hgAXCaHvGf6T+6VXAgxC0qP+QIC3LNyn/CWd/F2k0TvhQLWbOEvBJsk0P6AOhc36U2Nd+eUVXsNxOrZMVCH7+16d6F2P6/0M87PKT4y5JS7ZTpKj94FMgeIN65DcH/H1O1L/8jDswKg0fP--7tHr/AiyL0F5pxOm--QzGcFZaugt4zOxyba5n/DQ==
\ No newline at end of file
@@ -0,0 +1,41 @@
1+# SQLite. Versions 3.8.0 and up are supported.
2+# gem install sqlite3
3+#
4+# Ensure the SQLite 3 gem is defined in your Gemfile
5+# gem "sqlite3"
6+#
7+default: &default
8+ adapter: sqlite3
9+ pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
10+ timeout: 5000
11+
12+development:
13+ <<: *default
14+ database: storage/development.sqlite3
15+
16+# Warning: The database defined as "test" will be erased and
17+# re-generated from your development database when you run "rake".
18+# Do not set this db to the same as development or production.
19+test:
20+ <<: *default
21+ database: storage/test.sqlite3
22+
23+
24+# Store production database in the storage/ directory, which by default
25+# is mounted as a persistent Docker volume in config/deploy.yml.
26+production:
27+ primary:
28+ <<: *default
29+ database: storage/production.sqlite3
30+ cache:
31+ <<: *default
32+ database: storage/production_cache.sqlite3
33+ migrations_paths: db/cache_migrate
34+ queue:
35+ <<: *default
36+ database: storage/production_queue.sqlite3
37+ migrations_paths: db/queue_migrate
38+ cable:
39+ <<: *default
40+ database: storage/production_cable.sqlite3
41+ migrations_paths: db/cable_migrate
@@ -0,0 +1,116 @@
1+# Name of your application. Used to uniquely configure containers.
2+service: insidertrades_directory
3+
4+# Name of the container image.
5+image: your-user/insidertrades_directory
6+
7+# Deploy to these servers.
8+servers:
9+ web:
10+ - 192.168.0.1
11+ # job:
12+ # hosts:
13+ # - 192.168.0.1
14+ # cmd: bin/jobs
15+
16+# Enable SSL auto certification via Let's Encrypt and allow for multiple apps on a single web server.
17+# Remove this section when using multiple web servers and ensure you terminate SSL at your load balancer.
18+#
19+# Note: If using Cloudflare, set encryption mode in SSL/TLS setting to "Full" to enable CF-to-app encryption.
20+proxy:
21+ ssl: true
22+ host: app.example.com
23+
24+# Credentials for your image host.
25+registry:
26+ # Specify the registry server, if you're not using Docker Hub
27+ # server: registry.digitalocean.com / ghcr.io / ...
28+ username: your-user
29+
30+ # Always use an access token rather than real password when possible.
31+ password:
32+ - KAMAL_REGISTRY_PASSWORD
33+
34+# Inject ENV variables into containers (secrets come from .kamal/secrets).
35+env:
36+ secret:
37+ - RAILS_MASTER_KEY
38+ clear:
39+ # Run the Solid Queue Supervisor inside the web server's Puma process to do jobs.
40+ # When you start using multiple servers, you should split out job processing to a dedicated machine.
41+ SOLID_QUEUE_IN_PUMA: true
42+
43+ # Set number of processes dedicated to Solid Queue (default: 1)
44+ # JOB_CONCURRENCY: 3
45+
46+ # Set number of cores available to the application on each server (default: 1).
47+ # WEB_CONCURRENCY: 2
48+
49+ # Match this to any external database server to configure Active Record correctly
50+ # Use insidertrades_directory-db for a db accessory server on same machine via local kamal docker network.
51+ # DB_HOST: 192.168.0.2
52+
53+ # Log everything from Rails
54+ # RAILS_LOG_LEVEL: debug
55+
56+# Aliases are triggered with "bin/kamal <alias>". You can overwrite arguments on invocation:
57+# "bin/kamal logs -r job" will tail logs from the first server in the job section.
58+aliases:
59+ console: app exec --interactive --reuse "bin/rails console"
60+ shell: app exec --interactive --reuse "bash"
61+ logs: app logs -f
62+ dbc: app exec --interactive --reuse "bin/rails dbconsole"
63+
64+
65+# Use a persistent storage volume for sqlite database files and local Active Storage files.
66+# Recommended to change this to a mounted volume path that is backed up off server.
67+volumes:
68+ - "insidertrades_directory_storage:/rails/storage"
69+
70+
71+# Bridge fingerprinted assets, like JS and CSS, between versions to avoid
72+# hitting 404 on in-flight requests. Combines all files from new and old
73+# version inside the asset_path.
74+asset_path: /rails/public/assets
75+
76+# Configure the image builder.
77+builder:
78+ arch: amd64
79+
80+ # # Build image via remote server (useful for faster amd64 builds on arm64 computers)
81+ # remote: ssh://docker@docker-builder-server
82+ #
83+ # # Pass arguments and secrets to the Docker build process
84+ # args:
85+ # RUBY_VERSION: ruby-3.4.1
86+ # secrets:
87+ # - GITHUB_TOKEN
88+ # - RAILS_MASTER_KEY
89+
90+# Use a different ssh user than root
91+# ssh:
92+# user: app
93+
94+# Use accessory services (secrets come from .kamal/secrets).
95+# accessories:
96+# db:
97+# image: mysql:8.0
98+# host: 192.168.0.2
99+# # Change to 3306 to expose port to the world instead of just local network.
100+# port: "127.0.0.1:3306:3306"
101+# env:
102+# clear:
103+# MYSQL_ROOT_HOST: '%'
104+# secret:
105+# - MYSQL_ROOT_PASSWORD
106+# files:
107+# - config/mysql/production.cnf:/etc/mysql/my.cnf
108+# - db/production.sql:/docker-entrypoint-initdb.d/setup.sql
109+# directories:
110+# - data:/var/lib/mysql
111+# redis:
112+# image: redis:7.0
113+# host: 192.168.0.2
114+# port: 6379
115+# directories:
116+# - data:/data
@@ -0,0 +1,5 @@
1+# Load the Rails application.
2+require_relative "application"
3+
4+# Initialize the Rails application.
5+Rails.application.initialize!
@@ -0,0 +1,72 @@
1+require "active_support/core_ext/integer/time"
2+
3+Rails.application.configure do
4+ # Settings specified here will take precedence over those in config/application.rb.
5+
6+ # Make code changes take effect immediately without server restart.
7+ config.enable_reloading = true
8+
9+ # Do not eager load code on boot.
10+ config.eager_load = false
11+
12+ # Show full error reports.
13+ config.consider_all_requests_local = true
14+
15+ # Enable server timing.
16+ config.server_timing = true
17+
18+ # Enable/disable Action Controller caching. By default Action Controller caching is disabled.
19+ # Run rails dev:cache to toggle Action Controller caching.
20+ if Rails.root.join("tmp/caching-dev.txt").exist?
21+ config.action_controller.perform_caching = true
22+ config.action_controller.enable_fragment_cache_logging = true
23+ config.public_file_server.headers = { "cache-control" => "public, max-age=#{2.days.to_i}" }
24+ else
25+ config.action_controller.perform_caching = false
26+ end
27+
28+ # Change to :null_store to avoid any caching.
29+ config.cache_store = :memory_store
30+
31+ # Store uploaded files on the local file system (see config/storage.yml for options).
32+ config.active_storage.service = :local
33+
34+ # Don't care if the mailer can't send.
35+ config.action_mailer.raise_delivery_errors = false
36+
37+ # Make template changes take effect immediately.
38+ config.action_mailer.perform_caching = false
39+
40+ # Set localhost to be used by links generated in mailer templates.
41+ config.action_mailer.default_url_options = { host: "localhost", port: 3000 }
42+
43+ # Print deprecation notices to the Rails logger.
44+ config.active_support.deprecation = :log
45+
46+ # Raise an error on page load if there are pending migrations.
47+ config.active_record.migration_error = :page_load
48+
49+ # Highlight code that triggered database queries in logs.
50+ config.active_record.verbose_query_logs = true
51+
52+ # Append comments with runtime information tags to SQL queries in logs.
53+ config.active_record.query_log_tags_enabled = true
54+
55+ # Highlight code that enqueued background job in logs.
56+ config.active_job.verbose_enqueue_logs = true
57+
58+ # Raises error for missing translations.
59+ # config.i18n.raise_on_missing_translations = true
60+
61+ # Annotate rendered view with file names.
62+ config.action_view.annotate_rendered_view_with_filenames = true
63+
64+ # Uncomment if you wish to allow Action Cable access from any origin.
65+ # config.action_cable.disable_request_forgery_protection = true
66+
67+ # Raise error when a before_action's only/except options reference missing actions.
68+ config.action_controller.raise_on_missing_callback_actions = true
69+
70+ # Apply autocorrection by RuboCop to files generated by `bin/rails generate`.
71+ # config.generators.apply_rubocop_autocorrect_after_generate!
72+end
@@ -0,0 +1,90 @@
1+require "active_support/core_ext/integer/time"
2+
3+Rails.application.configure do
4+ # Settings specified here will take precedence over those in config/application.rb.
5+
6+ # Code is not reloaded between requests.
7+ config.enable_reloading = false
8+
9+ # Eager load code on boot for better performance and memory savings (ignored by Rake tasks).
10+ config.eager_load = true
11+
12+ # Full error reports are disabled.
13+ config.consider_all_requests_local = false
14+
15+ # Turn on fragment caching in view templates.
16+ config.action_controller.perform_caching = true
17+
18+ # Cache assets for far-future expiry since they are all digest stamped.
19+ config.public_file_server.headers = { "cache-control" => "public, max-age=#{1.year.to_i}" }
20+
21+ # Enable serving of images, stylesheets, and JavaScripts from an asset server.
22+ # config.asset_host = "http://assets.example.com"
23+
24+ # Store uploaded files on the local file system (see config/storage.yml for options).
25+ config.active_storage.service = :local
26+
27+ # Assume all access to the app is happening through a SSL-terminating reverse proxy.
28+ config.assume_ssl = true
29+
30+ # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
31+ config.force_ssl = true
32+
33+ # Skip http-to-https redirect for the default health check endpoint.
34+ # config.ssl_options = { redirect: { exclude: ->(request) { request.path == "/up" } } }
35+
36+ # Log to STDOUT with the current request id as a default log tag.
37+ config.log_tags = [ :request_id ]
38+ config.logger = ActiveSupport::TaggedLogging.logger(STDOUT)
39+
40+ # Change to "debug" to log everything (including potentially personally-identifiable information!)
41+ config.log_level = ENV.fetch("RAILS_LOG_LEVEL", "info")
42+
43+ # Prevent health checks from clogging up the logs.
44+ config.silence_healthcheck_path = "/up"
45+
46+ # Don't log any deprecations.
47+ config.active_support.report_deprecations = false
48+
49+ # Replace the default in-process memory cache store with a durable alternative.
50+ config.cache_store = :solid_cache_store
51+
52+ # Replace the default in-process and non-durable queuing backend for Active Job.
53+ config.active_job.queue_adapter = :solid_queue
54+ config.solid_queue.connects_to = { database: { writing: :queue } }
55+
56+ # Ignore bad email addresses and do not raise email delivery errors.
57+ # Set this to true and configure the email server for immediate delivery to raise delivery errors.
58+ # config.action_mailer.raise_delivery_errors = false
59+
60+ # Set host to be used by links generated in mailer templates.
61+ config.action_mailer.default_url_options = { host: "example.com" }
62+
63+ # Specify outgoing SMTP server. Remember to add smtp/* credentials via rails credentials:edit.
64+ # config.action_mailer.smtp_settings = {
65+ # user_name: Rails.application.credentials.dig(:smtp, :user_name),
66+ # password: Rails.application.credentials.dig(:smtp, :password),
67+ # address: "smtp.example.com",
68+ # port: 587,
69+ # authentication: :plain
70+ # }
71+
72+ # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
73+ # the I18n.default_locale when a translation cannot be found).
74+ config.i18n.fallbacks = true
75+
76+ # Do not dump schema after migrations.
77+ config.active_record.dump_schema_after_migration = false
78+
79+ # Only use :id for inspections in production.
80+ config.active_record.attributes_for_inspect = [ :id ]
81+
82+ # Enable DNS rebinding protection and other `Host` header attacks.
83+ # config.hosts = [
84+ # "example.com", # Allow requests from example.com
85+ # /.*\.example\.com/ # Allow requests from subdomains like `www.example.com`
86+ # ]
87+ #
88+ # Skip DNS rebinding protection for the default health check endpoint.
89+ # config.host_authorization = { exclude: ->(request) { request.path == "/up" } }
90+end
@@ -0,0 +1,53 @@
1+# The test environment is used exclusively to run your application's
2+# test suite. You never need to work with it otherwise. Remember that
3+# your test database is "scratch space" for the test suite and is wiped
4+# and recreated between test runs. Don't rely on the data there!
5+
6+Rails.application.configure do
7+ # Settings specified here will take precedence over those in config/application.rb.
8+
9+ # While tests run files are not watched, reloading is not necessary.
10+ config.enable_reloading = false
11+
12+ # Eager loading loads your entire application. When running a single test locally,
13+ # this is usually not necessary, and can slow down your test suite. However, it's
14+ # recommended that you enable it in continuous integration systems to ensure eager
15+ # loading is working properly before deploying your code.
16+ config.eager_load = ENV["CI"].present?
17+
18+ # Configure public file server for tests with cache-control for performance.
19+ config.public_file_server.headers = { "cache-control" => "public, max-age=3600" }
20+
21+ # Show full error reports.
22+ config.consider_all_requests_local = true
23+ config.cache_store = :null_store
24+
25+ # Render exception templates for rescuable exceptions and raise for other exceptions.
26+ config.action_dispatch.show_exceptions = :rescuable
27+
28+ # Disable request forgery protection in test environment.
29+ config.action_controller.allow_forgery_protection = false
30+
31+ # Store uploaded files on the local file system in a temporary directory.
32+ config.active_storage.service = :test
33+
34+ # Tell Action Mailer not to deliver emails to the real world.
35+ # The :test delivery method accumulates sent emails in the
36+ # ActionMailer::Base.deliveries array.
37+ config.action_mailer.delivery_method = :test
38+
39+ # Set host to be used by links generated in mailer templates.
40+ config.action_mailer.default_url_options = { host: "example.com" }
41+
42+ # Print deprecation notices to the stderr.
43+ config.active_support.deprecation = :stderr
44+
45+ # Raises error for missing translations.
46+ # config.i18n.raise_on_missing_translations = true
47+
48+ # Annotate rendered view with file names.
49+ # config.action_view.annotate_rendered_view_with_filenames = true
50+
51+ # Raise error when a before_action's only/except options reference missing actions.
52+ config.action_controller.raise_on_missing_callback_actions = true
53+end
@@ -0,0 +1,7 @@
1+# Pin npm packages by running ./bin/importmap
2+
3+pin "application"
4+pin "@hotwired/turbo-rails", to: "turbo.min.js"
5+pin "@hotwired/stimulus", to: "stimulus.min.js"
6+pin "@hotwired/stimulus-loading", to: "stimulus-loading.js"
7+pin_all_from "app/javascript/controllers", under: "controllers"
@@ -0,0 +1,7 @@
1+# Be sure to restart your server when you modify this file.
2+
3+# Version of your assets, change this if you want to expire all your assets.
4+Rails.application.config.assets.version = "1.0"
5+
6+# Add additional assets to the asset load path.
7+# Rails.application.config.assets.paths << Emoji.images_path
@@ -0,0 +1,25 @@
1+# Be sure to restart your server when you modify this file.
2+
3+# Define an application-wide content security policy.
4+# See the Securing Rails Applications Guide for more information:
5+# https://guides.rubyonrails.org/security.html#content-security-policy-header
6+
7+# Rails.application.configure do
8+# config.content_security_policy do |policy|
9+# policy.default_src :self, :https
10+# policy.font_src :self, :https, :data
11+# policy.img_src :self, :https, :data
12+# policy.object_src :none
13+# policy.script_src :self, :https
14+# policy.style_src :self, :https
15+# # Specify URI for violation reports
16+# # policy.report_uri "/csp-violation-report-endpoint"
17+# end
18+#
19+# # Generate session nonces for permitted importmap, inline scripts, and inline styles.
20+# config.content_security_policy_nonce_generator = ->(request) { request.session.id.to_s }
21+# config.content_security_policy_nonce_directives = %w(script-src style-src)
22+#
23+# # Report violations without enforcing the policy.
24+# # config.content_security_policy_report_only = true
25+# end
@@ -0,0 +1,8 @@
1+# Be sure to restart your server when you modify this file.
2+
3+# Configure parameters to be partially matched (e.g. passw matches password) and filtered from the log file.
4+# Use this to limit dissemination of sensitive information.
5+# See the ActiveSupport::ParameterFilter documentation for supported notations and behaviors.
6+Rails.application.config.filter_parameters += [
7+ :passw, :email, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn, :cvv, :cvc
8+]
@@ -0,0 +1,16 @@
1+# Be sure to restart your server when you modify this file.
2+
3+# Add new inflection rules using the following format. Inflections
4+# are locale specific, and you may define rules for as many different
5+# locales as you wish. All of these examples are active by default:
6+# ActiveSupport::Inflector.inflections(:en) do |inflect|
7+# inflect.plural /^(ox)$/i, "\\1en"
8+# inflect.singular /^(ox)en/i, "\\1"
9+# inflect.irregular "person", "people"
10+# inflect.uncountable %w( fish sheep )
11+# end
12+
13+# These inflection rules are supported but not enabled by default:
14+# ActiveSupport::Inflector.inflections(:en) do |inflect|
15+# inflect.acronym "RESTful"
16+# end
@@ -0,0 +1,31 @@
1+# Files in the config/locales directory are used for internationalization and
2+# are automatically loaded by Rails. If you want to use locales other than
3+# English, add the necessary files in this directory.
4+#
5+# To use the locales, use `I18n.t`:
6+#
7+# I18n.t "hello"
8+#
9+# In views, this is aliased to just `t`:
10+#
11+# <%= t("hello") %>
12+#
13+# To use a different locale, set it with `I18n.locale`:
14+#
15+# I18n.locale = :es
16+#
17+# This would use the information in config/locales/es.yml.
18+#
19+# To learn more about the API, please read the Rails Internationalization guide
20+# at https://guides.rubyonrails.org/i18n.html.
21+#
22+# Be aware that YAML interprets the following case-insensitive strings as
23+# booleans: `true`, `false`, `on`, `off`, `yes`, `no`. Therefore, these strings
24+# must be quoted to be interpreted as strings. For example:
25+#
26+# en:
27+# "yes": yup
28+# enabled: "ON"
29+
30+en:
31+ hello: "Hello world"
@@ -0,0 +1,41 @@
1+# This configuration file will be evaluated by Puma. The top-level methods that
2+# are invoked here are part of Puma's configuration DSL. For more information
3+# about methods provided by the DSL, see https://puma.io/puma/Puma/DSL.html.
4+#
5+# Puma starts a configurable number of processes (workers) and each process
6+# serves each request in a thread from an internal thread pool.
7+#
8+# You can control the number of workers using ENV["WEB_CONCURRENCY"]. You
9+# should only set this value when you want to run 2 or more workers. The
10+# default is already 1.
11+#
12+# The ideal number of threads per worker depends both on how much time the
13+# application spends waiting for IO operations and on how much you wish to
14+# prioritize throughput over latency.
15+#
16+# As a rule of thumb, increasing the number of threads will increase how much
17+# traffic a given process can handle (throughput), but due to CRuby's
18+# Global VM Lock (GVL) it has diminishing returns and will degrade the
19+# response time (latency) of the application.
20+#
21+# The default is set to 3 threads as it's deemed a decent compromise between
22+# throughput and latency for the average Rails application.
23+#
24+# Any libraries that use a connection pool or another resource pool should
25+# be configured to provide at least as many connections as the number of
26+# threads. This includes Active Record's `pool` parameter in `database.yml`.
27+threads_count = ENV.fetch("RAILS_MAX_THREADS", 3)
28+threads threads_count, threads_count
29+
30+# Specifies the `port` that Puma will listen on to receive requests; default is 3000.
31+port ENV.fetch("PORT", 3000)
32+
33+# Allow puma to be restarted by `bin/rails restart` command.
34+plugin :tmp_restart
35+
36+# Run the Solid Queue supervisor inside of Puma for single-server deployments
37+plugin :solid_queue if ENV["SOLID_QUEUE_IN_PUMA"]
38+
39+# Specify the PID file. Defaults to tmp/pids/server.pid in development.
40+# In other environments, only set the PID file if requested.
41+pidfile ENV["PIDFILE"] if ENV["PIDFILE"]
@@ -0,0 +1,18 @@
1+default: &default
2+ dispatchers:
3+ - polling_interval: 1
4+ batch_size: 500
5+ workers:
6+ - queues: "*"
7+ threads: 3
8+ processes: <%= ENV.fetch("JOB_CONCURRENCY", 1) %>
9+ polling_interval: 0.1
10+
11+development:
12+ <<: *default
13+
14+test:
15+ <<: *default
16+
17+production:
18+ <<: *default
@@ -0,0 +1,15 @@
1+# examples:
2+# periodic_cleanup:
3+# class: CleanSoftDeletedRecordsJob
4+# queue: background
5+# args: [ 1000, { batch_size: 500 } ]
6+# schedule: every hour
7+# periodic_cleanup_with_command:
8+# command: "SoftDeletedRecord.due.delete_all"
9+# priority: 2
10+# schedule: at 5am every day
11+
12+production:
13+ clear_solid_queue_finished_jobs:
14+ command: "SolidQueue::Job.clear_finished_in_batches(sleep_between_batches: 0.3)"
15+ schedule: every hour at minute 12
@@ -0,0 +1,14 @@
1+Rails.application.routes.draw do
2+ # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html
3+
4+ # Reveal health status on /up that returns 200 if the app boots with no exceptions, otherwise 500.
5+ # Can be used by load balancers and uptime monitors to verify that the app is live.
6+ get "up" => "rails/health#show", as: :rails_health_check
7+
8+ # Render dynamic PWA files from app/views/pwa/* (remember to link manifest in application.html.erb)
9+ # get "manifest" => "rails/pwa#manifest", as: :pwa_manifest
10+ # get "service-worker" => "rails/pwa#service_worker", as: :pwa_service_worker
11+
12+ # Defines the root path route ("/")
13+ # root "posts#index"
14+end
@@ -0,0 +1,34 @@
1+test:
2+ service: Disk
3+ root: <%= Rails.root.join("tmp/storage") %>
4+
5+local:
6+ service: Disk
7+ root: <%= Rails.root.join("storage") %>
8+
9+# Use bin/rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key)
10+# amazon:
11+# service: S3
12+# access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %>
13+# secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %>
14+# region: us-east-1
15+# bucket: your_own_bucket-<%= Rails.env %>
16+
17+# Remember not to checkin your GCS keyfile to a repository
18+# google:
19+# service: GCS
20+# project: your_project
21+# credentials: <%= Rails.root.join("path/to/gcs.keyfile") %>
22+# bucket: your_own_bucket-<%= Rails.env %>
23+
24+# Use bin/rails credentials:edit to set the Azure Storage secret (as azure_storage:storage_access_key)
25+# microsoft:
26+# service: AzureStorage
27+# storage_account_name: your_account_name
28+# storage_access_key: <%= Rails.application.credentials.dig(:azure_storage, :storage_access_key) %>
29+# container: your_container_name-<%= Rails.env %>
30+
31+# mirror:
32+# service: Mirror
33+# primary: local
34+# mirrors: [ amazon, google, microsoft ]
@@ -0,0 +1,11 @@
1+ActiveRecord::Schema[7.1].define(version: 1) do
2+ create_table "solid_cable_messages", force: :cascade do |t|
3+ t.binary "channel", limit: 1024, null: false
4+ t.binary "payload", limit: 536870912, null: false
5+ t.datetime "created_at", null: false
6+ t.integer "channel_hash", limit: 8, null: false
7+ t.index ["channel"], name: "index_solid_cable_messages_on_channel"
8+ t.index ["channel_hash"], name: "index_solid_cable_messages_on_channel_hash"
9+ t.index ["created_at"], name: "index_solid_cable_messages_on_created_at"
10+ end
11+end
@@ -0,0 +1,14 @@
1+# frozen_string_literal: true
2+
3+ActiveRecord::Schema[7.2].define(version: 1) do
4+ create_table "solid_cache_entries", force: :cascade do |t|
5+ t.binary "key", limit: 1024, null: false
6+ t.binary "value", limit: 536870912, null: false
7+ t.datetime "created_at", null: false
8+ t.integer "key_hash", limit: 8, null: false
9+ t.integer "byte_size", limit: 4, null: false
10+ t.index ["byte_size"], name: "index_solid_cache_entries_on_byte_size"
11+ t.index ["key_hash", "byte_size"], name: "index_solid_cache_entries_on_key_hash_and_byte_size"
12+ t.index ["key_hash"], name: "index_solid_cache_entries_on_key_hash", unique: true
13+ end
14+end
@@ -0,0 +1,129 @@
1+ActiveRecord::Schema[7.1].define(version: 1) do
2+ create_table "solid_queue_blocked_executions", force: :cascade do |t|
3+ t.bigint "job_id", null: false
4+ t.string "queue_name", null: false
5+ t.integer "priority", default: 0, null: false
6+ t.string "concurrency_key", null: false
7+ t.datetime "expires_at", null: false
8+ t.datetime "created_at", null: false
9+ t.index [ "concurrency_key", "priority", "job_id" ], name: "index_solid_queue_blocked_executions_for_release"
10+ t.index [ "expires_at", "concurrency_key" ], name: "index_solid_queue_blocked_executions_for_maintenance"
11+ t.index [ "job_id" ], name: "index_solid_queue_blocked_executions_on_job_id", unique: true
12+ end
13+
14+ create_table "solid_queue_claimed_executions", force: :cascade do |t|
15+ t.bigint "job_id", null: false
16+ t.bigint "process_id"
17+ t.datetime "created_at", null: false
18+ t.index [ "job_id" ], name: "index_solid_queue_claimed_executions_on_job_id", unique: true
19+ t.index [ "process_id", "job_id" ], name: "index_solid_queue_claimed_executions_on_process_id_and_job_id"
20+ end
21+
22+ create_table "solid_queue_failed_executions", force: :cascade do |t|
23+ t.bigint "job_id", null: false
24+ t.text "error"
25+ t.datetime "created_at", null: false
26+ t.index [ "job_id" ], name: "index_solid_queue_failed_executions_on_job_id", unique: true
27+ end
28+
29+ create_table "solid_queue_jobs", force: :cascade do |t|
30+ t.string "queue_name", null: false
31+ t.string "class_name", null: false
32+ t.text "arguments"
33+ t.integer "priority", default: 0, null: false
34+ t.string "active_job_id"
35+ t.datetime "scheduled_at"
36+ t.datetime "finished_at"
37+ t.string "concurrency_key"
38+ t.datetime "created_at", null: false
39+ t.datetime "updated_at", null: false
40+ t.index [ "active_job_id" ], name: "index_solid_queue_jobs_on_active_job_id"
41+ t.index [ "class_name" ], name: "index_solid_queue_jobs_on_class_name"
42+ t.index [ "finished_at" ], name: "index_solid_queue_jobs_on_finished_at"
43+ t.index [ "queue_name", "finished_at" ], name: "index_solid_queue_jobs_for_filtering"
44+ t.index [ "scheduled_at", "finished_at" ], name: "index_solid_queue_jobs_for_alerting"
45+ end
46+
47+ create_table "solid_queue_pauses", force: :cascade do |t|
48+ t.string "queue_name", null: false
49+ t.datetime "created_at", null: false
50+ t.index [ "queue_name" ], name: "index_solid_queue_pauses_on_queue_name", unique: true
51+ end
52+
53+ create_table "solid_queue_processes", force: :cascade do |t|
54+ t.string "kind", null: false
55+ t.datetime "last_heartbeat_at", null: false
56+ t.bigint "supervisor_id"
57+ t.integer "pid", null: false
58+ t.string "hostname"
59+ t.text "metadata"
60+ t.datetime "created_at", null: false
61+ t.string "name", null: false
62+ t.index [ "last_heartbeat_at" ], name: "index_solid_queue_processes_on_last_heartbeat_at"
63+ t.index [ "name", "supervisor_id" ], name: "index_solid_queue_processes_on_name_and_supervisor_id", unique: true
64+ t.index [ "supervisor_id" ], name: "index_solid_queue_processes_on_supervisor_id"
65+ end
66+
67+ create_table "solid_queue_ready_executions", force: :cascade do |t|
68+ t.bigint "job_id", null: false
69+ t.string "queue_name", null: false
70+ t.integer "priority", default: 0, null: false
71+ t.datetime "created_at", null: false
72+ t.index [ "job_id" ], name: "index_solid_queue_ready_executions_on_job_id", unique: true
73+ t.index [ "priority", "job_id" ], name: "index_solid_queue_poll_all"
74+ t.index [ "queue_name", "priority", "job_id" ], name: "index_solid_queue_poll_by_queue"
75+ end
76+
77+ create_table "solid_queue_recurring_executions", force: :cascade do |t|
78+ t.bigint "job_id", null: false
79+ t.string "task_key", null: false
80+ t.datetime "run_at", null: false
81+ t.datetime "created_at", null: false
82+ t.index [ "job_id" ], name: "index_solid_queue_recurring_executions_on_job_id", unique: true
83+ t.index [ "task_key", "run_at" ], name: "index_solid_queue_recurring_executions_on_task_key_and_run_at", unique: true
84+ end
85+
86+ create_table "solid_queue_recurring_tasks", force: :cascade do |t|
87+ t.string "key", null: false
88+ t.string "schedule", null: false
89+ t.string "command", limit: 2048
90+ t.string "class_name"
91+ t.text "arguments"
92+ t.string "queue_name"
93+ t.integer "priority", default: 0
94+ t.boolean "static", default: true, null: false
95+ t.text "description"
96+ t.datetime "created_at", null: false
97+ t.datetime "updated_at", null: false
98+ t.index [ "key" ], name: "index_solid_queue_recurring_tasks_on_key", unique: true
99+ t.index [ "static" ], name: "index_solid_queue_recurring_tasks_on_static"
100+ end
101+
102+ create_table "solid_queue_scheduled_executions", force: :cascade do |t|
103+ t.bigint "job_id", null: false
104+ t.string "queue_name", null: false
105+ t.integer "priority", default: 0, null: false
106+ t.datetime "scheduled_at", null: false
107+ t.datetime "created_at", null: false
108+ t.index [ "job_id" ], name: "index_solid_queue_scheduled_executions_on_job_id", unique: true
109+ t.index [ "scheduled_at", "priority", "job_id" ], name: "index_solid_queue_dispatch_all"
110+ end
111+
112+ create_table "solid_queue_semaphores", force: :cascade do |t|
113+ t.string "key", null: false
114+ t.integer "value", default: 1, null: false
115+ t.datetime "expires_at", null: false
116+ t.datetime "created_at", null: false
117+ t.datetime "updated_at", null: false
118+ t.index [ "expires_at" ], name: "index_solid_queue_semaphores_on_expires_at"
119+ t.index [ "key", "value" ], name: "index_solid_queue_semaphores_on_key_and_value"
120+ t.index [ "key" ], name: "index_solid_queue_semaphores_on_key", unique: true
121+ end
122+
123+ add_foreign_key "solid_queue_blocked_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade
124+ add_foreign_key "solid_queue_claimed_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade
125+ add_foreign_key "solid_queue_failed_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade
126+ add_foreign_key "solid_queue_ready_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade
127+ add_foreign_key "solid_queue_recurring_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade
128+ add_foreign_key "solid_queue_scheduled_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade
129+end
@@ -0,0 +1,9 @@
1+# This file should ensure the existence of records required to run the application in every environment (production,
2+# development, test). The code here should be idempotent so that it can be executed at any point in every environment.
3+# The data can then be loaded with the bin/rails db:seed command (or created alongside the database with db:setup).
4+#
5+# Example:
6+#
7+# ["Action", "Comedy", "Drama", "Horror"].each do |genre_name|
8+# MovieGenre.find_or_create_by!(name: genre_name)
9+# end
@@ -0,0 +1,114 @@
1+<!doctype html>
2+
3+<html lang="en">
4+
5+ <head>
6+
7+ <title>The server cannot process the request due to a client error (400 Bad Request)</title>
8+
9+ <meta charset="utf-8">
10+ <meta name="viewport" content="initial-scale=1, width=device-width">
11+ <meta name="robots" content="noindex, nofollow">
12+
13+ <style>
14+
15+ *, *::before, *::after {
16+ box-sizing: border-box;
17+ }
18+
19+ * {
20+ margin: 0;
21+ }
22+
23+ html {
24+ font-size: 16px;
25+ }
26+
27+ body {
28+ background: #FFF;
29+ color: #261B23;
30+ display: grid;
31+ font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Aptos, Roboto, "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
32+ font-size: clamp(1rem, 2.5vw, 2rem);
33+ -webkit-font-smoothing: antialiased;
34+ font-style: normal;
35+ font-weight: 400;
36+ letter-spacing: -0.0025em;
37+ line-height: 1.4;
38+ min-height: 100vh;
39+ place-items: center;
40+ text-rendering: optimizeLegibility;
41+ -webkit-text-size-adjust: 100%;
42+ }
43+
44+ a {
45+ color: inherit;
46+ font-weight: 700;
47+ text-decoration: underline;
48+ text-underline-offset: 0.0925em;
49+ }
50+
51+ b, strong {
52+ font-weight: 700;
53+ }
54+
55+ i, em {
56+ font-style: italic;
57+ }
58+
59+ main {
60+ display: grid;
61+ gap: 1em;
62+ padding: 2em;
63+ place-items: center;
64+ text-align: center;
65+ }
66+
67+ main header {
68+ width: min(100%, 12em);
69+ }
70+
71+ main header svg {
72+ height: auto;
73+ max-width: 100%;
74+ width: 100%;
75+ }
76+
77+ main article {
78+ width: min(100%, 30em);
79+ }
80+
81+ main article p {
82+ font-size: 75%;
83+ }
84+
85+ main article br {
86+
87+ display: none;
88+
89+ @media(min-width: 48em) {
90+ display: inline;
91+ }
92+
93+ }
94+
95+ </style>
96+
97+ </head>
98+
99+ <body>
100+
101+ <!-- This file lives in public/400.html -->
102+
103+ <main>
104+ <header>
105+ <svg height="172" viewBox="0 0 480 172" width="480" xmlns="http://www.w3.org/2000/svg"><path d="m124.48 3.00509-45.6889 100.02991h26.2239v-28.1168h38.119v28.1168h21.628v35.145h-21.628v30.82h-37.308v-30.82h-72.1833v-31.901l50.2851-103.27391zm115.583 168.69891c-40.822 0-64.884-35.146-64.884-85.7015 0-50.5554 24.062-85.700907 64.884-85.700907 40.823 0 64.884 35.145507 64.884 85.700907 0 50.5555-24.061 85.7015-64.884 85.7015zm0-133.2831c-17.572 0-22.709 21.8984-22.709 47.5816 0 25.6835 5.137 47.5815 22.709 47.5815 17.303 0 22.71-21.898 22.71-47.5815 0-25.6832-5.407-47.5816-22.71-47.5816zm140.456 133.2831c-40.823 0-64.884-35.146-64.884-85.7015 0-50.5554 24.061-85.700907 64.884-85.700907 40.822 0 64.884 35.145507 64.884 85.700907 0 50.5555-24.062 85.7015-64.884 85.7015zm0-133.2831c-17.573 0-22.71 21.8984-22.71 47.5816 0 25.6835 5.137 47.5815 22.71 47.5815 17.302 0 22.709-21.898 22.709-47.5815 0-25.6832-5.407-47.5816-22.709-47.5816z" fill="#f0eff0"/><path d="m123.606 85.4445c3.212 1.0523 5.538 4.2089 5.538 8.0301 0 6.1472-4.209 9.5254-11.298 9.5254h-15.617v-34.0033h14.565c7.089 0 11.353 3.1566 11.353 9.2484 0 3.6551-2.049 6.3134-4.541 7.1994zm-12.904-2.9905h5.095c2.603 0 3.988-.9968 3.988-3.1013 0-2.1044-1.385-3.0459-3.988-3.0459h-5.095zm0 6.6456v6.5902h5.981c2.492 0 3.877-1.3291 3.877-3.2674 0-2.049-1.385-3.3228-3.877-3.3228zm43.786 13.9004h-8.362v-1.274c-.831.831-3.323 1.717-5.981 1.717-4.929 0-9.083-2.769-9.083-8.0301 0-4.818 4.154-7.9193 9.581-7.9193 2.049 0 4.486.6646 5.483 1.3845v-1.606c0-1.606-.942-2.9905-3.046-2.9905-1.606 0-2.548.7199-2.935 1.8275h-8.197c.72-4.8181 4.985-8.6393 11.409-8.6393 7.088 0 11.131 3.7659 11.131 10.2453zm-8.362-6.9779v-1.4399c-.554-1.0522-2.049-1.7167-3.655-1.7167-1.717 0-3.434.7199-3.434 2.3813 0 1.7168 1.717 2.4367 3.434 2.4367 1.606 0 3.101-.6645 3.655-1.6614zm27.996 6.9779v-1.994c-1.163 1.329-3.599 2.548-6.147 2.548-7.199 0-11.131-5.8151-11.131-13.0145s3.932-13.0143 11.131-13.0143c2.548 0 4.984 1.2184 6.147 2.5475v-13.0697h8.695v35.997zm0-9.1931v-6.5902c-.664-1.3291-2.159-2.326-3.821-2.326-2.99 0-4.763 2.4368-4.763 5.6488s1.773 5.5934 4.763 5.5934c1.717 0 3.157-.9415 3.821-2.326zm35.471-2.049h-3.101v11.2421h-8.806v-34.0033h15.285c7.31 0 12.35 4.1535 12.35 11.5744 0 5.1503-2.603 8.6947-6.757 10.2453l7.975 12.1836h-9.858zm-3.101-15.2849v8.1962h5.538c3.156 0 4.596-1.606 4.596-4.0981s-1.44-4.0981-4.596-4.0981zm36.957 17.8323h8.03c-.886 5.7597-5.206 9.2487-11.685 9.2487-7.643 0-12.682-5.2613-12.682-13.0145 0-7.6978 5.316-13.0143 12.515-13.0143 7.643 0 11.962 5.095 11.962 12.5159v2.1598h-16.115c.277 2.9905 1.827 4.5965 4.32 4.5965 1.772 0 3.156-.7753 3.655-2.4921zm-3.822-10.0237c-2.049 0-3.433 1.2737-3.987 3.5997h7.532c-.111-2.0491-1.385-3.5997-3.545-3.5997zm30.98 27.5234v-10.799c-1.163 1.329-3.6 2.548-6.147 2.548-7.2 0-11.132-5.9259-11.132-13.0145 0-7.144 3.932-13.0143 11.132-13.0143 2.547 0 4.984 1.2184 6.147 2.5475v-1.9937h8.695v33.726zm0-17.9981v-6.5902c-.665-1.3291-2.105-2.326-3.821-2.326-2.991 0-4.763 2.4368-4.763 5.6488s1.772 5.5934 4.763 5.5934c1.661 0 3.156-.9415 3.821-2.326zm36.789-15.7279v24.921h-8.695v-2.16c-1.329 1.551-3.821 2.714-6.646 2.714-5.482 0-8.75-3.5999-8.75-9.1379v-16.3371h8.64v14.288c0 2.1045.996 3.5997 3.212 3.5997 1.606 0 3.101-1.0522 3.544-2.769v-15.1187zm19.084 16.2263h8.03c-.886 5.7597-5.206 9.2487-11.685 9.2487-7.643 0-12.682-5.2613-12.682-13.0145 0-7.6978 5.316-13.0143 12.515-13.0143 7.643 0 11.963 5.095 11.963 12.5159v2.1598h-16.116c.277 2.9905 1.828 4.5965 4.32 4.5965 1.772 0 3.156-.7753 3.655-2.4921zm-3.822-10.0237c-2.049 0-3.433 1.2737-3.987 3.5997h7.532c-.111-2.0491-1.385-3.5997-3.545-3.5997zm13.428 11.0206h8.474c.387 1.3845 1.606 2.1598 3.156 2.1598 1.44 0 2.548-.5538 2.548-1.7168 0-.9414-.72-1.2737-1.939-1.5506l-4.873-.9969c-4.154-.886-6.867-2.8797-6.867-7.2547 0-5.3165 4.762-8.4178 10.633-8.4178 6.812 0 10.522 3.1567 11.297 8.0855h-8.03c-.277-1.0522-1.052-1.9937-3.046-1.9937-1.273 0-2.326.5538-2.326 1.6614 0 .7753.554 1.163 1.717 1.3845l4.929 1.163c4.541 1.0522 6.978 3.4335 6.978 7.4763 0 5.3168-4.818 8.2518-10.91 8.2518-6.369 0-10.965-2.88-11.741-8.2518zm27.538-.8861v-9.5807h-3.655v-6.7564h3.655v-6.8671h8.584v6.8671h5.205v6.7564h-5.205v8.307c0 1.9383.941 2.769 2.658 2.769.941 0 1.993-.2216 2.769-.5538v7.3654c-.997.443-2.88.775-4.818.775-5.871 0-9.193-2.769-9.193-9.0819z" fill="#d30001"/></svg>
106+ </header>
107+ <article>
108+ <p><strong>The server cannot process the request due to a client error.</strong> Please check the request and try again. If you’re the application owner check the logs for more information.</p>
109+ </article>
110+ </main>
111+
112+ </body>
113+
114+</html>
@@ -0,0 +1,114 @@
1+<!doctype html>
2+
3+<html lang="en">
4+
5+ <head>
6+
7+ <title>The page you were looking for doesn’t exist (404 Not found)</title>
8+
9+ <meta charset="utf-8">
10+ <meta name="viewport" content="initial-scale=1, width=device-width">
11+ <meta name="robots" content="noindex, nofollow">
12+
13+ <style>
14+
15+ *, *::before, *::after {
16+ box-sizing: border-box;
17+ }
18+
19+ * {
20+ margin: 0;
21+ }
22+
23+ html {
24+ font-size: 16px;
25+ }
26+
27+ body {
28+ background: #FFF;
29+ color: #261B23;
30+ display: grid;
31+ font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Aptos, Roboto, "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
32+ font-size: clamp(1rem, 2.5vw, 2rem);
33+ -webkit-font-smoothing: antialiased;
34+ font-style: normal;
35+ font-weight: 400;
36+ letter-spacing: -0.0025em;
37+ line-height: 1.4;
38+ min-height: 100vh;
39+ place-items: center;
40+ text-rendering: optimizeLegibility;
41+ -webkit-text-size-adjust: 100%;
42+ }
43+
44+ a {
45+ color: inherit;
46+ font-weight: 700;
47+ text-decoration: underline;
48+ text-underline-offset: 0.0925em;
49+ }
50+
51+ b, strong {
52+ font-weight: 700;
53+ }
54+
55+ i, em {
56+ font-style: italic;
57+ }
58+
59+ main {
60+ display: grid;
61+ gap: 1em;
62+ padding: 2em;
63+ place-items: center;
64+ text-align: center;
65+ }
66+
67+ main header {
68+ width: min(100%, 12em);
69+ }
70+
71+ main header svg {
72+ height: auto;
73+ max-width: 100%;
74+ width: 100%;
75+ }
76+
77+ main article {
78+ width: min(100%, 30em);
79+ }
80+
81+ main article p {
82+ font-size: 75%;
83+ }
84+
85+ main article br {
86+
87+ display: none;
88+
89+ @media(min-width: 48em) {
90+ display: inline;
91+ }
92+
93+ }
94+
95+ </style>
96+
97+ </head>
98+
99+ <body>
100+
101+ <!-- This file lives in public/404.html -->
102+
103+ <main>
104+ <header>
105+ <svg height="172" viewBox="0 0 480 172" width="480" xmlns="http://www.w3.org/2000/svg"><path d="m124.48 3.00509-45.6889 100.02991h26.2239v-28.1168h38.119v28.1168h21.628v35.145h-21.628v30.82h-37.308v-30.82h-72.1833v-31.901l50.2851-103.27391zm115.583 168.69891c-40.822 0-64.884-35.146-64.884-85.7015 0-50.5554 24.062-85.700907 64.884-85.700907 40.823 0 64.884 35.145507 64.884 85.700907 0 50.5555-24.061 85.7015-64.884 85.7015zm0-133.2831c-17.572 0-22.709 21.8984-22.709 47.5816 0 25.6835 5.137 47.5815 22.709 47.5815 17.303 0 22.71-21.898 22.71-47.5815 0-25.6832-5.407-47.5816-22.71-47.5816zm165.328-35.41581-45.689 100.02991h26.224v-28.1168h38.119v28.1168h21.628v35.145h-21.628v30.82h-37.308v-30.82h-72.184v-31.901l50.285-103.27391z" fill="#f0eff0"/><path d="m157.758 68.9967v34.0033h-7.199l-14.233-19.8814v19.8814h-8.584v-34.0033h8.307l13.125 18.7184v-18.7184zm28.454 21.5428c0 7.6978-5.15 13.0145-12.737 13.0145-7.532 0-12.738-5.3167-12.738-13.0145s5.206-13.0143 12.738-13.0143c7.587 0 12.737 5.3165 12.737 13.0143zm-8.528 0c0-3.4336-1.496-5.8703-4.209-5.8703-2.659 0-4.154 2.4367-4.154 5.8703s1.495 5.8149 4.154 5.8149c2.713 0 4.209-2.3813 4.209-5.8149zm13.184 3.8766v-9.5807h-3.655v-6.7564h3.655v-6.8671h8.584v6.8671h5.205v6.7564h-5.205v8.307c0 1.9383.941 2.769 2.658 2.769.941 0 1.994-.2216 2.769-.5538v7.3654c-.997.443-2.88.775-4.818.775-5.87 0-9.193-2.769-9.193-9.0819zm37.027 8.5839h-8.806v-34.0033h23.924v7.6978h-15.118v6.7564h13.9v7.5316h-13.9zm41.876-12.4605c0 7.6978-5.15 13.0145-12.737 13.0145-7.532 0-12.738-5.3167-12.738-13.0145s5.206-13.0143 12.738-13.0143c7.587 0 12.737 5.3165 12.737 13.0143zm-8.529 0c0-3.4336-1.495-5.8703-4.208-5.8703-2.659 0-4.154 2.4367-4.154 5.8703s1.495 5.8149 4.154 5.8149c2.713 0 4.208-2.3813 4.208-5.8149zm35.337-12.4605v24.921h-8.695v-2.16c-1.329 1.551-3.821 2.714-6.646 2.714-5.482 0-8.75-3.5999-8.75-9.1379v-16.3371h8.64v14.288c0 2.1045.997 3.5997 3.212 3.5997 1.606 0 3.101-1.0522 3.544-2.769v-15.1187zm4.076 24.921v-24.921h8.694v2.1598c1.385-1.5506 3.822-2.7136 6.701-2.7136 5.538 0 8.806 3.5997 8.806 9.1377v16.3371h-8.639v-14.2327c0-2.049-1.053-3.5443-3.268-3.5443-1.717 0-3.156.9969-3.6 2.7136v15.0634zm44.113 0v-1.994c-1.163 1.329-3.6 2.548-6.147 2.548-7.2 0-11.132-5.8151-11.132-13.0145s3.932-13.0143 11.132-13.0143c2.547 0 4.984 1.2184 6.147 2.5475v-13.0697h8.695v35.997zm0-9.1931v-6.5902c-.665-1.3291-2.16-2.326-3.821-2.326-2.991 0-4.763 2.4368-4.763 5.6488s1.772 5.5934 4.763 5.5934c1.717 0 3.156-.9415 3.821-2.326z" fill="#d30001"/></svg>
106+ </header>
107+ <article>
108+ <p><strong>The page you were looking for doesn’t exist.</strong> You may have mistyped the address or the page may have moved. If you’re the application owner check the logs for more information.</p>
109+ </article>
110+ </main>
111+
112+ </body>
113+
114+</html>
@@ -0,0 +1,114 @@
1+<!doctype html>
2+
3+<html lang="en">
4+
5+ <head>
6+
7+ <title>Your browser is not supported (406 Not Acceptable)</title>
8+
9+ <meta charset="utf-8">
10+ <meta name="viewport" content="initial-scale=1, width=device-width">
11+ <meta name="robots" content="noindex, nofollow">
12+
13+ <style>
14+
15+ *, *::before, *::after {
16+ box-sizing: border-box;
17+ }
18+
19+ * {
20+ margin: 0;
21+ }
22+
23+ html {
24+ font-size: 16px;
25+ }
26+
27+ body {
28+ background: #FFF;
29+ color: #261B23;
30+ display: grid;
31+ font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Aptos, Roboto, "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
32+ font-size: clamp(1rem, 2.5vw, 2rem);
33+ -webkit-font-smoothing: antialiased;
34+ font-style: normal;
35+ font-weight: 400;
36+ letter-spacing: -0.0025em;
37+ line-height: 1.4;
38+ min-height: 100vh;
39+ place-items: center;
40+ text-rendering: optimizeLegibility;
41+ -webkit-text-size-adjust: 100%;
42+ }
43+
44+ a {
45+ color: inherit;
46+ font-weight: 700;
47+ text-decoration: underline;
48+ text-underline-offset: 0.0925em;
49+ }
50+
51+ b, strong {
52+ font-weight: 700;
53+ }
54+
55+ i, em {
56+ font-style: italic;
57+ }
58+
59+ main {
60+ display: grid;
61+ gap: 1em;
62+ padding: 2em;
63+ place-items: center;
64+ text-align: center;
65+ }
66+
67+ main header {
68+ width: min(100%, 12em);
69+ }
70+
71+ main header svg {
72+ height: auto;
73+ max-width: 100%;
74+ width: 100%;
75+ }
76+
77+ main article {
78+ width: min(100%, 30em);
79+ }
80+
81+ main article p {
82+ font-size: 75%;
83+ }
84+
85+ main article br {
86+
87+ display: none;
88+
89+ @media(min-width: 48em) {
90+ display: inline;
91+ }
92+
93+ }
94+
95+ </style>
96+
97+ </head>
98+
99+ <body>
100+
101+ <!-- This file lives in public/406-unsupported-browser.html -->
102+
103+ <main>
104+ <header>
105+ <svg height="172" viewBox="0 0 480 172" width="480" xmlns="http://www.w3.org/2000/svg"><path d="m124.48 3.00509-45.6889 100.02991h26.2239v-28.1168h38.119v28.1168h21.628v35.145h-21.628v30.82h-37.308v-30.82h-72.1833v-31.901l50.2851-103.27391zm115.583 168.69891c-40.822 0-64.884-35.146-64.884-85.7015 0-50.5554 24.062-85.700907 64.884-85.700907 40.823 0 64.884 35.145507 64.884 85.700907 0 50.5555-24.061 85.7015-64.884 85.7015zm0-133.2831c-17.572 0-22.709 21.8984-22.709 47.5816 0 25.6835 5.137 47.5815 22.709 47.5815 17.303 0 22.71-21.898 22.71-47.5815 0-25.6832-5.407-47.5816-22.71-47.5816zm202.906 9.7326h-41.093c-2.433-7.2994-7.84-12.4361-17.302-12.4361-16.221 0-25.413 17.5728-25.954 34.8752v1.3517c5.137-7.0291 16.221-12.4361 30.82-12.4361 33.524 0 54.881 24.0612 54.881 53.7998 0 33.253-23.791 58.396-61.64 58.396-21.628 0-39.741-10.003-50.825-27.576-9.733-14.599-13.788-32.442-13.788-54.3406 0-51.9072 24.331-89.485807 66.236-89.485807 32.712 0 53.258 18.654107 58.665 47.851907zm-82.727 66.2355c0 13.247 9.463 22.439 22.71 22.439 12.977 0 22.439-9.192 22.439-22.439 0-13.517-9.462-22.7091-22.439-22.7091-13.247 0-22.71 9.1921-22.71 22.7091z" fill="#f0eff0"/><path d="m100.761 68.9967v34.0033h-7.1991l-14.2326-19.8814v19.8814h-8.5839v-34.0033h8.307l13.125 18.7184v-18.7184zm28.454 21.5428c0 7.6978-5.15 13.0145-12.737 13.0145-7.532 0-12.738-5.3167-12.738-13.0145s5.206-13.0143 12.738-13.0143c7.587 0 12.737 5.3165 12.737 13.0143zm-8.529 0c0-3.4336-1.495-5.8703-4.208-5.8703-2.659 0-4.154 2.4367-4.154 5.8703s1.495 5.8149 4.154 5.8149c2.713 0 4.208-2.3813 4.208-5.8149zm13.185 3.8766v-9.5807h-3.655v-6.7564h3.655v-6.8671h8.584v6.8671h5.205v6.7564h-5.205v8.307c0 1.9383.941 2.769 2.658 2.769.941 0 1.994-.2216 2.769-.5538v7.3654c-.997.443-2.88.775-4.818.775-5.87 0-9.193-2.769-9.193-9.0819zm39.02-25.4194h9.083l12.958 34.0033h-9.027l-2.436-6.5902h-12.35l-2.381 6.5902h-8.806zm4.431 10.5222-3.489 9.5807h6.978zm17.44 11.0206c0-7.6978 5.095-13.0143 12.572-13.0143 6.701 0 10.854 3.9874 11.574 9.8023h-8.418c-.221-1.4953-1.384-2.6029-3.156-2.6029-2.437 0-3.988 2.2706-3.988 5.8149s1.551 5.7595 3.988 5.7595c1.772 0 2.935-1.0522 3.156-2.5475h8.418c-.72 5.7596-4.873 9.8025-11.574 9.8025-7.477 0-12.572-5.3167-12.572-13.0145zm25.676 0c0-7.6978 5.095-13.0143 12.572-13.0143 6.701 0 10.854 3.9874 11.574 9.8023h-8.418c-.221-1.4953-1.384-2.6029-3.156-2.6029-2.437 0-3.988 2.2706-3.988 5.8149s1.551 5.7595 3.988 5.7595c1.772 0 2.935-1.0522 3.156-2.5475h8.418c-.72 5.7596-4.873 9.8025-11.574 9.8025-7.477 0-12.572-5.3167-12.572-13.0145zm42.013 3.7658h8.031c-.887 5.7597-5.206 9.2487-11.686 9.2487-7.642 0-12.682-5.2613-12.682-13.0145 0-7.6978 5.317-13.0143 12.516-13.0143 7.643 0 11.962 5.095 11.962 12.5159v2.1598h-16.115c.277 2.9905 1.827 4.5965 4.319 4.5965 1.773 0 3.157-.7753 3.655-2.4921zm-3.821-10.0237c-2.049 0-3.433 1.2737-3.987 3.5997h7.532c-.111-2.0491-1.385-3.5997-3.545-3.5997zm23.4 16.7244v10.799h-8.694v-33.726h8.694v1.9937c1.163-1.3291 3.6-2.5475 6.148-2.5475 7.199 0 11.131 5.8703 11.131 13.0143 0 7.0886-3.932 13.0145-11.131 13.0145-2.548 0-4.985-1.219-6.148-2.548zm0-13.7893v6.5902c.665 1.3845 2.16 2.326 3.822 2.326 2.99 0 4.762-2.3814 4.762-5.5934s-1.772-5.6488-4.762-5.6488c-1.717 0-3.157.9969-3.822 2.326zm21.892 7.1994v-9.5807h-3.655v-6.7564h3.655v-6.8671h8.584v6.8671h5.206v6.7564h-5.206v8.307c0 1.9383.941 2.769 2.658 2.769.942 0 1.994-.2216 2.769-.5538v7.3654c-.997.443-2.88.775-4.818.775-5.87 0-9.193-2.769-9.193-9.0819zm39.458 8.5839h-8.363v-1.274c-.83.831-3.322 1.717-5.981 1.717-4.928 0-9.082-2.769-9.082-8.0301 0-4.818 4.154-7.9193 9.581-7.9193 2.049 0 4.486.6646 5.482 1.3845v-1.606c0-1.606-.941-2.9905-3.045-2.9905-1.606 0-2.548.7199-2.936 1.8275h-8.196c.72-4.8181 4.984-8.6393 11.408-8.6393 7.089 0 11.132 3.7659 11.132 10.2453zm-8.363-6.9779v-1.4399c-.553-1.0522-2.049-1.7167-3.655-1.7167-1.716 0-3.433.7199-3.433 2.3813 0 1.7168 1.717 2.4367 3.433 2.4367 1.606 0 3.102-.6645 3.655-1.6614zm20.742 4.9839v1.994h-8.694v-35.997h8.694v13.0697c1.163-1.3291 3.6-2.5475 6.148-2.5475 7.199 0 11.131 5.8149 11.131 13.0143s-3.932 13.0145-11.131 13.0145c-2.548 0-4.985-1.219-6.148-2.548zm0-13.7893v6.5902c.665 1.3845 2.105 2.326 3.822 2.326 2.99 0 4.762-2.3814 4.762-5.5934s-1.772-5.6488-4.762-5.6488c-1.662 0-3.157.9969-3.822 2.326zm28.759-20.2137v35.997h-8.695v-35.997zm19.172 27.3023h8.03c-.886 5.7597-5.206 9.2487-11.685 9.2487-7.643 0-12.682-5.2613-12.682-13.0145 0-7.6978 5.316-13.0143 12.516-13.0143 7.642 0 11.962 5.095 11.962 12.5159v2.1598h-16.116c.277 2.9905 1.828 4.5965 4.32 4.5965 1.772 0 3.157-.7753 3.655-2.4921zm-3.821-10.0237c-2.049 0-3.434 1.2737-3.988 3.5997h7.532c-.111-2.0491-1.384-3.5997-3.544-3.5997z" fill="#d30001"/></svg>
106+ </header>
107+ <article>
108+ <p><strong>Your browser is not supported.</strong><br> Please upgrade your browser to continue.</p>
109+ </article>
110+ </main>
111+
112+ </body>
113+
114+</html>
@@ -0,0 +1,114 @@
1+<!doctype html>
2+
3+<html lang="en">
4+
5+ <head>
6+
7+ <title>The change you wanted was rejected (422 Unprocessable Entity)</title>
8+
9+ <meta charset="utf-8">
10+ <meta name="viewport" content="initial-scale=1, width=device-width">
11+ <meta name="robots" content="noindex, nofollow">
12+
13+ <style>
14+
15+ *, *::before, *::after {
16+ box-sizing: border-box;
17+ }
18+
19+ * {
20+ margin: 0;
21+ }
22+
23+ html {
24+ font-size: 16px;
25+ }
26+
27+ body {
28+ background: #FFF;
29+ color: #261B23;
30+ display: grid;
31+ font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Aptos, Roboto, "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
32+ font-size: clamp(1rem, 2.5vw, 2rem);
33+ -webkit-font-smoothing: antialiased;
34+ font-style: normal;
35+ font-weight: 400;
36+ letter-spacing: -0.0025em;
37+ line-height: 1.4;
38+ min-height: 100vh;
39+ place-items: center;
40+ text-rendering: optimizeLegibility;
41+ -webkit-text-size-adjust: 100%;
42+ }
43+
44+ a {
45+ color: inherit;
46+ font-weight: 700;
47+ text-decoration: underline;
48+ text-underline-offset: 0.0925em;
49+ }
50+
51+ b, strong {
52+ font-weight: 700;
53+ }
54+
55+ i, em {
56+ font-style: italic;
57+ }
58+
59+ main {
60+ display: grid;
61+ gap: 1em;
62+ padding: 2em;
63+ place-items: center;
64+ text-align: center;
65+ }
66+
67+ main header {
68+ width: min(100%, 12em);
69+ }
70+
71+ main header svg {
72+ height: auto;
73+ max-width: 100%;
74+ width: 100%;
75+ }
76+
77+ main article {
78+ width: min(100%, 30em);
79+ }
80+
81+ main article p {
82+ font-size: 75%;
83+ }
84+
85+ main article br {
86+
87+ display: none;
88+
89+ @media(min-width: 48em) {
90+ display: inline;
91+ }
92+
93+ }
94+
95+ </style>
96+
97+ </head>
98+
99+ <body>
100+
101+ <!-- This file lives in public/422.html -->
102+
103+ <main>
104+ <header>
105+ <svg height="172" viewBox="0 0 480 172" width="480" xmlns="http://www.w3.org/2000/svg"><path d="m124.48 3.00509-45.6889 100.02991h26.2239v-28.1168h38.119v28.1168h21.628v35.145h-21.628v30.82h-37.308v-30.82h-72.1833v-31.901l50.2851-103.27391zm130.453 51.63681c0-8.9215-6.218-15.4099-15.681-15.4099-10.273 0-15.95 7.5698-16.491 16.4913h-44.608c3.244-30.8199 25.683-55.421707 61.099-55.421707 36.498 0 59.477 20.816907 59.477 51.636807 0 21.3577-14.869 36.7676-31.901 52.7186l-27.305 27.035h59.747v37.308h-120.306v-27.846l57.044-56.7736c11.084-11.8954 18.925-20.0059 18.925-29.7385zm140.455 0c0-8.9215-6.218-15.4099-15.68-15.4099-10.274 0-15.951 7.5698-16.492 16.4913h-44.608c3.245-30.8199 25.684-55.421707 61.1-55.421707 36.497 0 59.477 20.816907 59.477 51.636807 0 21.3577-14.87 36.7676-31.902 52.7186l-27.305 27.035h59.747v37.308h-120.305v-27.846l57.043-56.7736c11.085-11.8954 18.925-20.0059 18.925-29.7385z" fill="#f0eff0"/><path d="m19.3936 103.554c-8.9715 0-14.84183-5.0952-14.84183-14.4544v-20.1029h8.86083v19.3276c0 4.8181 2.2706 7.3102 5.981 7.3102 3.6551 0 5.9257-2.4921 5.9257-7.3102v-19.3276h8.8608v20.1583c0 9.3038-5.8149 14.399-14.7865 14.399zm18.734-.554v-24.921h8.6947v2.1598c1.3845-1.5506 3.8212-2.7136 6.701-2.7136 5.538 0 8.8054 3.5997 8.8054 9.1377v16.3371h-8.6393v-14.2327c0-2.049-1.0522-3.5443-3.2674-3.5443-1.7168 0-3.1567.9969-3.5997 2.7136v15.0634zm36.8584-1.994v10.799h-8.6946v-33.726h8.6946v1.9937c1.163-1.3291 3.5997-2.5475 6.1472-2.5475 7.1994 0 11.1314 5.8703 11.1314 13.0143 0 7.0886-3.932 13.0145-11.1314 13.0145-2.5475 0-4.9842-1.219-6.1472-2.548zm0-13.7893v6.5902c.6646 1.3845 2.1599 2.326 3.8213 2.326 2.9905 0 4.7626-2.3814 4.7626-5.5934s-1.7721-5.6488-4.7626-5.6488c-1.7168 0-3.1567.9969-3.8213 2.326zm36.789-9.2485v8.3624c-1.052-.5538-2.215-.7753-3.6-.7753-2.381 0-3.987 1.0522-4.43 2.8244v14.6203h-8.6949v-24.921h8.6949v2.2152c1.218-1.6614 3.156-2.769 5.648-2.769 1.108 0 1.994.2215 2.382.443zm26.769 12.5713c0 7.6978-5.15 13.0145-12.737 13.0145-7.532 0-12.738-5.3167-12.738-13.0145s5.206-13.0143 12.738-13.0143c7.587 0 12.737 5.3165 12.737 13.0143zm-8.528 0c0-3.4336-1.496-5.8703-4.209-5.8703-2.659 0-4.154 2.4367-4.154 5.8703s1.495 5.8149 4.154 5.8149c2.713 0 4.209-2.3813 4.209-5.8149zm10.352 0c0-7.6978 5.095-13.0143 12.571-13.0143 6.701 0 10.855 3.9874 11.574 9.8023h-8.417c-.222-1.4953-1.385-2.6029-3.157-2.6029-2.437 0-3.987 2.2706-3.987 5.8149s1.55 5.7595 3.987 5.7595c1.772 0 2.935-1.0522 3.157-2.5475h8.417c-.719 5.7596-4.873 9.8025-11.574 9.8025-7.476 0-12.571-5.3167-12.571-13.0145zm42.013 3.7658h8.03c-.886 5.7597-5.206 9.2487-11.685 9.2487-7.643 0-12.682-5.2613-12.682-13.0145 0-7.6978 5.316-13.0143 12.516-13.0143 7.642 0 11.962 5.095 11.962 12.5159v2.1598h-16.116c.277 2.9905 1.828 4.5965 4.32 4.5965 1.772 0 3.156-.7753 3.655-2.4921zm-3.821-10.0237c-2.049 0-3.434 1.2737-3.988 3.5997h7.532c-.111-2.0491-1.385-3.5997-3.544-3.5997zm13.428 11.0206h8.473c.387 1.3845 1.606 2.1598 3.156 2.1598 1.44 0 2.548-.5538 2.548-1.7168 0-.9414-.72-1.2737-1.938-1.5506l-4.874-.9969c-4.153-.886-6.867-2.8797-6.867-7.2547 0-5.3165 4.763-8.4178 10.633-8.4178 6.812 0 10.522 3.1567 11.297 8.0855h-8.03c-.277-1.0522-1.052-1.9937-3.046-1.9937-1.273 0-2.326.5538-2.326 1.6614 0 .7753.554 1.163 1.717 1.3845l4.929 1.163c4.541 1.0522 6.978 3.4335 6.978 7.4763 0 5.3168-4.818 8.2518-10.91 8.2518-6.369 0-10.965-2.88-11.74-8.2518zm24.269 0h8.474c.387 1.3845 1.606 2.1598 3.156 2.1598 1.44 0 2.548-.5538 2.548-1.7168 0-.9414-.72-1.2737-1.939-1.5506l-4.873-.9969c-4.154-.886-6.867-2.8797-6.867-7.2547 0-5.3165 4.763-8.4178 10.633-8.4178 6.812 0 10.522 3.1567 11.297 8.0855h-8.03c-.277-1.0522-1.052-1.9937-3.046-1.9937-1.273 0-2.326.5538-2.326 1.6614 0 .7753.554 1.163 1.717 1.3845l4.929 1.163c4.541 1.0522 6.978 3.4335 6.978 7.4763 0 5.3168-4.818 8.2518-10.91 8.2518-6.369 0-10.965-2.88-11.741-8.2518zm47.918 7.6978h-8.363v-1.274c-.831.831-3.323 1.717-5.981 1.717-4.929 0-9.082-2.769-9.082-8.0301 0-4.818 4.153-7.9193 9.581-7.9193 2.049 0 4.485.6646 5.482 1.3845v-1.606c0-1.606-.941-2.9905-3.046-2.9905-1.606 0-2.547.7199-2.935 1.8275h-8.196c.72-4.8181 4.984-8.6393 11.408-8.6393 7.089 0 11.132 3.7659 11.132 10.2453zm-8.363-6.9779v-1.4399c-.554-1.0522-2.049-1.7167-3.655-1.7167-1.717 0-3.434.7199-3.434 2.3813 0 1.7168 1.717 2.4367 3.434 2.4367 1.606 0 3.101-.6645 3.655-1.6614zm20.742 4.9839v1.994h-8.695v-35.997h8.695v13.0697c1.163-1.3291 3.6-2.5475 6.147-2.5475 7.2 0 11.132 5.8149 11.132 13.0143s-3.932 13.0145-11.132 13.0145c-2.547 0-4.984-1.219-6.147-2.548zm0-13.7893v6.5902c.665 1.3845 2.105 2.326 3.821 2.326 2.991 0 4.763-2.3814 4.763-5.5934s-1.772-5.6488-4.763-5.6488c-1.661 0-3.156.9969-3.821 2.326zm28.759-20.2137v35.997h-8.695v-35.997zm19.172 27.3023h8.03c-.886 5.7597-5.206 9.2487-11.685 9.2487-7.643 0-12.682-5.2613-12.682-13.0145 0-7.6978 5.316-13.0143 12.515-13.0143 7.643 0 11.962 5.095 11.962 12.5159v2.1598h-16.115c.277 2.9905 1.827 4.5965 4.32 4.5965 1.772 0 3.156-.7753 3.655-2.4921zm-3.822-10.0237c-2.049 0-3.433 1.2737-3.987 3.5997h7.532c-.111-2.0491-1.385-3.5997-3.545-3.5997zm25.461-15.2849h24.311v7.6424h-15.561v5.3165h14.232v7.4763h-14.232v5.8703h15.561v7.6978h-24.311zm27.942 34.0033v-24.921h8.694v2.1598c1.385-1.5506 3.822-2.7136 6.701-2.7136 5.538 0 8.806 3.5997 8.806 9.1377v16.3371h-8.639v-14.2327c0-2.049-1.053-3.5443-3.268-3.5443-1.717 0-3.157.9969-3.6 2.7136v15.0634zm29.991-8.5839v-9.5807h-3.655v-6.7564h3.655v-6.8671h8.584v6.8671h5.206v6.7564h-5.206v8.307c0 1.9383.941 2.769 2.658 2.769.942 0 1.994-.2216 2.769-.5538v7.3654c-.997.443-2.88.775-4.818.775-5.87 0-9.193-2.769-9.193-9.0819zm26.161-16.3371v24.921h-8.694v-24.921zm.61-6.7564c0 2.8244-2.271 4.652-4.929 4.652s-4.929-1.8276-4.929-4.652c0-2.8797 2.271-4.7073 4.929-4.7073s4.929 1.8276 4.929 4.7073zm5.382 23.0935v-9.5807h-3.655v-6.7564h3.655v-6.8671h8.584v6.8671h5.206v6.7564h-5.206v8.307c0 1.9383.941 2.769 2.658 2.769.941 0 1.994-.2216 2.769-.5538v7.3654c-.997.443-2.88.775-4.818.775-5.87 0-9.193-2.769-9.193-9.0819zm29.22 17.3889h-8.584l3.655-9.414-9.303-24.312h9.026l4.763 14.1773 4.652-14.1773h8.639z" fill="#d30001"/></svg>
106+ </header>
107+ <article>
108+ <p><strong>The change you wanted was rejected.</strong> Maybe you tried to change something you didn’t have access to. If you’re the application owner check the logs for more information.</p>
109+ </article>
110+ </main>
111+
112+ </body>
113+
114+</html>
@@ -0,0 +1,114 @@
1+<!doctype html>
2+
3+<html lang="en">
4+
5+ <head>
6+
7+ <title>We’re sorry, but something went wrong (500 Internal Server Error)</title>
8+
9+ <meta charset="utf-8">
10+ <meta name="viewport" content="initial-scale=1, width=device-width">
11+ <meta name="robots" content="noindex, nofollow">
12+
13+ <style>
14+
15+ *, *::before, *::after {
16+ box-sizing: border-box;
17+ }
18+
19+ * {
20+ margin: 0;
21+ }
22+
23+ html {
24+ font-size: 16px;
25+ }
26+
27+ body {
28+ background: #FFF;
29+ color: #261B23;
30+ display: grid;
31+ font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Aptos, Roboto, "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
32+ font-size: clamp(1rem, 2.5vw, 2rem);
33+ -webkit-font-smoothing: antialiased;
34+ font-style: normal;
35+ font-weight: 400;
36+ letter-spacing: -0.0025em;
37+ line-height: 1.4;
38+ min-height: 100vh;
39+ place-items: center;
40+ text-rendering: optimizeLegibility;
41+ -webkit-text-size-adjust: 100%;
42+ }
43+
44+ a {
45+ color: inherit;
46+ font-weight: 700;
47+ text-decoration: underline;
48+ text-underline-offset: 0.0925em;
49+ }
50+
51+ b, strong {
52+ font-weight: 700;
53+ }
54+
55+ i, em {
56+ font-style: italic;
57+ }
58+
59+ main {
60+ display: grid;
61+ gap: 1em;
62+ padding: 2em;
63+ place-items: center;
64+ text-align: center;
65+ }
66+
67+ main header {
68+ width: min(100%, 12em);
69+ }
70+
71+ main header svg {
72+ height: auto;
73+ max-width: 100%;
74+ width: 100%;
75+ }
76+
77+ main article {
78+ width: min(100%, 30em);
79+ }
80+
81+ main article p {
82+ font-size: 75%;
83+ }
84+
85+ main article br {
86+
87+ display: none;
88+
89+ @media(min-width: 48em) {
90+ display: inline;
91+ }
92+
93+ }
94+
95+ </style>
96+
97+ </head>
98+
99+ <body>
100+
101+ <!-- This file lives in public/500.html -->
102+
103+ <main>
104+ <header>
105+ <svg height="172" viewBox="0 0 480 172" width="480" xmlns="http://www.w3.org/2000/svg"><path d="m101.23 93.8427c-8.1103 0-15.4098 3.7849-19.7354 8.3813h-36.2269v-99.21891h103.8143v37.03791h-68.3984v24.8722c5.1366-2.7035 15.1396-5.9477 24.6014-5.9477 35.146 0 56.233 22.7094 56.233 55.4215 0 34.605-23.791 57.315-60.558 57.315-37.8492 0-61.64-22.169-63.8028-55.963h42.9857c1.0814 10.814 9.1919 19.195 21.6281 19.195 11.355 0 19.465-8.381 19.465-20.547 0-11.625-7.299-20.5463-20.006-20.5463zm138.833 77.8613c-40.822 0-64.884-35.146-64.884-85.7015 0-50.5554 24.062-85.700907 64.884-85.700907 40.823 0 64.884 35.145507 64.884 85.700907 0 50.5555-24.061 85.7015-64.884 85.7015zm0-133.2831c-17.572 0-22.709 21.8984-22.709 47.5816 0 25.6835 5.137 47.5815 22.709 47.5815 17.303 0 22.71-21.898 22.71-47.5815 0-25.6832-5.407-47.5816-22.71-47.5816zm140.456 133.2831c-40.823 0-64.884-35.146-64.884-85.7015 0-50.5554 24.061-85.700907 64.884-85.700907 40.822 0 64.884 35.145507 64.884 85.700907 0 50.5555-24.062 85.7015-64.884 85.7015zm0-133.2831c-17.573 0-22.71 21.8984-22.71 47.5816 0 25.6835 5.137 47.5815 22.71 47.5815 17.302 0 22.709-21.898 22.709-47.5815 0-25.6832-5.407-47.5816-22.709-47.5816z" fill="#f0eff0"/><path d="m23.1377 68.9967v34.0033h-8.9162v-34.0033zm4.3157 34.0033v-24.921h8.6947v2.1598c1.3845-1.5506 3.8212-2.7136 6.701-2.7136 5.538 0 8.8054 3.5997 8.8054 9.1377v16.3371h-8.6393v-14.2327c0-2.049-1.0522-3.5443-3.2674-3.5443-1.7168 0-3.1567.9969-3.5997 2.7136v15.0634zm29.9913-8.5839v-9.5807h-3.655v-6.7564h3.655v-6.8671h8.5839v6.8671h5.2058v6.7564h-5.2058v8.307c0 1.9383.9415 2.769 2.6583 2.769.9414 0 1.9937-.2216 2.769-.5538v7.3654c-.9969.443-2.8798.775-4.8181.775-5.8703 0-9.1931-2.769-9.1931-9.0819zm32.3666-.1108h8.0301c-.8861 5.7597-5.2057 9.2487-11.6852 9.2487-7.6424 0-12.682-5.2613-12.682-13.0145 0-7.6978 5.3165-13.0143 12.5159-13.0143 7.6424 0 11.9621 5.095 11.9621 12.5159v2.1598h-16.1156c.2769 2.9905 1.8275 4.5965 4.3196 4.5965 1.7722 0 3.1567-.7753 3.6551-2.4921zm-3.8212-10.0237c-2.0491 0-3.4336 1.2737-3.9874 3.5997h7.5317c-.1107-2.0491-1.3845-3.5997-3.5443-3.5997zm31.4299-6.3134v8.3624c-1.052-.5538-2.215-.7753-3.599-.7753-2.382 0-3.988 1.0522-4.431 2.8244v14.6203h-8.694v-24.921h8.694v2.2152c1.219-1.6614 3.157-2.769 5.649-2.769 1.108 0 1.994.2215 2.381.443zm2.949 25.0318v-24.921h8.694v2.1598c1.385-1.5506 3.821-2.7136 6.701-2.7136 5.538 0 8.806 3.5997 8.806 9.1377v16.3371h-8.64v-14.2327c0-2.049-1.052-3.5443-3.267-3.5443-1.717 0-3.157.9969-3.6 2.7136v15.0634zm50.371 0h-8.363v-1.274c-.83.831-3.323 1.717-5.981 1.717-4.929 0-9.082-2.769-9.082-8.0301 0-4.818 4.153-7.9193 9.581-7.9193 2.049 0 4.485.6646 5.482 1.3845v-1.606c0-1.606-.941-2.9905-3.046-2.9905-1.606 0-2.547.7199-2.935 1.8275h-8.196c.72-4.8181 4.984-8.6393 11.408-8.6393 7.089 0 11.132 3.7659 11.132 10.2453zm-8.363-6.9779v-1.4399c-.554-1.0522-2.049-1.7167-3.655-1.7167-1.717 0-3.433.7199-3.433 2.3813 0 1.7168 1.716 2.4367 3.433 2.4367 1.606 0 3.101-.6645 3.655-1.6614zm20.742-29.0191v35.997h-8.694v-35.997zm13.036 25.9178h9.248c.72 2.326 2.714 3.489 5.483 3.489 2.713 0 4.596-1.163 4.596-3.2674 0-1.6061-1.052-2.326-3.212-2.8244l-6.534-1.3845c-4.985-1.1076-8.751-3.7105-8.751-9.47 0-6.6456 5.538-11.0206 13.07-11.0206 8.307 0 13.014 4.5411 13.956 10.4114h-8.695c-.72-1.8829-2.27-3.3228-5.205-3.3228-2.548 0-4.265 1.1076-4.265 2.9905 0 1.4953 1.052 2.326 2.825 2.7137l6.645 1.5506c5.815 1.3845 9.027 4.5412 9.027 9.8023 0 6.9778-5.87 10.9654-13.291 10.9654-8.141 0-13.679-3.9322-14.897-10.6332zm46.509 1.3845h8.031c-.887 5.7597-5.206 9.2487-11.686 9.2487-7.642 0-12.682-5.2613-12.682-13.0145 0-7.6978 5.317-13.0143 12.516-13.0143 7.643 0 11.962 5.095 11.962 12.5159v2.1598h-16.115c.277 2.9905 1.827 4.5965 4.319 4.5965 1.773 0 3.157-.7753 3.655-2.4921zm-3.821-10.0237c-2.049 0-3.433 1.2737-3.987 3.5997h7.532c-.111-2.0491-1.385-3.5997-3.545-3.5997zm31.431-6.3134v8.3624c-1.053-.5538-2.216-.7753-3.6-.7753-2.381 0-3.988 1.0522-4.431 2.8244v14.6203h-8.694v-24.921h8.694v2.2152c1.219-1.6614 3.157-2.769 5.649-2.769 1.108 0 1.994.2215 2.382.443zm18.288 25.0318h-7.809l-9.47-24.921h8.861l4.763 14.288 4.652-14.288h8.528zm25.614-8.6947h8.03c-.886 5.7597-5.206 9.2487-11.685 9.2487-7.642 0-12.682-5.2613-12.682-13.0145 0-7.6978 5.316-13.0143 12.516-13.0143 7.642 0 11.962 5.095 11.962 12.5159v2.1598h-16.116c.277 2.9905 1.828 4.5965 4.32 4.5965 1.772 0 3.157-.7753 3.655-2.4921zm-3.821-10.0237c-2.049 0-3.434 1.2737-3.988 3.5997h7.532c-.111-2.0491-1.384-3.5997-3.544-3.5997zm31.43-6.3134v8.3624c-1.052-.5538-2.215-.7753-3.6-.7753-2.381 0-3.987 1.0522-4.43 2.8244v14.6203h-8.695v-24.921h8.695v2.2152c1.218-1.6614 3.157-2.769 5.649-2.769 1.107 0 1.993.2215 2.381.443zm13.703-8.9715h24.312v7.6424h-15.562v5.3165h14.232v7.4763h-14.232v5.8703h15.562v7.6978h-24.312zm44.667 8.9715v8.3624c-1.052-.5538-2.215-.7753-3.6-.7753-2.381 0-3.987 1.0522-4.43 2.8244v14.6203h-8.695v-24.921h8.695v2.2152c1.218-1.6614 3.156-2.769 5.648-2.769 1.108 0 1.994.2215 2.382.443zm19.673 0v8.3624c-1.053-.5538-2.216-.7753-3.6-.7753-2.381 0-3.987 1.0522-4.43 2.8244v14.6203h-8.695v-24.921h8.695v2.2152c1.218-1.6614 3.156-2.769 5.648-2.769 1.108 0 1.994.2215 2.382.443zm26.769 12.5713c0 7.6978-5.15 13.0145-12.737 13.0145-7.532 0-12.738-5.3167-12.738-13.0145s5.206-13.0143 12.738-13.0143c7.587 0 12.737 5.3165 12.737 13.0143zm-8.529 0c0-3.4336-1.495-5.8703-4.208-5.8703-2.659 0-4.154 2.4367-4.154 5.8703s1.495 5.8149 4.154 5.8149c2.713 0 4.208-2.3813 4.208-5.8149zm28.082-12.5713v8.3624c-1.052-.5538-2.215-.7753-3.6-.7753-2.381 0-3.987 1.0522-4.43 2.8244v14.6203h-8.695v-24.921h8.695v2.2152c1.218-1.6614 3.157-2.769 5.649-2.769 1.107 0 1.993.2215 2.381.443z" fill="#d30001"/></svg>
106+ </header>
107+ <article>
108+ <p><strong>We’re sorry, but something went wrong.</strong><br> If you’re the application owner check the logs for more information.</p>
109+ </article>
110+ </main>
111+
112+ </body>
113+
114+</html>
@@ -0,0 +1,3 @@
1+<svg width="512" height="512" xmlns="http://www.w3.org/2000/svg">
2+ <circle cx="256" cy="256" r="256" fill="red"/>
3+</svg>
@@ -0,0 +1 @@
1+# See https://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file
@@ -0,0 +1,72 @@
1+# This file is copied to spec/ when you run 'rails generate rspec:install'
2+require 'spec_helper'
3+ENV['RAILS_ENV'] ||= 'test'
4+require_relative '../config/environment'
5+# Prevent database truncation if the environment is production
6+abort("The Rails environment is running in production mode!") if Rails.env.production?
7+# Uncomment the line below in case you have `--require rails_helper` in the `.rspec` file
8+# that will avoid rails generators crashing because migrations haven't been run yet
9+# return unless Rails.env.test?
10+require 'rspec/rails'
11+# Add additional requires below this line. Rails is not loaded until this point!
12+
13+# Requires supporting ruby files with custom matchers and macros, etc, in
14+# spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are
15+# run as spec files by default. This means that files in spec/support that end
16+# in _spec.rb will both be required and run as specs, causing the specs to be
17+# run twice. It is recommended that you do not name files matching this glob to
18+# end with _spec.rb. You can configure this pattern with the --pattern
19+# option on the command line or in ~/.rspec, .rspec or `.rspec-local`.
20+#
21+# The following line is provided for convenience purposes. It has the downside
22+# of increasing the boot-up time by auto-requiring all files in the support
23+# directory. Alternatively, in the individual `*_spec.rb` files, manually
24+# require only the support files necessary.
25+#
26+# Rails.root.glob('spec/support/**/*.rb').sort_by(&:to_s).each { |f| require f }
27+
28+# Ensures that the test database schema matches the current schema file.
29+# If there are pending migrations it will invoke `db:test:prepare` to
30+# recreate the test database by loading the schema.
31+# If you are not using ActiveRecord, you can remove these lines.
32+begin
33+ ActiveRecord::Migration.maintain_test_schema!
34+rescue ActiveRecord::PendingMigrationError => e
35+ abort e.to_s.strip
36+end
37+RSpec.configure do |config|
38+ # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
39+ config.fixture_paths = [
40+ Rails.root.join('spec/fixtures')
41+ ]
42+
43+ # If you're not using ActiveRecord, or you'd prefer not to run each of your
44+ # examples within a transaction, remove the following line or assign false
45+ # instead of true.
46+ config.use_transactional_fixtures = true
47+
48+ # You can uncomment this line to turn off ActiveRecord support entirely.
49+ # config.use_active_record = false
50+
51+ # RSpec Rails uses metadata to mix in different behaviours to your tests,
52+ # for example enabling you to call `get` and `post` in request specs. e.g.:
53+ #
54+ # RSpec.describe UsersController, type: :request do
55+ # # ...
56+ # end
57+ #
58+ # The different available types are documented in the features, such as in
59+ # https://rspec.info/features/8-0/rspec-rails
60+ #
61+ # You can also this infer these behaviours automatically by location, e.g.
62+ # /spec/models would pull in the same behaviour as `type: :model` but this
63+ # behaviour is considered legacy and will be removed in a future version.
64+ #
65+ # To enable this behaviour uncomment the line below.
66+ # config.infer_spec_type_from_file_location!
67+
68+ # Filter lines from Rails gems in backtraces.
69+ config.filter_rails_from_backtrace!
70+ # arbitrary gems may also be filtered via:
71+ # config.filter_gems_from_backtrace("gem name")
72+end
@@ -0,0 +1,94 @@
1+# This file was generated by the `rails generate rspec:install` 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+# See https://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
16+RSpec.configure do |config|
17+ # rspec-expectations config goes here. You can use an alternate
18+ # assertion/expectation library such as wrong or the stdlib/minitest
19+ # assertions if you prefer.
20+ config.expect_with :rspec do |expectations|
21+ # This option will default to `true` in RSpec 4. It makes the `description`
22+ # and `failure_message` of custom matchers include text for helper methods
23+ # defined using `chain`, e.g.:
24+ # be_bigger_than(2).and_smaller_than(4).description
25+ # # => "be bigger than 2 and smaller than 4"
26+ # ...rather than:
27+ # # => "be bigger than 2"
28+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
29+ end
30+
31+ # rspec-mocks config goes here. You can use an alternate test double
32+ # library (such as bogus or mocha) by changing the `mock_with` option here.
33+ config.mock_with :rspec do |mocks|
34+ # Prevents you from mocking or stubbing a method that does not exist on
35+ # a real object. This is generally recommended, and will default to
36+ # `true` in RSpec 4.
37+ mocks.verify_partial_doubles = true
38+ end
39+
40+ # This option will default to `:apply_to_host_groups` in RSpec 4 (and will
41+ # have no way to turn it off -- the option exists only for backwards
42+ # compatibility in RSpec 3). It causes shared context metadata to be
43+ # inherited by the metadata hash of host groups and examples, rather than
44+ # triggering implicit auto-inclusion in groups with matching metadata.
45+ config.shared_context_metadata_behavior = :apply_to_host_groups
46+
47+# The settings below are suggested to provide a good initial experience
48+# with RSpec, but feel free to customize to your heart's content.
49+=begin
50+ # This allows you to limit a spec run to individual examples or groups
51+ # you care about by tagging them with `:focus` metadata. When nothing
52+ # is tagged with `:focus`, all examples get run. RSpec also provides
53+ # aliases for `it`, `describe`, and `context` that include `:focus`
54+ # metadata: `fit`, `fdescribe` and `fcontext`, respectively.
55+ config.filter_run_when_matching :focus
56+
57+ # Allows RSpec to persist some state between runs in order to support
58+ # the `--only-failures` and `--next-failure` CLI options. We recommend
59+ # you configure your source control system to ignore this file.
60+ config.example_status_persistence_file_path = "spec/examples.txt"
61+
62+ # Limits the available syntax to the non-monkey patched syntax that is
63+ # recommended. For more details, see:
64+ # https://rspec.info/features/3-12/rspec-core/configuration/zero-monkey-patching-mode/
65+ config.disable_monkey_patching!
66+
67+ # Many RSpec users commonly either run the entire suite or an individual
68+ # file, and it's useful to allow more verbose output when running an
69+ # individual spec file.
70+ if config.files_to_run.one?
71+ # Use the documentation formatter for detailed output,
72+ # unless a formatter has already been configured
73+ # (e.g. via a command-line flag).
74+ config.default_formatter = "doc"
75+ end
76+
77+ # Print the 10 slowest examples and example groups at the
78+ # end of the spec run, to help surface which specs are running
79+ # particularly slow.
80+ config.profile_examples = 10
81+
82+ # Run specs in random order to surface order dependencies. If you find an
83+ # order dependency and want to debug it, you can fix the order by providing
84+ # the seed, which is printed after each run.
85+ # --seed 1234
86+ config.order = :random
87+
88+ # Seed global randomization in this process using the `--seed` CLI option.
89+ # Setting this allows you to use `--seed` to deterministically reproduce
90+ # test failures related to randomization by passing the same `--seed` value
91+ # as the one that triggered the failure.
92+ Kernel.srand config.seed
93+=end
94+end