apigy/selfstarter
Roll your own crowdfunding
Stale — last commit 4y ago
worst of 4 axesnon-standard license (Other); last commit was 4y ago…
Has a license, tests, and CI — clean foundation to fork and modify.
Documented and popular — useful reference codebase to read through.
last commit was 4y ago; no CI workflows detected
- ✓17 active contributors
- ✓Distributed ownership (top contributor 43% of recent commits)
- ✓Other licensed
Show 4 more →Show less
- ✓Tests present
- ⚠Stale — last commit 4y ago
- ⚠Non-standard license (Other) — review terms
- ⚠No CI workflows detected
What would change the summary?
- →Use as dependency Concerns → Mixed if: clarify license terms
- →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/apigy/selfstarter)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/apigy/selfstarter on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: apigy/selfstarter
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/apigy/selfstarter 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 4y ago
- 17 active contributors
- Distributed ownership (top contributor 43% of recent commits)
- Other licensed
- Tests present
- ⚠ Stale — last commit 4y ago
- ⚠ Non-standard license (Other) — review terms
- ⚠ 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 apigy/selfstarter
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/apigy/selfstarter.
What it runs against: a local clone of apigy/selfstarter — 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 apigy/selfstarter | Confirms the artifact applies here, not a fork |
| 2 | License is still Other | 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 ≤ 1320 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of apigy/selfstarter. If you don't
# have one yet, run these first:
#
# git clone https://github.com/apigy/selfstarter.git
# cd selfstarter
#
# 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 apigy/selfstarter and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "apigy/selfstarter(\\.git)?\\b" \\
&& ok "origin remote is apigy/selfstarter" \\
|| miss "origin remote is not apigy/selfstarter (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(Other)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"Other\"" package.json 2>/dev/null) \\
&& ok "license is Other" \\
|| miss "license drift — was Other 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 "config/routes.rb" \\
&& ok "config/routes.rb" \\
|| miss "missing critical file: config/routes.rb"
test -f "app/controllers/preorder_controller.rb" \\
&& ok "app/controllers/preorder_controller.rb" \\
|| miss "missing critical file: app/controllers/preorder_controller.rb"
test -f "config/settings.yml" \\
&& ok "config/settings.yml" \\
|| miss "missing critical file: config/settings.yml"
test -f "app/models/order.rb" \\
&& ok "app/models/order.rb" \\
|| miss "missing critical file: app/models/order.rb"
test -f "config/initializers/amazon_flexible_payments.rb" \\
&& ok "config/initializers/amazon_flexible_payments.rb" \\
|| miss "missing critical file: config/initializers/amazon_flexible_payments.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 1320 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~1290d)"
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/apigy/selfstarter"
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
Selfstarter is a self-hosted crowdfunding platform written in Ruby on Rails that lets you run your own Kickstarter-like campaign without relying on third-party crowdfunding services. It handles product preorders, payment collection via Amazon Payments (with pluggable Stripe/WePay support), multi-use payment tokens, and tiered reward/payment options, all configurable through config/settings.yml and app/assets/stylesheets/variables.css.scss. Standard Rails monolith: app/controllers/preorder_controller.rb is the core request handler, app/models/ (Order, PaymentOption, User) define domain logic, app/views/ renders ERB templates for the campaign page and checkout flow, config/settings.yml centralizes campaign metadata, and app/assets/stylesheets/ (split by page: homepage, checkout, preorder) with SCSS variables define the visual theme.
👥Who it's for
Entrepreneurs and product creators (like Lockitron's founders) who need to run independent crowdfunding campaigns and want full control over branding, payment flow, and customer data without Kickstarter's fees or approval constraints. Rails developers who need to understand a working preorder/payments architecture.
🌱Maturity & risk
This is a mature but dormant project: it was open-sourced in ~2012 by Lockitron after their successful self-hosted campaign, but shows no recent activity visible in the file structure. The codebase is production-tested (used by Lockitron), but lacks modern CI/CD setup (no .github/workflows, no test suite visible beyond .rspec config), and has likely accrued unmaintained dependencies. Treat as a solid historical reference implementation rather than an actively maintained product.
High dependency risk: uses the legacy amazon_flex_pay gem (Amazon Payments is deprecated/discontinued), outdated Rails version constraints (Ruby 1.9.2 era suggests Rails 3.x), and no visible test files or continuous integration. Single-maintainer risk is real—the repo credits Lockitron/hello@lockitron.com but shows no recent commits. No authentication or admin panel included, leaving you to build security-critical user/order management from scratch.
Active areas of work
Nothing—no recent commits visible. This is a historical snapshot of a working 2012 Rails stack. If you're interested in crowdfunding platforms, you'd be forking and heavily customizing it rather than tracking upstream changes.
🚀Get running
Check README for instructions.
Daily commands: rails s (starts dev server on localhost:3000). For production: Procfile is configured for Heroku (heroku create && git push heroku master && heroku run rake db:migrate).
🗺️Map of the codebase
config/routes.rb— Entry point for URL routing; defines all crowdfunding flow endpoints (preorder, checkout, share)app/controllers/preorder_controller.rb— Main controller handling homepage, checkout, and share views; orchestrates payment flowconfig/settings.yml— Core configuration file for customizing crowdfunding campaign (product name, price, payment methods)app/models/order.rb— Order model representing customer preorders; central data structure for payment processingconfig/initializers/amazon_flexible_payments.rb— Payment gateway initialization; sets up Amazon Flexible Payments integration required for checkoutGemfile— Dependencies specification; includes amazon_flex_pay gem and Rails framework versionsdb/schema.rb— Database schema defining users, orders, and payment options tables
🛠️How to make changes
Add a new reward tier
- Create migration to insert new payment_option record with amount and description (
db/migrate/) - Add new tier section to homepage with pricing and features (
app/views/preorder/index.html.erb) - Update _payment_options.html.erb to display new tier as a radio button (
app/views/preorder/_payment_options.html.erb) - Seed payment_option in db/seeds.rb or through admin UI if implemented (
db/seeds.rb)
Customize campaign messaging
- Update product name, tagline, and description in config/settings.yml (
config/settings.yml) - Modify value proposition section with campaign-specific copy (
app/views/preorder/homepage/_value_proposition.html.erb) - Update FAQs section with product-specific questions (
app/views/preorder/homepage/_faqs.html.erb) - Replace hero background image in app/assets/images/ (
app/assets/images/background.png)
Switch payment processor (Amazon to Stripe/WePay)
- Replace amazon_flex_pay gem with stripe or wepay gem in Gemfile (
Gemfile) - Create new config/initializers/stripe.rb with API credentials (
config/initializers/stripe.rb) - Update preorder_controller.rb payment handling logic in checkout action (
app/controllers/preorder_controller.rb) - Modify payment form in app/views/preorder/checkout.html.erb for new provider (
app/views/preorder/checkout.html.erb) - Update Order model validation and payment status tracking (
app/models/order.rb)
Add custom thank-you email after order
- Create mailer class app/mailers/order_mailer.rb with confirmation_email method (
app/mailers/order_mailer.rb) - Create email template app/views/order_mailer/confirmation_email.html.erb (
app/views/order_mailer/confirmation_email.html.erb) - Trigger mailer in preorder_controller.rb after successful payment processing (
app/controllers/preorder_controller.rb) - Configure SMTP in config/environments/production.rb for email delivery (
config/environments/production.rb)
🔧Why these technologies
- Ruby on Rails 3.2+ — Rapid development of full-stack web application with minimal boilerplate; built-in scaffolding for models, controllers, and views
- Amazon Flexible Payments (via amazon_flex_pay gem) — Minimal PCI compliance burden; delegates payment handling to trusted third party; supports multi-use tokens for recurring charges
- SQLite/PostgreSQL (database agnostic) — Simple persistence layer for orders and users; no complex querying requirements justify NoSQL
- ERB templates + SCSS + CoffeeScript — Rails standard stack for server-side rendering; allows rapid iteration on homepage design and checkout UX
- Heroku deployment (Procfile) — Zero-infrastructure hosting; built-in Rails support simplifies production deployment
⚖️Trade-offs already made
-
Single PreorderController handles all flows (homepage, checkout, share)
- Why: Simplicity for a focused single-product campaign; avoid over-engineering
- Consequence: Controller becomes a fat god object if features expand (e.g., multiple products, admin panel); should refactor into separate concerns
-
Payment processor tightly integrated via amazon_flex_pay gem
- Why: Quick integration; Kickstarter-vetted library
- Consequence: Switching payment providers requires significant refactoring; no payment abstraction layer
-
Settings stored in YAML config files, not database
- Why: Configuration as code; simple to fork and customize; no admin UI complexity
- Consequence: Requires code deploy + server restart to change campaign details; not suitable for multi-tenant or dynamic campaigns
-
No authentication/authorization layer
- Why: Public crowdfunding page with no admin backend needed initially
- Consequence: Adding admin features (order management, customer support) requires retrofitting auth from scratch
🚫Non-goals (don't propose these)
- Admin dashboard for campaign management (manage orders, refunds, customer support)
- Multi-product campaigns or marketplace functionality
- Real-time inventory management or fulfillment tracking
- User accounts, login, or order history per customer
- Analytics or detailed campaign metrics (beyond basic stats display)
- Support for multiple concurrent campaigns
- Refund processing or payment reversal workflows
🪤Traps & gotchas
Amazon Payments API is deprecated/discontinued as of 2014—you must replace amazon_flex_pay gem with Stripe, WePay, or another processor before deploying. No authentication system included; remember to add admin login and backer accounts. config/settings.yml is read at startup—changing it requires a server restart. Multi-use payment tokens are an Amazon-specific feature; if switching processors, rearchitect token handling. No mailer configured, so confirmation/shipping emails won't send without adding ActionMailer setup. Database must be seeded (rake db:seed) if payment_options are enabled, or app will crash.
🏗️Architecture
💡Concepts to learn
- [Multi-use Payment Tokens](https://docs.aws.amazon.com/waf/latest/developerguide/web-request-components.html (Amazon-specific) or https://stripe.com/docs/payments/save-and-reuse) — Selfstarter collects payment authorization tokens upfront without charging customers—critical for crowdfunding where you collect funds after campaign closes. Understanding token lifecycle (storage, reuse, expiry) is essential when switching payment processors.
- SCSS Variables & Theming — The entire visual identity is parameterized in app/assets/stylesheets/variables.css.scss—this pattern lets non-developers customize campaigns without touching code, critical for a 'roll your own' platform.
- Rails Asset Pipeline — app/assets structure (images, javascripts, stylesheets) relies on the Rails asset pipeline for minification and fingerprinting—understanding how this works is necessary for debugging CSS/JS not loading in production.
- Tiered Reward/Payment Options — PaymentOption model enables Kickstarter-style tiers (different pledge levels at different prices). The use_payment_options config flag toggles this feature, requiring careful database seed/migration management.
- Flexible Payment Processor Abstraction — The README explicitly calls out swappable payment processors (Amazon, Stripe, WePay) but lacks abstraction—preorder_controller.rb tightly couples to amazon_flex_pay gem, making processor swaps high-friction. Understanding adapter/strategy pattern would improve this.
- Configuration-Driven Customization — config/settings.yml externalizes campaign metadata—this is the key to Selfstarter's 'roll your own' appeal. How settings are loaded, cached, and used across controllers determines deployment friction.
🔗Related repos
stripe-samples/web-elements-modal— Demonstrates Stripe payment integration patterns (hosted.js tokenization) that could replace amazon_flex_pay in this codebasechrisvfritz/vue-2-level-list— Not directly related, but exemplifies modern modular front-end approach—Selfstarter's CoffeeScript could be modernized using similar patternskickstarter/kickstarter— Kickstarter's own open-source infrastructure (partial)—spiritual predecessor and reference for what a production crowdfunding platform handlesrails-api/rails-api— Shows Rails patterns for building API-first apps; Selfstarter could be split into a JSON API backend + JS frontend using this approachthoughtbot/paperclip— File attachment gem commonly paired with Rails models like Order/User for storing product images, campaign media, backer documents
🪄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 unit tests for Order and User models (app/models/)
The repo has .rspec configured but app/models/ appears to have no corresponding spec files. The Order and User models handle critical business logic (payments, user data) and currently lack test coverage. This is a high-value addition that protects against regressions in core functionality.
- [ ] Create spec/models/order_spec.rb with tests for order validation, payment processing, and state transitions
- [ ] Create spec/models/user_spec.rb with tests for user creation, email validation, and password handling
- [ ] Create spec/models/payment_option_spec.rb with tests for payment option associations and pricing logic
- [ ] Run
rspecto verify all tests pass and coverage improves
Complete and document payment provider integration (finish Amazon Payments setup in README)
The README is truncated mid-sentence at 'We use Amazon Payments for payments. You can us...' and the config/settings.yml payment configuration is not documented. New contributors cannot understand payment setup without this critical documentation. The incomplete PaymentOption model suggests integration is partially implemented.
- [ ] Complete the Amazon Payments section in README.md with setup instructions and API key configuration
- [ ] Document config/settings.yml structure with all payment-related configuration options and examples
- [ ] Add inline comments to app/models/payment_option.rb explaining the payment gateway integration points
- [ ] Create PAYMENT_SETUP.md with step-by-step instructions for integrating alternative payment providers (Stripe, etc.)
Add feature tests for preorder checkout flow (app/controllers/preorder_controller.rb)
The checkout view (app/views/preorder/checkout.html.erb) and preorder controller handle the critical revenue path but lack integration/feature tests. This is high-risk code that needs test coverage to prevent checkout breakage during refactoring.
- [ ] Create spec/features/preorder_checkout_spec.rb with tests for: viewing homepage, selecting payment option, completing checkout form
- [ ] Add tests for payment option selection (app/views/preorder/_payment_options.html.erb) and sidebar calculation (app/views/preorder/checkout/_sidebar.html.erb)
- [ ] Test the share flow (app/views/preorder/share.html.erb) and analytics integration
- [ ] Verify form submission successfully creates an Order and redirects appropriately
🌿Good first issues
- Add RSpec test suite: app/models/ has no specs visible—write tests for Order.rb (fixture creation, validation, payment token association) and PaymentOption.rb (pricing tiers, availability). This would modernize the codebase and catch regressions.
- Document payment processor swap: The README mentions Stripe and WePay are alternatives but provides no implementation guide. Create config/payment_processors/ with example Stripe adapter code showing how to replace amazon_flex_pay in preorder_controller.rb.
- Extract mailer templates: config/ lacks any ActionMailer setup despite needing order confirmation and fulfillment notification emails. Add app/mailers/order_mailer.rb and app/views/order_mailer/ templates with settings to customize sender/branding via config/settings.yml.
⭐Top contributors
Click to expand
Top contributors
- @jes5e — 43 commits
- @Jarred-Sumner — 23 commits
- @skull-squadron — 10 commits
- @supermarin — 9 commits
- @paterson — 2 commits
📝Recent commits
Click to expand
Recent commits
740075f— Update README.md (Jarred-Sumner)2ffaad9— Merge pull request #76 from justinsb/heroku (Jarred-Sumner)d9bfb69— Add rails_12factor gem, to support heroku deploys (justinsb)7a0d965— Merge pull request #63 from paterson/master (Jarred-Sumner)8987286— Merge branch 'rails4' (paterson)6c1c3bf— updated for rails 4 and ruby 2 (paterson)4dacca5— Merge pull request #59 from lemonkoala/master (ccamrobertson)d143af9— change "let's us" to "lets us" (ko-lem)0d52a56— Merge pull request #50 from gmaliar/master (Jarred-Sumner)ef05e3c— Update user.rb (gmaliar)
🔒Security observations
- Critical · Potential Hardcoded Secrets in Configuration Files —
config/initializers/secret_token.rb, config/initializers/amazon_flexible_payments.rb. The codebase references config/initializers/secret_token.rb and config/initializers/amazon_flexible_payments.rb which are likely to contain sensitive credentials. These files are not visible in the repository structure provided, but their presence suggests hardcoded secrets may exist. AWS API keys, payment tokens, and Rails secrets should never be hardcoded. Fix: Use environment variables or a secrets management system (Rails 5.1+ credentials, AWS Secrets Manager, or HashiCorp Vault). Remove any hardcoded secrets from version control. Use .gitignore to exclude sensitive configuration files. - High · Missing CSRF Protection Configuration —
app/controllers/preorder_controller.rb, app/views/preorder/checkout.html.erb. The application uses Amazon Flexible Payments and processes financial transactions. Without explicit verification, CSRF tokens may not be properly configured for all payment-related forms, especially in preorder_controller.rb and checkout views. Fix: Ensure all forms include <%= csrf_meta_tags %> in layouts and verify protect_from_forgery is enabled in ApplicationController. Test that CSRF tokens are present on all state-changing operations, especially payment forms. - High · SQL Injection Risk in Model Queries —
app/models/order.rb, app/models/user.rb, app/models/payment_option.rb. The models (Order, User, PaymentOption) are present but their implementation is not visible. Without seeing the actual query implementations, there's risk of SQL injection if user input is concatenated into queries without proper parameterization. Fix: Use Rails ORM (ActiveRecord) with parameterized queries exclusively. Never use string interpolation or concatenation for SQL queries. Use find(), where(conditions_hash), or prepared statements with ? or named placeholders. - High · XSS Vulnerability Risk in Payment Processing Views —
app/views/preorder/checkout.html.erb, app/views/preorder/checkout/_sidebar.html.erb, app/views/preorder/_payment_options.html.erb. Payment-related views (checkout.html.erb, _payment_options.html.erb) handle sensitive user data and payment information. If user-controlled data is rendered without escaping (using raw, html_safe, or unescaped ERB tags), XSS attacks could expose payment details or session tokens. Fix: Ensure all user input is escaped by default in ERB templates. Use <%= %> (escaped) instead of <%== %> or raw(). Implement Content Security Policy headers to prevent inline script execution. - High · Missing Security Headers —
config/application.rb, app/controllers/application_controller.rb. No evidence of security headers configuration (X-Frame-Options, X-Content-Type-Options, Strict-Transport-Security, Content-Security-Policy) in the visible configuration files. This is especially critical for a payment processing application. Fix: Add security headers in ApplicationController or middleware. Configure: X-Frame-Options (DENY), X-Content-Type-Options (nosniff), Strict-Transport-Security, X-XSS-Protection, and Content-Security-Policy. Consider using the 'secure_headers' gem. - High · No Visible Authentication/Authorization Mechanism —
app/models/user.rb, app/controllers/preorder_controller.rb. User model exists but no authentication framework (Devise, Clearance, etc.) is evident. Without proper authentication, unauthorized users could modify orders, payment information, or access sensitive preorder data. Fix: Implement a robust authentication system using Devise or similar. Add authorization checks to PreorderController to ensure users can only access/modify their own data. Use before_action filters for access control. - High · Sensitive Payment Data Exposure Risk —
config/initializers/amazon_flexible_payments.rb, app/models/order.rb. Amazon Flexible Payments integration may log, store, or transmit payment information insecurely. PCI DSS compliance requirements are not evident in the configuration. Fix: Never store full credit card numbers. Use Amazon's tokenization to handle payment data. Implement PCI DSS compliance measures. Log only masked payment information. Use HTTPS exclusively (set force_ssl: true in config
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.