Skip to content
MiloJoin the waitlist
Private beta · building in the open

Know when your resume gets seen.

Share your resume through Milo and see when it’s viewed, downloaded, and where the traffic came from.

Your resume stays where it already lives. Milo provides the analytics layer.

No spam. One email when Milo opens up, then nothing.

See how it works

01 · Today

Your resume already lives somewhere.

On your site, in Drive, on GitHub. Milo does not move it, copy it, or store it. It stays exactly where you put it.

How it works

Three steps, and nothing moves.

Milo is an analytics layer over a file you already host. Setup is one form, and there is nothing to install.

  1. 01

    Paste the URL your resume already has

    Your site, GitHub, Drive, Dropbox, anywhere public. Milo stores the link and some metadata. It never uploads or keeps a copy of your PDF.

    https://yoursite.com/resume.pdf

  2. 02

    Share the Milo link instead

    One short link per resume. Put a different one in each application, or add UTM tags to tell LinkedIn from a referral.

    milo.app/r/abc123

  3. 03

    Watch how it performs

    Views, unique viewers, downloads, which pages held attention and for how long. Aggregate patterns, never identities.

    12 views · 8 viewers · 3 downloads

Milo works on the link, not the file

Share the Milo link and every open, page turn and download is measurable. Attach the raw PDF to an email or upload it to a job portal and Milo sees nothing: a file that leaves your hands stops reporting back. Embedding a tracker inside the PDF would change that, and it is exactly the invisible tracking Milo refuses to do. So use the link in LinkedIn messages, cold emails, referrals, your portfolio and your signature.

The dashboard

Everything you get. Nothing you shouldn't.

Performance, sources, and per-page attention. No IP, no city, no company name, no identity, because Milo never collects them.

Example data

Resume views

12

Unique viewers

8

Downloads

3

Download rate

38%

Traffic sources

  • LinkedIn5
  • GitHub2
  • Portfolio2
  • Email1
  • Direct2

Page engagement

  • Page 112 viewers0m 48s
  • Page 210 viewers1m 31s
  • Page 37 viewers0m 22s

Average reading time1m 42s

Recent activity

  • 10:42Resume viewedLinkedIn · Desktop
  • 10:35Resume viewedDirect · Mobile
  • 10:21Resume downloadedLinkedIn · Desktop

No name, no company, no location. By design.

Features

Built for one job: the job hunt.

No CRM, no lead scoring, no pitch-deck analytics. Milo does one thing for people applying to roles.

Your file, your host

Milo stores the URL and the analytics, never the document. Move or replace the PDF and the tracking link keeps working.

Views and unique viewers

Separate a recruiter opening your resume four times from four different people opening it once.

Per-page attention

Which page held someone the longest, and where they stopped reading. Deduplicated, so scrolling back does not inflate the count.

Download tracking

Downloads are recorded before the file is handed over, and repeat clicks within a short window count once.

Source attribution

UTM tags first, referrer domain second, Direct when neither is available. Honest about what it cannot know.

Anonymous by construction

Sessions are anonymous and scoped to one resume. There is no identity field in the schema to fill in later.

Privacy

Milo tells you how, not who.

A recruiter opening your resume did not sign up for anything. The only honest way to build this is to collect the minimum that answers your question and nothing beyond it.

What Milo records

  • Timestamp of the view
  • An anonymous session ID, scoped to one resume
  • Device category, desktop, mobile or tablet
  • Browser and operating system
  • Referrer domain, e.g. linkedin.com
  • UTM parameters you added to your own link
  • Which page of the resume was on screen
  • Roughly how long each page was open
  • Whether the PDF was opened and whether it was downloaded

What Milo will not do

  • IP addresses shown to you, or stored longer than a request needs
  • City, country, or any location derived from an address
  • GPS or precise location
  • Names, emails, or LinkedIn profiles of viewers
  • Device fingerprints
  • Tracking across other websites
  • Camera, microphone, or browser history
Read the full privacy page

Written in plain language, without legal claims we cannot back up.

Path

Built in the open, dated honestly.

Milo is early and being built in the open. Every technical and product decision lands here as it gets made, dated the day it shipped, including the quiet weeks.

  1. 15 September 2026

    2 releases
    • Shipped

      Accounts, and a signup that proves you own the address

      Register, verify by one-time code, login, refresh, logout and a current-user endpoint, layered routes to service to dao so the rules stay testable with no database and no running app. Codes are HMAC hashed with a server-side pepper before they reach Mongo, and the row keeps only a user id: an email copy and a stored expiry are both facts the users collection already owns, so expiry is derived from last sent, which is the same field the TTL index deletes on. Tokens carry a type claim that decoding checks, so a refresh token cannot be replayed as an access token, and they only ever travel in httpOnly cookies. Passwords are argon2id and deliberately never trimmed, since trimming one silently changes the credential someone typed.

      • Auth
      • FastAPI
      • MongoDB
      • Security
    • Shipped

      Mail that refuses to fail quietly

      SMTP delivery derives from the environment: console in development, where the whole message lands in the log so signup works with no mail server, and real delivery in production, which refuses to start on console mode, a local mail catcher host, missing TLS, absent credentials, or a missing code pepper. That last check is not cosmetic, without a shared pepper every worker hashes codes differently and verification fails at random. Rate limiting surfaced its own trap: with headers enabled a limited route must also accept the response object, or it raises on the first request rather than at import.

      • Email
      • Configuration
      • Reliability
  2. 13 August 2026

    2 releases
    • Shipped

      Product app, and the design system underneath it

      Marketing shell for the app, with a story section where one beat index drives the copy feed, the figure pose and a WebGL backdrop of 54 cards rendered as a single InstancedMesh. Tokens and shared components moved into their own packages so both apps render from one source; Tailwind v4 needs explicit source globs to scan a linked package, verified against the built CSS rather than assumed.

      • React
      • Three.js
      • Design system
      • Monorepo
    • Shipped

      Polyglot monorepo with a single task runner

      npm workspaces for TypeScript, Poetry for the FastAPI service, and a Makefile so one command lints both languages. CI splits into parallel JavaScript and Python jobs. Prettier is fenced out of the Python package, proven by dropping an identical malformed file into each and checking only one was flagged.

      • Infrastructure
      • CI
      • Python
See everything that shipped →

Stop guessing whether anyone opened it.

Milo is in private beta. Leave your email and we’ll send one message when tracking links open up, no drip sequence, no newsletter.

No spam. One email when Milo opens up, then nothing.