Lifery is a comprehensive full-stack web platform that enables users to record, organize, and share life memories and milestones in a rich multimedia diary format. Users can attach photos, videos, audio, and text to each memory and organize them chronologically on a timeline, grouped by life periods (e.g., "University Years," "First Job"). Each entry supports granular visibility settings (public, friends-only, or private), providing users with full control over their digital narrative.
- Multimedia Memory Storage: Support for photos, videos, audio, and text content
- Timeline Organization: Chronological organization with life period grouping
- Granular Privacy Controls: Public, friends-only, and private visibility settings
- Social Connectivity: Friend connections and social sharing capabilities
- Multi-language Support: Turkish and English interface
- OAuth Integration: Google and LinkedIn authentication
- Real-time Notifications: User activity and connection notifications
- Responsive Design: Modern, mobile-friendly interface
- Framework: Echo v4 for HTTP routing and middleware
- Architecture: Clean Architecture with clear separation of concerns
- Controllers: HTTP request handling and response formatting
- Use Cases: Business logic and application rules
- Repositories: Data access layer with interface abstractions
- Models: Data structures and validation
- Database: PostgreSQL with go-pg ORM
- Caching: Redis for performance optimization
- Authentication: JWT-based authentication with role-based access control
- Documentation: Swagger/OpenAPI 3.0 integration
- Testing: Comprehensive test suite with testcontainers for integration tests
- Logging: Structured logging with Zap
- Validation: Request validation with go-playground/validator
- Framework: Nuxt 3 with Vue 3 Composition API
- UI Library: Nuxt UI with Tailwind CSS
- State Management: Vue composables for reactive state
- Form Validation: Vee-validate with Yup schemas
- Internationalization: Nuxt i18n with Turkish and English support
- Authentication: JWT token management with automatic refresh
- File Upload: Cloudinary integration for media storage
- SSR/SSG: Server-side rendering for improved SEO and performance
- Containerization: Docker with multi-stage builds
- Orchestration: Docker Compose for local development
- Cloud Platform: Railway for production deployment
- CI/CD: GitHub integration for automated deployments
- Environment Management: Environment-specific configuration
- Database: PostgreSQL with connection pooling
- Caching: Redis for session and data caching
lifery/
βββ api/ # Backend Go application
β βββ controller/ # HTTP handlers and request/response logic
β βββ model/ # Data models and validation schemas
β βββ repositories/ # Data access layer with interfaces
β βββ uc/ # Use cases (business logic)
β βββ pkg/ # Shared utilities and configurations
β βββ util/ # Helper functions and utilities
β βββ tests/ # Test suites and test utilities
β βββ docs/ # Swagger documentation
β βββ docker-compose.yaml # Local development environment
βββ ui/ # Frontend Nuxt.js application
β βββ components/ # Vue components
β βββ pages/ # Application pages and routing
β βββ composables/ # Vue composables for state management
β βββ middleware/ # Nuxt middleware
β βββ layouts/ # Page layouts
β βββ i18n/ # Internationalization files
βββ README.md
- Go 1.23+
- Node.js 18+
- Docker and Docker Compose
- PostgreSQL
- Redis
cd api
# Install dependencies
go mod download
# Set up environment variables
cp .env.example .env
# Edit .env with your configuration
# Run with Docker Compose
docker-compose up -d
# Or run locally
go run main.gocd ui
# Install dependencies
npm install
# Set up environment variables
cp .env.example .env
# Edit .env with your configuration
# Run development server
npm run devOnce the backend is running, access the Swagger documentation at:
http://localhost:8080/swagger/index.html
# Database
DB_HOST=localhost
DB_PORT=5432
DB_NAME=lifery
DB_USER=postgres
DB_PASSWORD=password
# JWT
JWT_SECRET=your-jwt-secret
# OAuth
GOOGLE_CLIENT_ID=your-google-client-id
GOOGLE_CLIENT_SECRET=your-google-client-secret
LINKEDIN_CLIENT_ID=your-linkedin-client-id
LINKEDIN_CLIENT_SECRET=your-linkedin-client-secret
# Email
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=your-email@gmail.com
SMTP_PASSWORD=your-app-passwordNUXT_API_BASE_URL=http://localhost:8080
NUXT_PUBLIC_CLOUDINARY_CLOUD_NAME=your-cloudinary-cloud-name
NUXT_PUBLIC_CLOUDINARY_UPLOAD_PRESET=your-upload-preset- JWT Authentication: Secure token-based authentication
- Role-based Access Control: Admin, Editor, and Viewer roles
- Password Hashing: Secure password storage with bcrypt
- CORS Configuration: Proper cross-origin resource sharing
- Input Validation: Comprehensive request validation
- SQL Injection Prevention: Parameterized queries with go-pg
- Rate Limiting: API rate limiting (configurable)
Lifery supports multiple OAuth providers for seamless authentication:
- Google OAuth 2.0: Sign in with Google account
- LinkedIn OAuth 2.0: Sign in with LinkedIn account
- Authorization Request: User clicks "Sign in with [Provider]"
- Provider Redirect: User is redirected to the OAuth provider
- User Consent: User grants permission to Lifery
- Callback Handling: Provider redirects back with authorization code
- Token Exchange: Backend exchanges code for access token
- User Creation/Login: User account is created or existing user is logged in
- JWT Token: User receives JWT token for subsequent API calls
The application supports multiple languages:
- Turkish (tr): Default language
- English (en): Secondary language
Language switching is available through the UI, and all user-facing content is localized.
The application is deployed on Railway with automated CI/CD from GitHub:
- Backend: Containerized Go application with PostgreSQL and Redis
- Frontend: Static site generation with Nuxt.js
- Database: Managed PostgreSQL instance
- Caching: Redis for session and data caching
- CDN: Cloudinary for media file delivery
- API Documentation: https://lifery-production.up.railway.app/swagger/index.html
- Frontend Application: https://lifery.bio
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
For support and questions:
- Create an issue in the GitHub repository
- Check the API documentation for technical details
- Review the test files for usage examples
