Main website for The Odin Project
# AGENTS.md
## Project Overview
The Odin Project is a Rails 8 application that provides a free, open-source coding curriculum. Users follow learning paths composed of courses and lessons, submit projects, and track their progress.
## References
- **Git commit & PR format:** See [.github/PULL_REQUEST_TEMPLATE.md](.github/PULL_REQUEST_TEMPLATE.md). Commit titles must follow `keyword: brief description` using one of: `Feature`, `Chore`, or `Fix`.
## Tech Stack
- **Backend:** Rails 8.0, Ruby 3.4, PostgreSQL
- **Frontend:** Tailwind CSS 4, Stimulus, Turbo Rails, esbuild
- **Components:** ViewComponent (app/components/)
- **Background Jobs:** Sidekiq with sidekiq-cron
- **Auth:** Devise with OmniAuth (GitHub, Google) and two-factor support
- **Testing:** RSpec, Capybara with Cuprite, FactoryBot, WebMock/VCR
- **Error Tracking:** Sentry
- **Feature Flags:** Flipper
## Common Commands
### Development
```bash
bin/setup # Initial setup (bundle, yarn, db:prepare, etc.)
bin/dev # Start dev server (Puma + Sidekiq + CSS/JS watchers)
```
### Testing
```bash
bin/test # Full suite: all linters + RSpec
bin/rspec # RSpec only (parallel execution)
bin/rspec spec/models/user_spec.rb # Single file
bin/rspec spec/models/user_spec.rb:42 # Single example by line number
```
### Linting
```bash
bin/rubocop # Ruby linting
bin/erb_lint --lint-all # ERB template linting
yarn lint # JavaScript (Standard.js)
yarn stylelint # CSS/SCSS
```
### Assets
```bash
yarn build # JavaScript bundle (esbuild)
yarn build:css # Tailwind CSS build
```
## Architecture
### Key Patterns
- **Routes** are split into modular files under `config/routes/` (admin.rb, redirects.rb) and drawn from the main `config/routes.rb` via `draw(:admin)`.
- **ViewComponent** is used extensively for UI (40+ components in `app/components/`). In development, Lookbook is mounted at `/lookbook` for component previews.
- **Service objects** in `app/services/` encapsulate business logic.
- **Policies** in `app/policies/` handle authorization.
- **Adaptors** in `app/adaptors/` wrap external service integrations.
- **Builders** in `app/builders/` handle complex object creation.
### Core Domain Models
- **Path** > **Course** > **Lesson** - the curriculum hierarchy
- **User** - learners with Devise authentication
- **LessonCompletion** - tracks user progress through lessons
- **ProjectSubmission** - student project submissions (likeable, flaggable, soft-deletable via Discard)
- **Flag** - content moderation on submissions
- **AdminUser** - separate admin accounts (devise_invitable)
### Testing Conventions
- Tests use `rails_helper` (no separate `spec_helper`)
- FactoryBot factories in `spec/factories/`
- System tests use Capybara + Cuprite (headless Chrome)
- Shared examples in `spec/support/shared_examples/`
- Test order is randomized; persistence file at `spec/examples.txt`
- CI splits tests across 4 parallel containers via `bin/ci_spec`
### Code Style
- JavaScript follows Standard.js
- CSS uses Tailwind with stylelint