Skip to content

hackclub/stickers

Hack Club flag Hack Club logo

The Rails 8 + Inertia.js + Svelte 5 codebase powering stickers.hackclub.com


Hack Club Stickers

Every Hack Clubber gets free, high-quality stickers. Completing programs and attending hackathons can earn more event-specific merch!

Features

  • Trade stickers with other Hack Clubbers
  • Browse an archive of all printed Hack Club stickers
  • Submit new sticker designs
  • Vote on your favourite designs
  • Hack to earn monthly sticker shipments
  • Use as an API for sticker designs

Contributing

Development Setup

git clone https://github.com/hackclub/stickers
cd stickers

# Install dependencies
bundle install
pnpm install

# Set up environment
cp .env.example .env
# Edit .env with your credentials

# Set up database
bin/rails db:create db:migrate

# Start the server (runs on port 3100)
bin/dev

Environment Variables

Required environment variables in .env:

# Airtable
AIRTABLE_PAT=your_personal_access_token
AIRTABLE_BASE_ID=your_base_id
AIRTABLE_STICKER_DB_TABLE_ID=your_stickers_table_id
AIRTABLE_DESIGN_TABLE_ID=your_designs_table_id
AIRTABLE_SHOP_TABLE_ID=your_shop_table_id

# OAuth (auth.hackclub.com)
OIDC_CLIENT_ID=your_client_id
OIDC_CLIENT_SECRET=your_client_secret
OIDC_REDIRECT_URI=http://localhost:3100/auth/oidc/callback

API Usage

You can use stickers.hackclub.com/api/ to get a list of all Hack Club stickers in JSON. Please don't hammer it too hard — let us know what you're up to and we can help you coexist within the rate limit.

Stickers

  • GET /api/stickers - List all visible stickers
  • GET /api/stickers/:id - Get sticker details

Designs

  • GET /api/designs - List current user's designs (requires auth)
  • GET /api/designs/all - List all designs (requires auth)
  • POST /api/designs - Submit a new design (requires auth)
  • POST /api/designs/:id/vote - Toggle vote on a design (requires auth)

Our Airtable has no passwords or secrets — if you want a read-only personal access token scoped to the base we can provide it! In general we're happy to help you over DM, but please have a glance over the code first!

Deployment

Option 1: Coolify (Recommended)

Using Docker Compose (app + database):

  1. Create new resource → Docker Compose
  2. Point to your Git repo
  3. Set compose file to docker-compose.coolify.yml
  4. Set environment variables including POSTGRES_PASSWORD
  5. Set your domain for the stickers service
  6. Deploy

Using Dockerfile (app only):

  1. Create new resource → ApplicationDockerfile
  2. Point to your Git repo
  3. Set environment variables (see .env.example)
  4. Set DATABASE_URL to your PostgreSQL instance
  5. Set your domain
  6. Deploy

Option 2: Docker (Manual)

# Build and run
docker build -t stickers .
docker run -d -p 80:80 \
  -e SECRET_KEY_BASE="$(rails secret)" \
  -e DATABASE_URL="postgresql://user:pass@host/db" \
  -e AIRTABLE_PAT="..." \
  stickers

Production Environment Variables

Variable Description
SECRET_KEY_BASE Rails secret (generate with rails secret)
DATABASE_URL PostgreSQL connection string
AIRTABLE_PAT Airtable Personal Access Token
AIRTABLE_BASE_ID Airtable base ID
AIRTABLE_STICKER_DB_TABLE_ID Stickers table ID
AIRTABLE_SHOP_TABLE_ID Shop table ID
AIRTABLE_DESIGN_TABLE_ID Designs table ID
OIDC_ISSUER https://auth.hackclub.com
OIDC_CLIENT_ID OIDC client ID
OIDC_CLIENT_SECRET OIDC client secret
OIDC_REDIRECT_URI https://your-domain.com/auth/oidc/callback

See .env.example for a complete list.


Made with <3 by nora, euan, and end.

About

Resources

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors