scaffold: modern rewrite skeleton (backend + frontend PWA) + roadmap
This commit is contained in:
parent
2cf4b45b85
commit
c64039bb2f
11
modern/.github/workflows/ci.yml
vendored
Normal file
11
modern/.github/workflows/ci.yml
vendored
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
name: CI
|
||||||
|
on: [push, pull_request]
|
||||||
|
jobs:
|
||||||
|
lint:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Check Python syntax
|
||||||
|
run: python -m py_compile modern/backend/server.py
|
||||||
|
- name: Check frontend package.json
|
||||||
|
run: cat modern/frontend/package.json
|
||||||
11
modern/.gitignore
vendored
Normal file
11
modern/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
# modern scaffold ignore
|
||||||
|
node_modules/
|
||||||
|
venv/
|
||||||
|
.env
|
||||||
|
dist/
|
||||||
|
.idea/
|
||||||
|
.DS_Store
|
||||||
|
__pycache__/
|
||||||
|
*.pyc
|
||||||
|
.env.local
|
||||||
|
/*.log
|
||||||
7
modern/Dockerfile.backend
Normal file
7
modern/Dockerfile.backend
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
# Simple Dockerfile for the minimal Python backend
|
||||||
|
FROM python:3.11-slim
|
||||||
|
WORKDIR /app
|
||||||
|
COPY backend/requirements.txt ./
|
||||||
|
RUN pip install --no-cache-dir -r requirements.txt || true
|
||||||
|
COPY backend/ ./backend/
|
||||||
|
CMD ["python", "backend/server.py"]
|
||||||
15
modern/README.md
Normal file
15
modern/README.md
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
# LifeRPG Modern Scaffold
|
||||||
|
|
||||||
|
This folder contains a small scaffold to kick off the modernization of LifeRPG.
|
||||||
|
|
||||||
|
What is included:
|
||||||
|
- `backend/` - minimal stdlib-based JSON HTTP server (dev-only)
|
||||||
|
- `frontend/` - minimal React + Vite scaffold and PWA files
|
||||||
|
- `ROADMAP.md` - prioritized milestones and estimates
|
||||||
|
- Dockerfile and docker-compose for local development
|
||||||
|
|
||||||
|
Next steps:
|
||||||
|
- Replace backend with FastAPI and add DB/ORM/migrations
|
||||||
|
- Implement OAuth2 and integrations adapters
|
||||||
|
- Expand frontend with components and theming
|
||||||
|
|
||||||
1
modern/README_INITIAL_COMMIT.md
Normal file
1
modern/README_INITIAL_COMMIT.md
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
This commit created a minimal scaffold for the modern LifeRPG rewrite (backend + frontend + PWA + roadmap). Replace the backend with FastAPI and add DB and integration implementations as next steps.
|
||||||
85
modern/ROADMAP.md
Normal file
85
modern/ROADMAP.md
Normal file
|
|
@ -0,0 +1,85 @@
|
||||||
|
# LifeRPG Modernization Roadmap
|
||||||
|
|
||||||
|
This roadmap prioritizes work to modernize LifeRPG into a cross-platform, integrations-capable, security-focused habit-tracking "level-up" system.
|
||||||
|
|
||||||
|
Prioritization legend:
|
||||||
|
- Priority: P1 (high), P2 (medium), P3 (low)
|
||||||
|
- Effort: S (1-3 days), M (1-2 weeks), L (2-6 weeks)
|
||||||
|
|
||||||
|
Milestone 1 — Core rewrite & cross-platform skeleton (P1, S → M)
|
||||||
|
- Goal: Create a maintainable API backend, web frontend, and PWA shell.
|
||||||
|
- Tasks:
|
||||||
|
- Scaffold backend API (initial: lightweight stdlib server; target: FastAPI) — Effort: S
|
||||||
|
- Scaffold React frontend + Vite + PWA manifest — Effort: S
|
||||||
|
- Add Dockerfiles and docker-compose for local dev — Effort: S
|
||||||
|
- Add CI skeleton (lint/test/build) — Effort: S
|
||||||
|
- Success criteria: repo contains runnable dev skeleton and CI passes basic checks.
|
||||||
|
|
||||||
|
Milestone 2 — Data model & persistence (P1, M)
|
||||||
|
- Goal: Design DB schema and migration strategy.
|
||||||
|
- Tasks:
|
||||||
|
- Draft ER: Users, Profiles, Projects, Habits, Logs, Achievements, Integrations, ChangeLog — Effort: S
|
||||||
|
- Implement migrations + ORM (e.g., SQLAlchemy/Alembic or Diesel/Golang) — Effort: M
|
||||||
|
- Add encrypted backups and export/import — Effort: S
|
||||||
|
- Success criteria: migrations run and basic entities can be persisted.
|
||||||
|
|
||||||
|
Milestone 3 — Auth, security, and infra (P1, M)
|
||||||
|
- Goal: Secure auth and deployment-ready infra.
|
||||||
|
- Tasks:
|
||||||
|
- Implement OAuth2/OIDC login with PKCE and refresh tokens — Effort: M
|
||||||
|
- Secure storage for tokens (Keystore/Keychain) — Effort: M
|
||||||
|
- Add 2FA (TOTP) and account hardening — Effort: M
|
||||||
|
- Add security middleware (CSP, HSTS, secure cookies) — Effort: S
|
||||||
|
- Success criteria: secure login flows and CI security checks enabled.
|
||||||
|
|
||||||
|
Milestone 4 — Integrations platform (P1, M → L)
|
||||||
|
- Goal: Add Google Calendar, Todoist, GitHub, Slack integrations.
|
||||||
|
- Tasks:
|
||||||
|
- Build pluggable adapter interface + webhook receiver — Effort: S
|
||||||
|
- Implement Google Calendar adapter (OAuth + sync) — Effort: M
|
||||||
|
- Implement Todoist adapter and sample sync — Effort: M
|
||||||
|
- Add rate-limited worker queue for background sync (Redis/RQ/RabbitMQ) — Effort: M
|
||||||
|
- Success criteria: successful demo sync for at least Google Calendar.
|
||||||
|
|
||||||
|
Milestone 5 — Mobile & offline (P2, M)
|
||||||
|
- Goal: Provide Android support and offline-first experience.
|
||||||
|
- Tasks:
|
||||||
|
- Implement PWA caching + background sync — Effort: S
|
||||||
|
- Optionally scaffold React Native / Flutter app with local DB sync — Effort: M
|
||||||
|
- Implement conflict resolution strategy and sync indicators — Effort: M
|
||||||
|
- Success criteria: PWA installable on Android with offline tasks and sync.
|
||||||
|
|
||||||
|
Milestone 6 — Gamification & analytics (P2, M)
|
||||||
|
- Goal: Rebuild gamification engine and analytics dashboard.
|
||||||
|
- Tasks:
|
||||||
|
- Implement XP/levels, achievements, streaks model — Effort: S
|
||||||
|
- Add analytics endpoints and frontend charts (heatmap, time series) — Effort: M
|
||||||
|
- Add opt-in anonymized telemetry — Effort: S
|
||||||
|
- Success criteria: visible progress UI and charts in frontend.
|
||||||
|
|
||||||
|
Milestone 7 — Extensibility and portfolio polish (P3, M → L)
|
||||||
|
- Goal: Plugins, documentation, security portfolio artifacts.
|
||||||
|
- Tasks:
|
||||||
|
- Add plugin system (sandbox with WASM or Lua) — Effort: L
|
||||||
|
- Add thorough docs, CONTRIBUTING, CODE_OF_CONDUCT, architecture guides — Effort: M
|
||||||
|
- Add security writeups, SBOM, CI SAST scans, and demo accounts — Effort: M
|
||||||
|
- Success criteria: repo is ready for public demo with documentation and security artifacts.
|
||||||
|
|
||||||
|
Roadmap timeline (example pace: solo maintainer ~10 hrs/week):
|
||||||
|
- Month 0 (weeks 0–2): Milestone 1
|
||||||
|
- Month 1 (weeks 3–6): Milestone 2 + start Milestone 3
|
||||||
|
- Month 2 (weeks 7–10): Finish Milestone 3
|
||||||
|
- Month 3–4: Milestone 4
|
||||||
|
- Month 5: Milestone 5
|
||||||
|
- Month 6: Milestone 6
|
||||||
|
- Months 7+: Milestone 7 and polish
|
||||||
|
|
||||||
|
Risks & mitigations:
|
||||||
|
- Third-party API rate limits — use queued workers and backoff.
|
||||||
|
- OAuth complexity on mobile — use PKCE and server-side token exchange patterns.
|
||||||
|
- Privacy/regulatory requirements — provide E2EE option and clear privacy policy.
|
||||||
|
|
||||||
|
Deliverables created in this commit:
|
||||||
|
- Minimal scaffold for backend and frontend
|
||||||
|
- `ROADMAP.md` (this file)
|
||||||
|
|
||||||
13
modern/backend/README.md
Normal file
13
modern/backend/README.md
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
Backend README
|
||||||
|
|
||||||
|
This is a minimal scaffold for the LifeRPG backend. It currently ships a tiny stdlib-based HTTP JSON endpoint for local development.
|
||||||
|
|
||||||
|
Next steps:
|
||||||
|
- Replace with FastAPI + Uvicorn for production.
|
||||||
|
- Add ORM (SQLAlchemy/Alembic) and migrations.
|
||||||
|
- Add OAuth2 and integration adapters.
|
||||||
|
|
||||||
|
Run (dev):
|
||||||
|
|
||||||
|
python server.py
|
||||||
|
|
||||||
8
modern/backend/requirements.txt
Normal file
8
modern/backend/requirements.txt
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
# Example dependencies for later
|
||||||
|
fastapi
|
||||||
|
uvicorn[standard]
|
||||||
|
sqlalchemy
|
||||||
|
alembic
|
||||||
|
psycopg2-binary
|
||||||
|
pydantic
|
||||||
|
redis
|
||||||
34
modern/backend/server.py
Normal file
34
modern/backend/server.py
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Minimal JSON HTTP server for the LifeRPG modern scaffold.
|
||||||
|
This intentionally uses only the Python stdlib so it's runnable without installing dependencies.
|
||||||
|
"""
|
||||||
|
from http.server import BaseHTTPRequestHandler, HTTPServer
|
||||||
|
import json
|
||||||
|
|
||||||
|
class Handler(BaseHTTPRequestHandler):
|
||||||
|
def _send_json(self, data, status=200):
|
||||||
|
payload = json.dumps(data).encode("utf-8")
|
||||||
|
self.send_response(status)
|
||||||
|
self.send_header("Content-Type", "application/json")
|
||||||
|
self.send_header("Content-Length", str(len(payload)))
|
||||||
|
self.end_headers()
|
||||||
|
self.wfile.write(payload)
|
||||||
|
|
||||||
|
def do_GET(self):
|
||||||
|
if self.path == "/health":
|
||||||
|
self._send_json({"status": "ok"})
|
||||||
|
return
|
||||||
|
if self.path == "/api/v1/hello":
|
||||||
|
self._send_json({"message": "Hello from LifeRPG modern backend"})
|
||||||
|
return
|
||||||
|
self._send_json({"error": "not_found"}, status=404)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
server = HTTPServer(("0.0.0.0", 8000), Handler)
|
||||||
|
print("LifeRPG backend listening on http://0.0.0.0:8000")
|
||||||
|
try:
|
||||||
|
server.serve_forever()
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
server.shutdown()
|
||||||
|
|
||||||
8
modern/docker-compose.yml
Normal file
8
modern/docker-compose.yml
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
version: '3.8'
|
||||||
|
services:
|
||||||
|
backend:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile.backend
|
||||||
|
ports:
|
||||||
|
- "8000:8000"
|
||||||
7
modern/frontend/README.md
Normal file
7
modern/frontend/README.md
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
Frontend README
|
||||||
|
|
||||||
|
This folder contains a minimal React + Vite app scaffold with PWA manifest and a small Service Worker.
|
||||||
|
|
||||||
|
Next steps:
|
||||||
|
- Run `npm install` then `npm run dev` to start local dev server.
|
||||||
|
- Replace placeholder UI with real components and integrate with backend.
|
||||||
12
modern/frontend/index.html
Normal file
12
modern/frontend/index.html
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>LifeRPG Modern</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="root"></div>
|
||||||
|
<script type="module" src="/src/main.jsx"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
9
modern/frontend/manifest.json
Normal file
9
modern/frontend/manifest.json
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"name": "LifeRPG Modern",
|
||||||
|
"short_name": "LifeRPG",
|
||||||
|
"start_url": "/",
|
||||||
|
"display": "standalone",
|
||||||
|
"background_color": "#ffffff",
|
||||||
|
"description": "A modern, cross-platform habit-leveling app.",
|
||||||
|
"icons": []
|
||||||
|
}
|
||||||
17
modern/frontend/package.json
Normal file
17
modern/frontend/package.json
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
{
|
||||||
|
"name": "liferpg-modern-frontend",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"dev": "vite",
|
||||||
|
"build": "vite build",
|
||||||
|
"preview": "vite preview"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"react": "^18.0.0",
|
||||||
|
"react-dom": "^18.0.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"vite": "^5.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
10
modern/frontend/src/App.jsx
Normal file
10
modern/frontend/src/App.jsx
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
import React from 'react'
|
||||||
|
|
||||||
|
export default function App(){
|
||||||
|
return (
|
||||||
|
<div style={{padding:20,fontFamily:'system-ui, sans-serif'}}>
|
||||||
|
<h1>LifeRPG Modern</h1>
|
||||||
|
<p>Welcome — frontend scaffold. Connect to backend at <code>/api/v1</code>.</p>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
9
modern/frontend/src/main.jsx
Normal file
9
modern/frontend/src/main.jsx
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
import React from 'react'
|
||||||
|
import { createRoot } from 'react-dom/client'
|
||||||
|
import App from './App'
|
||||||
|
|
||||||
|
createRoot(document.getElementById('root')).render(
|
||||||
|
<React.StrictMode>
|
||||||
|
<App />
|
||||||
|
</React.StrictMode>
|
||||||
|
)
|
||||||
12
modern/frontend/sw.js
Normal file
12
modern/frontend/sw.js
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
// Minimal service worker (cache-first for shell)
|
||||||
|
const CACHE = 'liferpg-shell-v1'
|
||||||
|
self.addEventListener('install', (e) => {
|
||||||
|
e.waitUntil(
|
||||||
|
caches.open(CACHE).then((cache) => cache.addAll(['/','/index.html']))
|
||||||
|
)
|
||||||
|
})
|
||||||
|
self.addEventListener('fetch', (e) => {
|
||||||
|
e.respondWith(
|
||||||
|
caches.match(e.request).then((r) => r || fetch(e.request))
|
||||||
|
)
|
||||||
|
})
|
||||||
Loading…
Reference in New Issue
Block a user