Skip to content
Sujeet. Back to portfolio

An open look behind the site

A little data.
A clearer picture.

How people find this portfolio, what they explore, and what gets a click. The same aggregate numbers I use to improve the site are here for everyone to see.

Read the privacy policy

01 / Open analytics

The site, in numbers.

Daily totals, including today. Repeat visits count again. These are activity counts, not unique people, and may include automated traffic. Reports may be cached for up to five minutes.

Usage data needs JavaScript and a connection to the analytics service.

Page views—Recorded page loads
Interactions—Project, CV, contact & other clicks
Active time—Estimated foreground activity
Time per page load—Active time ÷ measured page loads

Time is estimated while a page is visible and focused, pausing after 60 seconds without activity. It cannot confirm that someone is reading. Time per page load uses the active time and measured page loads received within this period; it is not a unique-visitor or session-duration metric.

Page views over time

Daily · UTC
  1. Waiting for usage data.

Where people spend time

Active time
  1. Waiting for usage data.

Time is assigned to the section near the upper-middle of the screen. Time in layout gaps or open dialogs stays in the page totals.

Active time by page

Active time
  1. Waiting for usage data.

Scroll milestones

Page loads
  1. Waiting for usage data.

Portfolio page loads that reached each scroll position, including anchor jumps. Reaching a position does not prove the content was read.

Pages explored

Views
  1. Waiting for usage data.

How people arrived

Views
  1. Waiting for usage data.

Sections reached

Page visits
  1. Waiting for usage data.

Each section counts once per page load when it enters the reading area.

What gets a click

Clicks
  1. Waiting for usage data.

Countries

Views
  1. Waiting for usage data.

Approximate country from the network connection.

Browsers

Views
  1. Waiting for usage data.

Devices

Views
  1. Waiting for usage data.

At the network edge

24 hours

Traffic estimates need JavaScript and a connection to Cloudflare.

Requests
—
Visits
—

Separate Cloudflare estimates. Requests include assets and bots; visits are not unique visitors. They will differ from the page views above.

Only aggregate totals are public; no individual visitor histories appear here. Usage history starts when the service is connected; earlier browsing cannot be reconstructed. Browser privacy signals, blocked scripts, interrupted timing reports and connection failures can reduce these totals. Time samples are sent about every 15 seconds and when a page becomes inactive, so some final activity may be lost.

02 / Privacy & policy

What’s behind the numbers.

Last updated

Usage analytics, open to everyone

This portfolio uses a small analytics service built on Cloudflare Workers and D1. When connected, it counts page loads, sections reached, and clicks on projects, articles, CV, email, social and notebook links, skill details and theme choices. A click count shows intent; it does not confirm that a download finished or an email was sent.

It also measures estimated active time per page and section, and whether the portfolio reached 25%, 50%, 75% or the bottom of its scrollable distance. Time is counted while the page is visible and focused, pauses after 60 seconds without input or scrolling, and skips long browser-suspension gaps. It starts after the welcome overlay closes. This estimates foreground activity rather than attention or actual reading.

Time is sent in small batches, approximately every 15 seconds and on tab changes or departure, and added to daily counters. Only elapsed milliseconds and fixed section labels are included. Input events refresh an inactivity timer without recording keys, text or pointer coordinates in these analytics. One page load is limited to one hour of estimated active time and 240 timing reports. Closing a browser can prevent the last report from arriving.

Page loads are grouped by public page, referral source, browser family, device type and approximate country. Referral sources are stored as broad categories such as Google or LinkedIn; unrecognised sites are grouped as “Other websites”. URL queries, campaign tags, fragments and referral paths are not stored.

The service immediately adds to daily counters. It does not store individual event histories, raw IP addresses, full browser identifiers, names, email addresses, form contents or persistent visitor IDs in the analytics database. Counts are public on this page. It does not record sessions, screenshots or keystrokes.

This usage tracker sets no cookies and uses no browser storage. It respects Do Not Track and Global Privacy Control signals. Those signals apply to the usage tracker; essential hosting, security processing and the separate live presence feature still operate.

Live presence, cursors & location

The portfolio’s live studio uses Firebase anonymous sign-in with an identity held in memory for each page. It shares a temporary visitor label, current section and path, approximate country, activity time and, when enabled, section-relative cursor coordinates with other connected visitors. This is separate from the daily usage counters above.

An approximate country lookup sends a request to ipwho.is, which receives your network address. Selecting “Use my precise location” asks for browser permission and sends your coordinates to BigDataCloud to resolve a city or locality. The site shares the resulting location label in live presence; it does not save the coordinates in Firebase.

You can turn cursor sharing and display off in the live studio panel. Reduced-motion settings also disable cursors. Precise location is optional and can be revoked in your browser settings. Presence records are scheduled for removal when a connection closes; stale records are hidden after about two minutes. Disconnection and cleanup can be delayed.

What stays in your browser

Your colour theme is saved locally so the site can remember Light, Dark or Auto. The welcome animation stores a seen flag in local and session storage so it does not repeat unnecessarily. These preferences are separate from analytics and can be removed by clearing this site’s browser data.

The owner’s login page uses Firebase authentication to manage availability. Login credentials and owner access are not part of this public analytics dashboard.

Services, security & retention

GitHub Pages hosts the portfolio. Cloudflare handles edge delivery, security and aggregate traffic estimates. Firebase handles live presence and availability. These providers receive the network information needed to serve requests and operate under their own policies. The site’s analytics database does not store raw IP addresses; infrastructure providers may process them for delivery and security.

Daily usage counters are retained for up to 90 UTC calendar days, with a scheduled daily cleanup. The dashboard offers today, seven-day and thirty-day views. The older Firebase country counter is a separate cumulative count with no automatic expiry. Cloudflare traffic-history retention is managed separately by Cloudflare.

This portfolio does not sell visitor data or use these counters for advertising profiles. Links to external projects, social networks and the blog take you to services with their own privacy practices.

A note about getting in touch

Email links open your email app. Messages you choose to send are used to read and respond to your inquiry, and are not added to public analytics or a mailing list. The usage tracker records only that the email link was clicked.

For questions about this site or your information, email [email protected]. This policy will be updated here if the site’s data practices change.