This repository hosts the personal website and automated CV of Ayan Ashraf, alongside a custom backend productivity tracker called Grimoire. The two parts have separate purposes and workflows: the website is a static public portfolio, while Grimoire is a hidden, authenticated Flask application for private journaling and productivity tracking.
The front-facing portfolio is a static website designed for personal, academic, and project presentation.
- Frontend:
index.htmlis the main landing page and can be opened directly in a web browser. - Automated CV:
generate_pdf.pyuses Playwright to render the portfolio content and automatically generateAyan_Ashraf_CV.pdf.
🔮 Part 2: Grimoire (The Hidden Backend)
Grimoire is a private Flask web application for maintaining a structured productivity and research journal. Its core features include:
- Tracker: A calendar-based workflow for daily entries, archived days, and journal editing.
- Tag and color system: Customizable priority tags with persistent colors, ordering, and historical snapshots for consistent visualization.
- Authentication: User registration, login, logout, and credential updates protect the private tracker.
The v2.0.0 backend separates application setup, persistence, and routes:
app.py: Flask entry point, configuration, Blueprint registration, and tunnel lifecycle management.database.py: SQLite connections, WAL configuration, schema initialization, and database helpers.routes/auth.py: Flask Blueprint containing authentication routes.routes/tracker.py: Flask Blueprint containing the dashboard, journal, tag, credential, and API routes.tests/: Pytest fixtures and authentication tests.
Create and activate a virtual environment before installing dependencies:
python -m venv venv
.\venv\Scripts\Activate.ps1Install dependencies in separate runtime and development groups:
-
Runtime dependencies
pip install -r requirements.txt -
Playwright engine required by the CV generator
python -m playwright install chromium -
Python development tools
pip install -r requirements-dev.txt
-
JavaScript linting tools
npm install
Open index.html directly in a web browser. The static portfolio does not
require a development server.
-
Initialize the SQLite database:
python init_db.py
-
Start the Flask server:
flask run
Alternatively, run
python app.pyto use the application entry point and its tunnel lifecycle behavior. -
Access the application at
http://127.0.0.1:5000.
The Grimoire backend enforces strict linting and typing. Run these checks before committing:
-
Tests:
pytest tests/ -
Typing: Strict typing is enforced with mypy.
mypy .
-
Formatting: Ruff enforces the 100-character line limit.
ruff check .
-
JavaScript linting: ESLint enforces
let/constusage and flags unused variables.eslint static/js/
AI coding assistants automatically read
.github/copilot-instructions.md. That file defines the Grimoire architectural
boundaries, strict Python typing and linting rules, JavaScript conventions, and
testing expectations, so these rules do not need to be repeated manually in
each prompt.