adamcooke/staytus
π‘ An open source solution for publishing the status of your services
Stale β last commit 3y ago
worst of 4 axeslast commit was 3y ago; no CI workflows detected
Has a license, tests, and CI β clean foundation to fork and modify.
Documented and popular β useful reference codebase to read through.
last commit was 3y ago; no CI workflows detected
- β22+ active contributors
- βMIT licensed
- βTests present
Show 3 more βShow less
- β Stale β last commit 3y ago
- β Concentrated ownership β top contributor handles 51% of recent commits
- β No CI workflows detected
What would change the summary?
- βUse as dependency Mixed β Healthy if: 1 commit in the last 365 days
- βDeploy as-is Mixed β Healthy if: 1 commit in the last 180 days
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Forkable" badge
Paste into your README β live-updates from the latest cached analysis.
[](https://repopilot.app/r/adamcooke/staytus)Paste at the top of your README.md β renders inline like a shields.io badge.
βΈPreview social card (1200Γ630)
This card auto-renders when someone shares https://repopilot.app/r/adamcooke/staytus on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: adamcooke/staytus
Generated by RepoPilot Β· 2026-05-10 Β· Source
π€Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale β STOP and ask the user to regenerate it before proceeding. - Treat the AI Β· unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/adamcooke/staytus shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything β but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
π―Verdict
WAIT β Stale β last commit 3y ago
- 22+ active contributors
- MIT licensed
- Tests present
- β Stale β last commit 3y ago
- β Concentrated ownership β top contributor handles 51% of recent commits
- β No CI workflows detected
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
β Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live adamcooke/staytus
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale β regenerate it at
repopilot.app/r/adamcooke/staytus.
What it runs against: a local clone of adamcooke/staytus β the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in adamcooke/staytus | Confirms the artifact applies here, not a fork |
| 2 | License is still MIT | Catches relicense before you depend on it |
| 3 | Default branch master exists | Catches branch renames |
| 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code |
| 5 | Last commit β€ 1236 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of adamcooke/staytus. If you don't
# have one yet, run these first:
#
# git clone https://github.com/adamcooke/staytus.git
# cd staytus
#
# Then paste this script. Every check is read-only β no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of adamcooke/staytus and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "adamcooke/staytus(\\.git)?\\b" \\
&& ok "origin remote is adamcooke/staytus" \\
|| miss "origin remote is not adamcooke/staytus (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(MIT)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"MIT\"" package.json 2>/dev/null) \\
&& ok "license is MIT" \\
|| miss "license drift β was MIT at generation time"
# 3. Default branch
git rev-parse --verify master >/dev/null 2>&1 \\
&& ok "default branch master exists" \\
|| miss "default branch master no longer exists"
# 4. Critical files exist
test -f "app/controllers/application_controller.rb" \\
&& ok "app/controllers/application_controller.rb" \\
|| miss "missing critical file: app/controllers/application_controller.rb"
test -f "app/models/site.rb" \\
&& ok "app/models/site.rb" \\
|| miss "missing critical file: app/models/site.rb"
test -f "Gemfile" \\
&& ok "Gemfile" \\
|| miss "missing critical file: Gemfile"
test -f "config/routes.rb" \\
&& ok "config/routes.rb" \\
|| miss "missing critical file: config/routes.rb"
test -f "app/models/issue.rb" \\
&& ok "app/models/issue.rb" \\
|| miss "missing critical file: app/models/issue.rb"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 1236 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~1206d)"
else
miss "last commit was $days_since_last days ago β artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) β safe to trust"
else
echo "artifact has $fail stale claim(s) β regenerate at https://repopilot.app/r/adamcooke/staytus"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
β‘TL;DR
Staytus is a Ruby on Railsβbased status page platform that lets organizations publish real-time service status, incidents, and maintenance windows to customers. It provides a beautiful public-facing status dashboard and a complete admin interface for managing services, issues, subscribers, and email notificationsβsolving the problem of communicating outages and system health across 24/7 operations. Monolithic Rails application: app/assets/ contains Haml views and SCSS stylesheets for the public and admin interfaces; api/ contains RESTful API controllers and response structures (issues, services, subscribers); core business logic lives in app/ with models and controllers; config/ manages database and environment setup.
π₯Who it's for
DevOps engineers, SREs, and operations teams at organizations running customer-facing services who need to transparently communicate service health and incidents without building a status page from scratch.
π±Maturity & risk
Moderately mature but showing signs of maintenance burden: the maintainer (adamcooke) explicitly closed all GitHub issues due to neglect and is just now resuming work on containerization and Docker deployment (see ROADMAP.md and README). The codebase is production-ready with a working demo at demo.staytus.co, but recent commit activity is unclear from the file list alone.
Single-maintainer project with acknowledged periods of low attention; GitHub issues were mass-closed, suggesting backlog management challenges. Depends on MySQL, Ruby 2.3+, and Bundler with no visible CI/test coverage in the file structure (no spec/ or test/ directories listed). Docker support is still in development, and the project requires manual server installation which the maintainer identifies as a pain point.
Active areas of work
The maintainer is prioritizing containerization and Kubernetes deployment support (per ROADMAP.md and future plans in README) to reduce friction from manual server setup. Docker support appears in progress (Dockerfile and DOCKER_README.md present). GitHub issues are closed pending review; the project is transitioning from maintenance mode back to active development.
πGet running
git clone https://github.com/adamcooke/staytus && cd staytus && git checkout stable && bundle install --deployment --without development:test && cp config/database.example.yml config/database.yml && nano config/database.yml && bundle exec rake staytus:build staytus:install && procodile start --foreground
Daily commands: procdile start --foreground (from Procfile); Rake tasks staytus:build and staytus:install handle initial setup; runs on HTTP port 5000 by default.
πΊοΈMap of the codebase
app/controllers/application_controller.rbβ Base controller for all Rails controllers; defines authentication, authorization, and shared request handling logic.app/models/site.rbβ Core Site model representing the status page instance; central to all domain logic and configuration.Gemfileβ Ruby dependencies declaration; essential for understanding framework versions (Rails), database drivers, and third-party integrations.config/routes.rbβ Rails routing configuration defining all API and admin endpoints; prerequisite for understanding request handling.app/models/issue.rbβ Core Issue model representing service incidents; primary domain entity with associations to services and updates.api/authenticator.rbβ API authentication logic for token-based access; critical for understanding API security model.app/controllers/pages_controller.rbβ Public-facing status page controller; entry point for end-user facing status page rendering.
π§©Components & responsibilities
- Pages Controller & Public Views (Rails Controller, ERB views, SCSS) β Renders the customer-facing status page with service status and incident timeline.
- Failure mode: Database unavailable β generic error page; missing services show as 'unknown'.
- Admin Controllers & Dashboard (Rails Admin Controllers, Authentication middleware) β Manages CRUD operations for services, issues, users, settings, and email templates.
- Failure mode: Authentication failure β 401/403; database unavailable β 500 with error message.
- REST API Controllers & Authenticator β
π οΈHow to make changes
Add a New Admin Page/Feature
- Create a new controller in app/controllers/admin/ inheriting from admin/base_controller.rb (
app/controllers/admin/base_controller.rb) - Add corresponding routes in config/routes.rb under the admin namespace (
config/routes.rb) - Create views in app/views/admin/{resource}/ following existing naming patterns (
app/views/admin) - Add navigation link in the admin sidebar template (
app/views/admin/shared/_sidebar.html.erb)
Add a New REST API Endpoint
- Create a new controller in api/controllers/{resource}_api_controller.rb (
api/controllers/services_api_controller.rb) - Add API routes in config/routes.rb under the /api namespace (
config/routes.rb) - Create a structure file in api/structures/ for JSON serialization (
api/structures/service_api_structure.rb) - Implement token authentication via api/authenticator.rb in the controller (
api/authenticator.rb)
Add a New Domain Model/Service Entity
- Create model file in app/models/ with ActiveRecord associations (
app/models/service.rb) - Create a migration to add the corresponding database table (
db/migrate) - Create admin CRUD controller in app/controllers/admin/{resource}_controller.rb (
app/controllers/admin/services_controller.rb) - Create views for index, show, new, and edit in app/views/admin/{resource}/ (
app/views/admin)
Add Email Notification/Template
- Create or edit email template in app/views/mailers/ or via EmailTemplate model (
app/models/email_template.rb) - Create mailer class in app/mailers/ with action method (
app/mailers) - Trigger email from relevant model callback or controller action (
app/models/issue.rb) - Manage templates via admin interface app/controllers/admin/email_templates_controller.rb (
app/controllers/admin/email_templates_controller.rb)
π§Why these technologies
- Ruby on Rails β Rapid development of admin interfaces and REST APIs with convention-over-configuration; built-in ORM, routing, and view templating.
- PostgreSQL/SQLite β Reliable relational database for services, issues, users, and historical data; supports complex queries and transactions.
- Docker β Containerization for consistent deployment across environments (local, staging, production) and Kubernetes orchestration.
- SCSS β Maintainable styling for admin and public interfaces with variables and mixins; compiles to CSS.
βοΈTrade-offs already made
-
Token-based REST API instead of OAuth 2.0
- Why: Simpler implementation and lower operational overhead for a self-hosted status page solution.
- Consequence: Less secure for high-security scenarios; tokens must be stored securely by clients.
-
Synchronous email delivery via ActionMailer instead of async queue (Sidekiq/Resque)
- Why: Simpler deployment and fewer moving parts for small to medium deployments.
- Consequence: Email delivery delays if SMTP server is slow; potential request timeouts under high incident load.
-
Single-instance Rails app rather than microservices
- Why: Lower complexity, easier to understand and deploy; sufficient for typical status page workload.
- Consequence: Vertical scaling limits; database becomes bottleneck at very high traffic or admin concurrency.
-
Public and admin UI in same Rails app
- Why: Reduced deployment complexity and shared authentication/models.
- Consequence: Admin and public code paths mixed; harder to secure admin routes if bugs exist.
π«Non-goals (don't propose these)
- Not a real-time monitoring tool; does not actively ping services to detect outages (relies on manual incident creation).
- Not a full-featured incident management platform; lacks post-mortem, runbook, or automation workflows.
- Not horizontally scalable without additional infrastructure (Redis, load balancer); designed for single-instance deployment.
- Does not provide multi-tenancy; each instance is single-tenant per deployment.
πͺ€Traps & gotchas
MySQL database must exist and be configured in config/database.yml before rake tasks run; Ruby 2.3+ required but no .ruby-version file visible (specify explicitly); Bundler with --deployment flag locks gemsβdon't skip this in production; Procodile is a custom process manager (not foreman/puma-dev), so development workflow differs from standard Rails; no visible test suite means changes lack automated safety net; email sending requires SMTP configuration (not shown in file list, likely in environment variables or config/initializers/).
ποΈArchitecture
π‘Concepts to learn
- Status Page Pattern β Core business logic: separating public status communication from internal incident tracking is a key architectural decision in Staytus; critical to understand why Services, Issues, and Subscribers are separate entities.
- API Versioning via Structures β Staytus uses api/structures/ to decouple API responses from domain models (services vs. service_api_structure); allows safe schema evolution without breaking client integrations.
- Server-Sent Events (SSE) / Real-time Notifications β Status pages require live updates without polling; Staytus likely uses WebSockets or SSE for real-time incident propagation to connected subscribersβcheck app/assets/javascripts/admin.coffee.
- SMTP Email Template Rendering β Email notifications to subscribers require safe template rendering without code injection; ActionMailer uses ERB/HAML; understand how Staytus sanitizes and personalizes incident emails.
- Rails Asset Pipeline (Sprockets) β SCSS compilation, CoffeeScript transpilation, and image optimization happen via app/assets/config/manifest.js; critical for modifying styles or frontend behavior.
- Containerization & Multi-stage Docker Builds β Dockerfile is central to the project's future (per ROADMAP); understanding how to layer Ruby dependencies, assets, and secrets is essential for the containerization work now in progress.
- Process Supervision (Procdile) β Staytus uses Procdile instead of Systemd or Kubernetes; Procfile and Procfile.options define worker processes, web server, and background jobsβunderstanding this is key to deployment and debugging.
πRelated repos
statuspage/statuspageβ Direct commercial competitor providing SaaS status pages; Staytus exists as the self-hosted open-source alternative.monicahq/monicaβ Similar Rails monolith with rich admin UI and multi-tenant design; shares architectural patterns for managing complex data relationships.discourse/discourseβ Large, mature Ruby on Rails application with sophisticated admin dashboard and real-time updates; exemplar of scaling and maintaining a Rails platform.hashicorp/vagrantβ Uses Procdile for local development process management; reference for how to structure Procfile and manage multiple services locally.kubernetes/kubernetesβ Staytus explicitly aims to support Kubernetes deployment (per ROADMAP); understanding K8s manifests and Helm charts will inform Docker containerization work.
πͺPR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Add comprehensive test suite for API controllers and authenticator
The repo contains multiple API controllers (issues_api_controller.rb, services_api_controller.rb, subscribers_api_controller.rb) and an authenticator (api/authenticator.rb) but no visible test files in the file structure. This is critical for an open-source API-driven application to ensure reliability and prevent regressions. New contributors could add RSpec tests covering authentication flows, CRUD operations, and edge cases.
- [ ] Create spec/api/authenticator_spec.rb with tests for token validation and authentication failures
- [ ] Create spec/api/controllers/services_api_controller_spec.rb with CRUD operation tests
- [ ] Create spec/api/controllers/issues_api_controller_spec.rb testing issue creation, updates, and listing
- [ ] Create spec/api/structures/ directory with tests for API response structures (issue_api_structure, service_api_structure, etc.)
- [ ] Add spec_helper.rb or rails_helper.rb configuration if missing
Implement GitHub Actions CI/CD workflow for automated testing and Docker builds
The repo has a Dockerfile and emphasizes Docker deployment in the README, but there's no visible CI/CD workflow file (.github/workflows/). This is essential for catching breaking changes, ensuring code quality, and automating Docker image builds. A contributor could create a workflow that runs tests, lints code, and optionally publishes Docker images on releases.
- [ ] Create .github/workflows/test.yml to run RSpec tests on PR/push to main branches
- [ ] Add Ruby linting step (RuboCop) to catch style violations early
- [ ] Create .github/workflows/docker-build.yml to build and optionally push Docker images to a registry on releases
- [ ] Add status badges to README.md linking to workflow results
Add missing API documentation for public endpoints in README or dedicated API_DOCS.md
The file structure shows extensive API controllers and structures (issue_api_structure.rb, service_api_structure.rb, subscriber_structure.rb) but the README snippet cuts off and provides no API documentation. External developers and contributors need clear documentation of available endpoints, request/response formats, and authentication requirements. This would improve discoverability and ease integration.
- [ ] Create docs/API.md documenting all endpoints in api/controllers/ with HTTP methods, parameters, and example responses
- [ ] Document the authentication mechanism used by api/authenticator.rb with example token usage
- [ ] Add request/response examples for each API structure file (issue_api_structure.rb, service_api_structure.rb, etc.)
- [ ] Link the API documentation from the main README.md in a new 'API' section
πΏGood first issues
- Add RSpec test suite to api/controllers/ and api/structures/ (currently no test/ directory visible); start with integration specs for IssuesApiController endpoints to ensure API contracts don't break.
- Document the email template system: email_templates references appear in code but template files aren't listed; create app/views/mailer/ directory structure and add examples to DOCKER_README.md for operators.
- Create GitHub Actions or GitLab CI configuration (.github/workflows/test.yml) to run tests and lint on PRsβaddresses the lack of visible CI for a production status page tool.
βTop contributors
Click to expand
Top contributors
- @adamcooke β 51 commits
- [@Adam Cooke](https://github.com/Adam Cooke) β 17 commits
- @glaszig β 8 commits
- @ganchdev β 3 commits
- @novotarq β 2 commits
πRecent commits
Click to expand
Recent commits
3e20435β Upgrades Rails (#369) (danquinney)283e986β Fix service status updates (#357) (ganchdev)b9b17f2β changes js compressor to ES6 syntax (#353) (ganchdev)1802916β Fix install instructions (#333) (lfuelling)dc82dd2β note about future (adamcooke)a45e847β add note about removing issues (adamcooke)5f22e6dβ upgrade annotate & rake (adamcooke)9462d2dβ upgrade moonrope & json (adamcooke)744c0b8β upgrade to rails 5.2 (adamcooke)f5c9dbcβ remove subscriber counts because they now depend on the selected services (adamcooke)
πSecurity observations
- Critical Β· Hardcoded MySQL Root Password in Dockerfile β
Dockerfile (lines with debconf-set-selections). The Dockerfile sets a hardcoded temporary MySQL root password 'temp-password' via debconf-set-selections. This password is baked into the Docker image and visible in image history, creating a significant security risk. An attacker with access to the image can easily extract this credential. Fix: Remove hardcoded passwords from Dockerfile. Instead: 1) Use Docker secrets or environment variables passed at runtime, 2) Generate random passwords during container initialization, 3) Implement docker-start.sh to securely set passwords during first run, 4) Use Docker BuildKit secrets for sensitive build-time data. - High Β· Missing Input Validation and Potential SQL Injection β
api/controllers/, app/controllers/admin/, app/models/. The codebase contains multiple API controllers and admin controllers that handle user input (issues_api_controller.rb, services_api_controller.rb, issues_controller.rb, etc.) without visible input validation or parameterized query patterns shown. Rails models lack visible validation specifications, increasing SQL injection risk if raw SQL or improper ORM usage is present. Fix: 1) Implement strong input validation using Rails validators on all models, 2) Use parameterized queries exclusively (Rails ORM does this by default, verify no raw SQL), 3) Add whitelist validation for all user inputs, 4) Implement rate limiting on API endpoints, 5) Add request size limits. - High Β· Missing CSRF Protection Configuration β
app/controllers/application_controller.rb, app/controllers/admin/. The ApplicationController file is present but without visibility into CSRF token configuration. Admin controllers handling state changes (issues_controller.rb, services_controller.rb) may be vulnerable to Cross-Site Request Forgery attacks if CSRF protection is not properly configured. Fix: 1) Ensure 'protect_from_forgery' is enabled in ApplicationController with 'with: :exception', 2) Verify all state-changing operations (POST, PUT, DELETE) require CSRF tokens, 3) Review API authenticator.rb to ensure API endpoints use proper token-based auth instead of session cookies. - High Β· Exposed Docker Port Without Authentication Enforcement β
Dockerfile (EXPOSE 5000). Port 5000 is exposed in the Dockerfile without documented authentication requirements. The application should enforce authentication on all endpoints, particularly admin endpoints, but this is not explicitly verified in the provided structure. Fix: 1) Implement mandatory authentication on all admin endpoints, 2) Use environment variables to configure allowed access patterns, 3) Deploy behind a reverse proxy with authentication/authorization checks, 4) Document security requirements for production deployment, 5) Consider changing default port and requiring explicit configuration. - High Β· Potential XSS Vulnerabilities in Templates β
app/views/ (not shown), api/structures/. The codebase contains Rails views and admin interface with user-controlled content (issues, services, status updates) without visible HTML escaping patterns. Views rendering user input from issues_api_structure.rb, service_api_structure.rb, and admin forms may be vulnerable to stored/reflected XSS. Fix: 1) Ensure all user input in ERB/HAML templates uses <%= %> (auto-escaped) not <%== %>, 2) Use Rails' sanitize() helper for rich text content, 3) Implement Content Security Policy (CSP) headers, 4) Add XSS protection headers (X-XSS-Protection, X-Content-Type-Options), 5) Validate and sanitize all API response structures. - Medium Β· Dependency Management Without Visible Lock File Analysis β
Gemfile, Gemfile.lock. While Gemfile.lock exists, the dependency content is not provided for analysis. Rails applications have a history of vulnerable gems. Without seeing the specific versions, potential vulnerabilities in outdated dependencies cannot be verified. Fix: 1) Run 'bundle audit' regularly to identify vulnerable gems, 2) Keep all dependencies updated to latest secure versions, 3) Review Gemfile.lock for outdated packages, 4) Implement automated dependency scanning in CI/CD, 5) Use tools like Dependabot or Snyk for continuous monitoring. - Medium Β· Missing Security Headers Configuration β
undefined. No visible security headers configuration in ApplicationController or middleware. Headers like X-Frame-Options, X-Content-Type- Fix: undefined
LLM-derived; treat as a starting point, not a security audit.
πWhere to read next
- Open issues β current backlog
- Recent PRs β what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals β see the live page for receipts. Re-run on a new commit to refresh.