Turn your git history into social media content.
ShipLog watches what you build, understands the significance, and generates authentic posts for LinkedIn, Twitter, Telegram, and Dev.to. You review and approve. It publishes.
Engineers build incredible things every day but remain invisible online. ShipLog fixes that.
Your git activity
→ ShipLog detects stories (not just commits — narratives)
→ AI generates platform-specific drafts
→ You review (swipe to approve)
→ Published at optimal times
| ChatGPT | ShipLog | |
|---|---|---|
| Knows what you built | You describe | From git |
| Knows your writing style | Generic | Learned from edits |
| Remembers past posts | No | Never repeats |
| Tracks what performs | No | Adjusts topics |
| Multi-platform formatting | Manual | Automatic |
| Scheduling | None | Optimal times |
ShipLog accumulates context over time. After a month, it knows your voice, your best topics, and your audience. ChatGPT starts from zero every time.
# Clone and install
git clone https://github.com/FrankFMY/shiplog.git
cd shiplog && bun install
# Scan a repo
bun run packages/cli/src/index.ts init ~/your-project
# See what stories ShipLog found
bun run packages/cli/src/index.ts stories ~/your-project
# Generate drafts (requires OPENROUTER_API_KEY)
bun run packages/cli/src/index.ts draft 1
# Copy to clipboard
bun run packages/cli/src/index.ts approve 1 --platform linkedin
git clone https://github.com/FrankFMY/shiplog.git
cd shiplog
cp .env.example .env # add your API keys
docker compose up -d # PostgreSQL + Redis
bun install
bun run build
Git → Ingest → Filter → Cluster → Score → Generate → Review → Publish
↑
Memory
(voice, history, rules)
| Stage | What it does |
|---|---|
| Ingest | Parse .git/ — commits, branches, tags, numstat |
| Filter | Skip merges, typos, bots, deps, security-sensitive (15+ patterns) |
| Cluster | Group by PR → branch → file+time proximity (3-pass) |
| Score | Heuristic scoring with 10+ modifiers |
| Classify | 11 topic categories + 6 narrative element detectors |
| Compose | LLM generation with platform-specific prompts, quality feedback loop |
| Publish | Telegram Bot API, Dev.to REST API, clipboard fallback |
| Layer | Technology |
|---|---|
| Language | TypeScript (strict) |
| Runtime | Bun |
| Backend | Elysia |
| Frontend | SvelteKit 5 + Tailwind v4 |
| Database | PostgreSQL 16 + Drizzle ORM |
| LLM | OpenRouter (Gemini, Claude, GPT) |
| Queue | BullMQ + Redis |
| Auth | GitHub OAuth + httpOnly cookies |
| Payments | Stripe |
| CI | GitHub Actions |
| Deploy | PM2 + Caddy |
shiplog/
├── apps/
│ ├── api/ # Elysia backend (12 route groups)
│ └── web/ # SvelteKit frontend (7 pages)
├── packages/
│ ├── db/ # Drizzle schema (18 tables)
│ ├── core/ # Pipeline, LLM, types, utils
│ └── cli/ # CLI tool (6 commands)
├── .github/workflows/ci.yml
├── docker-compose.yml
├── ecosystem.config.cjs
├── deploy.sh
├── Caddyfile
└── turbo.json
shiplog init [path] # Scan repo, find stories
shiplog stories [path] # List post-worthy stories
shiplog draft <number> # Generate platform-specific drafts
shiplog approve <number> # Copy draft to clipboard
shiplog note "message" # Add manual note/event
shiplog stats [path] # Show pipeline statistics
Auth: GET /api/auth/github, /callback, /me POST /logout
Repos: GET/POST/DELETE /api/repos POST /repos/:id/scan
Stories: GET/PATCH /api/stories
Drafts: GET/PATCH /api/drafts POST /drafts/:id/publish
Memory: GET/PUT/DELETE /api/memory/:category/:key
Analytics: GET /api/analytics/overview, /best-posts, /schedule
Platforms: GET /api/platforms POST /telegram/connect
Pipeline: POST /api/pipeline/run, /generate-drafts
Billing: GET /api/billing/plan POST /checkout, /portal
Teams: GET/POST /api/teams POST /invite, /approvals
Webhooks: POST /api/webhooks/github, /webhooks/stripe
cd packages/core && bunx vitest run # 120 tests
cd apps/api && bunx vitest run # 55 tests
See .env.example. Key variables:
DATABASE_URL=postgresql://...
REDIS_URL=redis://localhost:6379
GITHUB_CLIENT_ID=
GITHUB_CLIENT_SECRET=
OPENROUTER_API_KEY= # required for drafts
TELEGRAM_BOT_TOKEN= # optional
STRIPE_SECRET_KEY= # optional
MIT. See LICENSE.
Pryanishnikov Artyom Alekseevich