Oryn is a curated gallery platform for discovering, saving, and sharing AI-generated art prompts. Built with a modern editorial aesthetic featuring dark/light themes, masonry layouts, and smooth animations.
- Masonry Gallery — Infinite scrollable grid with tag filtering, search, and sort (newest / trending / most liked)
- Image Detail Modal — Full-screen image view with prompt copy, like, save, and similar image recommendations
- Prompt Builder — Compose and refine AI art prompts
- Style Converter — Convert between prompt styles across different AI models
- Saved Board — Bookmark favorite images for later reference
- Admin Panel — Upload images, manage tags, edit metadata, toggle publish/draft status
- Dark & Light Themes — Editorial-quality design with grain overlay and serif typography
- Azure Blob Storage — Images stored on Azure with PostgreSQL metadata
| Layer | Technology |
|---|---|
| Frontend | React 18, Vite, TailwindCSS v4, Framer Motion |
| Backend | Express.js, TypeScript, PostgreSQL (Azure) |
| Storage | Azure Blob Storage |
| Fonts | Cormorant Garamond, Inter, DM Mono |
promptBoard/
├── client/ # React + Vite frontend
│ ├── src/
│ │ ├── components/ # Gallery, ImageModal, ImageTrail, etc.
│ │ ├── pages/ # Home, GalleryPage, SavedPage, admin/*
│ │ ├── store/ # Zustand stores (gallery, auth)
│ │ ├── data/ # Types and constants
│ │ └── lib/ # Utility functions
│ └── vite.config.ts
├── server/ # Express API server
│ ├── src/
│ │ ├── routes/ # images, tags, admin, auth
│ │ ├── middleware/ # Rate limiting, auth
│ │ └── db.ts # PostgreSQL connection pool
│ └── .env
└── README.md
- Node.js 18+
- PostgreSQL database (local or Azure)
- Azure Blob Storage account (for image uploads)
git clone <repo-url>
cd promptBoard
# Install client dependencies
cd client && npm install
# Install server dependencies
cd ../server && npm installCreate server/.env:
# Gemini AI
GEMINI_API_KEY=your_key
# App
APP_URL=http://localhost:3000
ALLOWED_ORIGIN=http://localhost:3000
# Database (PostgreSQL)
DATABASE_URL=postgresql://user:password@host:5432/promptboard?sslmode=require
# Admin Auth
ADMIN_PASSWORD=your_admin_password
JWT_SECRET=your_jwt_secret
# Azure Blob Storage
AZURE_STORAGE_CONNECTION_STRING=your_connection_string
AZURE_STORAGE_CONTAINER_NAME=imagescd server
npm run migrate # Create tables
npm run seed # Load seed data# Terminal 1 — Backend (port 4000)
cd server && npm run dev
# Terminal 2 — Frontend (port 3000)
cd client && npm run devOpen http://localhost:3000 in your browser.
Type adminpanel in the search bar on the home page, or navigate to /admin directly. Log in with your configured ADMIN_PASSWORD.
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/images |
Paginated, filterable image list |
| GET | /api/images/:id |
Single image detail |
| GET | /api/images/:id/similar |
Similar images by shared tags |
| POST | /api/images/:id/like |
Like an image (fingerprint dedup) |
| POST | /api/images/:id/copy |
Track prompt copy |
| GET | /api/tags |
All available tags |
| POST | /api/auth/login |
Admin login |
| GET | /api/admin/images |
Admin image list |
| PATCH | /api/admin/images/:id |
Update image metadata |
| DELETE | /api/admin/images/:id |
Delete an image |
| POST | /api/admin/upload |
Upload new image |
Private project.