Files
view/frontend
0xcathiefish 619391f87a Add build.sh for Cloudflare Pages env-based config injection
- Add build.sh that generates auth-config.js from environment variables
  (API_BASE_URL, GOOGLE_CLIENT_ID, ALLOWED_EMAILS) at build time
- Move email whitelist from hardcoded login.html to window.ALLOWED_EMAILS
  in auth-config.js, so it can be configured via env vars
- Reset auth-config.js to placeholder defaults in repo
- Update README.md and README_CN.md deployment docs for both options

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 15:47:52 +00:00
..
2026-02-12 08:11:37 +00:00
2026-02-12 08:11:37 +00:00
2026-02-12 08:11:37 +00:00
2026-02-12 08:11:37 +00:00
2026-02-12 08:11:37 +00:00
2026-02-12 08:11:37 +00:00
2026-02-12 08:11:37 +00:00
2026-02-12 08:11:37 +00:00
2026-02-12 08:11:37 +00:00
2026-02-12 08:11:37 +00:00
2026-02-12 08:11:37 +00:00
2026-02-12 08:11:37 +00:00

📈 View Charting Frontend

A self-hosted View Charting Library frontend for Binance USDS-M Futures. Features real-time WebSocket streaming, multi-chart layouts, persistent drawing canvases, and a watchlist sidebar — all protected behind Google OAuth.

Features

  • View Charting Library v29.4 — Professional-grade charting with full indicator and drawing tool support
  • Real-time Data — Live candle updates via WebSocket from the backend API
  • Multi-chart Layouts — Single, vertical split, horizontal split, and 1-left / 2-right layouts with resizable dividers
  • Watchlist Sidebar — Drag-and-drop reordering, live price & change tracking, multiple custom lists
  • Canvas Persistence — Save/load named drawing canvases per symbol, with auto-save every 5 minutes
  • Dark & Light Theme — Full theme support synced with View widget
  • Google OAuth Protection — Access restricted to authorized Google accounts with 144-hour session persistence
  • Responsive Login Page — Adaptive background images for mobile / tablet / desktop
  • Docker Ready — Nginx-based container, single-file deployment

📁 Project Structure

├── index.html          # Main application (View widget + watchlist + layouts)
├── login.html          # Standalone login page with Google Sign-In
├── auth.js             # AuthGuard class — session management & login UI
├── auth-config.js      # Google OAuth Client ID & API base URL configuration
├── .env.example        # Environment variable template
├── Dockerfile          # Nginx Alpine container
├── docker-compose.yml  # Docker Compose service definition
├── serve.py            # Python dev server with CORS support
├── package.json        # Charting Library package metadata (v29.4.0)
├── charting_library/   # View Charting Library assets
└── datafeeds/          # View UDF datafeed adapter

🚀 Quick Start

Prerequisites

Environment Setup

cp .env.example .env
# Edit .env with your backend API URL

.env.example:

API_BASE_URL=https://api.yourdomain.com

Configuration

Edit auth-config.js to set your API base URL and Google OAuth Client ID:

window.API_CONFIG = { baseUrl: 'https://api.yourdomain.com' };

const AUTH_CONFIG = {
    clientId: 'YOUR_GOOGLE_CLIENT_ID.apps.googleusercontent.com',
    onSuccess: (user) => { /* ... */ },
    onError: (error) => { /* ... */ }
};

Development

# Using Python dev server (with CORS headers)
python3 serve.py
# → http://localhost:8080

# Or any static file server
npx serve .

Docker

# Build image
docker build -t frontend .

# Using docker-compose (connects to existing `cycle` network)
docker compose up -d

🔐 Authentication Flow

login.html                        index.html
    │                                  │
    ├─ Google Sign-In ──────┐          │
    │                       ▼          │
    │              JWT validation      │
    │              + email whitelist   │
    │                                  │
    │              localStorage ───────┤
    │              (auth_user,         │
    │               auth_token,        │
    │               auth_login_time)   │
    │                                  │
    │              redirect ───────────▶ Session check (144h max)           │
    │                                  │
    │                                  ├─ Valid → Load app                   │
    │                                  └─ Expired → Redirect to login.html

Email Whitelist

Access is restricted at the client level via an email whitelist in login.html. Only emails in the allowedEmails array can log in — all others receive an "Access denied" error:

const allowedEmails = ['your-email@gmail.com'];

Important

Update this whitelist with your authorized email addresses before deploying. This is a client-side check; for production use, combine with GCP Console's OAuth test user list for server-side enforcement.

🖥️ Multi-Chart Layouts

Layout Description
Single One full-screen chart
Vertical Two charts stacked vertically
Horizontal Two charts side by side
1L + 2R One large chart on left, two stacked on right

All dividers are draggable for custom sizing.

📦 Dependencies

Dependency Purpose
View Charting Library v29.4 Charting engine
Google Identity Services OAuth authentication
Nginx Alpine Production static file serving

📜 License

MIT

Generated By Claude Opus 4.6