Spaces:
Running
Running
title: AI Phone Leaderboard | |
emoji: π± | |
colorFrom: blue | |
colorTo: purple | |
sdk: streamlit | |
sdk_version: 1.41.0 | |
app_file: main.py | |
pinned: false | |
license: mit | |
short_description: AI Phone Leaderboard | |
# AI Phone Benchmark Leaderboard | |
A Streamlit dashboard for displaying and analyzing mobile device AI benchmark results. The dashboard fetches data from Firebase Firestore and provides interactive visualizations and filtering capabilities. | |
## Setup | |
### Prerequisites | |
- Python 3.10+ | |
- Firebase project with Firestore database | |
- Hugging Face account (for deployment) | |
### Local Development | |
1. Clone the repository: | |
```bash | |
git clone https://github.com/yourusername/ai-phone-leaderboard.git | |
cd ai-phone-leaderboard | |
``` | |
2. Create a virtual environment and install dependencies: | |
```bash | |
make venv | |
make setup-dev | |
``` | |
### Firebase Configuration | |
1. Create a Firebase Service Account: | |
- Go to Firebase Console β Project Settings β Service Accounts | |
- Create a new service account for the dashboard: | |
```bash | |
# Create service account | |
gcloud iam service-accounts create dashboard-firestore-reader \ | |
--description="Service account for reading Firestore data in the dashboard" \ | |
--display-name="Dashboard Firestore Reader" | |
``` | |
- Grant minimal required permissions: | |
```bash | |
# Grant Firestore read-only access | |
gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \ | |
--member="serviceAccount:dashboard-firestore-reader@YOUR_PROJECT_ID.iam.gserviceaccount.com" \ | |
--role="roles/datastore.viewer" | |
``` | |
- Generate and download the service account key: | |
- Click "Generate New Private Key" | |
- Save the JSON file (don't commit this to git) | |
2. For local development, create `.streamlit/secrets.toml`: | |
```toml | |
FIREBASE_CREDENTIALS = ''' | |
{ | |
"type": "service_account", | |
"project_id": "your-project-id", | |
"private_key_id": "your-private-key-id", | |
"private_key": "your-private-key", | |
"client_email": "your-client-email", | |
"client_id": "your-client-id", | |
"auth_uri": "https://accounts.google.com/o/oauth2/auth", | |
"token_uri": "https://oauth2.googleapis.com/token", | |
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", | |
"client_x509_cert_url": "your-client-cert-url", | |
"universe_domain": "googleapis.com" | |
} | |
''' | |
``` | |
3. Run the application: | |
```bash | |
make run | |
``` | |
## Deployment to Hugging Face Spaces | |
1. Create a new Space: | |
- Go to huggingface.co/spaces | |
- Click "Create new Space" | |
- Select "Streamlit" as the SDK | |
- Choose a name for your space | |
2. Add Firebase credentials to Spaces: | |
- Go to Space Settings β Repository Secrets | |
- Add a new secret named `FIREBASE_CREDENTIALS` | |
- Value should be your Firebase credentials as a minified JSON string (single line) | |
- Note: Convert the private key's newlines to `\n` in the JSON | |
Example of minified credentials for HF Spaces: | |
```json | |
{"type":"service_account","project_id":"your-project-id","private_key_id":"your-key-id","private_key":"-----BEGIN PRIVATE KEY-----\\nYour\\nPrivate\\nKey\\nHere\\n-----END PRIVATE KEY-----\\n","client_email":"your-email","client_id":"your-client-id","auth_uri":"https://accounts.google.com/o/oauth2/auth","token_uri":"https://oauth2.googleapis.com/token","auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs","client_x509_cert_url":"your-cert-url","universe_domain":"googleapis.com"} | |
``` | |
3. The application will automatically deploy when you push to the repository. | |
## Project Structure | |
``` | |
. | |
βββ .gitignore | |
βββ .streamlit/ | |
β βββ secrets.toml | |
βββ requirements/ | |
β βββ base.txt | |
β βββ dev.txt | |
β βββ prod.txt | |
βββ src/ | |
β βββ components/ | |
β β βββ filters.py | |
β β βββ header.py | |
β β βββ visualizations.py | |
β βββ core/ | |
β β βββ config.py | |
β βββ services/ | |
β βββ firebase.py | |
βββ main.py | |
βββ requirements.txt | |
``` | |
## Firebase Data Structure | |
The application expects the following Firestore collection structure: | |
``` | |
benchmarks/ | |
βββ v1/ | |
βββ submissions/ | |
βββ [benchmark_uuid]/ | |
βββ benchmarkResult: {...} | |
βββ deviceInfo: {...} | |
βββ metadata: {...} | |
``` | |
## Development | |
Available make commands: | |
```bash | |
make help # Show available commands | |
make setup-dev # Setup development environment | |
make setup-prod # Setup production environment | |
make run # Run Streamlit application | |
make lint # Run code linter | |
make format # Format code using black | |
make test # Run tests | |
make clean # Clean cache files | |
``` | |
## Security Considerations | |
1. Never commit sensitive credentials to git: | |
```gitignore | |
# Add to .gitignore | |
.streamlit/secrets.toml | |
*firebase*.json | |
``` | |
2. Use environment-specific secrets: | |
- Local: Use `.streamlit/secrets.toml` | |
- Production: Use HF Spaces secrets | |
3. Firebase Security: | |
- Create a dedicated service account with minimal permissions | |
- Only grant read access to the required Firestore collections | |
## Dependencies | |
Key dependencies are pinned to specific versions to ensure stability: | |
``` | |
firebase-admin==6.6.0 | |
streamlit>=1.28.0 | |
pandas>=2.1.3 | |
plotly>=5.18.0 | |
``` | |
## License | |
[MIT License](LICENSE) |