Shield

shieldapp.aicontributed by Samuele Ongaro

ALMOST

A weekend of work, and real gaps remain.

Analytics for a personal LinkedIn account: post performance, follower growth and which topics land, gathered without the platform offering an API for it.

Promptfree, for everyone, and the only version there is
Build me the analytics I actually need instead of Shield — and read the first paragraph, because it decides everything.

**The data is not exposed.** Shield works by having a relationship with the platform, or by reading what the platform shows a signed-in user. Neither is available to you: scraping a social platform breaks its terms, gets accounts restricted, and breaks the week they change their markup. So the honest build is the half that is yours — your own posting record, your own link clicks, and whatever the platform's official API does give you. That is genuinely useful, and it is less than the product.

STACK
- Node 20+ with Fastify, server-rendered HTML
- SQLite through better-sqlite3, WAL mode
- The platform's official API, whatever it offers
- Caddy in front

WHAT YOU CAN HAVE, HONESTLY
- **Everything you posted**: content, time, format, length, whether it had a link, an image or a video, and any tags. That is your own record and nobody can take it away
- **Whatever metrics the official API returns** for your own posts — usually impressions, reactions and comments, sometimes only some of those, sometimes with a delay
- **Link clicks**, in full, if every link goes through your own short domain. This is the one metric that is entirely yours and often the most meaningful
- **Follower count over time**, sampled from the API
- What you cannot have: per-viewer detail, demographics the platform does not expose, and other people's posts. Say so in the interface rather than presenting an estimate as a fact

THE DATA MODEL
- accounts: id, platform, handle, credentials_encrypted, token_expires_at, is_active
- posts: id, account_id, external_id, published_at, body, format, has_link, has_image, has_video, word_count, tags_json, campaign
- metric_snapshots: id, post_id, kind, value, collected_at — append-only, one row per collection. Never overwritten, because a post's numbers move for days and the curve is the interesting part
- follower_snapshots: id, account_id, count, at
- links: id, post_id, url, token; clicks: id, link_id, at, referrer_host, country, device, ip_hash, bot
- Every figure computed at query time from snapshots, so a total can never disagree with the rows under it

COLLECTING
- Poll the API on a schedule after publishing — an hour, six hours, a day, three days, a week — because engagement accrues over days and a single reading is meaningless
- Respect rate limits with backoff, and record every collection attempt whether or not it succeeded
- A metric the API stops returning is recorded as absent, never as zero. That distinction matters when you look back in a year
- Tokens refreshed under a lock, and a connection that fails to refresh alerts rather than silently stopping

WHAT TO ACTUALLY MEASURE
- Engagement rate with its denominator stated — impressions if you have them, followers if you do not, and never mixed between posts
- Performance by format, by length, by time of day and day of week, over enough posts to mean something. Show the sample size next to every comparison, because forty posts is not a finding
- The distribution rather than the average: social performance is heavily skewed, and a mean is dominated by one post
- Click-through from your own short domain, which is the number that survives every platform change
- Growth over time, and posts ranked by clicks rather than by reactions — reactions are cheap and clicks are intent

THE HONEST FRAMING
- Put the sample size and the definition next to every number, and mark clearly which come from the platform and which are yours
- Best-time-to-post from your own history is a weak signal from a small sample. Label it as such rather than presenting it as a science
- No estimated reach, no invented demographics, no scraped competitor data

OPERATIONS
- .env: DATABASE_PATH, BASE_URL, ENCRYPTION_KEY, HASH_SALT, SESSION_SECRET, platform credentials
- Migrations on boot, each once; nightly backup off the machine
- Health endpoint reporting token expiry and the age of the last successful collection

WHAT MATTERS MOST
Your own short domain and snapshots over time. Those two are entirely under your control, they survive any platform decision, and together they answer the only question that matters: which posts actually sent somebody somewhere.

What you lose

  • Access to personal-account analytics that LinkedIn does not publish through an API
  • History from before you started measuring, which you cannot backfill
  • Somebody keeping the collection working when the platform changes

If you would rather not build

  • The platform's own data export, imported on a schedule
  • A spreadsheet updated weekly, which is what this replaces
  • Buffer, for cross-platform basics

What it costs

as published on their pricing page

PlanBilled monthlyBilled yearlyLast read
—$29/mo——

Their pricing page is where these came from. Seeing a different price? Tell us.

The escape hatch

open source · no votes, no paid placement

Metabase

$0

Point it at the imported table and build the charts without code.

metabase/metabasefree · open source

Umami

$0

For the traffic those posts send to your own site, which you do control.

umami-software/umamifree · open source

Why this verdict

our own opinion · changed only by a person

60/100

Verdict kinda at 60. The analysis is easy; the data is not offered, and the history you already have there does not come with you.

History

tracked since 10 Aug 2026 · nothing is ever overwritten

Interest · last 30 dayspeak 2/day
views01230 Aug4 Sept9 Sept14 Sept19 Sept24 Sept28 Sept
— views— prompt copies none yet— votes none yet

Questions about Shield

answered from the record above

Is Shield free?

No — the plan we track is $29 a month. Starter at around $29/month billed monthly, cheaper annually.

Can you replace Shield by building your own?

ALMOST. A weekend of work, and real gaps remain. Replacement score 60 out of 100, build time a weekend. Read what you lose before you decide.

How much does Shield cost?

$29 a month on Starter — $348 a year. Recorded 10 Aug 2026.

What do you lose by replacing Shield?

Access to personal-account analytics that LinkedIn does not publish through an API; History from before you started measuring, which you cannot backfill; Somebody keeping the collection working when the platform changes. If any of those carry weight for you, keep paying.

Is there an open-source alternative to Shield?

Yes: Metabase, Umami. The prompt on this page is for when you want it your way instead.

Related entries

same category first, most replaced first

All 17 in Social media & links

Not sending yet

Every week, something stops being worth paying for.

New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.

free forever · no tracking pixel · stored here, never passed to anyone

Esc