Install (customers)
Ordinary customers use the Windows portable build — no Python or Git. See the download page: unzip SnipeClub-windows-portable.zip and double-click FCTradingDesk.exe. Builds are unsigned until code signing is purchased.
Data is stored in %LOCALAPPDATA%\FCTradingDesk\data. The desk binds to 127.0.0.1 only.
Install (developers / from source)
Requires Python 3.11+.
py -3 -m pip install -e .
py -3 -m eafc
# then open http://127.0.0.1:8765
Do not expose the local server to the internet without an authenticated reverse proxy.
Using the desk
- Data centre: import CSV price observations. A synthetic demo dataset is available and is labelled
SYNTHETIC_DEMO_DO_NOT_USE_AS_REAL. - Opportunities: ranks cards by discount to fair value and liquidity from the data you imported.
- Paper trading: 20 portfolios, each starting at zero. Add simulated capital yourself.
- Research lab and System health: strategy analysis and event log.
EA account journal
Account slots hold a nickname and a status that you assert (CREATED, WEB_READY, MARKET_UNLOCKED, RESTRICTED). Balances and completed trades are user-reported and are never treated as verified by EA. The journal does not touch paper balances.
Optional browser bridge (experimental)
You must sign in to EA yourself in your own browser; the desk never sees your EA credentials. Activity reported by the browser worker is stored as unverified.
Accounts, entitlements and billing (back end)
The eafc.commerce Python package provides the SaaS plumbing. It is implemented and tested, but no public service is deployed.
| Module | Purpose |
|---|---|
auth | Registration, login, 30-day sessions, password reset, email verification, deletion requests. Passwords are PBKDF2-HMAC-SHA256 hashed; tokens are stored only as hashes. |
entitlements | Server-side access check: status active or trialing and not past expires_at. |
billing | Stripe-compatible checkout, idempotent webhooks, cancellation, refunds. Sandbox by default; live keys are refused unless explicitly approved. |
support | Tickets. Customers only see their own; admins see all. |
admin | Founder metrics (customers, MRR from stored payment amounts, failed payments, cancellations, tickets, app versions). Requires the admin flag. |
Configuration
| Variable | Meaning |
|---|---|
EAFC_DATA_DIR | Where the SQLite database lives. |
EAFC_PRICE_MONTHLY_CENTS / EAFC_PRICE_SEASONAL_CENTS | Example prices in minor units (defaults 1999 / 4999). |
EAFC_SEASONAL_DAYS / EAFC_MONTHLY_DAYS | Length of a paid period (defaults 120 / 30). |
STRIPE_SECRET_KEY | Unset = mock sandbox. A test key uses Stripe test mode. A live key is blocked. |
STRIPE_WEBHOOK_SECRET | Required to accept webhooks whenever a Stripe key is set. |
EAFC_LIVE_PAYMENTS_APPROVED | Operator override that must stay unset until a processor has approved the business. |
Known limits
- Email delivery is not implemented; verification and reset tokens must be delivered by the operator.
- The static pages need a web endpoint for
/api/commerce/*to be wired to the Python modules. Until then the forms report that the service is not connected. - Terms and privacy text are drafts.
- Third-party market data has its own terms and accuracy limits.