first commit
Made-with: Cursor
This commit is contained in:
267
context/Frontend_overview.md
Normal file
267
context/Frontend_overview.md
Normal file
@@ -0,0 +1,267 @@
|
||||
# frontend_overview.md
|
||||
|
||||
## 1. Purpose
|
||||
|
||||
This document defines the complete frontend architecture, user experience, and interaction model for the Sats Faucet application.
|
||||
|
||||
The frontend must:
|
||||
|
||||
* Provide a simple, clean, and trustworthy interface.
|
||||
* Integrate Nostr login (NIP-07 or external signer).
|
||||
* Guide users through eligibility check and claim confirmation.
|
||||
* Display transparent faucet statistics and funding information.
|
||||
* Clearly communicate rules, cooldowns, and denial reasons.
|
||||
|
||||
The frontend must never expose secrets or LNbits keys.
|
||||
|
||||
---
|
||||
|
||||
## 2. Tech Stack Requirements
|
||||
|
||||
Recommended:
|
||||
|
||||
* Framework: React (Next.js preferred) or similar SPA framework
|
||||
* Styling: TailwindCSS or clean minimal CSS system
|
||||
* QR generation library for Lightning deposit QR
|
||||
* Nostr integration via NIP-07 browser extension (window.nostr)
|
||||
|
||||
Frontend must be deployable as static site or server-rendered app.
|
||||
|
||||
---
|
||||
|
||||
## 3. Global App Structure
|
||||
|
||||
### 3.1 Pages
|
||||
|
||||
1. Home Page (/)
|
||||
2. Claim Modal or Claim Section
|
||||
3. Transparency / Stats Section
|
||||
4. Deposit Section
|
||||
5. Optional: About / Rules page
|
||||
|
||||
Navigation should be minimal and focused.
|
||||
|
||||
---
|
||||
|
||||
## 4. Nostr Authentication
|
||||
|
||||
### 4.1 Connect Flow
|
||||
|
||||
* User clicks "Connect Nostr".
|
||||
* Frontend requests pubkey via NIP-07.
|
||||
* Pubkey stored in memory (not localStorage unless necessary).
|
||||
* Show truncated pubkey (npub format preferred).
|
||||
|
||||
### 4.2 NIP-98 Signing
|
||||
|
||||
For protected API calls:
|
||||
|
||||
* Build request payload (method + URL + timestamp + nonce).
|
||||
* Request signature via NIP-07.
|
||||
* Attach NIP-98 header to backend request.
|
||||
|
||||
Frontend must:
|
||||
|
||||
* Generate secure nonce.
|
||||
* Handle signature errors gracefully.
|
||||
|
||||
---
|
||||
|
||||
## 5. Home Page Layout
|
||||
|
||||
### 5.1 Hero Section
|
||||
|
||||
* Title: Sats Faucet
|
||||
* Short description of rules
|
||||
* Claim button
|
||||
|
||||
### 5.2 Live Stats Section
|
||||
|
||||
Display:
|
||||
|
||||
* Current pool balance
|
||||
* Total sats paid
|
||||
* Total claims
|
||||
* Claims in last 24h
|
||||
* Daily budget progress bar
|
||||
|
||||
Stats pulled from GET /stats.
|
||||
|
||||
Must auto-refresh every 30–60 seconds.
|
||||
|
||||
---
|
||||
|
||||
## 6. Claim Flow UI
|
||||
|
||||
### 6.1 Step 1: Connect
|
||||
|
||||
If not connected:
|
||||
|
||||
* Disable claim button.
|
||||
* Prompt user to connect Nostr.
|
||||
|
||||
### 6.2 Step 2: Enter Lightning Address
|
||||
|
||||
Input field:
|
||||
|
||||
* Validate basic format (user@domain).
|
||||
* Do not over-validate client-side.
|
||||
|
||||
### 6.3 Step 3: Quote
|
||||
|
||||
On "Check Eligibility":
|
||||
|
||||
* Send POST /claim/quote with NIP-98.
|
||||
|
||||
Possible responses:
|
||||
|
||||
Eligible:
|
||||
|
||||
* Show payout amount.
|
||||
* Show Confirm button.
|
||||
|
||||
Not eligible:
|
||||
|
||||
* Show clear message from backend.
|
||||
* If cooldown, show next eligible date.
|
||||
* If account too new, show required age.
|
||||
|
||||
### 6.4 Step 4: Confirm
|
||||
|
||||
On confirm:
|
||||
|
||||
* Call POST /claim/confirm.
|
||||
* Show loading state.
|
||||
* On success:
|
||||
|
||||
* Show payout amount.
|
||||
* Show next eligible time.
|
||||
* On failure:
|
||||
|
||||
* Show clear error.
|
||||
|
||||
Must prevent double-click submission.
|
||||
|
||||
---
|
||||
|
||||
## 7. Deposit Section
|
||||
|
||||
Display:
|
||||
|
||||
* Lightning Address (copyable).
|
||||
* QR code of LNURL.
|
||||
* Optional: "Create invoice" button.
|
||||
|
||||
Copy buttons required for:
|
||||
|
||||
* Lightning address
|
||||
* LNURL
|
||||
|
||||
Deposit section must feel transparent and trustworthy.
|
||||
|
||||
---
|
||||
|
||||
## 8. Transparency Section
|
||||
|
||||
Display:
|
||||
|
||||
* Recent payouts (anonymized pubkey prefix).
|
||||
* Payout amount.
|
||||
* Timestamp.
|
||||
|
||||
Optional:
|
||||
|
||||
* Distribution breakdown (small/medium/large payouts).
|
||||
|
||||
---
|
||||
|
||||
## 9. Error Handling UX
|
||||
|
||||
Frontend must handle:
|
||||
|
||||
* Network failures.
|
||||
* Signature rejection.
|
||||
* Expired quote.
|
||||
* Payout failure.
|
||||
|
||||
All errors must be displayed in a clean alert component.
|
||||
|
||||
Do not expose internal error stack traces.
|
||||
|
||||
---
|
||||
|
||||
## 10. State Management
|
||||
|
||||
Minimal state required:
|
||||
|
||||
* pubkey
|
||||
* lightning_address
|
||||
* eligibility result
|
||||
* quote_id
|
||||
* payout_sats
|
||||
* next_eligible_at
|
||||
|
||||
Use React state or lightweight state manager.
|
||||
|
||||
No need for complex global store.
|
||||
|
||||
---
|
||||
|
||||
## 11. Security Requirements
|
||||
|
||||
Frontend must:
|
||||
|
||||
* Never store secrets.
|
||||
* Never expose LNbits keys.
|
||||
* Never trust client-side eligibility logic.
|
||||
* Rely entirely on backend for final validation.
|
||||
|
||||
If Turnstile or CAPTCHA enabled:
|
||||
|
||||
* Include widget only when backend indicates required.
|
||||
|
||||
---
|
||||
|
||||
## 12. Design Principles
|
||||
|
||||
* Minimal, modern UI.
|
||||
* Clear visual feedback.
|
||||
* No clutter.
|
||||
* Show transparency clearly.
|
||||
* Make it feel fair and legitimate.
|
||||
|
||||
Recommended style:
|
||||
|
||||
* Dark mode default.
|
||||
* Bitcoin-inspired accent color.
|
||||
* Clean typography.
|
||||
|
||||
---
|
||||
|
||||
## 13. Performance Requirements
|
||||
|
||||
* Fast initial load.
|
||||
* Avoid blocking Nostr relay calls on frontend.
|
||||
* All relay interaction handled by backend.
|
||||
|
||||
---
|
||||
|
||||
## 14. Accessibility
|
||||
|
||||
* Buttons must have disabled states.
|
||||
* Inputs labeled clearly.
|
||||
* QR accessible with copy option.
|
||||
|
||||
---
|
||||
|
||||
## 15. Completion Criteria
|
||||
|
||||
Frontend is complete when:
|
||||
|
||||
* User can connect via NIP-07.
|
||||
* Eligibility check works and displays correct messages.
|
||||
* Confirm claim triggers payout.
|
||||
* Deposit Lightning address and QR visible.
|
||||
* Live stats update correctly.
|
||||
* Cooldown and denial reasons clearly displayed.
|
||||
* No sensitive data exposed in frontend code.
|
||||
Reference in New Issue
Block a user