Study anywhere, sync everywhere, own your data
- Spaced Repetition Algorithm - SuperMemo-2 based intelligent review scheduling
- Interactive Study Mode - Multi-directional card flipping with keyboard shortcuts
- Real-time Card Editing - Modify cards on-the-fly during study sessions
- Progress Tracking - Detailed analytics on learning performance and retention
- Intuitive Card Creation - Drag-and-drop reordering with auto-resize text areas
- Bulk Import Support - Import from CSV, TSV, or paste tab/comma-separated data
- Flexible Organization - Group decks into pods for structured learning
- Rich Content Support - Text, HTML, and Markdown content types
- Pod Creation - Add multiple decks to a single pod
- Pod Study - Study all your decks in one place
- Multiple Flip Animations - Horizontal, vertical-up, and vertical-down card flips
- Keyboard Navigation - Full keyboard control for efficient studying
- Shuffle & Randomize - Mix up card order to prevent pattern memorization
- Term/Definition Toggle - Study in both directions
- Mobile-Responsive - Seamless experience across desktop, tablet, and mobile
- Self-Hosted - Complete data ownership and privacy
- No External Dependencies - All learning data stays on your server
- Secure Authentication - JWT-based session management
- Offline Capable - Study without internet connectivity
FlashPod can be deployed using Docker or Podman containers for easy setup and isolation.
- Docker or Podman installed on your system
-
Clone the repository
git clone https://github.com/ElderBlade/FlashPod.git cd FlashPod -
Build the container image
# Using Docker docker build -f docker/Dockerfile -t localhost/flashpod . # Using Podman podman build -f docker/Dockerfile -t localhost/flashpod .
-
docker-compose.yml
services: flashpod: image: localhost/flashpod:latest container_name: flashpod ports: - "8000:8000" environment: - JWT_SECRET=change-this-secure-jwt-secret-key - SECRET_KEY=change-this-secure-secret-key - DEBUG=false - JWT_EXPIRATION_HOURS=24 - TZ=America/Los_Angeles volumes: - flashpod:/data user: "1001:1001" read_only: true tmpfs: - /tmp security_opt: - no-new-privileges:true restart: always volumes: flashpod: driver: local
-
Start with Docker Compose
docker-compose up -d
-
Access FlashPod Open your browser to
http://localhost:8000
-
Clone and build (same as above)
-
Run container
docker run -d \ --name flashpod \ --restart=always \ -p 8000:8000 \ -e JWT_SECRET=change-this-secure-jwt-secret-key \ -e SECRET_KEY=change-this-secure-secret-key \ -e DEBUG=false \ -e JWT_EXPIRATION_HOURS=24 \ -e TZ=America/Los_Angeles \ -v flashpod:/data \ --user 1001:1001 \ --read-only \ --tmpfs /tmp \ --security-opt no-new-privileges:true \ localhost/flashpod:latest
-
Clone and build (same as above)
-
Quadlet file - place file
/etc/containers/systemd/users/$(UID)or/etc/containers/systemd/users/[Unit] Description=FlashPod - Smart Flashcard Learning Platform Wants=network-online.target After=network-online.target [Container] Image=localhost/flashpod:latest ContainerName=flashpod PublishPort=8000:8000 # Environment variables Environment=JWT_SECRET=change-this-secure-jwt-secret-key Environment=SECRET_KEY=change-this-secure-secret-key Environment=DEBUG=false Environment=JWT_EXPIRATION_HOURS=24 Environment=TZ=America/Los_Angeles # Data persistence Volume=flashpod:/data:Z # Security User=1001:1001 ReadOnlyTmpfs=true Tmpfs=/tmp NoNewPrivileges=true [Service] Restart=always TimeoutStartSec=300 [Install] WantedBy=multi-user.target EOF
-
Start service
systemctl --user daemon-reload systemctl --user enable --now flashpod.service
For development or if you prefer running without containers:
- Python 3.8+
- Node.js 16+ (for CSS building)
-
Clone the repository
git clone https://github.com/ElderBlade/flashpod.git cd flashpod -
Set up Python environment
python -m venv venv source venv/bin/activate # On Windows: venv\Scripts\activate pip install -r requirements.txt
-
Build CSS assets
npm install npm run build-css
-
Initialize database
mkdir -p data cd app python main.py -
Access FlashPod Open your browser to
http://localhost:8000
- Username:
testuser - Password:
password123
JWT_SECRET: Used for JWT token signingSECRET_KEY: Used for session security
Generate secure secrets:
# Generate random secrets
openssl rand -hex 32 # For JWT_SECRET
openssl rand -hex 32 # For SECRET_KEY- Navigate to "New Deck" in the sidebar
- Enter deck details - name and optional description
- Add flashcards using the intuitive form
- Import bulk cards (optional) via the Import button
- Save and start studying!
| Action | Keyboard | Mouse |
|---|---|---|
| Flip Horizontal | Space |
Click card |
| Flip Up | โ |
- |
| Flip Down | โ |
- |
| Previous Card | โ |
Previous button |
| Next Card | โ |
Next button |
| Shuffle Toggle | S |
Shuffle button |
| Term/Def Toggle | T |
T/D button |
| Exit Study | Escape |
Exit button |
FlashPod supports multiple import formats:
Tab-separated:
Term 1 Definition 1
Term 2 Definition 2
Comma-separated:
Term 1, Definition 1
Term 2, Definition 2
FlashPod uses a comprehensive relational schema designed for scalability:
- Users - Authentication and preferences
- Decks - Flashcard collections
- Cards - Individual flashcards with rich content
- Pods - Grouped deck collections
- Study Sessions - Learning session tracking
- Card Reviews - Spaced repetition data
- Statistics - Progress analytics
View the complete schema in db_schema.sql.
FlashPod implements the SuperMemo-2 algorithm for optimal learning:
- Ease Factor: Adjusts based on response quality (1-5 scale)
- Interval Calculation: Exponential spacing for long-term retention
- Review Scheduling: Automatic next-review date calculation
- Progress Tracking: Repetition count and success metrics
The study mode provides an immersive learning experience:
- 3D Card Animations: Smooth CSS3 transforms for realistic card flipping
- Keyboard-First Design: Navigate entirely without mouse
- Visual Feedback: Progress bars, card counters, and status indicators
- Accessibility: Screen reader support and high contrast mode
Flexible data import supporting various formats:
- Format Detection: Auto-detects delimiters (tab, comma)
- Preview & Edit: Review imported cards before creating deck
- Error Handling: Graceful handling of malformed data
- Bulk Operations: Efficient processing of large datasets
FlashPod is fully responsive with mobile-specific optimizations:
- Touch-Friendly Interface - Large touch targets and swipe gestures
- Collapsible Navigation - Hamburger menu with smooth animations
- Optimized Study Mode - Card sizing and controls adapted for mobile
- Offline Support - Continue studying without internet connection
Create a .env file for custom configuration:
DATABASE_URL=sqlite:///./data/flashpod.db
SECRET_KEY=your-super-secret-key
DEBUG=True
JWT_EXPIRATION_HOURS=24
TZ=America/Los_AngelesFor production environments:
- Set
DEBUG=False - Use a strong
SECRET_KEY - Configure reverse proxy (nginx recommended)
- Set up SSL/TLS certificates
- Consider PostgreSQL for better performance
We welcome contributions! Please see our Contributing Guide for details.
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to branch (
git push origin feature/amazing-feature) - Open a Pull Request
FlashPod is open source software licensed under the MIT License.
- SuperMemo - For the spaced repetition algorithm
- Tailwind CSS - For the utility-first CSS framework
- Sanic - For the high-performance async Python framework
- ๐ Bug Reports: GitHub Issues
- ๐ฌ Discussions: GitHub Discussions
Built with โค๏ธ for learners everywhere

