Platform for scientists and educators to collect and combine educational data into benchmarks for competency-based learning.
- Java 17 JDK (for Spring Boot backend)
- Node.js 20+ (for Vite frontend)
- Docker & Docker Compose
- Git
-
Clone the repository
git clone https://github.com/ls1intum/memo.git cd memo -
Start the Spring Boot backend
cd server ./server-manage.sh upWait ~60 seconds for all services to start (PostgreSQL, Keycloak, Spring Boot)
-
Start the Vite frontend (in a new terminal)
cd .. # Back to root directory npm install npm run dev
-
Access the application
- Frontend: http://localhost:5173
- Backend API: http://localhost:8080
- Swagger UI: http://localhost:8080/swagger-ui.html
- Keycloak Admin: http://localhost:8081 (admin/admin)
-
Login
- Use
[email protected]/demoor[email protected]/admin
- Use
┌─────────────────────────────────────────────────────────┐
│ Vite + React Frontend │
│ (Port 5173) │
│ ┌─────────────┐ ┌──────────────┐ ┌───────────────┐ │
│ │ React │ │ React Query │ │ Keycloak │ │
│ │ Components │ │ + Axios API │ │ Auth │ │
│ └─────────────┘ └──────────────┘ └───────────────┘ │
└───────────────────────┬─────────────────────────────────┘
│ REST API (JWT)
┌───────────────────────▼─────────────────────────────────┐
│ Spring Boot Backend │
│ (Port 8080) │
│ ┌──────────────┐ ┌──────────┐ ┌──────────────────┐ │
│ │ REST │ │ Service │ │ Spring Data JPA │ │
│ │ Controllers │ │ Layer │ │ + PostgreSQL │ │
│ └──────────────┘ └──────────┘ └──────────────────┘ │
└─────────────────────────────────────────────────────────┘
│ │
▼ ▼
┌──────────────────┐ ┌─────────────────────┐
│ Keycloak │ │ PostgreSQL │
│ (Port 8081) │ │ (Port 5433) │
│ OAuth2 + JWT │ │ Application DB │
└──────────────────┘ └─────────────────────┘
memo/
├── src/ # Vite + React frontend
│ ├── App.tsx # Main app component
│ ├── main.tsx # Entry point
│ ├── components/ # Reusable React components
│ │ ├── ui/ # UI primitives (button, card, etc.)
│ │ └── session/ # Session-specific components
│ ├── pages/ # Page components
│ │ ├── HomePage.tsx
│ │ ├── SessionPage.tsx
│ │ ├── AboutPage.tsx
│ │ └── OnboardingPage.tsx
│ ├── lib/ # Frontend utilities
│ │ ├── api/ # REST API client and services
│ │ └── utils.ts # Utility functions
│ └── hooks/ # Custom React hooks
├── server/ # Spring Boot backend
│ ├── src/main/java/ # Java source code
│ │ └── de/tum/cit/memo/
│ │ ├── controller/ # REST endpoints
│ │ ├── service/ # Business logic
│ │ ├── repository/ # Data access
│ │ ├── entity/ # JPA entities
│ │ ├── dto/ # Data transfer objects
│ │ ├── security/ # OAuth2 config
│ │ └── config/ # Application config
│ ├── src/main/resources/
│ │ ├── application.yml # Spring config
│ │ └── db/migration/ # Flyway migrations
│ ├── docker-compose.yml # Backend services
│ └── server-manage.sh # Management script
├── public/ # Static assets
├── index.html # HTML entry point
├── vite.config.ts # Vite configuration
├── tsconfig.json # TypeScript config
└── README.md # This file
npm run dev # Start development server (Vite)
npm run build # Build for production
npm run preview # Preview production build
npm run lint # Run ESLint
npm run lint:fix # Fix ESLint issues
npm run format # Format code with Prettier
npm run type-check # TypeScript type checking
npm run quality # Run all checks
npm run quality:fix # Fix all auto-fixable issuescd server
./server-manage.sh up # Start all services
./server-manage.sh down # Stop all services
./server-manage.sh logs # View logs
./server-manage.sh status # Check service status
./server-manage.sh build # Build Spring Boot app
./server-manage.sh test # Run testsThe application uses Keycloak for OAuth2/JWT authentication.
| Password | Role | |
|---|---|---|
[email protected] |
demo |
USER |
[email protected] |
admin |
ADMIN |
- URL: http://localhost:8081
- Username:
admin - Password:
admin
- Build Tool: Vite 6
- UI: React 19, shadcn/ui, Tailwind CSS 4
- State: TanStack Query (React Query)
- Routing: React Router 7
- HTTP: Axios
- Auth: Keycloak JS
- Framework: Spring Boot 3.4.1
- Language: Java 17
- Database: PostgreSQL 16
- ORM: JPA/Hibernate
- Migrations: Flyway
- Security: Spring Security + OAuth2
- API Docs: OpenAPI/Swagger
- Build: Gradle 8.11.1
- Authentication: Keycloak 26.4
- Containerization: Docker + Docker Compose
- Reverse Proxy: Nginx (production)
Full API documentation with interactive testing:
- Swagger UI: http://localhost:8080/swagger-ui.html
- OpenAPI JSON: http://localhost:8080/api-docs
GET /api/competencies- List all competenciesGET /api/competencies/random?count=2- Get random competenciesPOST /api/competencies- Create competencyPOST /api/competency-relationships- Create relationshipGET /api/users- List usersGET /api/learning-resources- List resources
All endpoints require JWT authentication via Bearer token.
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Make your changes
- Run quality checks:
npm run quality - Test thoroughly (backend and frontend)
- Commit:
git commit -m 'Add amazing feature' - Push:
git push origin feature/amazing-feature - Open a Pull Request
- Frontend:
npm run qualitypasses - Backend:
cd server && ./server-manage.sh testpasses - Code is properly formatted
- No console.log statements in production code
- API changes documented in Swagger
cd server
./server-manage.sh down
./server-manage.sh up
./server-manage.sh logs # Check for errors- Verify backend is running: http://localhost:8080/actuator/health
- Check
.env.localhas correct URLs - Clear browser cache and cookies
- Restart frontend:
npm run dev
- Check Keycloak is running: http://localhost:8081
- Clear browser local storage and cookies
- Try incognito/private browsing mode
- Check
server/docker-compose.ymlfor Keycloak config
cd server
./server-manage.sh down
docker volume rm memo_postgres_data # Warning: deletes all data
./server-manage.sh upIf ports 5173, 5433, 8080, or 8081 are in use:
- Frontend:
vite --port 3001or editvite.config.ts - Backend: Edit
server/docker-compose.ymlport mappings
- CLAUDE.md - Project conventions and AI assistant guidelines
- server/README.md - Backend-specific documentation
- SECURITY.md - Security guidelines
- CODE_OF_CONDUCT.md - Community guidelines
This project is part of the ls1intum organization.