diff --git a/Gemfile b/Gemfile
index 48a4d41..c1e1ea4 100644
--- a/Gemfile
+++ b/Gemfile
@@ -3,7 +3,7 @@
source 'https://rubygems.org'
# Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main"
-gem 'rails', '~> 8.0.2'
+gem 'rails', '~> 8.1.0'
# The modern asset pipeline for Rails [https://github.com/rails/propshaft]
gem 'propshaft'
# Use sqlite3 as the database for Active Record
@@ -41,6 +41,9 @@ gem 'mini_magick'
# Reduces boot times through caching; required in config/boot.rb
gem 'bootsnap', require: false
+# Structured logging for production
+gem 'lograge'
+
# Deploy this application anywhere as a Docker container [https://kamal-deploy.org]
gem 'kamal', require: false
diff --git a/Gemfile.lock b/Gemfile.lock
index 9464bd7..edff6fc 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,29 +1,31 @@
GEM
remote: https://rubygems.org/
specs:
- actioncable (8.0.2)
- actionpack (= 8.0.2)
- activesupport (= 8.0.2)
+ action_text-trix (2.1.16)
+ railties
+ actioncable (8.1.2)
+ actionpack (= 8.1.2)
+ activesupport (= 8.1.2)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
zeitwerk (~> 2.6)
- actionmailbox (8.0.2)
- actionpack (= 8.0.2)
- activejob (= 8.0.2)
- activerecord (= 8.0.2)
- activestorage (= 8.0.2)
- activesupport (= 8.0.2)
+ actionmailbox (8.1.2)
+ actionpack (= 8.1.2)
+ activejob (= 8.1.2)
+ activerecord (= 8.1.2)
+ activestorage (= 8.1.2)
+ activesupport (= 8.1.2)
mail (>= 2.8.0)
- actionmailer (8.0.2)
- actionpack (= 8.0.2)
- actionview (= 8.0.2)
- activejob (= 8.0.2)
- activesupport (= 8.0.2)
+ actionmailer (8.1.2)
+ actionpack (= 8.1.2)
+ actionview (= 8.1.2)
+ activejob (= 8.1.2)
+ activesupport (= 8.1.2)
mail (>= 2.8.0)
rails-dom-testing (~> 2.2)
- actionpack (8.0.2)
- actionview (= 8.0.2)
- activesupport (= 8.0.2)
+ actionpack (8.1.2)
+ actionview (= 8.1.2)
+ activesupport (= 8.1.2)
nokogiri (>= 1.8.5)
rack (>= 2.2.4)
rack-session (>= 1.0.1)
@@ -31,68 +33,67 @@ GEM
rails-dom-testing (~> 2.2)
rails-html-sanitizer (~> 1.6)
useragent (~> 0.16)
- actiontext (8.0.2)
- actionpack (= 8.0.2)
- activerecord (= 8.0.2)
- activestorage (= 8.0.2)
- activesupport (= 8.0.2)
+ actiontext (8.1.2)
+ action_text-trix (~> 2.1.15)
+ actionpack (= 8.1.2)
+ activerecord (= 8.1.2)
+ activestorage (= 8.1.2)
+ activesupport (= 8.1.2)
globalid (>= 0.6.0)
nokogiri (>= 1.8.5)
- actionview (8.0.2)
- activesupport (= 8.0.2)
+ actionview (8.1.2)
+ activesupport (= 8.1.2)
builder (~> 3.1)
erubi (~> 1.11)
rails-dom-testing (~> 2.2)
rails-html-sanitizer (~> 1.6)
- activejob (8.0.2)
- activesupport (= 8.0.2)
+ activejob (8.1.2)
+ activesupport (= 8.1.2)
globalid (>= 0.3.6)
- activemodel (8.0.2)
- activesupport (= 8.0.2)
- activerecord (8.0.2)
- activemodel (= 8.0.2)
- activesupport (= 8.0.2)
+ activemodel (8.1.2)
+ activesupport (= 8.1.2)
+ activerecord (8.1.2)
+ activemodel (= 8.1.2)
+ activesupport (= 8.1.2)
timeout (>= 0.4.0)
- activestorage (8.0.2)
- actionpack (= 8.0.2)
- activejob (= 8.0.2)
- activerecord (= 8.0.2)
- activesupport (= 8.0.2)
+ activestorage (8.1.2)
+ actionpack (= 8.1.2)
+ activejob (= 8.1.2)
+ activerecord (= 8.1.2)
+ activesupport (= 8.1.2)
marcel (~> 1.0)
- activesupport (8.0.2)
+ activesupport (8.1.2)
base64
- benchmark (>= 0.3)
bigdecimal
concurrent-ruby (~> 1.0, >= 1.3.1)
connection_pool (>= 2.2.5)
drb
i18n (>= 1.6, < 2)
+ json
logger (>= 1.4.2)
minitest (>= 5.1)
securerandom (>= 0.3)
tzinfo (~> 2.0, >= 2.0.5)
uri (>= 0.13.1)
- addressable (2.8.7)
- public_suffix (>= 2.0.2, < 7.0)
+ addressable (2.8.8)
+ public_suffix (>= 2.0.2, < 8.0)
aes_key_wrap (1.1.0)
ansi (1.5.0)
ast (2.4.3)
attr_required (1.0.2)
- base64 (0.2.0)
- bcrypt (3.1.20)
- bcrypt_pbkdf (1.1.1)
- bcrypt_pbkdf (1.1.1-arm64-darwin)
- bcrypt_pbkdf (1.1.1-x86_64-darwin)
- benchmark (0.4.0)
- bigdecimal (3.1.9)
+ base64 (0.3.0)
+ bcrypt (3.1.21)
+ bcrypt_pbkdf (1.1.2)
+ bigdecimal (4.0.1)
bindata (2.5.1)
bindex (0.8.1)
- bootsnap (1.18.4)
+ bootsnap (1.23.0)
msgpack (~> 1.2)
- brakeman (7.0.2)
+ brakeman (8.0.2)
racc
builder (3.3.0)
- byebug (12.0.0)
+ byebug (13.0.0)
+ reline (>= 0.6.0)
bzip2-ffi (1.1.1)
ffi (~> 1.0)
cancancan (3.6.1)
@@ -107,137 +108,146 @@ GEM
xpath (~> 3.2)
choice (0.2.0)
coderay (1.1.3)
- concurrent-ruby (1.3.5)
- connection_pool (2.5.3)
+ concurrent-ruby (1.3.6)
+ connection_pool (3.0.2)
content_disposition (1.0.0)
crass (1.0.6)
cssbundling-rails (1.4.3)
railties (>= 6.0.0)
- date (3.4.1)
- debug (1.10.0)
+ date (3.5.1)
+ debug (1.11.1)
irb (~> 1.10)
reline (>= 0.3.8)
- devise (4.9.4)
+ devise (5.0.2)
bcrypt (~> 3.0)
orm_adapter (~> 0.1)
- railties (>= 4.1.0)
+ railties (>= 7.0)
responders
warden (~> 1.2.3)
- dotenv (3.1.8)
+ dotenv (3.2.0)
down (5.4.2)
addressable (~> 2.8)
- drb (2.2.1)
+ drb (2.2.3)
ed25519 (1.4.0)
email_validator (2.2.4)
activemodel
+ erb (6.0.2)
erubi (1.13.1)
- factory_bot (6.5.1)
+ factory_bot (6.5.6)
activesupport (>= 6.1.0)
- factory_bot_rails (6.4.4)
+ factory_bot_rails (6.5.1)
factory_bot (~> 6.5)
- railties (>= 5.0.0)
- faraday (2.13.1)
+ railties (>= 6.1.0)
+ faraday (2.14.1)
faraday-net_http (>= 2.0, < 3.5)
json
logger
- faraday-follow_redirects (0.3.0)
+ faraday-follow_redirects (0.5.0)
faraday (>= 1, < 3)
- faraday-net_http (3.4.0)
- net-http (>= 0.5.0)
+ faraday-net_http (3.4.2)
+ net-http (~> 0.5)
fastimage (2.4.0)
- ffi (1.17.2-aarch64-linux-gnu)
- ffi (1.17.2-aarch64-linux-musl)
- ffi (1.17.2-arm-linux-gnu)
- ffi (1.17.2-arm-linux-musl)
- ffi (1.17.2-arm64-darwin)
- ffi (1.17.2-x86_64-darwin)
- ffi (1.17.2-x86_64-linux-gnu)
- ffi (1.17.2-x86_64-linux-musl)
- formatador (1.1.0)
- globalid (1.2.1)
+ ffi (1.17.3-aarch64-linux-gnu)
+ ffi (1.17.3-aarch64-linux-musl)
+ ffi (1.17.3-arm-linux-gnu)
+ ffi (1.17.3-arm-linux-musl)
+ ffi (1.17.3-arm64-darwin)
+ ffi (1.17.3-x86_64-darwin)
+ ffi (1.17.3-x86_64-linux-gnu)
+ ffi (1.17.3-x86_64-linux-musl)
+ formatador (1.2.3)
+ reline
+ globalid (1.3.0)
activesupport (>= 6.1)
gravtastic (3.2.6)
- guard (2.19.1)
+ guard (2.20.1)
formatador (>= 0.2.4)
listen (>= 2.7, < 4.0)
logger (~> 1.6)
lumberjack (>= 1.0.12, < 2.0)
nenv (~> 0.1)
notiffany (~> 0.0)
- ostruct (~> 0.6)
pry (>= 0.13.0)
shellany (~> 0.0)
thor (>= 0.18.1)
guard-compat (1.2.1)
- guard-minitest (2.4.6)
+ guard-minitest (3.0.0)
guard-compat (~> 1.2)
- minitest (>= 3.0)
+ minitest (>= 5.0.4, < 7.0)
guard-rails (0.8.1)
guard (~> 2.11)
guard-compat (~> 1.0)
- hashie (5.0.0)
- i18n (1.14.7)
+ hashie (5.1.0)
+ logger
+ i18n (1.14.8)
concurrent-ruby (~> 1.0)
image_processing (1.14.0)
mini_magick (>= 4.9.5, < 6)
ruby-vips (>= 2.0.17, < 3)
- importmap-rails (2.1.0)
+ importmap-rails (2.2.3)
actionpack (>= 6.0.0)
activesupport (>= 6.0.0)
railties (>= 6.0.0)
- io-console (0.8.0)
- irb (1.15.2)
+ io-console (0.8.2)
+ irb (1.17.0)
pp (>= 0.6.0)
+ prism (>= 1.3.0)
rdoc (>= 4.0.0)
reline (>= 0.4.2)
- jbuilder (2.13.0)
- actionview (>= 5.0.0)
- activesupport (>= 5.0.0)
- json (2.11.3)
- json-jwt (1.16.7)
+ jbuilder (2.14.1)
+ actionview (>= 7.0.0)
+ activesupport (>= 7.0.0)
+ json (2.18.1)
+ json-jwt (1.17.0)
activesupport (>= 4.2)
aes_key_wrap
base64
bindata
faraday (~> 2.0)
faraday-follow_redirects
- kamal (2.5.3)
+ kamal (2.10.1)
activesupport (>= 7.0)
base64 (~> 0.2)
bcrypt_pbkdf (~> 1.0)
concurrent-ruby (~> 1.2)
dotenv (~> 3.1)
- ed25519 (~> 1.2)
+ ed25519 (~> 1.4)
net-ssh (~> 7.3)
sshkit (>= 1.23.0, < 2.0)
thor (~> 1.3)
zeitwerk (>= 2.6.18, < 3.0)
- language_server-protocol (3.17.0.4)
+ language_server-protocol (3.17.0.5)
lint_roller (1.1.0)
- listen (3.9.0)
+ listen (3.10.0)
+ logger
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
logger (1.7.0)
- loofah (2.24.0)
+ lograge (0.14.0)
+ actionpack (>= 4)
+ activesupport (>= 4)
+ railties (>= 4)
+ request_store (~> 1.0)
+ loofah (2.25.0)
crass (~> 1.0.2)
nokogiri (>= 1.12.0)
- lumberjack (1.2.10)
- mail (2.8.1)
+ lumberjack (1.4.2)
+ mail (2.9.0)
+ logger
mini_mime (>= 0.1.1)
net-imap
net-pop
net-smtp
- marcel (1.0.4)
- matrix (0.4.2)
+ marcel (1.1.0)
+ matrix (0.4.3)
method_source (1.1.0)
- mini_magick (5.2.0)
- benchmark
+ mini_magick (5.3.1)
logger
mini_mime (1.1.5)
- minitest (5.25.5)
- minitest-rails (8.0.0)
+ minitest (5.27.0)
+ minitest-rails (8.1.0)
minitest (~> 5.20)
- railties (>= 8.0.0, < 8.1.0)
+ railties (>= 8.1.0, < 8.2.0)
minitest-reporters (1.7.1)
ansi
builder
@@ -245,9 +255,9 @@ GEM
ruby-progressbar
msgpack (1.8.0)
nenv (0.3.0)
- net-http (0.6.0)
- uri
- net-imap (0.5.8)
+ net-http (0.9.1)
+ uri (>= 0.11.1)
+ net-imap (0.6.3)
date
net-protocol
net-pop (0.1.2)
@@ -261,31 +271,32 @@ GEM
net-smtp (0.5.1)
net-protocol
net-ssh (7.3.0)
- nio4r (2.7.4)
- nokogiri (1.18.8-aarch64-linux-gnu)
+ nio4r (2.7.5)
+ nokogiri (1.19.1-aarch64-linux-gnu)
racc (~> 1.4)
- nokogiri (1.18.8-aarch64-linux-musl)
+ nokogiri (1.19.1-aarch64-linux-musl)
racc (~> 1.4)
- nokogiri (1.18.8-arm-linux-gnu)
+ nokogiri (1.19.1-arm-linux-gnu)
racc (~> 1.4)
- nokogiri (1.18.8-arm-linux-musl)
+ nokogiri (1.19.1-arm-linux-musl)
racc (~> 1.4)
- nokogiri (1.18.8-arm64-darwin)
+ nokogiri (1.19.1-arm64-darwin)
racc (~> 1.4)
- nokogiri (1.18.8-x86_64-darwin)
+ nokogiri (1.19.1-x86_64-darwin)
racc (~> 1.4)
- nokogiri (1.18.8-x86_64-linux-gnu)
+ nokogiri (1.19.1-x86_64-linux-gnu)
racc (~> 1.4)
- nokogiri (1.18.8-x86_64-linux-musl)
+ nokogiri (1.19.1-x86_64-linux-musl)
racc (~> 1.4)
notiffany (0.1.3)
nenv (~> 0.1)
shellany (~> 0.0)
- omniauth (2.1.3)
+ omniauth (2.1.4)
hashie (>= 3.4.6)
+ logger
rack (>= 2.2.3)
rack-protection
- omniauth-rails_csrf_protection (1.0.2)
+ omniauth-rails_csrf_protection (2.0.1)
actionpack (>= 4.2)
omniauth (~> 2.0)
omniauth_openid_connect (0.8.0)
@@ -305,43 +316,49 @@ GEM
validate_url
webfinger (~> 2.0)
orm_adapter (0.5.0)
- ostruct (0.6.1)
+ ostruct (0.6.3)
parallel (1.27.0)
- parser (3.3.8.0)
+ parser (3.3.10.2)
ast (~> 2.4.1)
racc
- pg (1.5.9)
+ pg (1.6.3)
+ pg (1.6.3-aarch64-linux)
+ pg (1.6.3-aarch64-linux-musl)
+ pg (1.6.3-arm64-darwin)
+ pg (1.6.3-x86_64-darwin)
+ pg (1.6.3-x86_64-linux)
+ pg (1.6.3-x86_64-linux-musl)
pg_search (2.3.7)
activerecord (>= 6.1)
activesupport (>= 6.1)
- pp (0.6.2)
+ pp (0.6.3)
prettyprint
prettyprint (0.2.0)
- prism (1.4.0)
- propshaft (1.1.0)
+ prism (1.9.0)
+ propshaft (1.3.1)
actionpack (>= 7.0.0)
activesupport (>= 7.0.0)
rack
- railties (>= 7.0.0)
- pry (0.15.2)
+ pry (0.16.0)
coderay (~> 1.1)
method_source (~> 1.0)
- psych (5.2.4)
+ reline (>= 0.6.0)
+ psych (5.3.1)
date
stringio
- public_suffix (6.0.2)
- puma (6.6.0)
+ public_suffix (7.0.2)
+ puma (7.2.0)
nio4r (~> 2.0)
racc (1.8.1)
- rack (3.1.14)
- rack-oauth2 (2.2.1)
+ rack (3.2.5)
+ rack-oauth2 (2.3.0)
activesupport
attr_required
faraday (~> 2.0)
faraday-follow_redirects
json-jwt (>= 1.11.0)
rack (>= 2.1.0)
- rack-protection (4.1.1)
+ rack-protection (4.2.1)
base64 (>= 0.1.0)
logger (>= 1.6.0)
rack (>= 3.0.0, < 4)
@@ -350,23 +367,23 @@ GEM
rack (>= 3.0.0)
rack-test (2.2.0)
rack (>= 1.3)
- rackup (2.2.1)
+ rackup (2.3.1)
rack (>= 3)
- rails (8.0.2)
- actioncable (= 8.0.2)
- actionmailbox (= 8.0.2)
- actionmailer (= 8.0.2)
- actionpack (= 8.0.2)
- actiontext (= 8.0.2)
- actionview (= 8.0.2)
- activejob (= 8.0.2)
- activemodel (= 8.0.2)
- activerecord (= 8.0.2)
- activestorage (= 8.0.2)
- activesupport (= 8.0.2)
+ rails (8.1.2)
+ actioncable (= 8.1.2)
+ actionmailbox (= 8.1.2)
+ actionmailer (= 8.1.2)
+ actionpack (= 8.1.2)
+ actiontext (= 8.1.2)
+ actionview (= 8.1.2)
+ activejob (= 8.1.2)
+ activemodel (= 8.1.2)
+ activerecord (= 8.1.2)
+ activestorage (= 8.1.2)
+ activesupport (= 8.1.2)
bundler (>= 1.15.0)
- railties (= 8.0.2)
- rails-dom-testing (2.2.0)
+ railties (= 8.1.2)
+ rails-dom-testing (2.3.0)
activesupport (>= 5.0.0)
minitest
nokogiri (>= 1.6)
@@ -381,34 +398,40 @@ GEM
rails-html-sanitizer (1.6.2)
loofah (~> 2.21)
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)
- rails_icons (1.3.0)
+ rails_icons (1.6.1)
nokogiri (~> 1.16, >= 1.16.4)
- rails (> 6.1)
- railties (8.0.2)
- actionpack (= 8.0.2)
- activesupport (= 8.0.2)
+ rails (>= 7.0)
+ railties (8.1.2)
+ actionpack (= 8.1.2)
+ activesupport (= 8.1.2)
irb (~> 1.13)
rackup (>= 1.0.0)
rake (>= 12.2)
thor (~> 1.0, >= 1.2.2)
+ tsort (>= 0.2)
zeitwerk (~> 2.6)
rainbow (3.1.1)
- rake (13.2.1)
+ rake (13.3.1)
rb-fsevent (0.11.2)
rb-inotify (0.11.1)
ffi (~> 1.0)
- rbs (3.9.2)
+ rbs (3.10.3)
logger
- rdoc (6.13.1)
+ tsort
+ rdoc (7.2.0)
+ erb
psych (>= 4.0.0)
- regexp_parser (2.10.0)
- reline (0.6.1)
+ tsort
+ regexp_parser (2.11.3)
+ reline (0.6.3)
io-console (~> 0.5)
- responders (3.1.1)
- actionpack (>= 5.2)
- railties (>= 5.2)
- rexml (3.4.1)
- rubocop (1.75.5)
+ request_store (1.7.0)
+ rack (>= 1.4)
+ responders (3.2.0)
+ actionpack (>= 7.0)
+ railties (>= 7.0)
+ rexml (3.4.4)
+ rubocop (1.84.2)
json (~> 2.3)
language_server-protocol (~> 3.17.0.2)
lint_roller (~> 1.1.0)
@@ -416,47 +439,46 @@ GEM
parser (>= 3.3.0.2)
rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 2.9.3, < 3.0)
- rubocop-ast (>= 1.44.0, < 2.0)
+ rubocop-ast (>= 1.49.0, < 2.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 2.4.0, < 4.0)
- rubocop-ast (1.44.1)
+ rubocop-ast (1.49.0)
parser (>= 3.3.7.2)
- prism (~> 1.4)
- rubocop-performance (1.25.0)
+ prism (~> 1.7)
+ rubocop-performance (1.26.1)
lint_roller (~> 1.1)
rubocop (>= 1.75.0, < 2.0)
- rubocop-ast (>= 1.38.0, < 2.0)
- rubocop-rails (2.31.0)
+ rubocop-ast (>= 1.47.1, < 2.0)
+ rubocop-rails (2.34.3)
activesupport (>= 4.2.0)
lint_roller (~> 1.1)
rack (>= 1.1)
rubocop (>= 1.75.0, < 2.0)
- rubocop-ast (>= 1.38.0, < 2.0)
+ rubocop-ast (>= 1.44.0, < 2.0)
rubocop-rails-omakase (1.1.0)
rubocop (>= 1.72)
rubocop-performance (>= 1.24)
rubocop-rails (>= 2.30)
ruby-graphviz (1.2.5)
rexml
- ruby-lsp (0.23.17)
+ ruby-lsp (0.26.7)
language_server-protocol (~> 3.17.0)
prism (>= 1.2, < 2.0)
- rbs (>= 3, < 4)
- sorbet-runtime (>= 0.5.10782)
+ rbs (>= 3, < 5)
ruby-progressbar (1.13.0)
- ruby-vips (2.2.3)
+ ruby-vips (2.3.0)
ffi (~> 1.12)
logger
- rubyzip (2.4.1)
- rufo (0.18.1)
- sdoc (2.6.1)
+ rubyzip (3.2.2)
+ rufo (0.18.2)
+ sdoc (2.6.5)
rdoc (>= 5.0)
securerandom (0.4.1)
- selenium-webdriver (4.32.0)
+ selenium-webdriver (4.41.0)
base64 (~> 0.2)
logger (~> 1.4)
rexml (~> 3.2, >= 3.2.5)
- rubyzip (>= 1.2.2, < 3.0)
+ rubyzip (>= 1.2.2, < 4.0)
websocket (~> 1.0)
shellany (0.0.1)
shrine (3.6.0)
@@ -465,64 +487,63 @@ GEM
slim (5.2.1)
temple (~> 0.10.0)
tilt (>= 2.1.0)
- slim-rails (3.7.0)
+ slim-rails (4.0.0)
actionpack (>= 3.1)
railties (>= 3.1)
slim (>= 3.0, < 6.0, != 5.0.0)
- sorbet-runtime (0.5.12070)
- sqlite3 (2.6.0-aarch64-linux-gnu)
- sqlite3 (2.6.0-aarch64-linux-musl)
- sqlite3 (2.6.0-arm-linux-gnu)
- sqlite3 (2.6.0-arm-linux-musl)
- sqlite3 (2.6.0-arm64-darwin)
- sqlite3 (2.6.0-x86_64-darwin)
- sqlite3 (2.6.0-x86_64-linux-gnu)
- sqlite3 (2.6.0-x86_64-linux-musl)
- sshkit (1.24.0)
+ sqlite3 (2.9.0-aarch64-linux-gnu)
+ sqlite3 (2.9.0-aarch64-linux-musl)
+ sqlite3 (2.9.0-arm-linux-gnu)
+ sqlite3 (2.9.0-arm-linux-musl)
+ sqlite3 (2.9.0-arm64-darwin)
+ sqlite3 (2.9.0-x86_64-darwin)
+ sqlite3 (2.9.0-x86_64-linux-gnu)
+ sqlite3 (2.9.0-x86_64-linux-musl)
+ sshkit (1.25.0)
base64
logger
net-scp (>= 1.1.2)
net-sftp (>= 2.1.2)
net-ssh (>= 2.8.0)
ostruct
- stringio (3.1.7)
+ stringio (3.2.0)
swd (2.0.3)
activesupport (>= 3)
attr_required (>= 0.0.5)
faraday (~> 2.0)
faraday-follow_redirects
- temple (0.10.3)
- thor (1.3.2)
- thruster (0.1.13)
- thruster (0.1.13-aarch64-linux)
- thruster (0.1.13-arm64-darwin)
- thruster (0.1.13-x86_64-darwin)
- thruster (0.1.13-x86_64-linux)
- tilt (2.6.0)
- timeout (0.4.3)
+ temple (0.10.4)
+ thor (1.5.0)
+ thruster (0.1.18)
+ thruster (0.1.18-aarch64-linux)
+ thruster (0.1.18-arm64-darwin)
+ thruster (0.1.18-x86_64-darwin)
+ thruster (0.1.18-x86_64-linux)
+ tilt (2.7.0)
+ timeout (0.6.0)
+ tsort (0.2.0)
tzinfo (2.0.6)
concurrent-ruby (~> 1.0)
- unicode-display_width (3.1.4)
- unicode-emoji (~> 4.0, >= 4.0.4)
- unicode-emoji (4.0.4)
- uri (1.0.3)
+ unicode-display_width (3.2.0)
+ unicode-emoji (~> 4.1)
+ unicode-emoji (4.2.0)
+ uri (1.1.1)
useragent (0.16.11)
validate_url (1.0.15)
activemodel (>= 3.0.0)
public_suffix
warden (1.2.9)
rack (>= 2.0.9)
- web-console (4.2.1)
- actionview (>= 6.0.0)
- activemodel (>= 6.0.0)
+ web-console (4.3.0)
+ actionview (>= 8.0.0)
bindex (>= 0.4.0)
- railties (>= 6.0.0)
+ railties (>= 8.0.0)
webfinger (2.1.3)
activesupport
faraday (~> 2.0)
faraday-follow_redirects
websocket (1.2.11)
- websocket-driver (0.7.7)
+ websocket-driver (0.8.0)
base64
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.5)
@@ -531,7 +552,7 @@ GEM
will_paginate (>= 3.0.3)
xpath (3.2.0)
nokogiri (~> 1.8)
- zeitwerk (2.7.2)
+ zeitwerk (2.7.5)
PLATFORMS
aarch64-linux
@@ -565,6 +586,7 @@ DEPENDENCIES
jbuilder
kamal
listen (~> 3.5)
+ lograge
mini_magick
minitest-rails
minitest-reporters
@@ -575,7 +597,7 @@ DEPENDENCIES
pg_search
propshaft
puma (>= 5.0)
- rails (~> 8.0.2)
+ rails (~> 8.1.0)
rails-erd
rails-healthcheck
rails_icons (~> 1.3)
diff --git a/bin/ci b/bin/ci
new file mode 100755
index 0000000..4137ad5
--- /dev/null
+++ b/bin/ci
@@ -0,0 +1,6 @@
+#!/usr/bin/env ruby
+require_relative "../config/boot"
+require "active_support/continuous_integration"
+
+CI = ActiveSupport::ContinuousIntegration
+require_relative "../config/ci.rb"
diff --git a/bin/dev b/bin/dev
index d80a02d..5f91c20 100755
--- a/bin/dev
+++ b/bin/dev
@@ -1,11 +1,2 @@
-#!/usr/bin/env sh
-
-if gem list --no-installed --exact --silent foreman; then
- echo "Installing foreman..."
- gem install foreman
-fi
-
-# Default to port 3000 if not specified
-export PORT="${PORT:-3000}"
-
-exec foreman start -f Procfile.dev --env /dev/null "$@"
+#!/usr/bin/env ruby
+exec "./bin/rails", "server", *ARGV
diff --git a/bin/rubocop b/bin/rubocop
index 40330c0..5a20504 100755
--- a/bin/rubocop
+++ b/bin/rubocop
@@ -2,7 +2,7 @@
require "rubygems"
require "bundler/setup"
-# explicit rubocop config increases performance slightly while avoiding config confusion.
+# Explicit RuboCop config increases performance slightly while avoiding config confusion.
ARGV.unshift("--config", File.expand_path("../.rubocop.yml", __dir__))
load Gem.bin_path("rubocop", "rubocop")
diff --git a/bin/setup b/bin/setup
index 6b62a32..81be011 100755
--- a/bin/setup
+++ b/bin/setup
@@ -15,9 +15,6 @@ FileUtils.chdir APP_ROOT do
puts "== Installing dependencies =="
system("bundle check") || system!("bundle install")
- # Install JavaScript dependencies
- system("yarn install --check-files")
-
# puts "\n== Copying sample files =="
# unless File.exist?("config/database.yml")
# FileUtils.cp "config/database.yml.sample", "config/database.yml"
@@ -25,6 +22,7 @@ FileUtils.chdir APP_ROOT do
puts "\n== Preparing database =="
system! "bin/rails db:prepare"
+ system! "bin/rails db:reset" if ARGV.include?("--reset")
puts "\n== Removing old logs and tempfiles =="
system! "bin/rails log:clear tmp:clear"
diff --git a/config/application.rb b/config/application.rb
index a30a5f0..1f84196 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -1,6 +1,6 @@
-require_relative "boot"
+require_relative 'boot'
-require "rails/all"
+require 'rails/all'
# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
@@ -8,12 +8,7 @@ Bundler.require(*Rails.groups)
module Debshots
class Application < Rails::Application
- # Initialize configuration defaults for originally generated Rails version.
config.load_defaults 8.0
-
- # Please, add to the `ignore` list any other `lib` subdirectories that do
- # not contain `.rb` files, or that should not be reloaded or eager loaded.
- # Common ones are `templates`, `generators`, or `middleware`, for example.
config.autoload_lib(ignore: %w[assets tasks])
# Configuration for the application, engines, and railties goes here.
diff --git a/config/ci.rb b/config/ci.rb
new file mode 100644
index 0000000..9f80784
--- /dev/null
+++ b/config/ci.rb
@@ -0,0 +1,23 @@
+# Run using bin/ci
+
+CI.run do
+ step "Setup", "bin/setup --skip-server"
+
+ step "Style: Ruby", "bin/rubocop"
+
+ step "Security: Importmap vulnerability audit", "bin/importmap audit"
+ step "Security: Brakeman code analysis", "bin/brakeman --quiet --no-pager --exit-on-warn --exit-on-error"
+ step "Tests: Rails", "bin/rails test"
+ step "Tests: Seeds", "env RAILS_ENV=test bin/rails db:seed:replant"
+
+ # Optional: Run system tests
+ # step "Tests: System", "bin/rails test:system"
+
+ # Optional: set a green GitHub commit status to unblock PR merge.
+ # Requires the `gh` CLI and `gh extension install basecamp/gh-signoff`.
+ # if success?
+ # step "Signoff: All systems go. Ready for merge and deploy.", "gh signoff"
+ # else
+ # failure "Signoff: CI failed. Do not merge or deploy.", "Fix the issues and try again."
+ # end
+end
diff --git a/config/environments/development.rb b/config/environments/development.rb
index f80aab5..fecb0da 100644
--- a/config/environments/development.rb
+++ b/config/environments/development.rb
@@ -17,17 +17,16 @@ Rails.application.configure do
# Enable/disable Action Controller caching. By default Action Controller caching is disabled.
# Run rails dev:cache to toggle Action Controller caching.
- # if Rails.root.join('tmp/caching-dev.txt').exist?
- # config.action_controller.perform_caching = true
- # config.action_controller.enable_fragment_cache_logging = true
- # config.public_file_server.headers = { 'cache-control' => "public, max-age=#{2.days.to_i}" }
- # else
- # config.action_controller.perform_caching = false
- # end
+ if Rails.root.join('tmp/caching-dev.txt').exist?
+ config.action_controller.perform_caching = true
+ config.action_controller.enable_fragment_cache_logging = true
+ config.public_file_server.headers = { 'cache-control' => "public, max-age=#{2.days.to_i}" }
+ else
+ config.action_controller.perform_caching = false
+ end
# Change to :null_store to avoid any caching.
- # config.cache_store = :memory_store
- config.cache_store = :null_store
+ config.cache_store = :memory_store
# Store uploaded files on the local file system (see config/storage.yml for options).
config.active_storage.service = :local
@@ -65,11 +64,23 @@ Rails.application.configure do
# Highlight code that enqueued background job in logs.
config.active_job.verbose_enqueue_logs = true
+ # Highlight code that triggered redirect in logs.
+ config.action_dispatch.verbose_redirect_logs = true
+
+ # Suppress logger output for asset requests.
+ config.assets.quiet = true
+
# Raises error for missing translations.
# config.i18n.raise_on_missing_translations = true
# Annotate rendered view with file names.
- # config.action_view.annotate_rendered_view_with_filenames = true
+ config.action_view.annotate_rendered_view_with_filenames = true
+
+ # Uncomment if you wish to allow Action Cable access from any origin.
+ # config.action_cable.disable_request_forgery_protection = true
+
+ # Raise error when a before_action's only/except options reference missing actions.
+ config.action_controller.raise_on_missing_callback_actions = true
# Use an evented file watcher to asynchronously detect changes in source code,
# routes, locales, etc. This feature depends on the listen gem.
@@ -96,18 +107,9 @@ Rails.application.configure do
# TODO: put it into the database and make it configurable online
config.alert_message = ENV['DEBSHOTS_ALERT_MESSAGE']
- # URL to fetch reviews from the Ubuntu JSON API
- # config.ubuntu_reviews_api_url = 'https://reviews.ubuntu.com/reviews/api/1.0/reviews/filter/en/any/any/any/%s'
-
# Needed (at least) for devise.rb to determine the oauth2 callback URL
config.base_url = ENV['DEBSHOTS_BASE_URL'] || 'http://localhost:3000'
- # Uncomment if you wish to allow Action Cable access from any origin.
- # config.action_cable.disable_request_forgery_protection = true
-
- # Raise error when a before_action's only/except options reference missing actions.
- config.action_controller.raise_on_missing_callback_actions = true
-
# Apply autocorrection by RuboCop to files generated by `bin/rails generate`.
# config.generators.apply_rubocop_autocorrect_after_generate!
end
diff --git a/config/environments/production.rb b/config/environments/production.rb
index 050081e..ced9b3c 100644
--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -25,10 +25,10 @@ Rails.application.configure do
config.active_storage.service = :local
# Assume all access to the app is happening through a SSL-terminating reverse proxy.
- config.assume_ssl = true
+ # config.assume_ssl = true
# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
- config.force_ssl = true
+ # config.force_ssl = true
# Skip http-to-https redirect for the default health check endpoint.
# config.ssl_options = { redirect: { exclude: ->(request) { request.path == "/up" } } }
@@ -37,7 +37,16 @@ Rails.application.configure do
config.log_tags = [:request_id]
config.logger = ActiveSupport::TaggedLogging.logger(STDOUT)
- # Change to "debug" to log everything (including potentially personally-identifiable information!)
+ # Lograge - structured request logging
+ config.lograge.enabled = true
+ config.lograge.custom_options = lambda do |event|
+ {
+ request_id: event.payload[:request_id],
+ user_id: event.payload[:user_id]
+ }
+ end
+
+ # Change to "debug" to log everything (including potentially personally-identifiable information!).
config.log_level = ENV.fetch('RAILS_LOG_LEVEL', 'info')
# Prevent health checks from clogging up the logs.
@@ -47,20 +56,10 @@ Rails.application.configure do
config.active_support.report_deprecations = false
# Replace the default in-process memory cache store with a durable alternative.
- # config.cache_store = :solid_cache_store
+ # config.cache_store = :mem_cache_store
# Replace the default in-process and non-durable queuing backend for Active Job.
- # config.active_job.queue_adapter = :solid_queue
- # config.solid_queue.connects_to = { database: { writing: :queue } }
- config.action_mailer.smtp_settings = {
- address: ENV['SMTP_SERVER'],
- port: 25,
- enable_starttls_auto: false
- }
- config.action_mailer.default_url_options = {
- host: 'screenshots.debian.net',
- protocol: 'https'
- }
+ # config.active_job.queue_adapter = :resque
# Ignore bad email addresses and do not raise email delivery errors.
# Set this to true and configure the email server for immediate delivery to raise delivery errors.
@@ -69,7 +68,7 @@ Rails.application.configure do
# Set host to be used by links generated in mailer templates.
config.action_mailer.default_url_options = { host: 'example.com' }
- # Specify outgoing SMTP server. Remember to add smtp/* credentials via rails credentials:edit.
+ # Specify outgoing SMTP server. Remember to add smtp/* credentials via bin/rails credentials:edit.
# config.action_mailer.smtp_settings = {
# user_name: Rails.application.credentials.dig(:smtp, :user_name),
# password: Rails.application.credentials.dig(:smtp, :password),
@@ -85,6 +84,18 @@ Rails.application.configure do
# Do not dump schema after migrations.
config.active_record.dump_schema_after_migration = false
+ # Only use :id for inspections in production.
+ config.active_record.attributes_for_inspect = [:id]
+
+ # Enable DNS rebinding protection and other `Host` header attacks.
+ # config.hosts = [
+ # "example.com", # Allow requests from example.com
+ # /.*\.example\.com/ # Allow requests from subdomains like `www.example.com`
+ # ]
+ #
+ # Skip DNS rebinding protection for the default health check endpoint.
+ # config.host_authorization = { exclude: ->(request) { request.path == "/up" } }
+
# Let the "thrust" web server handle sending images. It allows to route all
# images through the Rails application and prevent unauthorized access to
# images that are pending moderation. (A common problem with spammers uploading
@@ -106,23 +117,6 @@ Rails.application.configure do
# TODO: put it into the database and make it configurable online
config.alert_message = ENV['DEBSHOTS_ALERT_MESSAGE']
- # URL to fetch reviews from the Ubuntu JSON API
- # config.ubuntu_reviews_api_url = 'https://reviews.ubuntu.com/reviews/api/1.0/reviews/filter/en/any/any/any/%s'
-
- # Any action dealing with authentication should redirect to HTTPS
- # Disabled because it will redirect incorrectly behind a proxy.
- # config.to_prepare { Devise::SessionsController.force_ssl }
- # Only use :id for inspections in production.
# Needed (at least) for devise.rb to determine the oauth2 callback URL
config.base_url = ENV['DEBSHOTS_BASE_URL'] || 'http://localhost:3000'
- config.active_record.attributes_for_inspect = [:id]
-
- # Enable DNS rebinding protection and other `Host` header attacks.
- # config.hosts = [
- # "example.com", # Allow requests from example.com
- # /.*\.example\.com/ # Allow requests from subdomains like `www.example.com`
- # ]
- #
- # Skip DNS rebinding protection for the default health check endpoint.
- # config.host_authorization = { exclude: ->(request) { request.path == "/up" } }
end
diff --git a/config/environments/test.rb b/config/environments/test.rb
index 9e7ca70..8482c06 100644
--- a/config/environments/test.rb
+++ b/config/environments/test.rb
@@ -62,10 +62,8 @@ Rails.application.configure do
config.alert_message = ENV['DEBSHOTS_ALERT_MESSAGE']
- # Raises error for missing translations
- # config.action_view.raise_on_missing_translations = true
-
config.base_url = ENV['DEBSHOTS_BASE_URL'] || 'http://localhost:3000'
+
# Raise error when a before_action's only/except options reference missing actions.
config.action_controller.raise_on_missing_callback_actions = true
end
diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb
index 287967b..4873244 100644
--- a/config/initializers/assets.rb
+++ b/config/initializers/assets.rb
@@ -1,8 +1,7 @@
# Be sure to restart your server when you modify this file.
# Version of your assets, change this if you want to expire all your assets.
-Rails.application.config.assets.version = '1.0'
+Rails.application.config.assets.version = "1.0"
# Add additional assets to the asset load path.
# Rails.application.config.assets.paths << Emoji.images_path
-# Rails.application.config.assets.paths << Rails.root.join('node_modules')
diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb
index b3076b3..d51d713 100644
--- a/config/initializers/content_security_policy.rb
+++ b/config/initializers/content_security_policy.rb
@@ -20,6 +20,10 @@
# config.content_security_policy_nonce_generator = ->(request) { request.session.id.to_s }
# config.content_security_policy_nonce_directives = %w(script-src style-src)
#
+# # Automatically add `nonce` to `javascript_tag`, `javascript_include_tag`, and `stylesheet_link_tag`
+# # if the corresponding directives are specified in `content_security_policy_nonce_directives`.
+# # config.content_security_policy_nonce_auto = true
+#
# # Report violations without enforcing the policy.
# # config.content_security_policy_report_only = true
# end
diff --git a/config/initializers/new_framework_defaults_8_1.rb b/config/initializers/new_framework_defaults_8_1.rb
new file mode 100644
index 0000000..8569b5b
--- /dev/null
+++ b/config/initializers/new_framework_defaults_8_1.rb
@@ -0,0 +1,74 @@
+# Be sure to restart your server when you modify this file.
+#
+# This file eases your Rails 8.1 framework defaults upgrade.
+#
+# Uncomment each configuration one by one to switch to the new default.
+# Once your application is ready to run with all new defaults, you can remove
+# this file and set the `config.load_defaults` to `8.1`.
+#
+# Read the Guide for Upgrading Ruby on Rails for more info on each option.
+# https://guides.rubyonrails.org/upgrading_ruby_on_rails.html
+
+###
+# Skips escaping HTML entities and line separators. When set to `false`, the
+# JSON renderer no longer escapes these to improve performance.
+#
+# Example:
+# class PostsController < ApplicationController
+# def index
+# render json: { key: "\u2028\u2029<>&" }
+# end
+# end
+#
+# Renders `{"key":"\u2028\u2029\u003c\u003e\u0026"}` with the previous default, but `{"key":"
<>&"}` with the config
+# set to `false`.
+#
+# Applications that want to keep the escaping behavior can set the config to `true`.
+#++
+# Rails.configuration.action_controller.escape_json_responses = false
+
+###
+# Skips escaping LINE SEPARATOR (U+2028) and PARAGRAPH SEPARATOR (U+2029) in JSON.
+#
+# Historically these characters were not valid inside JavaScript literal strings but that changed in ECMAScript 2019.
+# As such it's no longer a concern in modern browsers: https://caniuse.com/mdn-javascript_builtins_json_json_superset.
+#++
+# Rails.configuration.active_support.escape_js_separators_in_json = false
+
+###
+# Raises an error when order dependent finder methods (e.g. `#first`, `#second`) are called without `order` values
+# on the relation, and the model does not have any order columns (`implicit_order_column`, `query_constraints`, or
+# `primary_key`) to fall back on.
+#
+# The current behavior of not raising an error has been deprecated, and this configuration option will be removed in
+# Rails 8.2.
+#++
+# Rails.configuration.active_record.raise_on_missing_required_finder_order_columns = true
+
+###
+# Controls how Rails handles path relative URL redirects.
+# When set to `:raise`, Rails will raise an `ActionController::Redirecting::UnsafeRedirectError`
+# for relative URLs without a leading slash, which can help prevent open redirect vulnerabilities.
+#
+# Example:
+# redirect_to "example.com" # Raises UnsafeRedirectError
+# redirect_to "@attacker.com" # Raises UnsafeRedirectError
+# redirect_to "/safe/path" # Works correctly
+#
+# Applications that want to allow these redirects can set the config to `:log` (previous default)
+# to only log warnings, or `:notify` to send ActiveSupport notifications.
+#++
+# Rails.configuration.action_controller.action_on_path_relative_redirect = :raise
+
+###
+# Use a Ruby parser to track dependencies between Action View templates
+#++
+# Rails.configuration.action_view.render_tracker = :ruby
+
+###
+# When enabled, hidden inputs generated by `form_tag`, `token_tag`, `method_tag`, and the hidden parameter fields
+# included in `button_to` forms will omit the `autocomplete="off"` attribute.
+#
+# Applications that want to keep generating the `autocomplete` attribute for those tags can set it to `false`.
+#++
+# Rails.configuration.action_view.remove_hidden_field_autocomplete = true
diff --git a/config/puma.rb b/config/puma.rb
index d34dc5e..38c4b86 100644
--- a/config/puma.rb
+++ b/config/puma.rb
@@ -7,7 +7,8 @@
#
# You can control the number of workers using ENV["WEB_CONCURRENCY"]. You
# should only set this value when you want to run 2 or more workers. The
-# default is already 1.
+# default is already 1. You can set it to `auto` to automatically start a worker
+# for each available processor.
#
# The ideal number of threads per worker depends both on how much time the
# application spends waiting for IO operations and on how much you wish to
@@ -24,18 +25,18 @@
# Any libraries that use a connection pool or another resource pool should
# be configured to provide at least as many connections as the number of
# threads. This includes Active Record's `pool` parameter in `database.yml`.
-threads_count = ENV.fetch('RAILS_MAX_THREADS', 3)
+threads_count = ENV.fetch("RAILS_MAX_THREADS", 3)
threads threads_count, threads_count
# Specifies the `port` that Puma will listen on to receive requests; default is 3000.
-port ENV.fetch('PORT', 3000)
+port ENV.fetch("PORT", 3000)
# Allow puma to be restarted by `bin/rails restart` command.
plugin :tmp_restart
-# Run the Solid Queue supervisor inside of Puma for single-server deployments
-# plugin :solid_queue if ENV["SOLID_QUEUE_IN_PUMA"]
+# Run the Solid Queue supervisor inside of Puma for single-server deployments.
+plugin :solid_queue if ENV["SOLID_QUEUE_IN_PUMA"]
# Specify the PID file. Defaults to tmp/pids/server.pid in development.
# In other environments, only set the PID file if requested.
-pidfile ENV['PIDFILE'] if ENV['PIDFILE']
+pidfile ENV["PIDFILE"] if ENV["PIDFILE"]
diff --git a/public/400.html b/public/400.html
index 282dbc8..640de03 100644
--- a/public/400.html
+++ b/public/400.html
@@ -35,12 +35,35 @@
font-weight: 400;
letter-spacing: -0.0025em;
line-height: 1.4;
- min-height: 100vh;
+ min-height: 100dvh;
place-items: center;
text-rendering: optimizeLegibility;
-webkit-text-size-adjust: 100%;
}
+ #error-description {
+ fill: #d30001;
+ }
+
+ #error-id {
+ fill: #f0eff0;
+ }
+
+ @media (prefers-color-scheme: dark) {
+ body {
+ background: #101010;
+ color: #e0e0e0;
+ }
+
+ #error-description {
+ fill: #FF6161;
+ }
+
+ #error-id {
+ fill: #2c2c2c;
+ }
+ }
+
a {
color: inherit;
font-weight: 700;
@@ -83,13 +106,11 @@
}
main article br {
-
display: none;
@media(min-width: 48em) {
display: inline;
}
-
}
@@ -102,10 +123,10 @@
- The server cannot process the request due to a client error. Please check the request and try again. If you’re the application owner check the logs for more information.
+ The server cannot process the request due to a client error. Please check the request and try again. If you're the application owner check the logs for more information.
diff --git a/public/404.html b/public/404.html
index c0670bc..d7f0f14 100644
--- a/public/404.html
+++ b/public/404.html
@@ -4,7 +4,7 @@
- The page you were looking for doesn’t exist (404 Not found)
+ The page you were looking for doesn't exist (404 Not found)
@@ -35,12 +35,35 @@
font-weight: 400;
letter-spacing: -0.0025em;
line-height: 1.4;
- min-height: 100vh;
+ min-height: 100dvh;
place-items: center;
text-rendering: optimizeLegibility;
-webkit-text-size-adjust: 100%;
}
+ #error-description {
+ fill: #d30001;
+ }
+
+ #error-id {
+ fill: #f0eff0;
+ }
+
+ @media (prefers-color-scheme: dark) {
+ body {
+ background: #101010;
+ color: #e0e0e0;
+ }
+
+ #error-description {
+ fill: #FF6161;
+ }
+
+ #error-id {
+ fill: #2c2c2c;
+ }
+ }
+
a {
color: inherit;
font-weight: 700;
@@ -83,13 +106,11 @@
}
main article br {
-
display: none;
@media(min-width: 48em) {
display: inline;
}
-
}
@@ -102,10 +123,10 @@
- The page you were looking for doesn’t exist. You may have mistyped the address or the page may have moved. If you’re the application owner check the logs for more information.
+ The page you were looking for doesn't exist. You may have mistyped the address or the page may have moved. If you're the application owner check the logs for more information.
diff --git a/public/406-unsupported-browser.html b/public/406-unsupported-browser.html
index 9532a9c..43d2811 100644
--- a/public/406-unsupported-browser.html
+++ b/public/406-unsupported-browser.html
@@ -35,12 +35,35 @@
font-weight: 400;
letter-spacing: -0.0025em;
line-height: 1.4;
- min-height: 100vh;
+ min-height: 100dvh;
place-items: center;
text-rendering: optimizeLegibility;
-webkit-text-size-adjust: 100%;
}
+ #error-description {
+ fill: #d30001;
+ }
+
+ #error-id {
+ fill: #f0eff0;
+ }
+
+ @media (prefers-color-scheme: dark) {
+ body {
+ background: #101010;
+ color: #e0e0e0;
+ }
+
+ #error-description {
+ fill: #FF6161;
+ }
+
+ #error-id {
+ fill: #2c2c2c;
+ }
+ }
+
a {
color: inherit;
font-weight: 700;
@@ -83,13 +106,11 @@
}
main article br {
-
display: none;
@media(min-width: 48em) {
display: inline;
}
-
}
@@ -102,7 +123,7 @@
Your browser is not supported.
Please upgrade your browser to continue.
diff --git a/public/422.html b/public/422.html
index 8bcf060..f12fb4a 100644
--- a/public/422.html
+++ b/public/422.html
@@ -35,12 +35,35 @@
font-weight: 400;
letter-spacing: -0.0025em;
line-height: 1.4;
- min-height: 100vh;
+ min-height: 100dvh;
place-items: center;
text-rendering: optimizeLegibility;
-webkit-text-size-adjust: 100%;
}
+ #error-description {
+ fill: #d30001;
+ }
+
+ #error-id {
+ fill: #f0eff0;
+ }
+
+ @media (prefers-color-scheme: dark) {
+ body {
+ background: #101010;
+ color: #e0e0e0;
+ }
+
+ #error-description {
+ fill: #FF6161;
+ }
+
+ #error-id {
+ fill: #2c2c2c;
+ }
+ }
+
a {
color: inherit;
font-weight: 700;
@@ -83,13 +106,11 @@
}
main article br {
-
display: none;
@media(min-width: 48em) {
display: inline;
}
-
}
@@ -102,10 +123,10 @@
- The change you wanted was rejected. Maybe you tried to change something you didn’t have access to. If you’re the application owner check the logs for more information.
+ The change you wanted was rejected. Maybe you tried to change something you didn't have access to. If you're the application owner check the logs for more information.
diff --git a/public/500.html b/public/500.html
index d77718c..e4eb18a 100644
--- a/public/500.html
+++ b/public/500.html
@@ -4,7 +4,7 @@
- We’re sorry, but something went wrong (500 Internal Server Error)
+ We're sorry, but something went wrong (500 Internal Server Error)
@@ -35,12 +35,35 @@
font-weight: 400;
letter-spacing: -0.0025em;
line-height: 1.4;
- min-height: 100vh;
+ min-height: 100dvh;
place-items: center;
text-rendering: optimizeLegibility;
-webkit-text-size-adjust: 100%;
}
+ #error-description {
+ fill: #d30001;
+ }
+
+ #error-id {
+ fill: #f0eff0;
+ }
+
+ @media (prefers-color-scheme: dark) {
+ body {
+ background: #101010;
+ color: #e0e0e0;
+ }
+
+ #error-description {
+ fill: #FF6161;
+ }
+
+ #error-id {
+ fill: #2c2c2c;
+ }
+ }
+
a {
color: inherit;
font-weight: 700;
@@ -83,13 +106,11 @@
}
main article br {
-
display: none;
@media(min-width: 48em) {
display: inline;
}
-
}
@@ -102,10 +123,10 @@
- We’re sorry, but something went wrong.
If you’re the application owner check the logs for more information.
+ We're sorry, but something went wrong.
If you're the application owner check the logs for more information.