A simple, privacy-focused analytics dashboard for tracking visits across your websites.
- 📊 Real-time visitor tracking across multiple sites
- 🌙 Dark/light theme support
- 📈 Beautiful charts showing visits by day, hour, and trends over time
- 🔒 Privacy-first: minimal tracking, no cookies, session-based deduplication
- ⚡ Optimized tracking snippet with cooldown and visibility checks
- 🚀 Serverless deployment on Vercel with MongoDB Atlas
- Fork/Clone this repo
- Create MongoDB Atlas database (free tier works great)
- Import to Vercel
- Add environment variables in Vercel dashboard:
VISTERIA_API_KEY- Your secret API key for dashboard accessVITE_TRACKING_API_KEY- Same as above (for frontend)
VISTERIA_TRACKING_ALLOWED_HOSTS- Comma-separated host allowlist for tracking (e.g.mysite.com,www.mysite.com)VISTERIA_TRACKING_SITE_HOSTS_JSON- Optional strict per-site host mapping (e.g.{"portfolio":["nixsh.dev","www.nixsh.dev"]})VISTERIA_TRACKING_ALLOWED_SITE_IDS- Optional comma-separated site IDs allowed to send tracking eventsMONGODB_URI- MongoDB Atlas connection stringMONGODB_DB_NAME- Database name (default:visteria)MONGODB_VISITS_COLLECTION- Collection name (default:visits)
- Deploy! 🎉
# Install dependencies
npm install
# Set up environment variables
cp .env.example .env
# Edit .env and add your MongoDB URI and API key
# Start dev server
npm run devVisit http://localhost:5173 to see your dashboard.
- Go to Settings in your Visteria dashboard
- Enter your Site ID (e.g.,
my-portfolio) and Site URL - Copy the generated tracking snippet
- Paste it in the
<head>of your website - Deploy and watch your visits roll in! 📈
<script>
(function() {
const SITE_ID = 'your-site-id';
const SITE_URL = 'https://yoursite.com';
const API_URL = 'https://visteria.vercel.app/api/visits/track';
const COOLDOWN_MS = 2000;
const lastTracked = sessionStorage.getItem('visteria_last_' + SITE_ID);
const now = Date.now();
if (lastTracked && now - parseInt(lastTracked) < COOLDOWN_MS) return;
if (document.hidden) return;
sessionStorage.setItem('visteria_last_' + SITE_ID, now.toString());
navigator.sendBeacon(API_URL, JSON.stringify({
siteId: SITE_ID,
siteUrl: SITE_URL,
url: window.location.href,
referrer: document.referrer || '',
userAgent: navigator.userAgent,
visitedAt: new Date().toISOString()
}));
})();
</script>Track Visit
POST /api/visits/track
Content-Type: application/json
{
"siteId": "my-site",
"siteUrl": "https://mysite.com",
"url": "https://mysite.com/page",
"referrer": "https://google.com/",
"userAgent": "Mozilla/5.0...",
"visitedAt": "2026-02-21T10:00:00.000Z"
}
Tracking hardening:
- If no allowlist env vars are set, tracking stays open (backward compatible).
- If any allowlist var is set,
/api/visits/trackonly accepts events matching configuredsiteIdand host rules. - Recommended: use
VISTERIA_TRACKING_SITE_HOSTS_JSONto lock eachsiteIdto explicit domains.
Get Site Details
GET /api/sites/:siteId
Header: x-api-key: your-api-key
- Frontend: React 19 + Vite
- Styling: Tailwind CSS
- Icons: Lucide React
- Backend: Vercel Serverless Functions
- Database: MongoDB Atlas
- Deployment: Vercel
Visteria is designed with privacy and performance in mind:
- No cookies or persistent tracking
- Session-based deduplication (2-second cooldown)
- Skips tracking when tab is hidden
- Uses
sendBeaconfor reliable, non-blocking requests - Minimal data collection (URL, referrer, user agent, timestamp)
MIT
Made with ❤️ by @callmenixsh