Compare commits
3 Commits
0c2ed2ef35
...
main
| Author | SHA256 | Date | |
|---|---|---|---|
| f7d010f28d | |||
| 10407415f0 | |||
| 49ef87ea50 |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -130,6 +130,8 @@ celerybeat.pid
|
|||||||
|
|
||||||
# Environments
|
# Environments
|
||||||
.env
|
.env
|
||||||
|
.env.dev
|
||||||
|
.env.prod
|
||||||
.venv
|
.venv
|
||||||
env/
|
env/
|
||||||
venv/
|
venv/
|
||||||
|
|||||||
98
CLAUDE.md
Normal file
98
CLAUDE.md
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
# CLAUDE.md - Kebuu Project Context
|
||||||
|
|
||||||
|
> **Last Updated**: 2026-01-19
|
||||||
|
|
||||||
|
<!-- CLAUDE CODE INSTRUCTION:
|
||||||
|
When implementing new features, adding routes, models, or dependencies:
|
||||||
|
1. Update the relevant sections in this file (Routes, Models, Directory Structure, etc.)
|
||||||
|
2. Move completed items from Roadmap to a "Completed" section or remove them
|
||||||
|
3. Update the "Last Updated" date above
|
||||||
|
This keeps the project context accurate for future sessions.
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
Kebuu is a spending tracker web app built with Flask. Currently in early development with user authentication complete.
|
||||||
|
|
||||||
|
## Tech Stack
|
||||||
|
- **Backend**: Flask 3.0, SQLAlchemy, Flask-Login
|
||||||
|
- **Auth**: bcrypt password hashing, Altcha CAPTCHA (self-hosted)
|
||||||
|
- **Forms**: Flask-WTF with CSRF protection
|
||||||
|
- **Server**: Docker + Gunicorn (dev and prod)
|
||||||
|
- **Database**: SQLite (dev), PostgreSQL (prod)
|
||||||
|
|
||||||
|
## Directory Structure
|
||||||
|
```
|
||||||
|
src/
|
||||||
|
├── app.py # Entry point, Flask factory pattern
|
||||||
|
├── config.py # Environment-based configuration
|
||||||
|
├── models.py # SQLAlchemy models (User)
|
||||||
|
├── routes.py # Blueprint routes (main)
|
||||||
|
├── forms.py # WTForms with validators
|
||||||
|
├── altcha_utils.py # Self-hosted CAPTCHA implementation
|
||||||
|
├── requirements.txt # Python dependencies
|
||||||
|
├── templates/ # Jinja2 templates
|
||||||
|
└── static/css/ # Stylesheets
|
||||||
|
```
|
||||||
|
|
||||||
|
## Key Patterns
|
||||||
|
- **Flask Factory**: `create_app()` in app.py
|
||||||
|
- **Blueprints**: Routes organized in `main` blueprint
|
||||||
|
- **Singleton**: Altcha instance cached per HMAC key
|
||||||
|
- **Strong passwords**: 8+ chars, upper/lower/number/special required
|
||||||
|
|
||||||
|
## Commands
|
||||||
|
|
||||||
|
### Build
|
||||||
|
```bash
|
||||||
|
docker build -t kebuu .
|
||||||
|
```
|
||||||
|
|
||||||
|
### Development
|
||||||
|
```bash
|
||||||
|
docker run -p 5000:5000 --env-file .env.dev -v $(pwd)/src:/app kebuu
|
||||||
|
```
|
||||||
|
|
||||||
|
### Production
|
||||||
|
```bash
|
||||||
|
docker run -p 5000:5000 --env-file .env.prod kebuu
|
||||||
|
```
|
||||||
|
|
||||||
|
### Testing
|
||||||
|
```bash
|
||||||
|
docker run --env-file .env.dev kebuu python -m unittest discover
|
||||||
|
```
|
||||||
|
|
||||||
|
## Environment Variables
|
||||||
|
| Variable | Description | Default |
|
||||||
|
|----------|-------------|---------|
|
||||||
|
| SECRET_KEY | Flask session secret | dev-secret-key |
|
||||||
|
| DATABASE_URL | SQLAlchemy URI | sqlite:///kebuu.db |
|
||||||
|
| ALTCHA_HMAC_KEY | CAPTCHA signing key | default-hmac-key |
|
||||||
|
|
||||||
|
## Routes
|
||||||
|
| Route | Method | Auth | Description |
|
||||||
|
|-------|--------|------|-------------|
|
||||||
|
| `/` | GET | No | Redirects to signup/dashboard |
|
||||||
|
| `/signup` | GET/POST | No | User registration |
|
||||||
|
| `/dashboard` | GET | Yes | User dashboard |
|
||||||
|
| `/altcha/challenge` | GET | No | CAPTCHA challenge endpoint |
|
||||||
|
|
||||||
|
## Database Models
|
||||||
|
**User**: id, email (unique), password_hash, created_at
|
||||||
|
- `set_password()`: bcrypt hash with salt
|
||||||
|
- `check_password()`: timing-safe comparison
|
||||||
|
|
||||||
|
## Security Notes
|
||||||
|
- CSRF enabled on all forms
|
||||||
|
- Passwords hashed with bcrypt + salt
|
||||||
|
- HMAC-SHA256 for Altcha signatures
|
||||||
|
- Docker runs as non-root user (appuser)
|
||||||
|
- Timing-safe comparisons for secrets
|
||||||
|
|
||||||
|
## Roadmap / TODOs
|
||||||
|
- [ ] Spending tracker core features (transactions, categories)
|
||||||
|
- [ ] Login page (currently only signup exists)
|
||||||
|
- [ ] Password reset functionality
|
||||||
|
- [ ] User profile/settings page
|
||||||
|
- [ ] Export spending data
|
||||||
|
- [ ] Dashboard with spending analytics
|
||||||
26
Dockerfile
Normal file
26
Dockerfile
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
FROM python:3.12-slim
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Install system dependencies
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
gcc \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# Copy requirements first for better caching
|
||||||
|
COPY src/requirements.txt .
|
||||||
|
|
||||||
|
# Install Python dependencies
|
||||||
|
RUN pip install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
|
# Copy application code
|
||||||
|
COPY src/ .
|
||||||
|
|
||||||
|
# Create non-root user for security
|
||||||
|
RUN useradd --create-home appuser && chown -R appuser:appuser /app
|
||||||
|
USER appuser
|
||||||
|
|
||||||
|
EXPOSE 5000
|
||||||
|
|
||||||
|
# Default to production; override with --env-file at runtime
|
||||||
|
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:create_app()"]
|
||||||
51
README.md
51
README.md
@@ -1,3 +1,50 @@
|
|||||||
# kebuu.com
|
# Kebuu
|
||||||
|
|
||||||
Spending Tracker
|
A spending tracker web application built with Flask.
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
### 1. Create Environment Files
|
||||||
|
|
||||||
|
Copy the example file and configure for your environment:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cp .env.example .env.dev # For development
|
||||||
|
cp .env.example .env.prod # For production
|
||||||
|
```
|
||||||
|
|
||||||
|
Edit the files with your values:
|
||||||
|
|
||||||
|
| Variable | Description | Example |
|
||||||
|
|----------|-------------|---------|
|
||||||
|
| `SECRET_KEY` | Flask session secret (use a strong random string in production) | `your-secret-key-here` |
|
||||||
|
| `DATABASE_URL` | Database connection string | `sqlite:///kebuu.db` or `postgresql://user:pass@host/db` |
|
||||||
|
| `ALTCHA_HMAC_KEY` | CAPTCHA signing key (use a strong random string) | `your-altcha-hmac-key-here` |
|
||||||
|
|
||||||
|
Generate secure keys with:
|
||||||
|
```bash
|
||||||
|
python -c "import secrets; print(secrets.token_hex(32))"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Build Docker Image
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker build -t kebuu .
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Run the Application
|
||||||
|
|
||||||
|
**Development:**
|
||||||
|
```bash
|
||||||
|
docker run -p 5000:5000 --env-file .env.dev -v $(pwd)/src:/app kebuu
|
||||||
|
```
|
||||||
|
The volume mount (`-v`) enables live code reloading during development.
|
||||||
|
|
||||||
|
**Production:**
|
||||||
|
```bash
|
||||||
|
docker run -p 5000:5000 --env-file .env.prod kebuu
|
||||||
|
```
|
||||||
|
|
||||||
|
## Project Structure
|
||||||
|
|
||||||
|
See [CLAUDE.md](CLAUDE.md) for detailed project documentation.
|
||||||
|
|||||||
@@ -6,3 +6,4 @@ bcrypt==4.1.2
|
|||||||
python-dotenv==1.0.0
|
python-dotenv==1.0.0
|
||||||
email-validator==2.1.0
|
email-validator==2.1.0
|
||||||
altcha==0.1.2
|
altcha==0.1.2
|
||||||
|
gunicorn==21.2.0
|
||||||
|
|||||||
Reference in New Issue
Block a user