{"skill":{"slug":"talos","displayName":"Talos — God of Automation","summary":"Talos â God of Automation. Plan and batch your entire social media content calendar â generate a 4-week posting schedule, write platform-optimised captio...","description":"---\nname: talos\ndescription: \"Talos â God of Automation. Plan and batch your entire social media content calendar â generate a 4-week posting schedule, write platform-optimised captions for Twitter/X, LinkedIn, Instagram, and Threads, apply best-posting-time rules, and export a ready-to-use content calendar.\"\nversion: \"1.0.4\"\nmetadata:\n  openclaw:\n    requires:\n      env: []\n      bins: [python3, pip3]\n    primaryEnv: \"BRAND_TOPIC\"\n    homepage: https://clawhub.ai/occupythemilkyway/talos\n    emoji: \"â¡ð\"\n    tags: [social-media, content, scheduler, twitter, linkedin, instagram, talos, marketing, calendar]\n    envVars:\n      - name: BRAND_TOPIC\n        description: \"What your brand/account is about (e.g. 'productivity tips for developers', 'vegan cooking on a budget')\"\n        required: true\n      - name: PLATFORMS\n        description: \"Comma-separated platforms to plan for: twitter, linkedin, instagram, threads\"\n        required: false\n        default: \"twitter, linkedin, instagram\"\n      - name: POSTS_PER_WEEK\n        description: \"Number of posts per platform per week (1-5)\"\n        required: false\n        default: \"3\"\n      - name: CONTENT_PILLARS\n        description: \"Comma-separated content pillars (e.g. 'education, inspiration, engagement, promotion')\"\n        required: false\n        default: \"education, inspiration, engagement, promotion\"\n      - name: BRAND_TONE\n        description: \"Brand tone: educational, professional, casual, or inspirational\"\n        required: false\n        default: \"educational\"\n---\n\n# Talos â Social Media Content Calendar\n\nGenerate a complete 4-week social media content calendar with platform-optimised captions, best posting times, and content pillar rotation â all offline, no API keys required.\n\n## What you get\n\n- **4-week posting calendar** with dates, days, and optimal posting times for each platform\n- **Platform-native captions** for Twitter/X (â¤280 chars), LinkedIn (long-form), Instagram (emoji + hashtags), and Threads\n- **Content pillar rotation** across education, inspiration, engagement, and promotion (fully customisable)\n- **Hashtag strategy** guide per platform\n- **Topic angle ideas** based on your brand topic\n- **Exports**: JSON calendar + Markdown document ready to paste into any scheduling tool\n\n## ð Security\n\nRuns entirely locally. No API calls, no data transmitted. Pure offline generation.\n\n---\n\n## Step 1 â Install\n\n```bash\npip3 install rich --break-system-packages --quiet\n```\n\n---\n\n\n---\n\n## â¡ Upgrade to Talos Pro\n\nð **Get Talos Pro** â **ko-fi.com/s/9433e598bd** â $9 one-time\n\n```bash\nopenclaw skills install talos-pro\n# Set LICENSE_KEY env var to your key from Ko-fi, then run\n```\n\nð° **Bundle deal:** all 5 Pro skills for **$29** â **ko-fi.com/s/7625accf3f** (save $16)\n\n## Step 2 â Build Your Content Calendar\n\n```python\nimport os, json, re, random\nfrom datetime import date, timedelta\nfrom rich.console import Console\nfrom rich.table import Table\nfrom rich.panel import Panel\nfrom rich import box\n\nFENCE = chr(96) * 3\n\nconsole = Console()\n\nTOPIC       = os.environ.get(\"BRAND_TOPIC\", \"productivity tips\")\nPLATS_RAW   = os.environ.get(\"PLATFORMS\", \"twitter, linkedin, instagram\")\ntry:\n    PPW = int(os.environ.get(\"POSTS_PER_WEEK\", \"3\"))\nexcept ValueError:\n    PPW = 3\nPILLARS_R   = os.environ.get(\"CONTENT_PILLARS\", \"education, inspiration, engagement, promotion\")\nTONE        = os.environ.get(\"BRAND_TONE\", \"educational\")\nTODAY       = date.today()\n\nPLATFORMS = [p.strip().lower() for p in PLATS_RAW.split(\",\") if p.strip()]\nPILLARS   = [p.strip() for p in PILLARS_R.split(\",\") if p.strip()]\n\n# Guard: clamp PPW to 1-5\nPPW = max(1, min(PPW, 5))\n# Guard: empty PLATFORMS or PILLARS\nif not PLATFORMS:\n    console.print(\"[red]â ï¸  PLATFORMS is empty â defaulting to 'twitter, linkedin, instagram'[/red]\")\n    PLATFORMS = [\"twitter\", \"linkedin\", \"instagram\"]\nif not PILLARS:\n    console.print(\"[red]â ï¸  CONTENT_PILLARS is empty â defaulting to standard pillars[/red]\")\n    PILLARS = [\"education\", \"inspiration\", \"engagement\", \"promotion\"]\n\ntopic_short = TOPIC.split()[0] if TOPIC else \"topic\"\n\nconsole.print(Panel.fit(\n    f\"[bold cyan]ð± â¡ Talos â Social Media Command[/bold cyan]\\n\"\n    f\"Topic: [yellow]{TOPIC}[/yellow]\\n\"\n    f\"Platforms: [green]{', '.join(PLATFORMS)}[/green]  |  \"\n    f\"Posts/week: [green]{PPW}[/green]  |  Tone: [green]{TONE}[/green]\",\n    border_style=\"cyan\"\n))\n\n# ââ Best posting times ââââââââââââââââââââââââââââââââââââââââââââââââââââââââ\nBEST_TIMES = {\n    \"twitter\":   [(\"Mon\", \"9am\"), (\"Tue\", \"9am\"), (\"Wed\", \"12pm\"), (\"Thu\", \"9am\"), (\"Fri\", \"10am\")],\n    \"linkedin\":  [(\"Tue\", \"8am\"), (\"Wed\", \"10am\"), (\"Thu\", \"9am\"), (\"Mon\", \"8am\"), (\"Fri\", \"9am\")],\n    \"instagram\": [(\"Mon\", \"6am\"), (\"Wed\", \"11am\"), (\"Fri\", \"10am\"), (\"Sat\", \"9am\"), (\"Tue\", \"2pm\")],\n    \"threads\":   [(\"Mon\", \"9am\"), (\"Wed\", \"12pm\"), (\"Fri\", \"11am\"), (\"Tue\", \"9am\"), (\"Thu\", \"2pm\")],\n}\n\n# ââ Caption templates per tone ââââââââââââââââââââââââââââââââââââââââââââââââ\nTONE_HOOKS = {\n    \"educational\":  [\n        \"Here's what most people get wrong about {topic}:\",\n        \"The {topic} rule nobody talks about:\",\n        \"{number} things I wish I knew about {topic}:\",\n    ],\n    \"professional\": [\n        \"A key insight about {topic} for professionals:\",\n        \"What high-performers know about {topic}:\",\n        \"The {topic} principle that drives results:\",\n    ],\n    \"casual\": [\n        \"Real talk about {topic} â\",\n        \"Hot take: {topic} is more interesting than you think.\",\n        \"Nobody told me {topic} could be this simple.\",\n    ],\n    \"inspirational\": [\n        \"Your {topic} journey starts with one step.\",\n        \"The {topic} mindset that changes everything:\",\n        \"What if {topic} was easier than you thought?\",\n    ],\n}\nhooks = TONE_HOOKS.get(TONE, TONE_HOOKS[\"educational\"])\n\n# ââ Content type formats ââââââââââââââââââââââââââââââââââââââââââââââââââââââ\nCONTENT_FORMATS = {\n    \"education\":    [\"how-to\", \"tips-list\", \"explainer\", \"myth-busting\", \"framework\"],\n    \"inspiration\":  [\"quote\", \"success-story\", \"milestone\", \"mindset\", \"reminder\"],\n    \"engagement\":   [\"question\", \"poll\", \"fill-in-blank\", \"hot-take\", \"challenge\"],\n    \"promotion\":    [\"feature-spotlight\", \"testimonial\", \"case-study\", \"offer\", \"behind-scenes\"],\n    \"tips\":         [\"quick-tip\", \"pro-tip\", \"mistake-to-avoid\", \"checklist\", \"framework\"],\n    \"portfolio\":    [\"case-study\", \"before-after\", \"process\", \"result\", \"client-story\"],\n    \"tools\":        [\"tool-review\", \"comparison\", \"workflow\", \"integration\", \"recommendation\"],\n    \"product\":      [\"feature\", \"how-to-use\", \"benefit\", \"testimonial\", \"demo\"],\n    \"behind-the-scenes\": [\"process\", \"day-in-life\", \"team\", \"workspace\", \"fail\"],\n}\n\ndef get_format(pillar: str) -> str:\n    for key in CONTENT_FORMATS:\n        if key.lower() in pillar.lower():\n            return random.choice(CONTENT_FORMATS[key])\n    return random.choice([\"tip\", \"story\", \"question\", \"fact\"])\n\n# ââ Offline topic angle generator âââââââââââââââââââââââââââââââââââââââââââââ\ndef get_topic_ideas(topic: str) -> list:\n    return [\n        f\"beginner guide to {topic}\",\n        f\"common mistakes in {topic}\",\n        f\"how to improve your {topic}\",\n        f\"{topic} for professionals\",\n        f\"advanced {topic} strategies\",\n        f\"{topic} tools and resources\",\n        f\"the future of {topic}\",\n        f\"{topic} myths debunked\",\n    ]\n\nconsole.print(\"[dim]Generating topic anglesâ¦[/dim]\")\ntopic_ideas = get_topic_ideas(TOPIC)\n\n# ââ Platform caption generators âââââââââââââââââââââââââââââââââââââââââââââââ\ndef gen_twitter(pillar: str, content_form: str, week: int) -> str:\n    hook = random.choice(hooks).replace(\"{topic}\", topic_short).replace(\"{number}\", str(random.choice([3, 5, 7])))\n    bodies = [\n        f\"{hook}\\n\\nâ [insight 1]\\nâ [insight 2]\\nâ [insight 3]\\n\\nRT if useful ð\",\n        f\"[Hot take about {topic_short}]\\n\\nHere's why: [reason]\\n\\nAgree? ð§µ\",\n        f\"Stop doing X. Start doing Y.\\n\\nFor {topic_short}, this means: [specific advice]\",\n        f\"The {content_form} that changed how I think about {topic_short}:\\n\\n[insight]\\n\\nThread ð§µ\",\n    ]\n    body = random.choice(bodies)\n    hashtags = f\"#{topic_short.replace(' ', '').title()} #ContentTips\"\n    result = f\"{body}\\n\\n{hashtags}\"\n    if len(result) > 280:\n        result = result[:277].rsplit(' ', 1)[0] + \"â¦\"\n    return result\n\ndef gen_linkedin(pillar: str, content_form: str, week: int) -> str:\n    return (\n        f\"The {topic_short} insight that changed everything for me:\\n\\n\"\n        f\"[Hook â one surprising or bold statement]\\n\\n\"\n        f\"Here's what I learned:\\n\\n\"\n        f\"1/ [First point]\\n\\n\"\n        f\"2/ [Second point]\\n\\n\"\n        f\"3/ [Third point]\\n\\n\"\n        f\"The bottom line: [key takeaway]\\n\\n\"\n        f\"What's your experience with {topic_short}? Drop it in the comments ð\\n\\n\"\n        f\"#{topic_short.replace(' ', '').title()} #ProfessionalGrowth #{pillar.replace(' ', '').title()}\"\n    )\n\ndef gen_instagram(pillar: str, content_form: str, week: int) -> str:\n    hook = random.choice(hooks).replace(\"{topic}\", topic_short).replace(\"{number}\", str(random.choice([3, 5, 7])))\n    emojis = [\"â¨\", \"ð¥\", \"ð¡\", \"ð¯\", \"ð\", \"ðª\", \"ð\"]\n    e = random.choice(emojis)\n    return (\n        f\"{e} {hook.upper()}\\n\\n\"\n        f\"[Main value â 2-3 sentences about {topic_short}]\\n\\n\"\n        f\"Save this post if you found it helpful! â»ï¸\\n\\n\"\n        f\"ð Follow for daily {topic_short} tips\\n\\n\"\n        f\"â â â â â â â\\n\"\n        f\"#{topic_short.replace(' ', '')} #{pillar.replace(' ', '')} #ContentCreator \"\n        f\"#InstagramTips #GrowthMindset #OnlineBusiness\"\n    )\n\ndef gen_threads(pillar: str, content_form: str, week: int) -> str:\n    hook = random.choice(hooks).replace(\"{topic}\", topic_short).replace(\"{number}\", str(random.choice([3, 5, 7])))\n    return (\n        f\"{hook}\\n\\n\"\n        f\"[Your honest take on {topic_short}]\\n\\n\"\n        f\"What do you think? ð\"\n    )\n\nPLATFORM_GENS = {\n    \"twitter\":   gen_twitter,\n    \"linkedin\":  gen_linkedin,\n    \"instagram\": gen_instagram,\n    \"threads\":   gen_threads,\n}\n\n# ââ Build 4-week calendar âââââââââââââââââââââââââââââââââââââââââââââââââââââ\ncalendar = []\nfor week in range(1, 5):\n    for platform in PLATFORMS:\n        gen_fn = PLATFORM_GENS.get(platform, gen_twitter)\n        times  = BEST_TIMES.get(platform, BEST_TIMES[\"twitter\"])\n        for day_idx in range(min(PPW, 5)):\n            pillar       = PILLARS[day_idx % len(PILLARS)]\n            content_form = get_format(pillar)\n            day_name, best_time = times[day_idx % len(times)]\n            post_date    = TODAY + timedelta(weeks=week - 1, days=day_idx)\n            caption      = gen_fn(pillar, content_form, week)\n            calendar.append({\n                \"week\":      week,\n                \"platform\":  platform,\n                \"date\":      post_date.strftime(\"%b %d\"),\n                \"day\":       day_name,\n                \"best_time\": best_time,\n                \"pillar\":    pillar,\n                \"format\":    content_form,\n                \"caption\":   caption,\n            })\n\n# ââ Display: Calendar overview ââââââââââââââââââââââââââââââââââââââââââââââââ\nconsole.print()\ncal_table = Table(\n    title=f\"ð 4-Week Social Calendar â {len(calendar)} posts\",\n    box=box.ROUNDED, border_style=\"cyan\"\n)\ncal_table.add_column(\"Wk\",       style=\"dim\",    width=4)\ncal_table.add_column(\"Date\",     style=\"cyan\",   width=8)\ncal_table.add_column(\"Platform\", style=\"yellow\", width=12)\ncal_table.add_column(\"Day\",      style=\"green\",  width=5)\ncal_table.add_column(\"Time\",     style=\"green\",  width=6)\ncal_table.add_column(\"Pillar\",   style=\"magenta\",width=14)\ncal_table.add_column(\"Format\",   style=\"white\",  width=18)\n\nfor entry in calendar:\n    cal_table.add_row(\n        str(entry[\"week\"]),\n        entry[\"date\"],\n        entry[\"platform\"].title(),\n        entry[\"day\"],\n        entry[\"best_time\"],\n        entry[\"pillar\"].title(),\n        entry[\"format\"],\n    )\nconsole.print(cal_table)\n\n# ââ Display: Sample captions ââââââââââââââââââââââââââââââââââââââââââââââââââ\nconsole.print()\nfor platform in PLATFORMS[:2]:\n    sample = next((p for p in calendar if p[\"platform\"] == platform), None)\n    if sample:\n        console.print(Panel(\n            sample[\"caption\"],\n            title=f\"[bold]ð Sample Caption â {platform.title()}[/bold]\",\n            border_style=\"yellow\"\n        ))\n\n# ââ Display: Hashtag strategy âââââââââââââââââââââââââââââââââââââââââââââââââ\nHASHTAG_GUIDE = {\n    \"twitter\":   \"1-2 hashtags max. Use trending + niche specific. Never in the middle of text.\",\n    \"linkedin\":  \"3-5 hashtags at the end. Mix: 1 broad + 2 niche + 1 trending.\",\n    \"instagram\": \"10-15 hashtags. Mix sizes: 3 mega (1M+) + 5 medium (100k-1M) + 7 niche (<100k).\",\n    \"threads\":   \"No hashtags currently. Focus on conversation starters.\",\n}\nconsole.print()\nhg_lines = \"\\n\".join([\n    f\"[cyan]{p.title()}:[/cyan] {guide}\"\n    for p, guide in HASHTAG_GUIDE.items() if p in PLATFORMS\n])\nconsole.print(Panel(hg_lines, title=\"[bold]# Hashtag Strategy[/bold]\", border_style=\"blue\"))\n\n# ââ Display: Topic angles âââââââââââââââââââââââââââââââââââââââââââââââââââââ\nif topic_ideas:\n    console.print()\n    ti_lines = \"\\n\".join([f\"[dim]{i + 1}.[/dim] {idea}\" for i, idea in enumerate(topic_ideas)])\n    console.print(Panel(ti_lines, title=\"[bold]ð¡ Content Angle Ideas[/bold]\", border_style=\"magenta\"))\n\n# ââ Save outputs ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ\ntopic_slug = re.sub(r\"[^a-z0-9]\", \"_\", TOPIC[:20].lower())\njson_path  = f\"social_calendar_{topic_slug}_{TODAY}.json\"\nmd_path    = f\"social_calendar_{topic_slug}_{TODAY}.md\"\n\nwith open(json_path, \"w\", encoding=\"utf-8\") as f:\n    json.dump({\"topic\": TOPIC, \"platforms\": PLATFORMS, \"calendar\": calendar,\n               \"generated\": str(TODAY)}, f, indent=2)\n\nwith open(md_path, \"w\", encoding=\"utf-8\") as f:\n    f.write(f\"# Social Media Calendar â {TOPIC}\\n\\n\")\n    f.write(f\"**Platforms:** {', '.join(p.title() for p in PLATFORMS)}  \")\n    f.write(f\"**Posts/week:** {PPW}  **Generated:** {TODAY}\\n\\n\")\n    f.write(\"## Content Angles\\n\\n\")\n    for idea in topic_ideas:\n        f.write(f\"- {idea}\\n\")\n    f.write(\"\\n## Calendar\\n\\n\")\n    f.write(\"| Wk | Date | Platform | Day | Time | Pillar | Format |\\n\")\n    f.write(\"|----|------|----------|-----|------|--------|--------|\\n\")\n    for e in calendar:\n        f.write(f\"| {e['week']} | {e['date']} | {e['platform'].title()} | {e['day']} | {e['best_time']} | {e['pillar'].title()} | {e['format']} |\\n\")\n    f.write(\"\\n## Sample Captions\\n\\n\")\n    shown = set()\n    for e in calendar:\n        if e[\"platform\"] not in shown:\n            shown.add(e[\"platform\"])\n            f.write(f\"### {e['platform'].title()}\\n\\n{FENCE}\\n{e['caption']}\\n{FENCE}\\n\\n\")\n\nconsole.print()\nconsole.print(Panel(\n    f\"[green]â Done![/green]\\n\\n\"\n    f\"ð [cyan]{json_path}[/cyan] â full calendar data\\n\"\n    f\"ð [cyan]{md_path}[/cyan] â markdown calendar\\n\\n\"\n    f\"[dim]Import either file into Buffer, Hootsuite, Later, or any scheduling tool.[/dim]\",\n    title=\"[bold]ð¤ Exports[/bold]\",\n    border_style=\"green\"\n))\n```\n","tags":{"latest":"1.0.4","content":"1.0.1","marketing":"1.0.1","scheduler":"1.0.1","social-media":"1.0.1"},"stats":{"comments":0,"downloads":500,"installsAllTime":19,"installsCurrent":0,"stars":0,"versions":3},"createdAt":1777961652316,"updatedAt":1779575372613},"latestVersion":{"version":"1.0.4","createdAt":1779575372613,"changelog":"- Updated to version 1.0.4 with no functional or code changes detected.\n- Documentation updated: added a new \"Upgrade to Talos Pro\" section, providing information and instructions for purchasing and installing a Pro version.\n- Minor formatting and encoding adjustments in documentation.","license":"MIT-0"},"metadata":{"setup":[{"key":"BRAND_TOPIC","required":true},{"key":"PLATFORMS","required":false},{"key":"POSTS_PER_WEEK","required":false},{"key":"CONTENT_PILLARS","required":false},{"key":"BRAND_TONE","required":false}],"os":null,"systems":null},"owner":{"handle":"occupythemilkyway","userId":"s1757zbbgb226m951fdfmj4s6s860nkn","displayName":"OccupyTheMilkyWay","image":"https://avatars.githubusercontent.com/u/135929372?v=4"},"moderation":null}