The LinkedIn Analyzer web app runs entirely in your browser. File contents are not uploaded to an app server.
- Open the app in your browser.
- Upload one or more LinkedIn CSV exports:
Shares.csvComments.csvmessages.csvConnections.csv
- Navigate to the screen you need: Clean, Analytics, Connections, Messages, or Insights.
The app is a single-page app (SPA) with hash routes.
- Home:
#home - Clean:
#clean - Analytics:
#analytics - Connections:
#connections - Messages:
#messages - Insights:
#insights
Examples:
#analytics?range=3m#connections?range=12m#messages?range=6m#insights?range=all
Time range is shared across Analytics, Connections, Messages, and Insights.
- If you set
3 monthsin Analytics, then move to Connections, Messages, or Insights, that same range is applied. - Clean and Home do not use this shared range state.
Supported range values:
1m,3m,6m,12m,all
Delegated click handlers use DomEvents.closest(event, selector) from web/src/dom-events.js.
- Prevents runtime errors when
event.targetis not anElement(for example text-node targets). - Keeps delegated handler guards consistent across screens.
Each screen has its own guided tutorial with first-visit auto-start after a short delay (~1.5s):
- Home
- Clean
- Analytics
- Connections
- Messages
- Insights
Tutorial controls:
Back,Next(orFinishon final step), andSkip- Progress counter and step dots
- Keyboard shortcuts:
ArrowLeft,ArrowRight,Enter,Escape, andTab/Shift+Tabfocus trapping
Special behavior:
- Only the Home tutorial includes the dark/light mode step (
#themeToggle). - Use the floating
?help button in the bottom-right corner to replay the tutorial for the current page. - Completing or skipping marks that page tutorial as done; the floating help button resets and replays it.
- Tutorial auto-start waits until active loading overlays finish, then adds a brief visible pause before opening.
- Contextual mini-tip callouts appear only after the route tutorial is completed/skipped, then follow engagement-based pacing and cooldowns until dismissed.
- Tutorial completion, mini-tip dismissal, and mini-tip pacing metadata are stored in versioned
localStoragekeys (bump version to re-onboard after new tutorial features). - Sketch-style arrow callouts point to the highlighted target; the arrow style varies per step unless a step specifies
arrowStyle.
Upload hub for all supported CSV types. Shows file readiness and processing status.
Converts uploaded CSV data into formatted .xlsx files.
- Shares and comments escaping fixes
- Messages and connections cleaning parity with Python cleaner
- Excel export with column widths and wrapped text
Interactive activity dashboard:
- Timeline chart
- Top topics chart
- Day/hour heatmap
Charts support PNG export via download button on hover.
Network analytics dashboard:
- Connection growth timeline
- Top companies in network (bar chart)
- Top positions/roles (bar chart)
- Stats: total connections, recent adds, top company, network age
Charts support PNG export via download button on hover.
Relationship-focused view derived from messages and connections:
- Top Contacts
- Silent Connections
- Fading Conversations
Each panel includes a full-list Excel export button.
Rule-based recommendations and summaries generated from analytics aggregates.
- A shared loading overlay (gear animation) is used for analytics/connections/messages/insights data loading.
- Active content is blurred while loading to keep the loading state clear.
- Tutorial auto-start and mini-tip rendering are gated by loading state, so onboarding UI does not appear while loading overlays are active.
- Analytics computation runs in
analytics-worker.js. - Connections parsing runs in
connections-worker.jswith client-side filtering. - Messages/connections parsing runs in
messages-worker.jswith safe fallback. - IndexedDB stores raw files and analytics base when available; an in-memory fallback keeps the app functional but does not persist data across reloads.
- On startup, a non-blocking session TTL sweep clears stale uploads and cached analytics from IndexedDB and in-memory cache. Screens wait for cleanup to finish before loading stored data.
- Upload restore warms cache first, then schedules analytics priming to avoid blocking first paint.
- Service worker caches navigation with NetworkFirst, scripts/styles with StaleWhileRevalidate, and fonts/images with CacheFirst (30-day TTL) to auto-refresh users onto newer builds.
- Clear All removes stored uploads/analytics from IndexedDB and clears in-memory cache.
- Fonts are self-hosted (no external Google Fonts dependency).
Your file contents stay in your browser unless you explicitly enable diagnostics.
- Processing is local JavaScript only.
- Data persistence uses browser IndexedDB when available, with an in-memory fallback when IndexedDB is unavailable.
- Theme preference is persisted across sessions.
- Tutorial and mini-tip onboarding state is preserved in
localStorage(versioned keys). - No backend API calls for file content.
- If
VITE_SENTRY_DSNis configured, diagnostics remain disabled until the user opts in.
npm run devThen open the Vite URL printed in the terminal.
Deploy web/dist/ to any static host (Vercel, Netlify, GitHub Pages).
Recommended production setup:
- Build with
npm run build - Publish the
web/dist/output - Set environment variables:
VITE_SENTRY_DSN(optional; only used after user opt-in)VITE_APP_RELEASE(recommended for release-level error tracking)
- Verify security headers from
vercel.jsonin deployed responses
- Vite production builds target
es2022 - Playwright E2E coverage currently runs on Chromium, Firefox, and WebKit
- Hash routing (
#...) avoids server-side rewrite requirements
The app ships with a hand-drawn favicon set and production meta tags.
Browsers pick the best format automatically:
| Repo path | Size | Used by |
|---|---|---|
web/public/assets/icon.svg |
any | Modern browsers (Chrome, FF) |
web/public/assets/favicon.ico |
32px | Legacy browsers (older IE/Edge) |
web/public/assets/apple-touch-icon.png |
180px | iOS home screen bookmark |
web/public/assets/icon-192.png |
192px | Android home screen, PWA |
web/public/assets/icon-512.png |
512px | PWA splash screen, OG cards |
assets/manifest.webmanifest declares the app name, icons, theme color, and standalone display mode. All paths use relative URLs so the app works under any base path. This enables "Add to Home Screen" on mobile devices.
index.html includes og:* and twitter:* meta tags so that link previews show the app title, description, and icon when shared on social platforms. Image URLs are relative so they resolve correctly on any deploy target.
Two <meta name="theme-color"> tags (one per prefers-color-scheme) tint the browser chrome to match the light (rgba(255, 253, 247, 1)) or dark (rgba(28, 25, 23, 1)) theme.
web/public/robots.txt allows all crawlers.