Snell Panel is a comprehensive management system for Snell proxy nodes that provides unified node management and automatic subscription link generation. The system consists of a backend API server and multiple frontend interfaces (Web UI and iOS App) for seamless node administration.
Key Components:
- Backend Server: RESTful API server that manages nodes and generates subscription links
- Web UI: Browser-based management interface accessible at snell-panel.owo.nz
- iOS App: Native mobile application available through TestFlight for enhanced mobile experience
- Multi-node Support: Unified management of multiple Snell proxy nodes
- Node Operations: Add, delete, and modify node configurations
- Node Renaming: Customize node names for better organization
- Relay Nodes: Support for adding sub-nodes (relay/transit nodes) for advanced routing
- Real-time Monitoring: Track node status and performance
- Automatic Generation: Generate subscription links compatible with Surge and other proxy clients
- Dynamic Updates: Subscription links automatically reflect node changes
- Multiple Formats: Support for various subscription formats
- RESTful API: Complete API endpoints for programmatic node management
- Cross-platform: API serves both Web UI and iOS App with consistent functionality
- Secure Access: Token-based authentication for API security
- Web UI: Feature-rich browser interface for desktop management
- iOS App: Native mobile app with optimized touch interface
- Responsive Design: Consistent experience across all devices
-
Configure environment variables
Create a
.envfile or set environment variables:export API_TOKEN=your_token_here export DATABASE_URL=your_database_url_here # e.g., postgres://user:pass@host:port/dbname export PORT=8080 # Optional, defaults to 8080
-
Start the Snell Panel server
./snell-panel
-
Configure the compose.yaml file
Edit the
compose.yamlfile and update the environment variables:environment: - API_TOKEN=your_token_here - DATABASE_URL=your_database_url_here
-
Start the service
docker-compose up -d
The service will be available on port 9997.
-
Build the Docker image
docker build -t snell-panel . -
Run the container
docker run -d \ --name snell-panel \ -p 8080:8080 \ -e API_TOKEN=your_token_here \ -e DATABASE_URL=your_database_url_here \ snell-panel
-
Set up Supabase Database
- Go to supabase.com and create a new project
- Navigate to Settings > Database and copy the connection string
- The connection string format should be:
postgresql://postgres:[YOUR-PASSWORD]@[YOUR-HOST]:[YOUR-PORT]/postgres
Detailed Steps:
- Create a Supabase account and new project
- Go to Project Settings β Database
- Under "Connection string", select "URI"
- Copy the connection string (it will look like
postgresql://postgres:[YOUR-PASSWORD]@db.xxxxx.supabase.co:5432/postgres) - Replace
[YOUR-PASSWORD]with your actual database password
-
Deploy to Vercel
Click the button below to deploy directly to Vercel:
Or manually deploy:
# Clone the repository git clone https://github.com/missuo/snell-panel.git cd snell-panel # Install Vercel CLI npm i -g vercel # Deploy to Vercel vercel --prod
-
Configure Environment Variables in Vercel
In your Vercel dashboard, go to your project settings and add the following environment variables:
API_TOKEN=your_token_here DATABASE_URL=your_supabase_database_urlExample Supabase DATABASE_URL:
postgresql://postgres:your_password@db.abcdefghijklmnop.supabase.co:5432/postgres -
Access your deployment
Your Snell Panel will be available at
https://your-project-name.vercel.appAdvantages of Vercel Deployment:
- Serverless architecture with automatic scaling
- Global edge network for faster response times
- Automatic HTTPS and custom domain support
- Zero server maintenance required
- Free tier available for personal projects
Use the following command to install Snell Server:
bash <(curl -Ls https://ssa.sx/sn) install your_panel_url your_token custom_node_nameUse the following command to uninstall Snell Server:
bash <(curl -Ls https://ssa.sx/sn) uninstall your_panel_url your_token custom_node_namecustom_node_name is optional. If your node name contains spaces, please use quotes. For example:
bash <(curl -Ls https://ssa.sx/sn) install your_panel_url your_token "My Node Name"Use the following command to update Snell Server:
bash <(curl -Ls https://ssa.sx/sn) updateAccess the management Web UI using the following link:
Web UI Features:
- Dashboard: Overview of all managed nodes and their status
- Node Management: Add, delete, and configure Snell proxy nodes
- Node Customization: Rename nodes for better organization and identification
- Relay Configuration: Set up sub-nodes (relay/transit nodes) for advanced routing scenarios
- Subscription Links: Generate and copy subscription URLs for various proxy clients
- Real-time Updates: Live status monitoring and configuration changes
You can get the subscription link from the Web UI.
You can also use the iOS App instead of the WebUI for a better mobile experience. Since the app is not yet available on the App Store, you must use TestFlight to install it:
TestFlight Beta Download: https://testflight.apple.com/join/wKvw64P6
iOS App Features:
- Native Interface: Optimized touch interface for iOS devices
- Full Functionality: Complete node management capabilities matching the Web UI
- Node Operations: Add, delete, rename, and configure nodes on-the-go
- Relay Management: Configure sub-nodes and routing policies
- Subscription Sharing: Easy copy and share subscription links
- Offline Access: View node configurations even when offline
Installation Notes:
- The TestFlight beta may have limited slots available
- You need to install TestFlight first on your iOS device
- The iOS app provides the same functionality as the web interface with native mobile optimization
Snell Panel provides a comprehensive RESTful API for programmatic node management and integration.
Base URL: https://your-panel-domain.com
Authentication: All API requests require a token query parameter:
GET /entries?token=your_api_token_here
GET /
Returns a welcome message with basic API information.
Response:
{
"status": "success",
"message": "Welcome to Snell Panel. Please use the API to manage the entries.\n https://github.com/missuo/snell-panel"
}POST /entry?token=your_token
Request Body:
{
"ip": "example.com",
"port": 443,
"psk": "your_psk_here",
"node_name": "Custom Node Name",
"version": "4"
}Response:
{
"status": "success",
"message": "Entry created successfully",
"data": {
"id": 1,
"ip": "example.com",
"port": 443,
"psk": "your_psk_here",
"country_code": "US",
"isp": "Example ISP",
"asn": 12345,
"node_id": "uuid-generated-string",
"node_name": "Custom Node Name",
"version": "4"
}
}GET /entries?token=your_token
Response:
{
"status": "success",
"message": "Entries retrieved successfully",
"data": [
{
"id": 1,
"ip": "example.com",
"port": 443,
"psk": "your_psk_here",
"country_code": "US",
"isp": "Example ISP",
"asn": 12345,
"node_id": "uuid-string",
"node_name": "Custom Node Name",
"version": "4"
}
]
}DELETE /entry/:ip?token=your_token
Example: DELETE /entry/192.168.1.1?token=your_token
Response:
{
"status": "success",
"message": "Entry deleted successfully"
}DELETE /entry/node/:node_id?token=your_token
Example: DELETE /entry/node/uuid-string?token=your_token
Response:
{
"status": "success",
"message": "Entry deleted successfully"
}GET /subscribe?token=your_token
Response: Plain text subscription content compatible with Surge:
πΊπΈ Custom Node Name = snell, example.com, 443, psk = your_psk_here, version = 4
π―π΅ JP Node = snell, jp.example.com, 443, psk = another_psk, version = 4
PUT /modify/:node_id?token=your_token
Request Body:
{
"node_name": "New Node Name",
"ip": "new.example.com"
}Response:
{
"status": "success",
"message": "Node updated successfully"
}{
"id": 1,
"ip": "string",
"port": 443,
"psk": "string",
"country_code": "string",
"isp": "string",
"asn": 12345,
"node_id": "string",
"node_name": "string",
"version": "string"
}{
"status": "success|error|warning",
"message": "string",
"data": "object|array (optional)"
}- The
node_idis automatically generated when creating entries - IP addresses can be domains or direct IPs - geolocation info is automatically resolved
- Default version is "4" if not specified
- All authenticated endpoints return 401 if token is invalid
- 404 responses are returned for non-existent resources
- Backend API Server: RESTful API with authentication
- Web UI: Full-featured browser interface
- iOS App: Native mobile application
- Node Management: Add, delete, rename, and configure nodes
- Relay Nodes: Support for sub-nodes and transit routing
- Subscription Generation: Automatic link generation and updates
- Node Health Monitoring: Real-time health checks and alerts
- Advanced Analytics: Usage statistics and performance metrics
- Android App: Native Android application
- Multi-user Support: User accounts and permission management
The Snell Panel project consists of multiple components:
- Backend API Server: Open source (this repository) - Go-based RESTful API server
- Web UI Frontend: Closed source - Browser-based management interface
- iOS App: Closed source - Native iOS application
We are currently not considering open-sourcing the frontend code (Web UI and iOS App) at this time. The backend API server remains fully open source and provides complete programmatic access to all functionality.
We welcome contributions to the Snell Panel backend server! Here's how you can help:
Prerequisites:
- Go 1.24+ installed
- PostgreSQL database (local or remote)
- Git
Local Development:
-
Clone the repository
git clone https://github.com/missuo/snell-panel.git cd snell-panel -
Set up environment
cp .env.example .env # Edit .env with your configuration -
Install dependencies
go mod tidy
-
Run in development mode
go run .
go mod tidy
go test ./...For local platform:
go mod tidy
go build .Cross-platform builds:
# Linux
GOOS=linux GOARCH=amd64 go build -o snell-panel-linux .
# macOS
GOOS=darwin GOARCH=amd64 go build -o snell-panel-macos .
# Windows
GOOS=windows GOARCH=amd64 go build -o snell-panel-windows.exe .- Fork the repository and create a feature branch
- Write clear commit messages
- Add tests for new functionality
- Ensure all tests pass before submitting
- Update documentation as needed
- Submit a pull request with a clear description
This project is licensed under GPL-3.0.