Skip to content

luvaary/Echos

Repository files navigation

echoes

The internet's emotional memory. One moment per day.

A minimalist web platform where people anonymously submit short reflections responding to a single daily prompt. No accounts, no likes, no comments, no feeds—just the quiet truth of how the world feels.

🌍 Philosophy

  • Anonymous by default — no identity, no history, no clout
  • Once per day — one submission per person, per prompt
  • Text only — no images, no formatting, no noise
  • Time over engagement — moments discovered through time, not popularity
  • Emotion, not opinion — no debates, just experiences

🚀 Features

  • Daily Prompt — One global question that changes every 24 hours (UTC)
  • 240 Character Echoes — Anonymous submissions classified by emotion
  • Time-Based Discovery — Explore random moments, jump to any second, or revisit one year ago
  • Emotion Pulse — Aggregated visualization of today's emotional landscape
  • No Dark Patterns — No infinite scroll, no engagement metrics, no manipulation

🛠️ Tech Stack

  • Framework: Next.js 14 (App Router, Edge Runtime)
  • Database: Vercel Postgres
  • Styling: Tailwind CSS
  • Language: TypeScript
  • Deployment: Vercel

📦 Installation

# Clone repository
git clone https://github.com/luvaary/Echos.git
cd echoes

# Install dependencies
npm install

# Configure environment
cp .env.example .env
# Add your Vercel Postgres credentials to .env

# Setup database
npm run setup-db

# Run development server
npm run dev

Visit http://localhost:3000

🗄️ Database Schema

prompts

  • id — Unique identifier
  • text — Prompt text (max 200 chars)
  • date — UTC date (unique)

echoes

  • id — Unique identifier
  • content — Echo text (max 240 chars)
  • created_at — Timestamp
  • prompt_id — Reference to prompt
  • emotion — Classified emotion (calm, hopeful, anxious, heavy, joyful, lost)
  • country — Optional 2-letter country code

🔐 Environment Variables

Required variables (see .env.example):

POSTGRES_URL
POSTGRES_PRISMA_URL
POSTGRES_URL_NO_SSL
POSTGRES_URL_NON_POOLING
POSTGRES_USER
POSTGRES_HOST
POSTGRES_PASSWORD
POSTGRES_DATABASE
CRON_SECRET

🚢 Deployment

Vercel (Recommended)

  1. Push code to GitHub
  2. Import project to Vercel
  3. Add Vercel Postgres database
  4. Environment variables are auto-populated
  5. Add CRON_SECRET manually
  6. Deploy

The cron job will automatically rotate prompts daily at midnight UTC.

Self-Hosting

Requires:

  • Node.js 18.17+
  • PostgreSQL database
  • Cron job scheduler for prompt rotation

📝 Project Structure

echoes/
├─ app/                    # Next.js App Router
│  ├─ api/                # API routes
│  ├─ echoes/             # Discovery pages
│  └─ submit/             # Submission page
├─ components/            # React components
├─ lib/                   # Core logic
│  ├─ db.ts              # Database layer
│  ├─ emotions.ts        # Emotion classification
│  ├─ prompts.ts         # Prompt rotation
│  └─ rateLimit.ts       # Submission limits
├─ scripts/              # Setup scripts
└─ styles/               # Global styles

🎨 Design Principles

  • Typography-first — Content is the design
  • Neutral colors — Off-white backgrounds, near-black text
  • No animations unless meaningful — Respect user attention
  • Silence is intentional — Space to breathe

🤝 Contributing

Contributions welcome. Please open an issue first to discuss changes.

📄 License

MIT License - see LICENSE file for details

🌐 Links


Built with intention. No dark patterns. Just moments.

About

may the echos speak

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published