refactor: add .copier-answers.yml at root + feature flags + .env.example

.copier-answers.yml (new, at repo root):
- Points to local template path (was GitLab remote)
- _commit: v0.19.0 (enables copier update)
- Reflects actual feature set: enable_cms, enable_daas, not directory/i18n/leads

web/src/beanflows/core.py:
- Added ENABLE_CMS/ENABLE_DAAS/ENABLE_DIRECTORY/ENABLE_LEADS/BUSINESS_MODEL
  to Config class (mirrors copier.yml questions for runtime feature gating)

.env.example (new, at repo root):
- Moved from web/.env.example; updated DUCKDB_PATH/SERVING_DUCKDB_PATH
  to root-relative paths (local.duckdb, analytics.duckdb)

.gitignore:
- Added web/src/beanflows/static/css/output.css (previously only in web/.gitignore)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Deeman
2026-02-27 10:25:28 +01:00
parent c4cb263f18
commit 3a8dd6ba00
4 changed files with 64 additions and 0 deletions

16
.copier-answers.yml Normal file
View File

@@ -0,0 +1,16 @@
# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY
_commit: v0.19.0
_src_path: /home/Deeman/Projects/quart_saas_boilerplate
author_email: hendrik@beanflows.coffee
author_name: Hendrik Deeman
base_url: https://beanflows.coffee
business_model: saas
description: Commodity analytics for coffee traders
enable_cms: true
enable_daas: true
enable_directory: false
enable_i18n: false
enable_leads: false
payment_provider: paddle
project_name: BeanFlows
project_slug: beanflows

38
.env.example Normal file
View File

@@ -0,0 +1,38 @@
# App
APP_NAME=BeanFlows
SECRET_KEY=change-me-generate-a-real-secret
BASE_URL=http://localhost:5001
DEBUG=true
ADMIN_EMAILS=admin@beanflows.coffee
# Database
DATABASE_PATH=data/app.db
# DUCKDB_PATH points to the full pipeline DB (lakehouse.duckdb) — used by SQLMesh and export_serving.
# SERVING_DUCKDB_PATH points to the serving-only export (analytics.duckdb) — used by the web app.
# Run `uv run materia pipeline run export_serving` after each SQLMesh transform to populate it.
DUCKDB_PATH=local.duckdb
SERVING_DUCKDB_PATH=analytics.duckdb
# Auth
MAGIC_LINK_EXPIRY_MINUTES=15
SESSION_LIFETIME_DAYS=30
# Email (Resend)
RESEND_API_KEY=
EMAIL_FROM=hello@example.com
# Paddle
PADDLE_API_KEY=
PADDLE_WEBHOOK_SECRET=
PADDLE_PRICE_STARTER=
PADDLE_PRICE_PRO=
# Rate limiting
RATE_LIMIT_REQUESTS=100
RATE_LIMIT_WINDOW=60
# Waitlist (set to true to enable waitlist gate on /auth/signup)
WAITLIST_MODE=false
RESEND_AUDIENCE_WAITLIST=

3
.gitignore vendored
View File

@@ -189,3 +189,6 @@ age-key.txt
.bedrock-state .bedrock-state
.bedrockapikey .bedrockapikey
toggle-bedrock.sh toggle-bedrock.sh
# Tailwind CSS (generated at build time)
web/src/beanflows/static/css/output.css

View File

@@ -31,6 +31,13 @@ load_dotenv(_repo_root / "web" / ".env", override=False)
class Config: class Config:
APP_NAME: str = os.getenv("APP_NAME", "BeanFlows") APP_NAME: str = os.getenv("APP_NAME", "BeanFlows")
SECRET_KEY: str = os.getenv("SECRET_KEY", "change-me-in-production") SECRET_KEY: str = os.getenv("SECRET_KEY", "change-me-in-production")
# Feature flags (set at template time via copier; mirror copier.yml questions)
ENABLE_CMS: bool = True
ENABLE_DAAS: bool = True
ENABLE_DIRECTORY: bool = False
ENABLE_LEADS: bool = False
BUSINESS_MODEL: str = "saas"
BASE_URL: str = os.getenv("BASE_URL", "http://localhost:5001") BASE_URL: str = os.getenv("BASE_URL", "http://localhost:5001")
DEBUG: bool = os.getenv("DEBUG", "false").lower() == "true" DEBUG: bool = os.getenv("DEBUG", "false").lower() == "true"