You manage 9 Instagram handles, 6 LinkedIn pages, 4 X accounts — 19 social assets across 8 clients + personal. Acme IG login is acme.social@gmail.com / ... in LastPass as IG acme. Handle @acme.insta lives in Sheets Socials tab. Follower count 12.4k is in notes - update Mar you haven't updated since March. Client asks "how's growth since we hired you?" You guess.
Sheets store handles. Vaults store passwords. Nothing stores handle + URL + accountType + followerCount + vault login + client together — so you hunt 3 tools per post.
Why Social Sprawl Hurts
No home. Sheet Platform|Handle|URL misses accountType personal|client src/lib/db/schema.ts:212 — you mix personal vs client. Detached logins. No vaultItemId FK → vault search instagram 9 hits, 2min each = 8h/yr. Count as text. 12.4k not integer 12400 src/lib/db/schema.ts:214 never updates — no growth story. Manual reporting. No clientId link → rebuild Beta's handles from memory each month. Offboarding miss. Pinterest Acme-Store tagged personal without validation z.enum(["personal","client"]) src/app/api/assets/[category]/route.ts:72.
The Linked Social Model: Handle Is an Asset
RunoSO models social exactly like domains/hosting — typed, linked, vault-aware:
assetsSocial {
platform varchar(255) notNull src/lib/db/schema.ts:208 // Instagram, LinkedIn, X, YouTube
handle varchar(255) notNull src/lib/db/schema.ts:209 // @acme.insta
url text src/lib/db/schema.ts:210
accountType varchar(50) personal|client notNull src/lib/db/schema.ts:211
clientId uuid fk → clients.id src/lib/db/schema.ts:212 // nullable if personal
vaultItemId uuid fk → vaultItems.id src/lib/db/schema.ts:213 // encrypted login
followerCount integer src/lib/db/schema.ts:214 // typed, not 12.4k text
notes text src/lib/db/schema.ts:215
}
// API: leftJoin(clients) + leftJoin(vaultItems) → clientName + vaultItemName
// src/app/api/assets/[category]/route.ts:220-240
// Validation: socialPostSchema platform min1, handle min1, accountType enum, followerCount int nullable
// src/app/api/assets/[category]/route.ts:68-77What linked gives you: one table GET /api/assets/social paginated buildPaginatedQuery; accountType+clientId split for reporting; one-click encrypted login vaultItemId → gcm:iv:tag:enc src/lib/vault/crypto.ts:22; integer followerCount growth 12400→13800 +11%.
Sheets / LastPass vs RunoSO Social: The Workflow Test
| Need | Sheets + 1Password | RunoSO Assets + Vault | |
|---|---|---|---|
| Find Acme's IG handle + login | Sheet search @acme → find handle, vault search acme ig → guess which entry | One assetsSocial row handle @acme.insta + vaultItemId → vaultItemName src/app/api/assets/[category]/route.ts:230 + clientName Acme Corp JOIN — single view, one click copy | |
| Report followers to client | Open IG, note count, paste to deck, email | followerCount integer src/lib/db/schema.ts:214 per asset → filter clientId=Acme → copy 4 handles with counts + url links for proof | |
| Personal vs client | Text column Owner typo Clinet | `accountType enum personal | client src/app/api/assets/[category]/route.ts:72 validated, plus clientId fk` — reporting query never mixes |
| Security | Sheet shared with VA has password column — leak | Asset has no password — only vaultItemId FK; secret stays AES-GCM ciphertext src/lib/vault/crypto.ts:28 until explicit vault decrypt | |
| Handover | Copy handles to doc, share vault logins separately — client reassembles | portalTokens src/lib/db/schema-public.ts:169 + assetsSocial + vaultItems bundle → one revocable link portal/[token] scoped to tenantId + clientId | |
| Cost | Sheets free + vault $36/yr disjoint | Free 5 assets, Solo ∞ ALLOWED_CATEGORIES src/app/api/assets/[category]/route.ts:91 includes social + vault unlimited |
Sheets list handles. Password managers hold logins. Only RunoSO links handle + URL + type + count + vault + client in one typed row — clipping 2-minute hunt to 10 seconds.
Setup in 25 Minutes
1. Import handles. Add platform/handle/url/accountType/clientId — expect 15–20 rows, 2 ghosts found. 2. Link vault. Set vaultItemId to vaultItems gcm:iv:tag:enc src/lib/vault/crypto.ts:28 — GET shows vaultItemName. 3. Seed counts. Set followerCount integer 13800; next month diff = growth, alongside cron daily src/app/api/cron/daily/route.ts:275. 4. Report. Clients → Beta LLC filtered clientId exports 3 handles with counts+URLs instantly.
Mistakes That Keep Handles Messy
Handle only in URL. Fill both handle @acme.insta and url — search fails otherwise. Wrong accountType. Personal as client pollutes report. No vaultItemId. Forces next hunt — always link. Handled correctly, handle/url/accountType is metadata, secret stays vaultItems usernameEncrypted encrypted until decryptGCM src/lib/vault/crypto.ts:31 via portalTokens share without exposure.
Stop juggling three tabs for one Instagram login. Link handles to clients, vaults and counts in one place — your monthly report writes itself.
→ Centralize Social Assets — Free
By Gautam Parmar — where every handle finally has a home.
Keep Reading
- Domains & zones twin: Cloudflare domain security freelancers.
- Repo sibling: GitHub repo management freelancers.
- Vault behind it: Where freelancers should never store passwords.
FAQ
Can I separate personal and client social accounts? Yes — accountType personal|client src/lib/db/schema.ts:211 + clientId src/lib/db/schema.ts:212 does exactly that. Filter Assets → Social → accountType:client + clientId:Acme for client report vs personal for your brand audit — validated z.enum(["personal","client"]) src/app/api/assets/[category]/route.ts:72.
How are social logins kept encrypted? As vaultItems rows usernameEncrypted/passwordEncrypted/notesEncrypted AES-256-GCM gcm:iv:tag:enc src/lib/vault/crypto.ts:22 with deriveKey SHA-256 src/lib/vault/crypto.ts:18. Social asset holds only vaultItemId FK src/lib/db/schema.ts:213, GET joins vaultItemName for display — password never sits in assets_social table.
How do I hand over all socials to a client? Use portalTokens token tenantId clientId src/lib/db/schema-public.ts:169 scoped unique tenantId+clientId to share assetsSocial bundle plus linked vaultItems references. Client opens portal/[token] and sees handle + url + platform + followerCount per account — secure handover without scattering logins across email threads.



