A responsive, real-time web application for verifying 12-word recovery phrases (like crypto wallet phrases) with live public submission tracking.
✅ 12 Word Verification
- Input boxes for all 12 words with order validation
- Real-time visual feedback (✅ green for correct, ❌ red for wrong)
- Case-insensitive word matching with automatic trimming
✅ Discord Username Required
- Validates Discord username format (username#1234)
- Required for submissions
✅ Live Submission Ledger
- View all verified submissions in real-time
- Shows username, timestamp, and verified status
- Auto-updates every 5 seconds
✅ Modern UI/UX
- Fully responsive design (mobile, tablet, desktop)
- Dark mode toggle
- Smooth animations and transitions
- Accessibility-friendly
The 12 words that need to be verified (in order):
steel, hamster, casual, nose, raise, right, various, cherry, trick, purse, bag, session
- Frontend: HTML5, CSS3, JavaScript (vanilla)
- Backend: Firebase Realtime Database
- Hosting: Firebase Hosting (recommended)
- Go to Firebase Console
- Click "Add Project"
- Enter a project name (e.g., "12-word-verifier")
- Click "Create project"
- Wait for project to initialize
- In Firebase Console, go to Build → Realtime Database
- Click "Create Database"
- Choose your region (closest to your users)
- Start in Test Mode initially:
{ "rules": { "submissions": { ".read": true, ".write": true, ".validate": true } } } - Click "Enable"
- In Firebase Console, go to Project Settings (gear icon)
- Under Your apps, click Web icon
- Copy the Firebase config:
const firebaseConfig = { apiKey: "AIza...", authDomain: "your-project.firebaseapp.com", projectId: "your-project", storageBucket: "your-project.appspot.com", messagingSenderId: "123456...", appId: "1:123456...:web:abcdef..." };
Replace the placeholder values in config.js with your actual Firebase config:
const firebaseConfig = {
apiKey: "YOUR_API_KEY",
authDomain: "YOUR_AUTH_DOMAIN",
projectId: "YOUR_PROJECT_ID",
storageBucket: "YOUR_STORAGE_BUCKET",
messagingSenderId: "YOUR_MESSAGING_SENDER_ID",
appId: "YOUR_APP_ID"
};- Open
index.htmlin your browser (or use a local server)# Using Python 3 python -m http.server 8000 # Using Node.js (http-server) npx http-server
- Navigate to
http://localhost:8000 - Test the form with the correct phrase
-
Install Firebase CLI:
npm install -g firebase-tools
-
Initialize Firebase:
firebase login firebase init hosting
- Choose your project
- Set public directory to current folder (or
.) - Don't overwrite
index.html - Skip automatic building
-
Deploy:
firebase deploy
Your site will be available at:
https://your-project.web.app
- Create a GitHub repository
- Push all files to the repository
- Go to Settings → Pages
- Set source to
mainbranch - Your site will be available at
https://username.github.io/repository-name
- Create a Netlify account
- Drag and drop the folder to deploy
- Or connect your GitHub repository for automatic deployments
Since this is just HTML/CSS/JS, it can be deployed on:
- Vercel
- Cloudflare Pages
- AWS S3 + CloudFront
- Azure Static Web Apps
- Any traditional web hosting
For production, update your Firebase Realtime Database rules to be more restrictive:
{
"rules": {
"submissions": {
".read": true,
".write": "auth != null",
".validate": true,
"$id": {
".validate": "newData.hasChildren(['discord', 'phrase', 'timestamp', 'verified'])"
}
}
}
}Or implement rate limiting using Firebase Cloud Functions.
- Validate on the backend (use Firebase Cloud Functions)
- Rate limiting - Prevent spam submissions
- Authentication - Consider requiring user login
- Data sanitization - The app already escapes HTML to prevent XSS
index.html- Main HTML structurestyles.css- All styling (responsive + dark mode)app.js- Application logic and validationconfig.js- Firebase configuration (update with your credentials)README.md- This file
Edit the CORRECT_PHRASE array in app.js:
const CORRECT_PHRASE = [
'word1', 'word2', 'word3', ... 'word12'
];The app stores submissions with this structure:
submissions/
├─ submission_id_1/
│ ├─ discord: "username#1234"
│ ├─ phrase: "steel hamster casual..."
│ ├─ timestamp: "2024-02-11T..."
│ └─ verified: true
└─ submission_id_2/
└─ ...
Edit the CSS variables at the top of styles.css:
:root {
--primary-color: #3b82f6;
--success-color: #10b981;
--error-color: #ef4444;
/* ... more colors ... */
}- Chrome/Edge 90+
- Firefox 88+
- Safari 14+
- Mobile browsers (iOS Safari, Chrome Mobile)
- Lightweight (no build step required)
- Database queries optimized with
limitToLast(50) - Lazy-loaded animations
- Responsive images and adaptive layouts
- Check that config.js has valid Firebase credentials
- Ensure Realtime Database is created in Firebase Console
- Check browser console for errors (F12)
- Verify database rules allow
.read: true - Check Firebase Console → Database to see data structure
- Clear browser cache and reload
- Check that localStorage is enabled in browser
- Clear site data and reload
MIT - Feel free to modify and use as needed
For issues:
- Check the browser console (F12)
- Verify Firebase credentials in config.js
- Ensure database rules are set correctly
- Check Firebase Dashboard for error logs