Open-Source Cold Email & Warmup Platform
Warmbly는 메일함을 예열하고 캠페인 전송·답변 triage를 지원하는 오픈소스 콜드 이메일 플랫폼입니다
LinkedIn 게시물을 직접 작성해 주는 오픈소스 대안
Social Daily Poster is the open-source alternative to Taplio: it writes your LinkedIn posts from the work you already did, on your own machine, for the price of the AI subscription you already pay for
마케팅Python · PowerShellGitHub @dimamak온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Nobody has the time - or the will - to sit down and write a post every day. Social Daily Poster does it for you, from what you actually did that day - your Claude Code sessions, screenshots and messages at the end of the day, etc. Kind of open-source alternative to Taplio
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Nobody has the time, or the will, to sit down and write a post every day.
Social Daily Poster does it for you, from what you actually did that day.
Social Daily Poster is the open-source alternative to Taplio: it writes your
LinkedIn posts from the work you already did, on your own machine, for the
price of the AI subscription you already pay for.README 전문 보기 ↗Nobody has the time, or the will, to sit down and write a post every day. Social Daily Poster does it for you, from what you actually did that day.
Social Daily Poster is the open-source alternative to Taplio: it writes your LinkedIn posts from the work you already did, on your own machine, for the price of the AI subscription you already pay for.
Every night, Social Daily Poster looks back at your day: your coding-agent sessions (Claude Code or Codex/ChatGPT), screenshots, and optionally your Telegram, Gmail, WhatsApp, and even a spoken debrief you record after a call. It picks the single best story and drafts a post. That draft lands in a private Telegram bot with Approve / Edit / Skip buttons. Approve also draws an illustration and shows it to you before anything is public. Nothing posts until a second tap.
Once that post is live on LinkedIn, Social Daily Poster can spin off the same story for X (a real rewrite, not a truncation) and Reddit (a prefilled link you submit yourself), each with its own approval step and its own on/off switch.
Runs on one laptop for one person, no server needed. That's how most people use it. It can also run on a shared server for a few people.
Fastest: hand it to a coding agent. If you already use a terminal-based agent (Claude Code, Codex, etc.), open it in an empty folder and give it this:
Clone https://github.com/dimamak/sdp and set it up locally for one person.
Before running the wizard, ask me which channels I want: Telegram and
LinkedIn are required, then check whether I also want Gmail, WhatsApp,
images, X, or Reddit, don't just leave them off by default. If I don't have
a LinkedIn Page, use https://www.linkedin.com/company/sdp-page/ as a
placeholder. Then walk me through the wizard with those answers.
The wizard is interactive by design: you'll still need to answer things yourself, like pasting a Telegram bot token or approving a LinkedIn login in your browser. But the agent can drive the whole install and relay each question to you as it comes up.
Or run it yourself (works on Windows, macOS, Linux):
git clone https://github.com/dimamak/sdp.git && cd sdp
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt # Windows: .venv\Scripts\pip
.venv/bin/python -m setup.wizard # mode? -> laptop (the default)
The wizard walks through: which sessions to harvest, your Telegram bot, and
(all optional) Gmail/WhatsApp/LinkedIn/images/X/Reddit. Every step is
re-runnable on its own, e.g. python -m setup.wizard --source linkedin.
When it's done:
python -m server.pipeline.run_nightly --dry-run # one harvest + digest, no posting
python -m server.bot.main # leave this running
That one process polls Telegram for your taps and schedules the nightly
draft itself: no cron, nothing else to install. python -m setup.wizard --doctor checks your setup any time.
Want a shared, always-on server for a few people instead of one laptop? See Server mode.
| Source | What it captures | Notes |
|---|---|---|
| Claude Code / Codex / ChatGPT sessions | Your coding-agent transcripts | Read locally; covers Claude Code, the Codex CLI, and the ChatGPT desktop app |
| Screenshots | Whatever you drop into a watched folder | Any OS |
| Telegram, Gmail, WhatsApp | Your own message/mail history | All optional, all off by default; WhatsApp capture is read-only |
| Call / office audio | Local speech-to-text on recordings you make, in whatever languages you actually speak | Off by default; recording and transcription both run on Windows, macOS and Linux |
| Screen activity | Which app and window was in the foreground, plus occasional screenshots — the non-coding half of the day | Off by default; not supported on Wayland (see Limitations) |
Every source is opt-in and walked through by the wizard. config.example.yaml
has the full field-by-field detail as inline comments.
w_member_social API. This is the core flow:
draft → approve → optional illustration → post. Creating the LinkedIn app
needs an associated LinkedIn Page; if you don't have one, use
linkedin.com/company/sdp-page,
a placeholder page for this project that anyone setting up their own
instance is welcome to use. It isn't tied to any real business and has
nothing to do with what actually gets posted.x.enabled): once a post is live on LinkedIn, the same
day's story gets a genuine X-length rewrite (LinkedIn drafts run
1,100–1,600 characters; X's default cap is 280), with its own
Approve/Rewrite/Skip step. Uses X's official API.reddit.enabled): Reddit closed off practical API
access for a project like this. Social Daily Poster hands you a prefilled
submit link and ready-to-paste title and body, and you review it and tap
Submit yourself. Nothing is ever posted by code.Skipping or failing a later step (X, Reddit) never touches a post already made on an earlier one. See Cost for what each channel actually costs to run.
radar.enabled, off by default)Discovery and draft-assist only — this never replies for you. A browser
extension you install and scroll x.com with (free) surfaces posts worth
replying to and, once you've told it enough about who to watch, an optional
budget-capped API poll (default cap $5/month) does the same for a short
watchlist. Either way, all you ever get is a drafted reply in Telegram —
Approve · Edit · Skip — that you paste in and send yourself. No code path
here calls X's post endpoint. See config.example.yaml's radar: block and
python -m setup.wizard --source radar to turn it on.
Approve doesn't publish right away. It first asks the same session that
wrote the post for an image brief, renders it, and sends it back with
Post with image · Regenerate · Post text-only · Cancel. Reply to steer it
("more abstract, no people") and each reply is a new take; regenerating never
touches LinkedIn, only the final tap does. Turn it off entirely with
image.enabled: false.
Every render is checked for broken text — a misspelled word, an invented
brand, a legible dashboard or slide — before it's shown to you. A flagged take
is silently re-rendered once (it never counts against your regeneration
budget, since you never saw it); if the retry is still bad, it's delivered
anyway with a warning in the caption rather than blocking the post. Configure
under image.text_check*.
By default, tapping Post with image / Post text-only sends it to LinkedIn
immediately. Set publish.window (e.g. "15:00-18:00") and it queues
instead, going out at the next eligible slot on its own — useful if you
approve first thing in the morning but don't want every post landing at the
same hour. Post now anyway on the queued message bypasses it for that one
post. publish.days caps which weekdays are eligible; /status lists what's
currently queued. Leave publish.window empty for the old immediate
behaviour.
For a tool that reads your coding transcripts, this is the part that matters most.
See CONTRIBUTING.md if you want the exact sandboxing mechanics behind the Claude vs. Codex backends.
| Item | Marginal cost |
|---|---|
| Drafting, image briefs, X/Reddit rewrites, session summaries | ~$0; runs through your existing Claude Code or ChatGPT/Codex subscription's CLI (an API key also works if you'd rather pay per-token) |
| LinkedIn publishing | $0 (official API) |
| Post illustrations (optional) | ~$0.13–0.24/render; image.enabled: false skips this entirely |
| X posting (optional) | Pay-per-use, no free tier; well under $1/month at one post a day |
| Reddit (optional) | $0; no API or account, just a link you submit yourself |
| X reply radar (optional) | Browser-extension lane is $0; the optional API polling lane is capped at radar.monthly_budget_usd (default $5/month, $0 disables it) |
At one post a day with images on, expect low-single-digit dollars a month.
For an always-on shared box instead of a laptop, with a separate laptop feeding it over SSH:
git clone https://github.com/dimamak/sdp.git && cd sdp
python3 -m venv .venv && .venv/bin/pip install -r requirements.txt
.venv/bin/python -m setup.wizard # mode? -> server
.venv/bin/python -m setup.wizard --doctor
Each additional person gets their own instance: separate config, secrets,
store, Telegram bot, and LinkedIn token, via
.venv/bin/python -m setup.wizard --instance alice. People can share one
LinkedIn or X App's credentials the same way a team shares any App: whoever
sets it up first pastes the client id/secret, everyone else just runs their
own login to get their own token (see the wizard's linkedin/x steps).
Full walkthrough (cron, systemd, Windows laptop push, CI auto-deploy) lives in docs/self-hosting/ci-deploy.md and the wizard's own prompts.
--user, launchd, or
a Task Scheduler logon task) so it comes back at login, and --doctor
fails if the bot hasn't checked in.? all day; an X11 session works. On macOS,
window titles additionally need Accessibility permission — without it you
get app names only.