blog-ki-linz
Write ki-linz.at Blog Post
Announce:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ki-linz Blog Writer started. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Parameters
/blog-ki-linz [optional topic]
If a topic is provided, write about that topic. If not, research and choose the best topic.
Autonomy
Run fully autonomously. Do not ask for confirmation between steps. Only stop on critical errors. Report the final result at the end.
Credentials
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.
Important Context
- ki-linz.at is a community site for AI enthusiasts in Linz, Austria
- It shares the same blog database as psquared.dev
- Posts appear on BOTH sites: as "Wissen" on ki-linz.at (German) and "AI Insights" on psquared.dev (both languages)
- ki-linz.at is an Astro 5 SSG site — new posts require a rebuild to appear there, but show immediately on psquared.dev (SSR)
- The audience is Austrian: SMB owners, tech leads, developers, and AI-curious professionals in Upper Austria
- Tone should be more community-oriented than psquared.dev (which is more corporate/consulting)
Authors
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 |
Cover Images
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):
- Futuristic office / multi-agent:
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.jpg - Cityscape / responsible AI:
https://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.jpg - Robots at table / AI models:
https://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.jpg - Helpdesk split / chatbots:
https://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.jpg - Dark futuristic / AI trends:
https://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.jpg - Network connections / protocols:
https://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.jpg - Dreamy human+AI:
https://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.jpg - AI video revolution:
https://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.jpg - AI implementation:
https://pub-25945c8861c3489e98f7a0aab28850c9.r2.dev/Generated%20Image%20June%2013%2C%202025%20-%204_37PM.jpeg - Prompting guide:
https://pub-863cd8a9e006495d88a7456aafeb34de.r2.dev/Flux_Dev_A_futuristic_digital_landscape_where_a_human_and_an_A_3.jpg
STEP 1 — Load Credentials and Check Existing Blogs
Announce:
Loading credentials and fetching existing blogs...
1a — Read credentials
source /Users/martinpammesberger/.agents/config/blog-credentials.env
1b — Fetch existing blogs
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:
- All existing titles and slugs (do not duplicate)
- Who wrote the most recent post (alternate to the other author)
- Which cover image was used most recently (pick a different one)
STEP 2 — Research Topic
Announce:
Researching AI scene in Austria/Linz...
Use WebSearch to research:
- AI community events in Linz and Austria (meetups, conferences, hackathons)
- AI adoption in Austrian SMBs and enterprises
- EU AI Act implications for Austrian companies
- Austrian AI startups and initiatives
- Practical AI use cases relevant to local businesses
- KI (Kuenstliche Intelligenz) trends in DACH
Topic selection criteria (if no topic was provided):
- Must NOT overlap with existing articles
- Should be relevant to the Linz/Austrian AI community
- Should be accessible to non-technical readers (SMB owners, managers)
- German-first thinking — this is primarily a German-language audience
Good topic types for ki-linz:
- "KI fuer [Branche]: Wie Unternehmen in Oberoesterreich profitieren" (industry-specific, local)
- "Was der EU AI Act fuer oesterreichische KMU bedeutet" (regulatory, practical)
- "[AI tool/technique] einfach erklaert" (educational, accessible)
- "KI-Trends [year]: Was kommt auf uns zu?" (trend overview)
- "Wie [local company type] KI sinnvoll einsetzen kann" (practical guide)
- "Von ChatGPT zu KI-Agenten: Was sich wirklich geaendert hat" (evolution)
Choose ONE topic. Write down:
- Title DE (primary — natural Austrian German, keyword-rich)
- Title EN (secondary — for psquared.dev English readers)
- Slug (URL-friendly, kebab-case, based on concept but in English for URL consistency)
- Target keywords DE (3-5, focus on "KI", "Kuenstliche Intelligenz", local terms)
- Target keywords EN (3-5)
- Author (alternate from most recent post, or use "KI Linz" for community posts)
- Cover image (thematically fitting, not same as most recent)
STEP 3 — Write the Article (DE primary, EN secondary)
Announce:
Writing article: [DE title]...
Content guidelines
- Length: 1500-2500 words per language
- German is primary: Write the German version FIRST. It should feel native, natural, Austrian German. Use "KI" not "AI" in German text. Reference Austrian/local examples where possible.
- English version: Adapt for international readers. Don't just translate — reframe for a broader audience.
- Tone: Friendly, community-oriented, educational. Like explaining AI to a smart business owner over coffee. Less corporate than psquared.dev.
- Structure: 4-6 sections with H2 headings
- psquared/ki-linz mentions: Brief mention that ki-linz.at is an AI community by psquared, or that psquared offers AI consulting — but keep it subtle. Max 1 mention.
- No AI slop: Write like a local expert. Use Austrian expressions where they fit naturally.
- Markdown format: Content is rendered with the
markedlibrary.
STEP 4 — Publish via Supabase
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.
STEP 5 — Verify
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}"
STEP 6 — Report
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). ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
More from psquared-development/psquared-skills
inboxmate-demo
Set up a personalized InboxMate demo chatbot for a sales prospect. Use when asked to create a demo, set up an InboxMate playground, or prepare a chatbot demo. Guides the full pipeline: research company, scrape content, call MCP, deliver playground URL.
33find-leads
Find new B2B leads in Germany for InboxMate outreach. Validates each lead against legal requirements (UWG), checks email is publicly visible, documents justification, and adds to CRM. Germany only — Austrian law (TKG) is stricter. Pass the number of leads to find as a parameter.
32check-outreach-status
Check status of sent demo outreach emails and monitor follow-up draft status. Follow-up drafts are created by /setup-email-drafts — this skill only monitors. Run periodically after /setup-email-drafts has been used.
23refurbish-demos
Upgrade demo agent knowledge — clears old summaries, scrapes real pages via MCP Tavily (advanced mode), falls back to WebFetch, fixes icons, republishes. Pass campaignId or 'all-sent' as parameter.
8analyse-inboxmate
Reference guide for understanding the InboxMate ecosystem - architecture, repos, pipeline, CRM states, metrics, and how to query each system. Use when starting any InboxMate-related work.
8sanity-check
Verify all InboxMate demo agents are properly configured — checks greetings, quick questions, knowledge, colors, and CRM linkage. Run after batch demo creation or before sending outreach.
7