Skip to content

Local Store

The store is a git repository. All message history is committed; session-sensitive files are gitignored.

.allman/
├── .git/
├── .gitignore
├── {myProfileId}/ # one directory per account
│ ├── AUTH.json # profile info, auth status
│ ├── COOKIES.json # cookie jar (gitignored)
│ ├── config.json # proxy, rate limit config
│ ├── rate-state.json # last send timestamp (gitignored)
│ ├── inbox-state.json # inbox watermark (gitignored)
│ ├── INBOX.jsonl # new message log (gitignored)
│ ├── {convId}/ # one directory per conversation
│ │ ├── RECORD.json # contact + conversation metadata
│ │ └── messages/
│ │ ├── 2024-11.jsonl
│ │ └── 2025-01.jsonl
│ ├── {profileId} -> {convId} # symlink: profile ID → conversation
│ └── {slug} -> {convId} # symlink: slug → conversation
└── {accountSlug} -> {myProfileId} # symlink: account slug → profile
FieldDescription
convIdLinkedIn conversation ID (matches directory name)
profileIdContact’s LinkedIn profile ID
slugContact’s LinkedIn publicIdentifier, or null
convUrnurn:li:msg_conversation:...
firstName, lastName, nameContact name
headlineLinkedIn headline
unreadCountUnread count from last sync
lastActivityAtISO timestamp of last activity
syncStateoldestMessageAt, newestMessageAt, lastSyncAt, totalSynced

Each line in a YYYY-MM.jsonl file is one message:

{
"urn": "urn:li:messagingMessage:...",
"timestamp": 1704067200000,
"fromUrn": "urn:li:fsd_profile:...",
"fromName": "Jamie Rivera",
"isFromMe": false,
"body": "Hey, got a minute?",
"reactions": [],
"attachments": [],
"originToken": null
}

Attachment types: image, video, file, gif, link_preview, voice, other.

OperationCommit timing
sendImmediate
syncOne commit at end
listenDebounced — 5s after last write
store commitImmediate (manual)

COOKIES.json, rate-state.json, inbox-state.json, INBOX.jsonl, listen.log

Credentials never enter git history. Message content is committed so you have a full audit trail and can back up to a private remote.