A full-stack application for finding favicons from domain CSV files. Built with NestJS backend and Next.js frontend.
View the interactive architecture diagram and thought process on Excalidraw:
This diagram illustrates the system design, component relationships, and decision-making process behind the application architecture.
The easiest way to run the application locally is using Docker Compose. This will set up both frontend and backend automatically.
- Docker 20.x or higher
- Docker Compose 2.x or higher
- Node.js 20.x (if running without Docker)
-
Clone the repository:
git clone <repository-url> cd faviconer.by.yerick
-
Optional: Configure environment variables
Create
backend/.envfile if you want to use database caching:DATABASE_URL="postgresql://postgres:password@postgres:5432/faviconer?sslmode=disable" PORT=3001
Note: Database is optional. The app works without it using HTTP strategies.
-
Start the application:
docker-compose up --build
-
Access the application:
- Frontend: http://localhost:3000
- Backend API: http://localhost:3001
- Health Check: http://localhost:3001/api/favicons/health
# Start services
docker-compose up
# Start in detached mode (background)
docker-compose up -d
# Rebuild and start
docker-compose up --build
# Stop services
docker-compose down
# View logs
docker-compose logs -f
# View logs for specific service
docker-compose logs -f backend
docker-compose logs -f frontend
# Stop and remove volumes
docker-compose down -vIf you want to use PostgreSQL for caching favicons:
- Uncomment the
postgresservice indocker-compose.yml - Uncomment the
DATABASE_URLin the backend environment section - Update the
DATABASE_URLto use the postgres service:- DATABASE_URL=postgresql://postgres:postgres@postgres:5432/faviconer?sslmode=disable - Run database migrations:
docker-compose exec backend yarn prisma:migrate dev
If you prefer to run the application without Docker, see the individual README files:
- Backend Setup: See backend/README.md
- Frontend Setup: See frontend/README.md
faviconer.by.yerick/
├── backend/ # NestJS API server
│ ├── src/ # Source code
│ ├── prisma/ # Database schema (optional)
│ └── Dockerfile # Backend container definition
├── frontend/ # Next.js frontend application
│ ├── app/ # Next.js app directory
│ └── Dockerfile # Frontend container definition
├── docker-compose.yml # Docker Compose configuration
└── README.md # This file
- CSV Upload: Upload CSV files with domain lists
- Real-time Progress: Server-Sent Events (SSE) for live progress updates
- Multiple Discovery Strategies: HTTP requests, HTML parsing, database caching
- Database Caching (Optional): Cache found favicons for faster subsequent lookups
- Results Table: Filterable, paginated table with favicon previews
- CSV Export: Download results as CSV file
- Responsive Design: Works on desktop and mobile devices
- Dark Mode: Built-in dark mode support
POST /api/favicons/process- Upload CSV and start processingGET /api/favicons/stream/:jobId- Stream progress updates (SSE)GET /api/favicons/health- Health check endpoint
Backend:
- NestJS
- TypeScript
- Prisma (optional, for database)
- PostgreSQL (optional, via Supabase or local)
Frontend:
- Next.js 16
- React 19
- Material-UI (MUI) v7
- TypeScript
- Sass
For development setup and detailed instructions, see:
MIT