skills/blog-ki-linz/SKILL.md
Write and publish a new blog article for ki-linz.at (Wissen section). Focuses on AI community in Linz/Austria, local events, KI for Austrian SMBs. Writes bilingual DE+EN content and publishes via Supabase. Same DB as psquared.dev — post also appears there.
npx skillsauth add psquared-development/psquared-skills blog-ki-linzInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Announce:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ki-linz Blog Writer started. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
/blog-ki-linz [optional topic]
If a topic is provided, write about that topic. If not, research and choose the best topic.
Run fully autonomously. Do not ask for confirmation between steps. Only stop on critical errors. Report the final result at the end.
Read from: /Users/martinpammesberger/.agents/config/blog-credentials.env
Required: SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY, BLOG_ACCOUNT_ID
If credentials are missing or empty, ask the user to fill in the config file and stop.
Alternate between the two co-founders. Check the latest posts to see who wrote last and pick the other one. For ki-linz-specific community posts, "KI Linz" is also a valid author (no avatar).
| Author | author_name | author_avatar |
|--------|------------|---------------|
| Martin Pammesberger | {"en": "Martin Pammesberger", "de": "Martin Pammesberger"} | https://pub-965ae2182ade48e8acb01069fc0de0f4.r2.dev/martin_anime.png |
| Manuel Pils | {"en": "Manuel Pils", "de": "Manuel Pils"} | https://pub-965ae2182ade48e8acb01069fc0de0f4.r2.dev/mapi_anime.png |
| KI Linz (community) | {"de": "KI Linz"} | null |
Every post should have a cover_image. Pick from these existing images (choose one that fits the topic, don't reuse the most recent post's image):
https://cdn.leonardo.ai/users/bf8efc52-029b-48d3-b1f0-97e4b0269844/generations/f017c59e-69b2-4fe3-9ee1-f7963daffe05/segments/3:4:1/Flux_Dev_A_futuristic_office_environment_where_multiple_digita_2.jpghttps://cdn.leonardo.ai/users/bf8efc52-029b-48d3-b1f0-97e4b0269844/generations/e811cf3e-95ba-4909-8420-8ca12d035e41/segments/4:4:1/Flux_Dev_A_sleek_hightech_cityscape_at_dawn_symbolizing_the_fu_3.jpghttps://cdn.leonardo.ai/users/153286fa-844a-4669-b8e7-9d92e89a66ee/generations/22bc2cc8-470b-47b0-906f-048be9d8a94e/Leonardo_Phoenix_09_Three_advanced_humanoid_robots_sit_around_3.jpghttps://cdn.leonardo.ai/users/153286fa-844a-4669-b8e7-9d92e89a66ee/generations/d7f8bb5c-19af-4d85-a003-3f82713b121f/Leonardo_Phoenix_09_A_futuristic_digital_helpdesk_scene_split_2.jpghttps://cdn.leonardo.ai/users/bf8efc52-029b-48d3-b1f0-97e4b0269844/generations/b234dc95-2fd5-4f9d-b887-7dc354209054/segments/2:4:1/Flux_Dev_A_futuristic_highcontrast_3D_artwork_depicting_the_da_1.jpghttps://cdn.leonardo.ai/users/bf8efc52-029b-48d3-b1f0-97e4b0269844/generations/347b4eed-1af9-4c97-aa9c-f902852f89ca/segments/4:4:1/Flux_Dev_Professional_tech_illustration_of_a_central_connectio_3.jpghttps://cdn.leonardo.ai/users/153286fa-844a-4669-b8e7-9d92e89a66ee/generations/02f51b3c-8448-434f-9e3e-9cd7dfb7e031/Leonardo_Phoenix_09_a_vivid_dreamlike_and_cinematic_photograph_0.jpghttps://cdn.leonardo.ai/users/bf8efc52-029b-48d3-b1f0-97e4b0269844/generations/153c1edc-8c46-46ea-9069-5540d5cb8983/segments/4:4:1/Flux_Dev_A_futuristic_splitscreen_composition_showing_the_AI_v_3.jpghttps://pub-25945c8861c3489e98f7a0aab28850c9.r2.dev/Generated%20Image%20June%2013%2C%202025%20-%204_37PM.jpeghttps://pub-863cd8a9e006495d88a7456aafeb34de.r2.dev/Flux_Dev_A_futuristic_digital_landscape_where_a_human_and_an_A_3.jpgAnnounce:
Loading credentials and fetching existing blogs...
source /Users/martinpammesberger/.agents/config/blog-credentials.env
curl -s "${SUPABASE_URL}/rest/v1/blogs?account_id=eq.${BLOG_ACCOUNT_ID}&order=published_at.desc&select=title,slug,tags,published_at,author_name,cover_image" \
-H "apikey: ${SUPABASE_SERVICE_ROLE_KEY}" \
-H "Authorization: Bearer ${SUPABASE_SERVICE_ROLE_KEY}"
Note:
Announce:
Researching AI scene in Austria/Linz...
Use WebSearch to research:
Topic selection criteria (if no topic was provided):
Good topic types for ki-linz:
Choose ONE topic. Write down:
Announce:
Writing article: [DE title]...
marked library.Announce:
Publishing to Supabase...
Write the payload with python for proper JSON encoding, then POST:
python3 -c "
import json
payload = {
'account_id': 'f68026a5-495f-4d73-aad3-31ca191bc499',
'title': {'de': DE_TITLE, 'en': EN_TITLE},
'slug': SLUG,
'excerpt': {'de': DE_EXCERPT, 'en': EN_EXCERPT},
'content': {'de': DE_CONTENT, 'en': EN_CONTENT},
'cover_image': COVER_IMAGE_URL,
'published_at': CURRENT_ISO_DATETIME,
'author_name': AUTHOR_NAME_OBJECT,
'author_avatar': AUTHOR_AVATAR_URL_OR_NONE,
'tags': {'de': DE_TAGS_LIST, 'en': EN_TAGS_LIST},
'created_at': CURRENT_ISO_DATETIME,
'updated_at': CURRENT_ISO_DATETIME
}
with open('/tmp/ki-linz-blog-post.json', 'w') as f:
json.dump(payload, f, ensure_ascii=False)
"
source /Users/martinpammesberger/.agents/config/blog-credentials.env
curl -s -X POST "${SUPABASE_URL}/rest/v1/blogs" \
-H "apikey: ${SUPABASE_SERVICE_ROLE_KEY}" \
-H "Authorization: Bearer ${SUPABASE_SERVICE_ROLE_KEY}" \
-H "Content-Type: application/json" \
-H "Prefer: return=representation" \
-d @/tmp/ki-linz-blog-post.json
rm /tmp/ki-linz-blog-post.json
Check response for errors. If slug exists (409), append a suffix and retry.
Announce:
Verifying publication...
curl -s "${SUPABASE_URL}/rest/v1/blogs?slug=eq.[slug]&account_id=eq.f68026a5-495f-4d73-aad3-31ca191bc499&select=id,title,slug,published_at" \
-H "apikey: ${SUPABASE_SERVICE_ROLE_KEY}" \
-H "Authorization: Bearer ${SUPABASE_SERVICE_ROLE_KEY}"
Announce:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ki-linz Blog Published Title (DE): [title] Title (EN): [title] Author: [name] Slug: [slug] Live URLs: psquared EN: https://www.psquared.dev/en/ai-insights/[slug] psquared DE: https://www.psquared.dev/de/ai-insights/[slug] ki-linz (after rebuild): https://www.ki-linz.at/wissen/[slug] Keywords (DE): [keywords] Keywords (EN): [keywords] Note: ki-linz.at requires a rebuild to show the new post. psquared.dev shows it immediately (SSR). ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
tools
Set up a personalized InboxMate INBOX demo (Demo-Postfach) for a sales prospect: a public, read-only seeded inbox showing 5-7 pre-triaged emails in their industry's language, with categories, routing and ready AI drafts. Use for email-automation outreach (the €49-349 product), NOT for chatbot outreach. No agent is created.
development
Build InboxMate demos AND write personalised outreach drafts in a single pass per company — eliminating the double-research that happens when /inboxmate-batch-demo and /setup-email-drafts run separately. Use when kicking off a new campaign where the campaign already exists (plan via /plan-campaign first). For each target company, dispatches ONE subagent that researches the site, builds the demo, creates the CRM opportunity, and drafts the outreach email — reusing the same research across all three. After all subagents return, runs a single batch call to auto-generate follow-ups.
testing
Autonomous pilot for the InboxMate EMAIL outreach (Demo-Postfach/INBOX track). Assesses where the inbox pipeline stands (leads → demos → review → campaign → drafts) and executes the next sensible step end-to-end, always finishing with the inbox sanity check and a summary of what the user should do next (ideally: just schedule the mails). Runs in save mode by default: orchestration + all quality gates on the top model, data collection on haiku subagents, content generation on sonnet subagents (pass 'full' to disable). Use when asked to 'advance the email outreach', 'run the inbox pipeline', or 'what's next for the Demo-Postfach motion'.
tools
Generate a polished psquared client offer as a multi-page PDF (title, project description, screenshots, Angebot/pricing, AGB). Walks the user through gathering inputs (or accepts a JSON config), renders branded HTML templates with Playwright in two passes (title page edge-to-edge + body pages with margins and pagination), then merges with pdf-lib.