This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
TikLocal is a Flask-based web application that provides a TikTok-like interface for browsing local media files. It serves as a local media server combining features of TikTok and Pinterest for videos and images.
- Backend: Flask 3.1.0, Waitress (WSGI server), PyYAML 6.0 (config file support)
- Frontend: TailwindCSS v4, Feather Icons, Hammer.js
- Python: Requires Python >=3.10,<4.0
- Package Management: Poetry for Python dependencies, npm for CSS building
# Watch mode for development (rebuilds CSS on changes)
npm run dev
# or
npm run build-css
# Production build (minified CSS)
npm run build
# or
npm run build-css-prod# Install dependencies
poetry install
# Run the application (multiple ways)
poetry run tiklocal /path/to/media/folder # Direct path argument
poetry run tiklocal --port 9000 # Custom port with config file
MEDIA_ROOT=/path tiklocal # Environment variable
tiklocal # Use config file
# Configuration file (optional)
# Create ~/.config/tiklocal/config.yaml:
# media_root: /path/to/media
# host: 0.0.0.0
# port: 8000
# Get help
tiklocal --helptiklocal/app.py: Main Flask application factory with all routes and view functionstiklocal/run.py: CLI entry point with argument parsing, config file loading, and Waitress server startuptiklocal/config.py: Configuration file (currently empty, configuration handled via config file/env vars)
/(tiktok.html): TikTok-like vertical scrolling video interface with random shuffle/browse: Paginated video browser with file management capabilities/gallery: Pinterest-style image gallery with directory navigation/settings: Application settings and statistics/detail/<name>: Individual video detail view with navigation/favorite: Favorited media management using JSON storage/media/<name>and/media2: Media file serving endpoints
- Templates: Located in
tiklocal/templates/using Jinja2 - CSS: TailwindCSS v4 with custom theme including dark mode support
- JavaScript: Vanilla JS with Feather icons and Hammer.js for touch gestures
- Theme System: Light/dark mode toggle with localStorage persistence
- Storage: Files stored in
MEDIA_ROOTenvironment variable location - Supported Formats: MP4, WebM videos; various image formats
- File Operations: Delete functionality, favorite management via JSON
- Navigation: Recursive directory scanning with mtime-based sorting
The application supports multiple configuration methods with the following priority (highest to lowest):
-
Command Line Arguments: Direct arguments passed to
tiklocaltiklocal /path/to/media- specify media root--host HOST- server host (default: 0.0.0.0)--port PORT- server port (default: 8000)
-
Environment Variables:
MEDIA_ROOT- path to media directoryTIKLOCAL_HOST- server hostTIKLOCAL_PORT- server port
-
Configuration File:
~/.config/tiklocal/config.yamlor~/.tiklocal/config.yamlmedia_root: /path/to/media host: 0.0.0.0 port: 8000
-
Defaults: host=0.0.0.0, port=8000
- Instance Config: Uses Flask's instance-relative configuration
- Favorites: Stored as JSON file in media root directory
- Configuration priority: CLI args > Environment variables > Config file > Defaults
- Config file locations:
~/.config/tiklocal/config.yamlor~/.tiklocal/config.yaml - Templates include responsive design optimized for mobile and tablet usage
- Custom Jinja2 filters for timestamp and file size formatting
- Error handling includes user-friendly messages and proper HTTP status codes
- Dark mode implementation uses CSS custom properties and data attributes
When publishing a new version to PyPI:
-
Update version number in
pyproject.toml:version = "x.y.z"
-
Commit changes:
git add . git commit -m "Release vx.y.z: description of changes"
-
Create and push git tag (required for PyPI build):
git tag -a vx.y.z -m "Release vx.y.z: description" git push origin vx.y.z -
Push commits:
git push
Note: The git tag triggers the CI/CD pipeline to automatically build and publish to PyPI.