Add Post logo

Add Post

Community
guilhermeborgesbastos
add-post

Add a new article/post card to the resume's Posts section. Writes the English and Portuguese title and description, runs every piece of that text through the humanizer skill, saves the thumbnail in src/assets/posts/, and inserts the record into src/assets/data/posts.json (newest first). Use when asked to add, publish, feature or list a new post, article or blog entry on the site.

Overview

Publisherguilhermeborgesbastos
Repositorylive-resume
Skill nameadd-post
Stars
491
Forks
275
Bundled files
2
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 2 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by guilhermeborgesbastos on GitHub. Read the source before you install it.

Installation

Install the Add Post AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/guilhermeborgesbastos/live-resume/tree/master/.claude/skills/add-post
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/guilhermeborgesbastos/live-resume.git /tmp/live-resume
mkdir -p .claude/skills
cp -r /tmp/live-resume/.claude/skills/add-post .claude/skills/add-post
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Add Post in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Add Post on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Add Post is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Add a post to the Live Resume

Each post is one record in src/assets/data/posts.json, rendered as a card by src/app/posts/posts-carousel/:

json
{
    "thumbnail": "assets/posts/post-MM-DD-YYYY.jpg",
    "http": "https://…",
    "date": "MM-DD-YYYY",
    "internationalizations": [
        { "language": "en", "title": "…", "description": "…" },
        { "language": "pt", "title": "…", "description": "…" }
    ]
}

post-template.json next to this file is a blank copy. scripts/posts.mjs validates the file and inserts records; always use it instead of editing posts.json by hand.

Rules

  • Every title and description goes through the humanizer skill, in both languages, before it is written to disk. No exceptions, including text the user wrote themselves (show them what changed). If humanizer:humanizer is not available, stop and tell the user to install it (see "Requirements" in docs/add-post-skill.md); do not write posts without it.
  • Do not invent content. Titles and descriptions only say what the article says. If you cannot read the article, ask the user to paste it or summarize it.
  • Description length: at most 275 characters per language, counting HTML tags. The card truncates the raw string at 275 ([ellipsis]="275"), so a longer one can be cut mid-sentence or mid-tag. The script rejects longer descriptions for new posts.
  • Markup: only <b> and <i>, balanced, and sparingly (one to three highlights, as in the existing posts). The text is rendered with innerHTML.
  • Voice: first person, from the resume owner's point of view, matching the existing posts ("Have you ever considered…", "I noticed…"). Titles keep the article's real title and end with a period, like the existing ones.
  • Portuguese is Brazilian Portuguese (pt-BR), written naturally, not word-for-word.
  • Never reformat or reorder the existing records, and don't touch other sections' JSON.

Workflow

1. Gather the inputs

You need four things. Take what the user gave in the arguments or message, and ask once for whatever is missing:

  1. Article URL (http): must be https.
  2. Publish date (date) in MM-DD-YYYY. If the article shows its date, use it and confirm with the user.
  3. Thumbnail image: a local path or URL. If there is none, use assets/posts/thumbnail-placeholder.png and say so.
  4. Source text: fetch the URL with WebFetch. LinkedIn and Medium often block fetches or require a login. If the fetch fails or returns a login wall, ask the user to paste the article text or a short summary. Note which language the article is written in.

2. Draft the text in the article's language

Write the title and the description in the language the article was written in (usually English):

  • title: the article's own title, with a final period.
  • description: one or two sentences, first person, that tell a reader what the article covers and why they might read it. Use the article's real specifics (the problem, the numbers, the tool), not generic praise. Stay under 275 characters including tags.

3. Humanize it

Invoke the skill with the Skill tool: skill: "humanizer:humanizer". Give it the title and description, and tell it the context: a short teaser card on a personal resume site, first person, must stay at or under 275 characters including <b>/<i> tags, keep the tags, and do not add facts. Use its final rewrite.

Then check the result yourself:

  • Names, numbers, dates and claims still match the source; nothing was added.
  • Tags are still balanced and the length is still ≤ 275.

4. Write the other language, then humanize it too

Translate the humanized text into the other language (English ↔ Brazilian Portuguese), keeping the same highlights. Then run the humanizer skill again on the translation, telling it the text is Brazilian Portuguese (or English) and asking it to apply its structural checks: contrast framing ("não é X, é Y"), forced lists of three, inflated claims, one-line closers, dash overuse, sales language. Re-check facts, tags and length afterwards.

5. Show the user before writing

Show both languages side by side, with each description's character count, and list the main changes the humanizer made. Ask for approval or edits. If the user edits the wording, run their edit through the humanizer again and show the diff.

6. Save the thumbnail

Save it as src/assets/posts/post-MM-DD-YYYY.jpg using the post's date. If that file already exists for another post, add a suffix (post-MM-DD-YYYY-2.jpg). Match the existing thumbnails (progressive JPEG, about 626 px wide, under about 120 KB). With ImageMagick:

bash
magick <input> -auto-orient -resize '626x>' -strip -interlace JPEG -quality 82 src/assets/posts/post-MM-DD-YYYY.jpg

If the input is a URL, download it to a temp file first. If ImageMagick is missing, copy a JPEG as-is and tell the user it wasn't resized. View the result with the Read tool to check that it looks right.

7. Insert the record

Write the approved record to a temp JSON file (outside the repo), then:

bash
node .claude/skills/add-post/scripts/posts.mjs add <record.json> --dry-run   # checks it and shows the position
node .claude/skills/add-post/scripts/posts.mjs add <record.json>             # writes posts.json

The script rejects a record with missing or unknown keys, a bad date, a non-https URL, a missing thumbnail file, missing or duplicate en/pt entries, disallowed or unbalanced tags, a description over 275 characters, or an http/thumbnail already used by another post. Fix the cause and run it again. It inserts the post so the list stays newest-first and leaves the other records untouched.

8. Verify

bash
npm run validate:posts      # whole file; warnings about older posts over 275 characters are expected
git diff --stat             # only posts.json and the new thumbnail should change

CLAUDE.md requires the browser suite before any commit: npm run lint and npm run test:e2e. To see the card, run npm run start:en and npm run start:pt (port 4200, #posts), or check test-results/screenshots/ after the e2e run.

9. Report

Tell the user the final en/pt title and description, the thumbnail path, where the post landed in the list, and what the humanizer changed. Don't commit unless asked.

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Add Post AI skill do?

Add a new article/post card to the resume's Posts section. Writes the English and Portuguese title and description, runs every piece of that text through the humanizer skill, saves the thumbnail in src/assets/posts/, and inserts the record into src/assets/data/posts.json (newest first). Use when asked to add, publish, feature or list a new post, article or blog entry on the site.

Why use Add Post on TypingMind?

Because you install it once and use it with any model. Add Post is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Add Post in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/guilhermeborgesbastos/live-resume/tree/master/.claude/skills/add-post. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Add Post?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Add Post?

As many as you like. As long as a model supports skills, you can use Add Post with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Add Post AI skill free?

Yes. It is published on GitHub by guilhermeborgesbastos under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇