From 27f9633ef51bffdfb7952bb7a06b2bc7e5697d83 Mon Sep 17 00:00:00 2001 From: Sean Dickinson Date: Sat, 8 Aug 2026 19:33:32 -0400 Subject: [PATCH 1/5] Add .mise.toml for mise-en-place Ruby version management --- .mise.toml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .mise.toml diff --git a/.mise.toml b/.mise.toml new file mode 100644 index 0000000..bf0643c --- /dev/null +++ b/.mise.toml @@ -0,0 +1,2 @@ +[tools] +ruby = "4.0.0" From a74077b1f0dc4d0c5d91fddf3188010999ec3e2c Mon Sep 17 00:00:00 2001 From: Sean Dickinson Date: Sat, 8 Aug 2026 19:33:39 -0400 Subject: [PATCH 2/5] Add libvips prerequisite check to bin/setup --- bin/setup | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/bin/setup b/bin/setup index 81be011..09249c8 100755 --- a/bin/setup +++ b/bin/setup @@ -12,6 +12,16 @@ FileUtils.chdir APP_ROOT do # This script is idempotent, so that you can run it at any time and get an expectable outcome. # Add necessary setup steps to this file. + puts "== Checking system prerequisites ==" + unless system("vips --version", out: File::NULL, err: File::NULL) + puts "\n⚠️ [WARNING] libvips does not appear to be installed on your system." + puts " libvips is required by Active Storage for image processing." + puts " Install it with your package manager:" + puts " macOS: brew install libvips" + puts " Ubuntu/Debian: sudo apt-get install -y libvips" + puts " Fedora: sudo dnf install vips\n\n" + end + puts "== Installing dependencies ==" system("bundle check") || system!("bundle install") From 52dba081fff63f04d60aea38a3eca17c33da79bf Mon Sep 17 00:00:00 2001 From: Sean Dickinson Date: Sat, 8 Aug 2026 19:33:52 -0400 Subject: [PATCH 3/5] Update README.md with mise prerequisites, setup instructions, and testing commands --- README.md | 51 +++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index a053ff8..f7b5a54 100644 --- a/README.md +++ b/README.md @@ -24,18 +24,49 @@ EndsideOut staff build a **curriculum** as a set of **programs**. Each program i Curriculum is delivered through **schools** and their **classrooms**. A classroom enrolls in a program at a given level, and modules are scheduled to publish on specific dates. **Students** belong to a classroom, and their participation is recorded through **student sessions** — giving the organization the statistics and trends it needs to measure impact. -See [DESIGN.md](DESIGN.md) for the full data model and workflow. +See [Architecture Decision Records (ADRs)](docs/adrs/README.md) for architectural decisions and guidelines. ## Getting Started 🛠️ -Built on **Ruby on Rails 8** with Hotwire, Tailwind, SQLite, and the Solid stack (Queue/Cache/Cable), deployed with Kamal. See [DESIGN.md](DESIGN.md) for the full tech stack. +Built on **Ruby on Rails 8** with Hotwire, Tailwind, SQLite, and the Solid stack (Queue/Cache/Cable), deployed with Kamal. -```sh -git clone https://github.com/rubyforgood/endsideout.git -cd endsideout -bundle install -bin/rails db:prepare # create, load schema, seed sample data -bin/dev # http://localhost:3000 -``` +### Prerequisites -Seed data is generated with [Faker](https://github.com/faker-ruby/faker); see `db/seeds.rb` for login credentials. \ No newline at end of file +- **[mise](https://mise.jdx.dev/)**: Recommended environment and tool version manager for Ruby. +- **libvips**: Native image processing library required by Active Storage. + - **macOS**: `brew install libvips` + - **Ubuntu/Debian**: `sudo apt-get install -y libvips` + - **Fedora**: `sudo dnf install vips` +- **SQLite3**: Database engine (pre-installed on macOS). + +### Local Setup + +1. **Clone the repository**: + ```sh + git clone https://github.com/rubyforgood/endsideout.git + cd endsideout + ``` + +2. **Install Ruby with mise**: + ```sh + mise install + ``` + +3. **Run setup**: + ```sh + bin/setup + ``` + This will install gem dependencies, prepare and seed the database, and clear log/temp files. + +4. **Start the development server**: + ```sh + bin/dev + ``` + Visit [http://localhost:3000](http://localhost:3000) in your browser. Seed data is generated with [Faker](https://github.com/faker-ruby/faker); see `db/seeds.rb` for default login credentials. + +### Useful Commands + +- **Run unit & integration tests**: `bin/rails test` +- **Run system tests**: `bin/rails test:system` +- **Code style & linting**: `bin/rubocop` +- **Security audits**: `bin/brakeman` and `bin/bundler-audit` \ No newline at end of file From b7ea5c1ff199643eec99ae2556bf8db2da7c6855 Mon Sep 17 00:00:00 2001 From: Sean Dickinson Date: Sat, 8 Aug 2026 19:38:49 -0400 Subject: [PATCH 4/5] Recommend bin/ci command in README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f7b5a54..89f0ba2 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,8 @@ Built on **Ruby on Rails 8** with Hotwire, Tailwind, SQLite, and the Solid stack ### Useful Commands +- **Run all CI checks (Recommended before pushing)**: `bin/ci` (runs setup, RuboCop, security audits, and tests) - **Run unit & integration tests**: `bin/rails test` - **Run system tests**: `bin/rails test:system` - **Code style & linting**: `bin/rubocop` -- **Security audits**: `bin/brakeman` and `bin/bundler-audit` \ No newline at end of file +- **Security audits**: `bin/brakeman`, `bin/bundler-audit`, and `bin/importmap audit` \ No newline at end of file From 20fa8f1fea8475e2cb670618b243560a3b6a1879 Mon Sep 17 00:00:00 2001 From: Sean Dickinson Date: Sat, 8 Aug 2026 19:39:35 -0400 Subject: [PATCH 5/5] Add WSL2 note for Windows developers in README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 89f0ba2..327ed04 100644 --- a/README.md +++ b/README.md @@ -32,11 +32,12 @@ Built on **Ruby on Rails 8** with Hotwire, Tailwind, SQLite, and the Solid stack ### Prerequisites -- **[mise](https://mise.jdx.dev/)**: Recommended environment and tool version manager for Ruby. +- **[mise](https://mise.jdx.dev/)**: Recommended environment and tool version manager for Ruby (macOS & Linux / WSL2). - **libvips**: Native image processing library required by Active Storage. - **macOS**: `brew install libvips` - **Ubuntu/Debian**: `sudo apt-get install -y libvips` - **Fedora**: `sudo dnf install vips` + - **Windows**: Use [WSL2 (Windows Subsystem for Linux)](https://learn.microsoft.com/en-us/windows/wsl/install) with Ubuntu/Debian. - **SQLite3**: Database engine (pre-installed on macOS). ### Local Setup