1
0
Fork 0
mirror of https://github.com/EDeev/tablo.git synced 2026-10-07 20:49:31 +03:00
Веб-приложение для студентов: расписание по фото с помощью ИИ, трекеры успеваемости и доступ по ссылке. Flask + PostgreSQL https://tablo.deev.su
Find a file
Egor Deev 9effed12e3 README на русском и английском, документация, скриншоты
- README.md и README.en.md: что это, статус учебного проекта, скриншоты, быстрый старт в
  Docker, установка без Docker, переменные, схема, развёртывание, тесты; лишний Bootstrap
  из стека убран (стили свои);
- docs/architecture.md (структура, формат расписания, трекеры, права) и docs/deploy.md;
- пояснительная записка перенесена в docs/.
2026-10-02 13:37:11 +00:00
.github/workflows CI: ruff и тесты на PostgreSQL на каждый push; Docker-образ по тегу в GHCR и dcr.deev.su 2026-10-02 13:31:03 +00:00
app Вход: переход по ?next= только на страницы этого сайта 2026-10-02 13:24:18 +00:00
docs README на русском и английском, документация, скриншоты 2026-10-02 13:37:11 +00:00
migrations Full Project 2026-05-19 13:49:09 +03:00
tests Тесты на PostgreSQL: права доступа, экспорт, ссылки, вход, разбор периодов и времени 2026-10-02 13:24:18 +00:00
.dockerignore Docker: образ с Chromium для экспорта, compose вместе с PostgreSQL 2026-10-02 13:31:03 +00:00
.env.example Docker: образ с Chromium для экспорта, compose вместе с PostgreSQL 2026-10-02 13:31:03 +00:00
.gitignore Docker: образ с Chromium для экспорта, compose вместе с PostgreSQL 2026-10-02 13:31:03 +00:00
compose.yaml Docker: образ с Chromium для экспорта, compose вместе с PostgreSQL 2026-10-02 13:31:03 +00:00
Dockerfile Docker: образ с Chromium для экспорта, compose вместе с PostgreSQL 2026-10-02 13:31:03 +00:00
pyproject.toml Тесты на PostgreSQL: права доступа, экспорт, ссылки, вход, разбор периодов и времени 2026-10-02 13:24:18 +00:00
README.en.md README на русском и английском, документация, скриншоты 2026-10-02 13:37:11 +00:00
README.md README на русском и английском, документация, скриншоты 2026-10-02 13:37:11 +00:00
requirements-dev.txt Зависимости: playwright и gunicorn закреплены по продакшену, dev-зависимости и настройки ruff/pytest 2026-10-02 13:10:20 +00:00
requirements.txt Тесты на PostgreSQL: права доступа, экспорт, ссылки, вход, разбор периодов и времени 2026-10-02 13:24:18 +00:00
run.py Безопасность: права на экспорт, обязательный SECRET_KEY, ошибки ИИ не показываются пользователю 2026-10-02 13:10:20 +00:00

Tablo

Русский · English

CI Docker Release

A web app for students: upload a photo of your timetable, and AI turns it into an editable schedule with per-subject progress trackers you can share by link.

Status: coursework project (2026), completed · live at tablo.deev.su

Weekly schedule and trackers

Stack: Python 3.12 · Flask · SQLAlchemy + Alembic · PostgreSQL · OpenAI-compatible Vision API · Playwright · Jinja2 + vanilla JS

Features

  • Timetable recognition from a photo or scan
  • Editing of schedules, subjects and classes; periods may span New Year
  • 11 tracker types (attendance, grades, deadlines, day streaks, etc.) on a drag-and-drop grid
  • Tracker generation from a description such as "8 labs and an exam"
  • Link sharing: view, edit, or copy as a template
  • Merging several schedules into one, with classes of the same subject combined
  • Export to JSON, CSV, PNG and a print-ready version

Quick start

git clone https://github.com/EDeev/tablo.git && cd tablo
cp .env.example .env      # set SECRET_KEY and your AI provider key
docker compose up -d

Open http://localhost:8000. Compose starts the app and PostgreSQL; migrations run on startup. Prebuilt image: docker pull ghcr.io/edeev/tablo or docker pull dcr.deev.su/edeev/tablo.

Installing without Docker

Requires Python 3.11+ and PostgreSQL.

python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
playwright install --with-deps chromium   # for PNG export
cp .env.example .env
flask --app run db upgrade
python run.py

Configuration

Variable Purpose
SECRET_KEY Flask session signing; the app will not start without it
DATABASE_URL or DB_HOST, DB_PORT, DB_NAME, DB_USER, DB_PASSWORD PostgreSQL connection
OPENAI_API_KEY AI provider key
OPENAI_BASE_URL OpenAI-compatible API URL, if not OpenAI
OPENAI_MODEL model for recognition and trackers, gpt-4o by default

Important

Without OPENAI_API_KEY, timetable recognition and tracker generation are disabled. Everything else works: you can create and edit a schedule manually.

Screenshots

My schedules Subject and trackers Phone
My schedules Subject and trackers Phone

How it works

flowchart LR
    B[Browser] --> F[Flask: auth · schedules · subjects · shares · export]
    F --> S[Services: ai_scan · ai_metrics · merge · export]
    F --> P[(PostgreSQL)]
    S --> A[OpenAI-compatible API]
    S --> C[Chromium via Playwright]

Details (in Russian):

Deployment

tablo.deev.su runs on a VPS: gunicorn under systemd behind nginx with a Let's Encrypt certificate; PostgreSQL runs on a separate server; AI is Timeweb Cloud AI. GitHub Actions builds the Docker image on every v* tag and publishes it to GitHub Packages and to dcr.deev.su.

Development

pip install -r requirements-dev.txt
export TEST_DATABASE_URL=postgresql://tablo:tablo@localhost:5432/tablo_test
ruff check . && pytest

Tests run against a real PostgreSQL: access rules and export, share links, sign-in and open-redirect protection, period and time parsing, schedule merging. CI starts the database as a service container and runs the same checks on every push.

License

Coursework project (Moscow Polytechnic University, 2025/26). The code is open for study; there is no separate license.

Author

Egor Deev — GitHub · Telegram · egor@deev.space


⭐ If you find this project useful, give it a star on GitHub!

Made with ❤️ — deev.space