GitHub to LinkedIn, curated posts with Airtable logging
Finding something worth posting is hard enough. Then you lose another chunk of the day copying links, rewriting the same “here’s why this matters” intro, and praying you didn’t already share that repo last week.
This GitHub LinkedIn automation hits marketers who need consistent content, but founders and consultants feel it too. You end up posting less, or posting rushed. Neither is great.
This workflow pulls trending GitHub discussions from Hacker News, turns them into publish-ready social posts with AI, publishes to LinkedIn (and X), then logs everything in Airtable so repeats don’t happen. You’ll see how it works, what you need, and the real-world time it saves.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: GitHub to LinkedIn, curated posts with Airtable logging
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n0["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Crawl HN Home"]
n1["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Extract Meta"]
n2["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Filter Unposted Items"]
n3["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Visit GH Page"]
n4["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/markdown.dark.svg' width='40' height='40' /></div><br/>Convert HTML To Markdown"]
n5@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter Errored", pos: "b", h: 48 }
n6@{ icon: "mdi:cog", form: "rounded", label: "No Operation, do nothing", pos: "b", h: 48 }
n7["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/airtable.svg' width='40' height='40' /></div><br/>Update X Status"]
n8["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/linkedin.svg' width='40' height='40' /></div><br/>LinkedIn"]
n9["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/airtable.svg' width='40' height='40' /></div><br/>Update L Status"]
n10["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/airtable.svg' width='40' height='40' /></div><br/>Search Item"]
n11["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/airtable.svg' width='40' height='40' /></div><br/>Create Item"]
n12["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/x.dark.svg' width='40' height='40' /></div><br/>X"]
n13["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Validate Generate Content"]
n14@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n15["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Merge"]
n16@{ icon: "mdi:robot", form: "rounded", label: "Generate Content", pos: "b", h: 48 }
n17["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/telegram.svg' width='40' height='40' /></div><br/>Ping Me"]
n18@{ icon: "mdi:cog", form: "rounded", label: "Wait for 5 mins before posting", pos: "b", h: 48 }
n12 --> n7
n15 --> n2
n17 --> n18
n8 --> n9
n11 --> n17
n10 --> n15
n1 --> n10
n1 --> n15
n0 --> n1
n3 --> n4
n5 --> n11
n9 --> n6
n7 --> n6
n16 --> n13
n14 --> n0
n2 --> n3
n4 --> n16
n13 --> n5
n18 --> n12
n18 --> n8
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n14 trigger
class n16 ai
class n5 decision
class n7,n9,n10,n11 database
class n0,n3 api
class n1,n2,n13 code
classDef customIcon fill:none,stroke:none
class n0,n1,n2,n3,n4,n7,n8,n9,n10,n11,n12,n13,n15,n17 customIcon
The Problem: Trending links don’t turn into consistent posts
Hacker News is full of gems, especially when GitHub repos start trending. But “interesting” doesn’t automatically become “posted.” You still have to open the thread, open the repo, skim the README, pull out a few credible details, write something that sounds like you, and then publish it in the right format for LinkedIn. Do that a few times a week and you’ve built a second job. Worse, you start second-guessing yourself: “Did I already post this?” So you either waste time searching… or you accidentally repeat content and your feed looks sloppy.
It adds up fast. Here’s where it usually breaks down.
- Reviewing a GitHub repo properly takes about 10 minutes, and you still haven’t written a single line of the post.
- Manual drafting leads to inconsistent quality, so you end up rewriting hooks instead of shipping.
- If you don’t log posts somewhere reliable, duplicates sneak in and you lose trust (including your own).
- Publishing to LinkedIn and X separately is small work, but it’s the kind that interrupts everything else.
The Solution: Auto-curate Hacker News GitHub finds and publish them
This n8n workflow runs on a schedule and scans the Hacker News homepage for GitHub-related discussions. It parses titles and URLs, then checks Airtable to see what you have already posted. Only new items move forward, which keeps your feed fresh without you babysitting it. For each new GitHub link, it opens the repository page, converts the page content into clean text, and hands the context to an AI prompt that drafts social copy tailored for LinkedIn (and also X). After a quick validation step, it publishes the final posts, logs them back to Airtable with status and timestamps, and sends you a Telegram summary so you know what went out.
The workflow starts with a scheduled trigger, then it does three things in a loop: collect candidates from Hacker News, enrich them from GitHub, and generate/publish posts. Airtable acts like the memory layer, so you don’t repost the same repo twice unless you intentionally want to.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you publish 3 curated “GitHub find” posts per week. Manually, that’s roughly 10 minutes to vet the HN thread, 10 minutes on the repo, and about 15 minutes to draft and format for LinkedIn, plus another 5 minutes to post to X and log it somewhere. Call it 40 minutes per post, or about 2 hours a week. With this workflow, you spend maybe 10 minutes up front tweaking the prompt and your Airtable fields, then each run is mostly hands-off: a scheduled trigger, a short wait before publishing, and a Telegram summary when it’s done.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Airtable for logging posts and deduping.
- LinkedIn to publish curated posts automatically.
- OpenAI API key (get it from your OpenAI dashboard).
Skill level: Intermediate. You’ll connect accounts, paste API keys, and edit a prompt, but you won’t be writing production code.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A scheduled run kicks everything off. n8n starts the workflow at the times you choose, so content creation doesn’t depend on “when you get around to it.”
Hacker News is crawled and parsed. The workflow fetches the HN homepage, extracts GitHub-related items, and builds a clean list of titles, URLs, and basic metadata that can be processed reliably.
Airtable prevents repeats. For every candidate link, it looks up an existing record, merges streams, then excludes anything that has already been marked as posted (separately for LinkedIn and X).
GitHub context improves the writing. It opens the repo page, converts the HTML to markdown-like text, then uses OpenAI to draft social copy that references real details instead of vague hype. After a validation pass and a short wait, it publishes to LinkedIn and X, updates Airtable statuses, and sends a Telegram notification with the summary.
You can easily modify the AI prompt to match your brand voice and your ideal post structure based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Schedule Trigger
Set the automation cadence so the workflow fetches new Hacker News content on a fixed schedule.
- Add or open Scheduled Automation Start.
- Set the interval rule to run every 6 hours by configuring the rule field to
{"interval":[{"field":"hours","hoursInterval":6}]}. - Connect Scheduled Automation Start to Fetch HN Homepage.
Step 2: Fetch and Parse Hacker News Data
Retrieve the homepage HTML and extract GitHub-related posts for processing.
- In Fetch HN Homepage, set URL to
https://news.ycombinator.com/. - Keep the response options that enable full response and never error, as already configured.
- Open Parse HN Metadata and confirm the language is
pythonand the parsing script is pasted in pythonCode. - Ensure Fetch HN Homepage connects to Parse HN Metadata.
- Parse HN Metadata outputs to both Lookup Existing Record and Combine Streams in parallel.
Step 3: De-duplicate and Enrich Repository Content
Prevent reposting by checking Airtable, then fetch and convert repo HTML to markdown for the AI prompt.
- In Lookup Existing Record, set operation to
searchand filterByFormula to={Post}= {{ $json.Post }}. - Credential Required: Connect your airtableTokenApi credentials in Lookup Existing Record.
- Confirm Lookup Existing Record feeds Combine Streams, then Combine Streams feeds Exclude Posted Records.
- Open Exclude Posted Records and keep the JavaScript in jsCode as provided to filter duplicates.
- In Open Repo Page, set URL to
{{ $json.url }}. - In HTML to Markdown, set HTML to
{{ $json.data }}.
Post and that the Airtable table has matching field IDs.Step 4: Set Up AI Draft Generation and Validation
Generate social copy with OpenAI and validate the JSON response before continuing.
- In Generate Social Copy, keep modelId set to
gpt-4o-miniand jsonOutput set totrue. - Confirm the prompt uses the expressions in the message content, including
{{ $('Exclude Posted Records').item.json.title }},{{ $json.data }}, and{{ $('Exclude Posted Records').item.json.url }}. - Credential Required: Connect your openAiApi credentials in Generate Social Copy.
- In Validate Draft Output, keep mode set to
runOnceForEachItemand the jsCode for JSON validation. - Verify the path: Generate Social Copy → Validate Draft Output → Filter Error Outputs.
Step 5: Log to Airtable and Notify for Review
Create an Airtable record, notify via Telegram, and prepare for delayed publishing.
- In Filter Error Outputs, keep the condition that checks
{{ $json.error }}is empty. - In Create Airtable Entry, set the operation to
createand map fields using expressions: - Set Url to
{{ $('Exclude Posted Records').item.json.url }}, Post to{{ $('Exclude Posted Records').item.json.Post }}, Title to{{ $('Exclude Posted Records').item.json.title }}, Tweet to{{ $json.message.content.twitter }}, and LinkedIn to{{ $json.message.content.linkedin }}. - Credential Required: Connect your airtableTokenApi credentials in Create Airtable Entry.
- In Notify via Telegram, set chatId to
[YOUR_ID]and keep the message template using{{ $json.fields.Tweet }}and{{ $json.fields.LinkedIn }}. - Credential Required: Connect your telegramApi credentials in Notify via Telegram.
- Ensure Notify via Telegram connects to Delay Before Publish.
Step 6: Schedule and Publish to Social Channels
Delay publishing, then post to X and LinkedIn in parallel and mark records as posted.
- In Delay Before Publish, set unit to
minutesand adjust any wait time if needed. - Delay Before Publish outputs to both Post to X and Publish to LinkedIn in parallel.
- In Post to X, set text to
{{ $('Filter Error Outputs').item.json.message.content.twitter }}. - Credential Required: Connect your twitterOAuth2Api credentials in Post to X.
- In Publish to LinkedIn, set text to
{{ $('Filter Error Outputs').item.json.message.content.linkedin }}and person to[YOUR_ID]. - Credential Required: Connect your linkedInOAuth2Api credentials in Publish to LinkedIn.
- In Mark X Posted, keep operation as
updateand set the record id to{{ $('Create Airtable Entry').item.json.id }}. - In Mark LinkedIn Posted, keep operation as
updateand set the record id to{{ $('Create Airtable Entry').item.json.id }}. - Credential Required: Connect your airtableTokenApi credentials in Mark X Posted and Mark LinkedIn Posted.
- Confirm both Mark X Posted and Mark LinkedIn Posted end at End Placeholder for clean termination.
Step 7: Test and Activate Your Workflow
Validate the full run end-to-end before enabling production scheduling.
- Click Execute Workflow to run Scheduled Automation Start manually.
- Confirm Fetch HN Homepage returns HTML, Parse HN Metadata outputs GitHub posts, and Exclude Posted Records yields items not already in Airtable.
- Verify Generate Social Copy produces JSON with
twitterandlinkedinfields and Validate Draft Output passes the content forward. - Check Airtable to confirm Create Airtable Entry created a record and Notify via Telegram delivered the message.
- After the wait period, ensure Post to X and Publish to LinkedIn both succeed and that Mark X Posted and Mark LinkedIn Posted update the record.
- Toggle the workflow to Active to enable scheduled runs every 6 hours.
Common Gotchas
- Airtable credentials can expire or need specific permissions. If things break, check the Airtable Personal Access Token scopes and the base/table IDs in your Airtable nodes first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Frequently Asked Questions
About 30 minutes if your API keys are ready.
No. You’ll mostly connect accounts and paste credentials into the right n8n nodes.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in OpenAI API costs (often just a few dollars a month at low volume).
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and you should. You’ll mainly adjust the “Generate Social Copy” OpenAI node so it writes in your tone and follows your structure (for example: hook, why it matters, one takeaway, and a question). Common tweaks include shortening posts for a tighter feed, adding a “who it’s for” line, or forcing a specific CTA like “star the repo” or “comment for the link.” If you want a manual approval step, you can insert a Google Sheets or Airtable “Status = Approved” check before “Publish to LinkedIn.”
Usually it’s an expired token or missing scopes on your Airtable Personal Access Token. Update the credential in n8n, then double-check the base ID and table name in “Lookup Existing Record” and “Create Airtable Entry.” If it fails only sometimes, you may be hitting rate limits during larger batches, so reduce how many posts you process per run.
A typical setup handles dozens of items per run, and the main limit is your n8n execution quota (on Cloud) or your server capacity (if self-hosted).
Often, yes, because this flow has branching, filtering, content generation, and “memory” (Airtable dedupe) in one place. n8n also makes it easier to insert code-based parsing for Hacker News and validation checks when AI output is missing key pieces. If you’re only doing a simple “new row → post to LinkedIn” sequence, Zapier or Make can be quicker to set up. But for pulling from Hacker News, enriching from GitHub, then publishing to two networks, n8n is usually the cleaner fit. Talk to an automation expert if you want help deciding.
Once this is live, your content engine stops relying on willpower. The workflow does the repeatable work, and you keep the judgment calls.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.