WallpaperMachine
The wallpapers you love. A new home on your Mac.
Our shared lists: groceries, recipes, places, and things worth sharing
Translation pending
LifestyleTypeScript · PythonGitHub @dandenneyOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Repo for the suite of apps
Taken from the repository README
Loading the full README.
Read the full README ↗A shared web app for a household of two — upcoming events, groceries, local places, links worth sharing, a recipe tracker, and a golf course list. Built with Next.js, TypeScript, and Supabase.
Everything is household-shared by design: no table carries a user_id, and RLS grants any authenticated user full access. See PRODUCT.md for who this is for and why.
Read these before adding or changing a feature:
| Doc | What it covers |
|---|---|
| PRODUCT.md | Users, purpose, brand personality, design principles, anti-references |
| DESIGN.md | Visual system — section hues, typography, component vocabulary, motion |
| CONTEXT.md | Domain language: canonical terms, relationships, resolved ambiguities |
| docs/adr/ | Architecture decisions — why the schema looks the way it does |
| RATE_LIMITING.md | Rate limiting setup and Redis configuration |
Each section owns a hue for wayfinding (see DESIGN.md).
yarn import-recipe <url> (idempotent; skips duplicates)git clone https://github.com/dandenney/side-by-side.git
cd side-by-side
yarn install
.env.local in the project root:# Supabase — the browser client reads the PUBLISHABLE key, not "anon"
NEXT_PUBLIC_SUPABASE_URL=your_supabase_project_url
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY=your_supabase_publishable_key
# Google Maps — two distinct keys: one server-side for Places lookups,
# one public for rendering the map in the browser
GOOGLE_MAPS_API_SERVER_KEY=your_server_side_key
NEXT_PUBLIC_GOOGLE_MAPS_API_KEY=your_browser_key
# Optional — movie lookup in Shares
OMDB_API_KEY=your_omdb_key
# Optional — elevated access for scripts and server-side uploads.
# NOTE: SUPABASE_SERVICE_ROLE_KEY is a legacy name and does NOT hold a
# service-role key; SUPABASE_SECRET_KEY is the one with elevated access.
SUPABASE_SECRET_KEY=your_supabase_secret_key
# Optional — rate limiting. Without these, an in-memory limiter is used
# (fine for development, not for production). See RATE_LIMITING.md.
REDIS_URL=your_redis_url
Migrations live in supabase/migrations and are ordered by their timestamp prefix.
npm install -g supabase
supabase link --project-ref your-project-ref
supabase db push
Alternatively, paste the migration files into the Supabase SQL editor in filename order.
Two caveats worth knowing:
if not exists, but create policy and create trigger do not, so re-running a migration will error on the policies.Start the development server:
yarn dev
The application will be available at http://localhost:3000. The dev server binds to 0.0.0.0, so it is reachable from a phone on the same network — worth doing, since mobile is the primary context.
yarn dev - Start development serveryarn build - Build for productionyarn start - Start production serveryarn lint - Run ESLintyarn test - Run testsyarn test:watch - Run tests in watch modeyarn test:coverage - Run tests with coverage reportyarn import-recipe <recime-url> [--dry-run] - Import one recipe from a ReciMe share URL (needs SUPABASE_SECRET_KEY)side-by-side/
├── src/
│ ├── app/ # Next.js app router pages
│ │ ├── api/ # API routes
│ │ ├── golf/ # Golf courses & rounds
│ │ ├── groceries/ # Groceries page
│ │ ├── local/ # Local places page
│ │ ├── recipes/ # Recipe tracker
│ │ ├── shares/ # Shares page
│ │ ├── upcoming/ # Upcoming events page
│ │ ├── globals.css # Design tokens & section hues
│ │ └── layout.tsx # Root layout
│ ├── components/ # React components
│ │ └── ui/ # UI component primitives
│ ├── contexts/ # React contexts
│ ├── lib/ # Utility functions
│ │ ├── supabase/ # Supabase client & helpers
│ │ └── google/ # Google Maps / Places integration
│ ├── services/ # Business logic services
│ ├── types/ # TypeScript type definitions
│ └── __tests__/ # Test files
├── docs/
│ └── adr/ # Architecture decision records
├── scripts/ # One-off and import scripts
└── supabase/
└── migrations/ # Database migrations
New sections are expected to update the docs alongside the code:
src/app/globals.css (light and dark) and record it in DESIGN.md. Style components with the slot tokens (--hue, --tint, …) and never hardcode a section color.docs/adr/ when a decision is hard to reverse, surprising without context, and the result of a real trade-off. Skip it if any of the three is missing.src/components/TabBar.tsx.The application is deployed on Vercel at: https://side-by-side-two.vercel.app/
Contributions are welcome! Please feel free to submit a Pull Request.
This project is licensed under the MIT License - see the LICENSE file for details.
Dan Denney