A full-stack web application for converting files between multiple formats including images, videos, audio, documents, and archives
- Frontend: https://qoal.onrender.com
- Backend API: https://qoalbackend.onrender.com
- User authentication with JWT tokens
- Support for 20+ file formats across 5 categories
- Real-time conversion status tracking
- Cloud storage integration with AWS S3
- Responsive design with modern UI
- Secure file handling and processing
- React 18 with TypeScript
- React Router for navigation
- Vite for build tooling
- TailwindCSS for styling
- Custom animation components
- Go (Golang) with Gin framework
- PostgreSQL database
- Redis for job queue management
- AWS S3 for file storage
- JWT authentication
- GORM for database operations
- Docker containerization
- Render for backend hosting
- Netlify for frontend hosting
- GitHub Actions for CI/CD
PNG, JPG, JPEG, WEBP, GIF, BMP, TIFF, SVG, ICO, HEIC
MP4, AVI, MOV, MKV, WEBM, FLV, WMV, M4V
MP3, WAV, AAC, FLAC, OGG, M4A, WMA, AIFF
PDF, DOCX, DOC, TXT, RTF, ODT, HTML, MD
ZIP, RAR, TAR, GZ, 7Z, BZ2
POST /api/auth/register- User registrationPOST /api/auth/login- User loginGET /api/auth/profile- Get user profile
POST /api/upload- Upload and queue file for conversionGET /api/jobs/:id- Get conversion job statusGET /api/download/:id- Download converted fileGET /api/jobs- List user's conversion jobs
- Go 1.24+
- Node.js 18+
- PostgreSQL 14+
- Redis 7+
- AWS S3 account
cd backend
cp .env.template .env
# Configure environment variables
go mod download
go run main.gocd frontend
npm install
npm run devDATABASE_URL=postgresql://user:password@localhost:5432/qoal
REDIS_URL=localhost:6379
JWT_SECRET=your-secret-key
AWS_REGION=us-east-1
AWS_ACCESS_KEY_ID=your-access-key
AWS_SECRET_ACCESS_KEY=your-secret-key
AWS_S3_BUCKET=your-bucket-name
PORT=8000
VITE_API_URL=http://localhost:8000/api
The application uses automated deployment:
- Backend deploys to Render via Docker
- Frontend deploys to Netlify via GitHub integration
- Database hosted on Render PostgreSQL
- Redis hosted on Render Redis
- Password hashing with bcrypt
- JWT token-based authentication
- CORS protection
- File type validation
- Size limit enforcement (30MB)
- Secure file storage with S3
- Asynchronous job processing with Redis queue
- Efficient file streaming
- Database connection pooling
- Optimized build with Vite
qoal/
├── backend/
│ ├── handlers/ # HTTP request handlers
│ ├── services/ # Business logic
│ ├── models/ # Data models
│ ├── middleware/ # Auth middleware
│ ├── storage/ # S3 and local storage
│ ├── worker/ # Background job processor
│ └── main.go # Application entry point
├── frontend/
│ ├── src/
│ │ ├── components/ # React components
│ │ ├── pages/ # Page components
│ │ ├── services/ # API client
│ │ └── App.tsx # Main app component
│ └── public/ # Static assets
└── docker-compose.yml # Local development setup
MIT License
For questions or feedback, please open an issue on GitHub.