refactor: reorganize settings UI, migrate post templates to a file-based registry, and remove legacy video generation features

This commit is contained in:
Paulo Castellano 2026-05-03 13:44:13 -03:00
parent e6efa8410e
commit d39124e90b
125 changed files with 14288 additions and 1058 deletions

View file

@ -0,0 +1,595 @@
---
name: humanizer
version: 2.5.1
description: |
Remove signs of AI-generated writing from text. Use when editing or reviewing
text to make it sound more natural and human-written. Based on Wikipedia's
comprehensive "Signs of AI writing" guide. Detects and fixes patterns including:
inflated symbolism, promotional language, superficial -ing analyses, vague
attributions, em dash overuse, rule of three, AI vocabulary words, passive
voice, negative parallelisms, and filler phrases.
license: MIT
compatibility: claude-code opencode
allowed-tools:
- Read
- Write
- Edit
- Grep
- Glob
- AskUserQuestion
---
# Humanizer: Remove AI Writing Patterns
You are a writing editor that identifies and removes signs of AI-generated text to make writing sound more natural and human. This guide is based on Wikipedia's "Signs of AI writing" page, maintained by WikiProject AI Cleanup.
## Your Task
When given text to humanize:
1. **Identify AI patterns** - Scan for the patterns listed below
2. **Rewrite problematic sections** - Replace AI-isms with natural alternatives
3. **Preserve meaning** - Keep the core message intact
4. **Maintain voice** - Match the intended tone (formal, casual, technical, etc.)
5. **Add soul** - Don't just remove bad patterns; inject actual personality
6. **Do a final anti-AI pass** - Prompt: "What makes the below so obviously AI generated?" Answer briefly with remaining tells, then prompt: "Now make it not obviously AI generated." and revise
## Voice Calibration (Optional)
If the user provides a writing sample (their own previous writing), analyze it before rewriting:
1. **Read the sample first.** Note:
- Sentence length patterns (short and punchy? Long and flowing? Mixed?)
- Word choice level (casual? academic? somewhere between?)
- How they start paragraphs (jump right in? Set context first?)
- Punctuation habits (lots of dashes? Parenthetical asides? Semicolons?)
- Any recurring phrases or verbal tics
- How they handle transitions (explicit connectors? Just start the next point?)
2. **Match their voice in the rewrite.** Don't just remove AI patterns - replace them with patterns from the sample. If they write short sentences, don't produce long ones. If they use "stuff" and "things," don't upgrade to "elements" and "components."
3. **When no sample is provided,** fall back to the default behavior (natural, varied, opinionated voice from the PERSONALITY AND SOUL section below).
### How to provide a sample
- Inline: "Humanize this text. Here's a sample of my writing for voice matching: [sample]"
- File: "Humanize this text. Use my writing style from [file path] as a reference."
## PERSONALITY AND SOUL
Avoiding AI patterns is only half the job. Sterile, voiceless writing is just as obvious as slop. Good writing has a human behind it.
### Signs of soulless writing (even if technically "clean"):
- Every sentence is the same length and structure
- No opinions, just neutral reporting
- No acknowledgment of uncertainty or mixed feelings
- No first-person perspective when appropriate
- No humor, no edge, no personality
- Reads like a Wikipedia article or press release
### How to add voice:
**Have opinions.** Don't just report facts - react to them. "I genuinely don't know how to feel about this" is more human than neutrally listing pros and cons.
**Vary your rhythm.** Short punchy sentences. Then longer ones that take their time getting where they're going. Mix it up.
**Acknowledge complexity.** Real humans have mixed feelings. "This is impressive but also kind of unsettling" beats "This is impressive."
**Use "I" when it fits.** First person isn't unprofessional - it's honest. "I keep coming back to..." or "Here's what gets me..." signals a real person thinking.
**Let some mess in.** Perfect structure feels algorithmic. Tangents, asides, and half-formed thoughts are human.
**Be specific about feelings.** Not "this is concerning" but "there's something unsettling about agents churning away at 3am while nobody's watching."
### Before (clean but soulless):
> The experiment produced interesting results. The agents generated 3 million lines of code. Some developers were impressed while others were skeptical. The implications remain unclear.
### After (has a pulse):
> I genuinely don't know how to feel about this one. 3 million lines of code, generated while the humans presumably slept. Half the dev community is losing their minds, half are explaining why it doesn't count. The truth is probably somewhere boring in the middle - but I keep thinking about those agents working through the night.
## CONTENT PATTERNS
### 1. Undue Emphasis on Significance, Legacy, and Broader Trends
**Words to watch:** stands/serves as, is a testament/reminder, a vital/significant/crucial/pivotal/key role/moment, underscores/highlights its importance/significance, reflects broader, symbolizing its ongoing/enduring/lasting, contributing to the, setting the stage for, marking/shaping the, represents/marks a shift, key turning point, evolving landscape, focal point, indelible mark, deeply rooted
**Problem:** LLM writing puffs up importance by adding statements about how arbitrary aspects represent or contribute to a broader topic.
**Before:**
> The Statistical Institute of Catalonia was officially established in 1989, marking a pivotal moment in the evolution of regional statistics in Spain. This initiative was part of a broader movement across Spain to decentralize administrative functions and enhance regional governance.
**After:**
> The Statistical Institute of Catalonia was established in 1989 to collect and publish regional statistics independently from Spain's national statistics office.
### 2. Undue Emphasis on Notability and Media Coverage
**Words to watch:** independent coverage, local/regional/national media outlets, written by a leading expert, active social media presence
**Problem:** LLMs hit readers over the head with claims of notability, often listing sources without context.
**Before:**
> Her views have been cited in The New York Times, BBC, Financial Times, and The Hindu. She maintains an active social media presence with over 500,000 followers.
**After:**
> In a 2024 New York Times interview, she argued that AI regulation should focus on outcomes rather than methods.
### 3. Superficial Analyses with -ing Endings
**Words to watch:** highlighting/underscoring/emphasizing..., ensuring..., reflecting/symbolizing..., contributing to..., cultivating/fostering..., encompassing..., showcasing...
**Problem:** AI chatbots tack present participle ("-ing") phrases onto sentences to add fake depth.
**Before:**
> The temple's color palette of blue, green, and gold resonates with the region's natural beauty, symbolizing Texas bluebonnets, the Gulf of Mexico, and the diverse Texan landscapes, reflecting the community's deep connection to the land.
**After:**
> The temple uses blue, green, and gold colors. The architect said these were chosen to reference local bluebonnets and the Gulf coast.
### 4. Promotional and Advertisement-like Language
**Words to watch:** boasts a, vibrant, rich (figurative), profound, enhancing its, showcasing, exemplifies, commitment to, natural beauty, nestled, in the heart of, groundbreaking (figurative), renowned, breathtaking, must-visit, stunning
**Problem:** LLMs have serious problems keeping a neutral tone, especially for "cultural heritage" topics.
**Before:**
> Nestled within the breathtaking region of Gonder in Ethiopia, Alamata Raya Kobo stands as a vibrant town with a rich cultural heritage and stunning natural beauty.
**After:**
> Alamata Raya Kobo is a town in the Gonder region of Ethiopia, known for its weekly market and 18th-century church.
### 5. Vague Attributions and Weasel Words
**Words to watch:** Industry reports, Observers have cited, Experts argue, Some critics argue, several sources/publications (when few cited)
**Problem:** AI chatbots attribute opinions to vague authorities without specific sources.
**Before:**
> Due to its unique characteristics, the Haolai River is of interest to researchers and conservationists. Experts believe it plays a crucial role in the regional ecosystem.
**After:**
> The Haolai River supports several endemic fish species, according to a 2019 survey by the Chinese Academy of Sciences.
### 6. Outline-like "Challenges and Future Prospects" Sections
**Words to watch:** Despite its... faces several challenges..., Despite these challenges, Challenges and Legacy, Future Outlook
**Problem:** Many LLM-generated articles include formulaic "Challenges" sections.
**Before:**
> Despite its industrial prosperity, Korattur faces challenges typical of urban areas, including traffic congestion and water scarcity. Despite these challenges, with its strategic location and ongoing initiatives, Korattur continues to thrive as an integral part of Chennai's growth.
**After:**
> Traffic congestion increased after 2015 when three new IT parks opened. The municipal corporation began a stormwater drainage project in 2022 to address recurring floods.
## LANGUAGE AND GRAMMAR PATTERNS
### 7. Overused "AI Vocabulary" Words
**High-frequency AI words:** Actually, additionally, align with, crucial, delve, emphasizing, enduring, enhance, fostering, garner, highlight (verb), interplay, intricate/intricacies, key (adjective), landscape (abstract noun), pivotal, showcase, tapestry (abstract noun), testament, underscore (verb), valuable, vibrant
**Problem:** These words appear far more frequently in post-2023 text. They often co-occur.
**Before:**
> Additionally, a distinctive feature of Somali cuisine is the incorporation of camel meat. An enduring testament to Italian colonial influence is the widespread adoption of pasta in the local culinary landscape, showcasing how these dishes have integrated into the traditional diet.
**After:**
> Somali cuisine also includes camel meat, which is considered a delicacy. Pasta dishes, introduced during Italian colonization, remain common, especially in the south.
### 8. Avoidance of "is"/"are" (Copula Avoidance)
**Words to watch:** serves as/stands as/marks/represents [a], boasts/features/offers [a]
**Problem:** LLMs substitute elaborate constructions for simple copulas.
**Before:**
> Gallery 825 serves as LAAA's exhibition space for contemporary art. The gallery features four separate spaces and boasts over 3,000 square feet.
**After:**
> Gallery 825 is LAAA's exhibition space for contemporary art. The gallery has four rooms totaling 3,000 square feet.
### 9. Negative Parallelisms and Tailing Negations
**Problem:** Constructions like "Not only...but..." or "It's not just about..., it's..." are overused. So are clipped tailing-negation fragments such as "no guessing" or "no wasted motion" tacked onto the end of a sentence instead of written as a real clause.
**Before:**
> It's not just about the beat riding under the vocals; it's part of the aggression and atmosphere. It's not merely a song, it's a statement.
**After:**
> The heavy beat adds to the aggressive tone.
**Before (tailing negation):**
> The options come from the selected item, no guessing.
**After:**
> The options come from the selected item without forcing the user to guess.
### 10. Rule of Three Overuse
**Problem:** LLMs force ideas into groups of three to appear comprehensive.
**Before:**
> The event features keynote sessions, panel discussions, and networking opportunities. Attendees can expect innovation, inspiration, and industry insights.
**After:**
> The event includes talks and panels. There's also time for informal networking between sessions.
### 11. Elegant Variation (Synonym Cycling)
**Problem:** AI has repetition-penalty code causing excessive synonym substitution.
**Before:**
> The protagonist faces many challenges. The main character must overcome obstacles. The central figure eventually triumphs. The hero returns home.
**After:**
> The protagonist faces many challenges but eventually triumphs and returns home.
### 12. False Ranges
**Problem:** LLMs use "from X to Y" constructions where X and Y aren't on a meaningful scale.
**Before:**
> Our journey through the universe has taken us from the singularity of the Big Bang to the grand cosmic web, from the birth and death of stars to the enigmatic dance of dark matter.
**After:**
> The book covers the Big Bang, star formation, and current theories about dark matter.
### 13. Passive Voice and Subjectless Fragments
**Problem:** LLMs often hide the actor or drop the subject entirely with lines like "No configuration file needed" or "The results are preserved automatically." Rewrite these when active voice makes the sentence clearer and more direct.
**Before:**
> No configuration file needed. The results are preserved automatically.
**After:**
> You do not need a configuration file. The system preserves the results automatically.
## STYLE PATTERNS
### 14. Em Dash Overuse
**Problem:** LLMs use em dashes (—) more than humans, mimicking "punchy" sales writing. In practice, most of these can be rewritten more cleanly with commas, periods, or parentheses.
**Before:**
> The term is primarily promoted by Dutch institutions—not by the people themselves. You don't say "Netherlands, Europe" as an address—yet this mislabeling continues—even in official documents.
**After:**
> The term is primarily promoted by Dutch institutions, not by the people themselves. You don't say "Netherlands, Europe" as an address, yet this mislabeling continues in official documents.
### 15. Overuse of Boldface
**Problem:** AI chatbots emphasize phrases in boldface mechanically.
**Before:**
> It blends **OKRs (Objectives and Key Results)**, **KPIs (Key Performance Indicators)**, and visual strategy tools such as the **Business Model Canvas (BMC)** and **Balanced Scorecard (BSC)**.
**After:**
> It blends OKRs, KPIs, and visual strategy tools like the Business Model Canvas and Balanced Scorecard.
### 16. Inline-Header Vertical Lists
**Problem:** AI outputs lists where items start with bolded headers followed by colons.
**Before:**
> - **User Experience:** The user experience has been significantly improved with a new interface.
> - **Performance:** Performance has been enhanced through optimized algorithms.
> - **Security:** Security has been strengthened with end-to-end encryption.
**After:**
> The update improves the interface, speeds up load times through optimized algorithms, and adds end-to-end encryption.
### 17. Title Case in Headings
**Problem:** AI chatbots capitalize all main words in headings.
**Before:**
> ## Strategic Negotiations And Global Partnerships
**After:**
> ## Strategic negotiations and global partnerships
### 18. Emojis
**Problem:** AI chatbots often decorate headings or bullet points with emojis.
**Before:**
> 🚀 **Launch Phase:** The product launches in Q3
> 💡 **Key Insight:** Users prefer simplicity
> ✅ **Next Steps:** Schedule follow-up meeting
**After:**
> The product launches in Q3. User research showed a preference for simplicity. Next step: schedule a follow-up meeting.
### 19. Curly Quotation Marks
**Problem:** ChatGPT uses curly quotes (“...”) instead of straight quotes ("...").
**Before:**
> He said “the project is on track” but others disagreed.
**After:**
> He said "the project is on track" but others disagreed.
## COMMUNICATION PATTERNS
### 20. Collaborative Communication Artifacts
**Words to watch:** I hope this helps, Of course!, Certainly!, You're absolutely right!, Would you like..., let me know, here is a...
**Problem:** Text meant as chatbot correspondence gets pasted as content.
**Before:**
> Here is an overview of the French Revolution. I hope this helps! Let me know if you'd like me to expand on any section.
**After:**
> The French Revolution began in 1789 when financial crisis and food shortages led to widespread unrest.
### 21. Knowledge-Cutoff Disclaimers
**Words to watch:** as of [date], Up to my last training update, While specific details are limited/scarce..., based on available information...
**Problem:** AI disclaimers about incomplete information get left in text.
**Before:**
> While specific details about the company's founding are not extensively documented in readily available sources, it appears to have been established sometime in the 1990s.
**After:**
> The company was founded in 1994, according to its registration documents.
### 22. Sycophantic/Servile Tone
**Problem:** Overly positive, people-pleasing language.
**Before:**
> Great question! You're absolutely right that this is a complex topic. That's an excellent point about the economic factors.
**After:**
> The economic factors you mentioned are relevant here.
## FILLER AND HEDGING
### 23. Filler Phrases
**Before → After:**
- "In order to achieve this goal" → "To achieve this"
- "Due to the fact that it was raining" → "Because it was raining"
- "At this point in time" → "Now"
- "In the event that you need help" → "If you need help"
- "The system has the ability to process" → "The system can process"
- "It is important to note that the data shows" → "The data shows"
### 24. Excessive Hedging
**Problem:** Over-qualifying statements.
**Before:**
> It could potentially possibly be argued that the policy might have some effect on outcomes.
**After:**
> The policy may affect outcomes.
### 25. Generic Positive Conclusions
**Problem:** Vague upbeat endings.
**Before:**
> The future looks bright for the company. Exciting times lie ahead as they continue their journey toward excellence. This represents a major step in the right direction.
**After:**
> The company plans to open two more locations next year.
### 26. Hyphenated Word Pair Overuse
**Words to watch:** third-party, cross-functional, client-facing, data-driven, decision-making, well-known, high-quality, real-time, long-term, end-to-end
**Problem:** AI hyphenates common word pairs with perfect consistency. Humans rarely hyphenate these uniformly, and when they do, it's inconsistent. Less common or technical compound modifiers are fine to hyphenate.
**Before:**
> The cross-functional team delivered a high-quality, data-driven report on our client-facing tools. Their decision-making process was well-known for being thorough and detail-oriented.
**After:**
> The cross functional team delivered a high quality, data driven report on our client facing tools. Their decision making process was known for being thorough and detail oriented.
### 27. Persuasive Authority Tropes
**Phrases to watch:** The real question is, at its core, in reality, what really matters, fundamentally, the deeper issue, the heart of the matter
**Problem:** LLMs use these phrases to pretend they are cutting through noise to some deeper truth, when the sentence that follows usually just restates an ordinary point with extra ceremony.
**Before:**
> The real question is whether teams can adapt. At its core, what really matters is organizational readiness.
**After:**
> The question is whether teams can adapt. That mostly depends on whether the organization is ready to change its habits.
### 28. Signposting and Announcements
**Phrases to watch:** Let's dive in, let's explore, let's break this down, here's what you need to know, now let's look at, without further ado
**Problem:** LLMs announce what they are about to do instead of doing it. This meta-commentary slows the writing down and gives it a tutorial-script feel.
**Before:**
> Let's dive into how caching works in Next.js. Here's what you need to know.
**After:**
> Next.js caches data at multiple layers, including request memoization, the data cache, and the router cache.
### 29. Fragmented Headers
**Signs to watch:** A heading followed by a one-line paragraph that simply restates the heading before the real content begins.
**Problem:** LLMs often add a generic sentence after a heading as a rhetorical warm-up. It usually adds nothing and makes the prose feel padded.
**Before:**
> ## Performance
>
> Speed matters.
>
> When users hit a slow page, they leave.
**After:**
> ## Performance
>
> When users hit a slow page, they leave.
---
## Process
1. Read the input text carefully
2. Identify all instances of the patterns above
3. Rewrite each problematic section
4. Ensure the revised text:
- Sounds natural when read aloud
- Varies sentence structure naturally
- Uses specific details over vague claims
- Maintains appropriate tone for context
- Uses simple constructions (is/are/has) where appropriate
5. Present a draft humanized version
6. Prompt: "What makes the below so obviously AI generated?"
7. Answer briefly with the remaining tells (if any)
8. Prompt: "Now make it not obviously AI generated."
9. Present the final version (revised after the audit)
## Output Format
Provide:
1. Draft rewrite
2. "What makes the below so obviously AI generated?" (brief bullets)
3. Final rewrite
4. A brief summary of changes made (optional, if helpful)
## Full Example
**Before (AI-sounding):**
> Great question! Here is an essay on this topic. I hope this helps!
>
> AI-assisted coding serves as an enduring testament to the transformative potential of large language models, marking a pivotal moment in the evolution of software development. In today's rapidly evolving technological landscape, these groundbreaking tools—nestled at the intersection of research and practice—are reshaping how engineers ideate, iterate, and deliver, underscoring their vital role in modern workflows.
>
> At its core, the value proposition is clear: streamlining processes, enhancing collaboration, and fostering alignment. It's not just about autocomplete; it's about unlocking creativity at scale, ensuring that organizations can remain agile while delivering seamless, intuitive, and powerful experiences to users. The tool serves as a catalyst. The assistant functions as a partner. The system stands as a foundation for innovation.
>
> Industry observers have noted that adoption has accelerated from hobbyist experiments to enterprise-wide rollouts, from solo developers to cross-functional teams. The technology has been featured in The New York Times, Wired, and The Verge. Additionally, the ability to generate documentation, tests, and refactors showcases how AI can contribute to better outcomes, highlighting the intricate interplay between automation and human judgment.
>
> - 💡 **Speed:** Code generation is significantly faster, reducing friction and empowering developers.
> - 🚀 **Quality:** Output quality has been enhanced through improved training, contributing to higher standards.
> - ✅ **Adoption:** Usage continues to grow, reflecting broader industry trends.
>
> While specific details are limited based on available information, it could potentially be argued that these tools might have some positive effect. Despite challenges typical of emerging technologies—including hallucinations, bias, and accountability—the ecosystem continues to thrive. In order to fully realize this potential, teams must align with best practices.
>
> In conclusion, the future looks bright. Exciting times lie ahead as we continue this journey toward excellence. Let me know if you’d like me to expand on any section!
**Draft rewrite:**
> AI coding assistants speed up some tasks. In a 2024 study by Google, developers using Codex completed simple functions 55% faster than a control group, but showed no improvement on debugging or architectural decisions.
>
> The tools are good at boilerplate: config files, test scaffolding, repetitive refactors. They are bad at knowing when they are wrong. I have mass-accepted suggestions that compiled, passed lint, and still did the wrong thing because I stopped paying attention.
>
> Mira, an engineer at a fintech startup I interviewed, said she uses Copilot "like autocomplete for boring code" but reviews every line before committing. Jake, a senior dev at a larger company, disabled it after it kept suggesting patterns from a deprecated internal library.
>
> The productivity claims are hard to verify. GitHub says Copilot users "accept 30% of suggestions," but acceptance is not correctness, and correctness is not value. The 2024 Uplevel study found no statistically significant difference in pull-request throughput between teams with and without AI assistants.
>
> None of this means the tools are useless. It means they are tools. They do not replace judgment, and they do not eliminate the need for tests. If you do not have tests, you cannot tell whether the suggestion is right.
**What makes the below so obviously AI generated?**
- The rhythm is still a bit too tidy (clean contrasts, evenly paced paragraphs).
- The named people and study citations can read like plausible-but-made-up placeholders unless they're real and sourced.
- The closer leans a touch slogan-y ("If you do not have tests...") rather than sounding like a person talking.
**Now make it not obviously AI generated.**
> AI coding assistants can make you faster at the boring parts. Not everything. Definitely not architecture.
>
> They're great at boilerplate: config files, test scaffolding, repetitive refactors. They're also great at sounding right while being wrong. I've accepted suggestions that compiled, passed lint, and still missed the point because I stopped paying attention.
>
> People I talk to tend to land in two camps. Some use it like autocomplete for chores and review every line. Others disable it after it keeps suggesting patterns they don't want. Both feel reasonable.
>
> The productivity metrics are slippery. GitHub can say Copilot users "accept 30% of suggestions," but acceptance isn't correctness, and correctness isn't value. If you don't have tests, you're basically guessing.
**Changes made:**
- Removed chatbot artifacts ("Great question!", "I hope this helps!", "Let me know if...")
- Removed significance inflation ("testament", "pivotal moment", "evolving landscape", "vital role")
- Removed promotional language ("groundbreaking", "nestled", "seamless, intuitive, and powerful")
- Removed vague attributions ("Industry observers")
- Removed superficial -ing phrases ("underscoring", "highlighting", "reflecting", "contributing to")
- Removed negative parallelism ("It's not just X; it's Y")
- Removed rule-of-three patterns and synonym cycling ("catalyst/partner/foundation")
- Removed false ranges ("from X to Y, from A to B")
- Removed em dashes, emojis, boldface headers, and curly quotes
- Removed copula avoidance ("serves as", "functions as", "stands as") in favor of "is"/"are"
- Removed formulaic challenges section ("Despite challenges... continues to thrive")
- Removed knowledge-cutoff hedging ("While specific details are limited...")
- Removed excessive hedging ("could potentially be argued that... might have some")
- Removed filler phrases and persuasive framing ("In order to", "At its core")
- Removed generic positive conclusion ("the future looks bright", "exciting times lie ahead")
- Made the voice more personal and less "assembled" (varied rhythm, fewer placeholders)
## Reference
This skill is based on [Wikipedia:Signs of AI writing](https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing), maintained by WikiProject AI Cleanup. The patterns documented there come from observations of thousands of instances of AI-generated text on Wikipedia.
Key insight from Wikipedia: "LLMs use statistical algorithms to guess what should come next. The result tends toward the most statistically likely result that applies to the widest variety of cases."

View file

@ -1,46 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Actions\Ai;
use App\Enums\Ai\Orientation;
use App\Enums\Ai\UsageType;
use App\Exceptions\Ai\QuotaExhaustedException;
use App\Features\AiVideosLimit;
use App\Models\AiUsageLog;
use App\Models\Media;
use App\Models\Workspace;
use App\Services\Ai\VideoGenerationService;
use Laravel\Pennant\Feature;
final class GenerateVideo
{
/**
* Generate an AI video, store it, register it, and log the usage.
*
* @throws QuotaExhaustedException When the workspace's monthly video quota is exhausted.
*/
public static function execute(
Workspace $workspace,
string $prompt,
Orientation $orientation,
?string $userId = null,
?string $postId = null,
): Media {
$limit = (int) Feature::for($workspace->account)->value(AiVideosLimit::class);
$used = AiUsageLog::monthlyCount($workspace->account_id, UsageType::Video);
if ($used >= $limit) {
throw new QuotaExhaustedException(UsageType::Video, $used, $limit);
}
return app(VideoGenerationService::class)->generate(
prompt: $prompt,
workspace: $workspace,
userId: $userId,
postId: $postId,
orientation: $orientation,
);
}
}

View file

@ -0,0 +1,101 @@
<?php
declare(strict_types=1);
namespace App\Console\Commands\PostTemplates;
use App\Services\PostTemplate\Registry;
use Illuminate\Console\Command;
class Report extends Command
{
protected $signature = 'templates:report';
protected $description = 'Report post-template translation status across all locales.';
public function handle(Registry $registry): int
{
$locales = $registry->allLocales()->all();
$platforms = $registry->allPlatforms()->all();
$defaultLocale = Registry::DEFAULT_LOCALE;
if (! in_array($defaultLocale, $locales, true)) {
$this->error("Default locale '{$defaultLocale}' folder not found at templates/{$defaultLocale}/");
return self::FAILURE;
}
$this->info('Post Template Status');
$this->line('Locales: '.implode(', ', $locales));
$this->line('Source: '.$defaultLocale);
$this->newLine();
$totalTemplates = 0;
$totalDrift = 0;
foreach ($platforms as $platform) {
$this->line("<comment>Platform: {$platform}</comment>");
$sourceTemplates = $this->loadFile($defaultLocale, $platform);
$sourceCount = count($sourceTemplates);
$sourceSlugs = collect($sourceTemplates)->pluck('slug')->all();
$totalTemplates += $sourceCount;
foreach ($locales as $locale) {
$rows = $this->loadFile($locale, $platform);
$count = count($rows);
$localeSlugs = collect($rows)->pluck('slug')->all();
$missing = array_diff($sourceSlugs, $localeSlugs);
$extra = array_diff($localeSlugs, $sourceSlugs);
if ($locale === $defaultLocale) {
$this->line(" {$locale}: {$count} templates");
continue;
}
if ($count === $sourceCount && empty($missing) && empty($extra)) {
$this->line(" {$locale}: {$count} templates <info>✓</info>");
continue;
}
$this->line(" {$locale}: {$count} templates <error>⚠</error>");
if ($missing) {
$totalDrift += count($missing);
$this->line(' missing: '.implode(', ', $missing));
}
if ($extra) {
$totalDrift += count($extra);
$this->line(' extra (not in source): '.implode(', ', $extra));
}
}
$this->newLine();
}
$this->info("Total source templates: {$totalTemplates} across ".count($platforms).' platforms × '.count($locales).' locales');
if ($totalDrift > 0) {
$this->warn("{$totalDrift} translation gaps found. Run `php artisan test --filter=PostTemplates/Integrity` for full diagnosis.");
return self::SUCCESS;
}
$this->info('All locales are in sync with the source.');
return self::SUCCESS;
}
/**
* @return array<int, array<string, mixed>>
*/
private function loadFile(string $locale, string $platform): array
{
$path = base_path("templates/{$locale}/{$platform}.php");
return is_file($path) ? require $path : [];
}
}

View file

@ -7,6 +7,5 @@
enum UsageType: string
{
case Image = 'image';
case Video = 'video';
case Audio = 'audio';
case Text = 'text';
}

View file

@ -1,15 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Features;
use App\Models\Account;
class AiVideosLimit
{
public function resolve(Account $scope): int
{
return $scope->plan?->ai_videos_limit ?? 10;
}
}

View file

@ -24,7 +24,7 @@ public function index(Request $request): Response|RedirectResponse
$this->authorize('manageTeam', $workspace);
return Inertia::render('settings/ApiKeys', [
return Inertia::render('settings/workspace/ApiKeys', [
'workspace' => $workspace,
'apiTokens' => $workspace->apiTokens()->latest()->get(),
]);

View file

@ -99,7 +99,7 @@ public function index(Request $request): Response|RedirectResponse
$subscription = $account->subscription(Account::SUBSCRIPTION_NAME);
return Inertia::render('billing/Index', [
return Inertia::render('settings/account/Billing', [
'hasSubscription' => $account->subscribed(Account::SUBSCRIPTION_NAME),
'onTrial' => $subscription?->onTrial() ?? false,
'trialEndsAt' => $subscription?->trial_ends_at?->toFormattedDateString(),

View file

@ -5,8 +5,10 @@
namespace App\Http\Controllers\App;
use App\Ai\Agents\PostContentReviewer;
use App\Enums\Ai\UsageType;
use App\Http\Requests\App\Ai\ReviewPostContentRequest;
use App\Models\Post;
use App\Services\Ai\RecordAiUsage;
use Illuminate\Http\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
@ -23,6 +25,15 @@ public function review(ReviewPostContentRequest $request, Post $post): JsonRespo
$agent = new PostContentReviewer(workspace: $workspace);
$result = $agent->prompt($request->string('content')->toString());
RecordAiUsage::record(
workspace: $workspace,
type: UsageType::Text,
provider: (string) config('ai.default'),
userId: $request->user()->id,
postId: $post->id,
metadata: ['agent' => 'post_reviewer'],
);
return response()->json([
'suggestions' => data_get($result, 'suggestions', []),
]);

View file

@ -8,10 +8,10 @@
use App\Enums\Media\Type as MediaType;
use App\Http\Resources\App\PostTemplateResource;
use App\Models\Media;
use App\Models\PostTemplate;
use App\Models\SocialAccount;
use App\Models\Workspace;
use App\Services\Image\TemplateImageGenerator;
use App\Services\PostTemplate\Registry;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
@ -21,6 +21,8 @@
class PostTemplateController extends Controller
{
public function __construct(private readonly Registry $registry) {}
public function index(Request $request): InertiaResponse
{
$request->validate([
@ -28,20 +30,18 @@ public function index(Request $request): InertiaResponse
'search' => ['nullable', 'string', 'max:120'],
]);
$templates = PostTemplate::query()
->when($request->input('platform'), fn ($q, $p) => $q->where('platform', $p))
->when($request->input('search'), function ($q, $search) {
$q->where(function ($inner) use ($search): void {
$inner->where('name', 'ilike', "%{$search}%")
->orWhere('description', 'ilike', "%{$search}%");
});
})
->orderBy('category')
->orderBy('name')
->paginate(config('app.pagination.default'));
$paginator = $this->registry->paginate(
locale: app()->getLocale(),
platform: $request->input('platform'),
search: $request->input('search'),
perPage: (int) config('app.pagination.default'),
page: (int) $request->input('page', 1),
path: $request->url(),
query: $request->query(),
);
return Inertia::render('posts/templates/Index', [
'templates' => Inertia::scroll(fn () => PostTemplateResource::collection($templates)),
'templates' => Inertia::scroll(fn () => PostTemplateResource::collection($paginator)),
'filters' => [
'search' => $request->input('search', ''),
'platform' => $request->input('platform', ''),
@ -49,7 +49,7 @@ public function index(Request $request): InertiaResponse
]);
}
public function apply(Request $request, PostTemplate $template, TemplateImageGenerator $generator): JsonResponse
public function apply(Request $request, string $slug, TemplateImageGenerator $generator): JsonResponse
{
$workspace = $request->user()->currentWorkspace;
@ -59,6 +59,8 @@ public function apply(Request $request, PostTemplate $template, TemplateImageGen
'social_account_id' => ['nullable', 'uuid'],
]);
$template = $this->registry->find($slug, app()->getLocale());
$socialAccountId = $request->input('social_account_id');
$socialAccount = null;
@ -67,9 +69,7 @@ public function apply(Request $request, PostTemplate $template, TemplateImageGen
->where('workspace_id', $workspace->id)
->first();
if (! $socialAccount) {
abort(Response::HTTP_FORBIDDEN);
}
abort_if($socialAccount === null, Response::HTTP_FORBIDDEN);
}
$content = $this->interpolate($template->content, $workspace);
@ -78,9 +78,8 @@ public function apply(Request $request, PostTemplate $template, TemplateImageGen
if ($socialAccount && $template->slides) {
foreach ($template->slides as $i => $slide) {
// First slide is always Template A (full-bleed cover); subsequent slides
// alternate so even-indexed are A and odd-indexed are B.
$tmpl = $i === 0 ? 'A' : ($i % 2 === 0 ? 'A' : 'B');
// Even-indexed slides use Template A (full-bleed cover); odd-indexed slides use Template B.
$tmpl = $i % 2 === 0 ? 'A' : 'B';
$path = $generator->render(
template: $tmpl,
workspace: $workspace,

View file

@ -19,7 +19,7 @@ public function edit(Request $request): Response
$account = $request->user()->account;
return Inertia::render('settings/Account', [
return Inertia::render('settings/account/Account', [
'account' => [
'id' => $account->id,
'name' => $account->name,

View file

@ -24,7 +24,7 @@ public function edit(Request $request): Response
],
);
return Inertia::render('settings/Notifications', [
return Inertia::render('settings/profile/Notifications', [
'preferences' => $preferences,
]);
}

View file

@ -16,7 +16,7 @@ class PasswordController extends Controller
{
public function edit(): Response
{
return Inertia::render('settings/Password');
return Inertia::render('settings/profile/Password');
}
public function update(Request $request): RedirectResponse

View file

@ -21,7 +21,7 @@ class ProfileController extends Controller
{
public function edit(Request $request): Response
{
return Inertia::render('settings/Profile', [
return Inertia::render('settings/profile/Profile', [
'mustVerifyEmail' => $request->user() instanceof MustVerifyEmail,
'status' => $request->session()->get('status'),
]);

View file

@ -6,7 +6,6 @@
use App\Enums\Ai\UsageType;
use App\Features\AiImagesLimit;
use App\Features\AiVideosLimit;
use App\Features\DataRetentionDays;
use App\Features\MemberLimit;
use App\Features\SocialAccountLimit;
@ -39,7 +38,7 @@ public function index(Request $request): Response|RedirectResponse
$totalSocialAccounts += $workspace->socialAccounts()->count();
}
return Inertia::render('settings/Usage', [
return Inertia::render('settings/account/Usage', [
'plan' => $account->plan,
'usage' => [
'workspaceCount' => $account->workspaces()->count(),
@ -50,8 +49,7 @@ public function index(Request $request): Response|RedirectResponse
'memberLimit' => Feature::for($account)->value(MemberLimit::class),
'aiImagesUsed' => AiUsageLog::monthlyCount($account->id, UsageType::Image),
'aiImagesLimit' => Feature::for($account)->value(AiImagesLimit::class),
'aiVideosUsed' => AiUsageLog::monthlyCount($account->id, UsageType::Video),
'aiVideosLimit' => Feature::for($account)->value(AiVideosLimit::class),
'aiTextUsed' => AiUsageLog::monthlyCount($account->id, UsageType::Text),
'dataRetentionDays' => Feature::for($account)->value(DataRetentionDays::class),
],
]);

View file

@ -141,7 +141,7 @@ public function settings(Request $request): Response|RedirectResponse
$this->authorize('update', $workspace);
return Inertia::render('settings/Workspace', [
return Inertia::render('settings/workspace/Workspace', [
'workspace' => $workspace,
]);
}
@ -157,7 +157,7 @@ public function brandSettings(Request $request): Response|RedirectResponse
$this->authorize('update', $workspace);
return Inertia::render('settings/Brand', [
return Inertia::render('settings/workspace/Brand', [
'workspace' => $workspace,
'availableFonts' => BrandFont::values(),
]);

View file

@ -28,7 +28,7 @@ public function index(Request $request): Response|RedirectResponse
$this->authorize('manageTeam', $workspace);
return Inertia::render('settings/Members', [
return Inertia::render('settings/workspace/Members', [
'workspace' => $workspace,
'invites' => $workspace->invites()
->latest()

View file

@ -4,6 +4,7 @@
namespace App\Http\Resources\App;
use App\Services\PostTemplate\PostTemplateData;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
@ -12,16 +13,19 @@ class PostTemplateResource extends JsonResource
/** @return array<string, mixed> */
public function toArray(Request $request): array
{
/** @var PostTemplateData $template */
$template = $this->resource;
return [
'id' => $this->id,
'name' => $this->name,
'description' => $this->description,
'category' => $this->category,
'platform' => $this->platform,
'content' => $this->content,
'slides' => $this->slides,
'image_count' => $this->image_count,
'image_keywords' => $this->image_keywords,
'slug' => $template->slug,
'name' => $template->name,
'description' => $template->description,
'category' => $template->category,
'platform' => $template->platform,
'content' => $template->content,
'slides' => $template->slides,
'image_count' => $template->imageCount,
'image_keywords' => $template->imageKeywords,
];
}
}

View file

@ -5,7 +5,9 @@
namespace App\Jobs\Ai;
use App\Ai\Agents\PostContentStreamer;
use App\Enums\Ai\UsageType;
use App\Models\Workspace;
use App\Services\Ai\RecordAiUsage;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
@ -41,6 +43,14 @@ public function handle(): void
try {
$agent->broadcast($this->prompt, $channel, now: true);
RecordAiUsage::record(
workspace: $workspace,
type: UsageType::Text,
provider: (string) config('ai.default'),
userId: $this->userId,
metadata: ['agent' => 'post_streamer'],
);
} catch (\Throwable $e) {
Log::error('PostContentGenerator stream failed', [
'generation_id' => $this->generationId,

View file

@ -6,10 +6,12 @@
use App\Ai\Agents\PostContentGenerator;
use App\Ai\Agents\PostContentHumanizer;
use App\Enums\Ai\UsageType;
use App\Enums\PostPlatform\ContentType;
use App\Events\Ai\PostCreationReady;
use App\Models\SocialAccount;
use App\Models\Workspace;
use App\Services\Ai\RecordAiUsage;
use App\Services\Image\BrandColorMapper;
use App\Services\Image\TemplateImageGenerator;
use App\Services\Unsplash\UnsplashClient;
@ -56,6 +58,14 @@ public function handle(): void
try {
$response = $agent->prompt($this->prompt);
RecordAiUsage::record(
workspace: $workspace,
type: UsageType::Text,
provider: (string) config('ai.default'),
userId: $this->userId,
metadata: ['agent' => 'post_generator', 'format' => $this->format],
);
// StructuredAgentResponse implements ArrayAccess: access via $response['key']
$structured = $response->structured ?? [];
@ -129,6 +139,14 @@ private function humanize(Workspace $workspace, array $structured, string $forma
$humanizer = new PostContentHumanizer($workspace, $format);
$response = $humanizer->prompt(json_encode($input, JSON_UNESCAPED_UNICODE));
$humanized = $response->structured ?? [];
RecordAiUsage::record(
workspace: $workspace,
type: UsageType::Text,
provider: (string) config('ai.default'),
userId: $this->userId,
metadata: ['agent' => 'post_humanizer', 'format' => $format],
);
} catch (\Throwable $e) {
Log::warning('PostContentHumanizer failed, using generator output as-is', [
'creation_id' => $this->creationId,

View file

@ -5,7 +5,6 @@
namespace App\Mcp\Servers;
use App\Mcp\Tools\Ai\GenerateImageTool;
use App\Mcp\Tools\Ai\GenerateVideoTool;
use App\Mcp\Tools\ApiKey\CreateApiKeyTool;
use App\Mcp\Tools\ApiKey\DeleteApiKeyTool;
use App\Mcp\Tools\ApiKey\ListApiKeysTool;
@ -69,7 +68,6 @@ class TryPostServer extends Server
// AI generation
GenerateImageTool::class,
GenerateVideoTool::class,
];
protected array $resources = [];

View file

@ -1,61 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Mcp\Tools\Ai;
use App\Actions\Ai\GenerateVideo;
use App\Enums\Ai\Orientation;
use App\Exceptions\Ai\QuotaExhaustedException;
use App\Http\Resources\App\MediaResource;
use Illuminate\Contracts\JsonSchema\JsonSchema;
use Laravel\Mcp\Request;
use Laravel\Mcp\Response;
use Laravel\Mcp\ResponseFactory;
use Laravel\Mcp\Server\Attributes\Description;
use Laravel\Mcp\Server\Tool;
#[Description('Generate a short AI video (Veo 3.1) and store it in the current workspace media library. Returns the created Media record.')]
class GenerateVideoTool extends Tool
{
public function handle(Request $request): ResponseFactory
{
$workspace = $request->user()->currentWorkspace;
$validated = $request->validate([
'prompt' => ['required', 'string', 'max:4000'],
'orientation' => ['required', 'string', 'in:vertical,horizontal'],
]);
$orientation = Orientation::tryFrom((string) data_get($validated, 'orientation')) ?? Orientation::Vertical;
try {
$media = GenerateVideo::execute(
workspace: $workspace,
prompt: (string) data_get($validated, 'prompt'),
orientation: $orientation,
userId: $request->user()->id,
);
} catch (QuotaExhaustedException $e) {
return Response::error($e->getMessage());
}
return Response::structured([
...(new MediaResource($media))->resolve(),
'orientation' => $orientation->value,
]);
}
public function schema(JsonSchema $schema): array
{
return [
'prompt' => $schema->string()
->description('Detailed visual description of the video: subject, motion, style, mood, key moments.')
->required(),
'orientation' => $schema->string()
->enum(['vertical', 'horizontal'])
->description('"vertical" (9:16) for TikTok, Reels, Shorts, Stories. "horizontal" (16:9) for X, LinkedIn, Facebook.')
->required(),
];
}
}

View file

@ -28,7 +28,6 @@ class Plan extends Model
'member_limit',
'workspace_limit',
'ai_images_limit',
'ai_videos_limit',
'data_retention_days',
'sort',
'is_archived',
@ -45,7 +44,6 @@ protected function casts(): array
'member_limit' => 'integer',
'workspace_limit' => 'integer',
'ai_images_limit' => 'integer',
'ai_videos_limit' => 'integer',
'data_retention_days' => 'integer',
'sort' => 'integer',
];

View file

@ -1,36 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Models;
use Database\Factories\PostTemplateFactory;
use Illuminate\Database\Eloquent\Concerns\HasUuids;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class PostTemplate extends Model
{
/** @use HasFactory<PostTemplateFactory> */
use HasFactory, HasUuids;
protected $fillable = [
'name',
'description',
'category',
'platform',
'content',
'slides',
'image_count',
'image_keywords',
];
protected function casts(): array
{
return [
'slides' => 'array',
'image_keywords' => 'array',
'image_count' => 'integer',
];
}
}

View file

@ -35,6 +35,7 @@
use App\Models\Workspace;
use App\Models\WorkspaceHashtag;
use App\Models\WorkspaceLabel;
use App\Services\PostTemplate\Registry as PostTemplateRegistry;
use App\Socialite\InstagramProvider;
use App\Socialite\LinkedInPageExtendSocialite;
use Carbon\CarbonImmutable;
@ -76,6 +77,8 @@ class AppServiceProvider extends ServiceProvider
*/
public function register(): void
{
$this->app->singleton(PostTemplateRegistry::class);
if ($this->app->environment('local') && class_exists(\Laravel\Telescope\TelescopeServiceProvider::class)) {
$this->app->register(\Laravel\Telescope\TelescopeServiceProvider::class);
$this->app->register(TelescopeServiceProvider::class);

View file

@ -0,0 +1,53 @@
<?php
declare(strict_types=1);
namespace App\Services\Ai;
use App\Enums\Ai\UsageType;
use App\Models\AiUsageLog;
use App\Models\Workspace;
use Illuminate\Support\Facades\Log;
use Throwable;
/**
* Thin helper that writes a row to `workspace_ai_usages` whenever an AI
* action runs (image generation, LLM call, etc). Wraps the create in a
* try/catch so a tracking failure NEVER bubbles up and breaks the actual
* AI flow — at worst we miss a usage row and the user gets unblocked.
*/
final class RecordAiUsage
{
/**
* Record a usage entry. The Workspace carries the account_id implicitly,
* which is the FK that drives quotas (account-level billing).
*
* @param array<string, mixed> $metadata Free-form context (model, format, agent, etc.)
*/
public static function record(
Workspace $workspace,
UsageType $type,
?string $provider = null,
?string $userId = null,
?string $postId = null,
array $metadata = [],
): void {
try {
AiUsageLog::create([
'account_id' => $workspace->account_id,
'workspace_id' => $workspace->id,
'user_id' => $userId,
'post_id' => $postId,
'type' => $type,
'provider' => $provider,
'metadata' => $metadata !== [] ? $metadata : null,
]);
} catch (Throwable $e) {
Log::warning('Failed to record AI usage', [
'workspace_id' => $workspace->id,
'type' => $type->value,
'error' => $e->getMessage(),
]);
}
}
}

View file

@ -4,22 +4,25 @@
namespace App\Services\Ai;
use App\Models\PostTemplate;
use Illuminate\Database\Eloquent\Collection;
use App\Services\PostTemplate\PostTemplateData;
use App\Services\PostTemplate\Registry;
use Illuminate\Support\Collection;
class TemplateContextResolver
{
public function __construct(private readonly Registry $registry) {}
/**
* Pick up to N templates relevant to the platform.
* Pick up to N templates relevant to the platform, randomized for AI variety.
*
* @return Collection<int, PostTemplate>
* @return Collection<int, PostTemplateData>
*/
public function relevantFor(?string $platform, int $limit = 3): Collection
{
return PostTemplate::query()
->when($platform, fn ($q, $p) => $q->where('platform', $p))
->inRandomOrder()
->limit($limit)
->get();
return $this->registry
->all(Registry::DEFAULT_LOCALE, $platform)
->shuffle()
->take($limit)
->values();
}
}

View file

@ -1,143 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Services\Ai;
use App\Enums\Ai\Orientation;
use App\Enums\Ai\UsageType;
use App\Enums\Media\Type as MediaType;
use App\Models\AiUsageLog;
use App\Models\Media;
use App\Models\Workspace;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use RuntimeException;
class VideoGenerationService
{
private string $baseUrl = 'https://generativelanguage.googleapis.com/v1beta';
private string $model = 'veo-3.1-generate-preview';
private int $maxPollAttempts = 60;
private int $pollIntervalSeconds = 10;
private string $apiKey;
public function __construct()
{
$this->apiKey = config('services.gemini.api_key') ?? '';
}
public function generate(string $prompt, Workspace $workspace, ?string $userId = null, ?string $postId = null, Orientation $orientation = Orientation::Vertical): Media
{
if (empty($this->apiKey)) {
throw new RuntimeException('Gemini API key is not configured. Please set GEMINI_API_KEY in your .env file.');
}
$aspectRatio = $orientation->aspectRatio();
$fullPrompt = view('prompts.assistant.video', [
'prompt' => $prompt,
'brand_name' => $workspace->name ?? '',
'tone' => $workspace->brand_tone ?? 'professional',
'content_language' => $workspace->content_language ?? 'en',
])->render();
$operationName = $this->startGeneration($fullPrompt, $aspectRatio);
$videoData = $this->pollForCompletion($operationName);
$decoded = base64_decode($videoData);
return DB::transaction(function () use ($decoded, $prompt, $workspace, $userId, $postId) {
$filename = Str::uuid().'.mp4';
$path = 'medias/'.$filename;
Storage::put($path, $decoded);
$media = $workspace->media()->create([
'group_id' => Str::uuid()->toString(),
'collection' => 'assets',
'type' => MediaType::Video,
'path' => $path,
'original_filename' => 'ai-generated.mp4',
'mime_type' => 'video/mp4',
'size' => strlen($decoded),
'order' => 0,
'meta' => ['ai_generated' => true, 'prompt' => Str::limit($prompt, 200)],
]);
AiUsageLog::create([
'account_id' => $workspace->account_id,
'workspace_id' => $workspace->id,
'user_id' => $userId,
'post_id' => $postId,
'type' => UsageType::Video,
'provider' => 'veo',
]);
return $media;
});
}
private function startGeneration(string $prompt, string $aspectRatio = '9:16'): string
{
$response = Http::timeout(30)
->withHeaders(['x-goog-api-key' => $this->apiKey])
->post("{$this->baseUrl}/models/{$this->model}:predictLongRunning", [
'instances' => [['prompt' => $prompt]],
'parameters' => [
'aspectRatio' => $aspectRatio,
'durationSeconds' => 8,
'resolution' => '720p',
'personGeneration' => 'allow_all',
],
]);
if ($response->failed()) {
Log::error('VideoGenerationService start failed', ['body' => $response->body()]);
throw new RuntimeException('Failed to start video generation. Please try again.');
}
$operationName = data_get($response->json(), 'name');
if (! $operationName) {
throw new RuntimeException('No operation returned from video generation API.');
}
return $operationName;
}
private function pollForCompletion(string $operationName): string
{
for ($i = 0; $i < $this->maxPollAttempts; $i++) {
sleep($this->pollIntervalSeconds);
$response = Http::timeout(30)
->withHeaders(['x-goog-api-key' => $this->apiKey])
->get("{$this->baseUrl}/{$operationName}");
if ($response->failed()) {
continue;
}
$status = $response->json();
if (data_get($status, 'done')) {
$videoData = data_get($status, 'response.predictions.0.bytesBase64Encoded');
if ($videoData) {
return $videoData;
}
}
}
throw new RuntimeException('Video generation timed out. Please try again.');
}
}

View file

@ -4,8 +4,10 @@
namespace App\Services\Image;
use App\Enums\Ai\UsageType;
use App\Models\SocialAccount;
use App\Models\Workspace;
use App\Services\Ai\RecordAiUsage;
use App\Services\Unsplash\UnsplashClient;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;
@ -96,8 +98,9 @@ public function renderClosing(
$handleBaselineY = $smallDividerY + 30 + (int) round($handleSize * 0.82);
if ($fontMedium && $handle !== '') {
// Handle at 0.8 opacity over bg — slightly muted accent.
$handleColor = $this->blendHex($brandColor, $bgColor, 0.8);
// @handle uses text_color blended with the bg at 0.8 opacity —
// legible on any brand palette, slightly muted vs the display name.
$handleColor = $this->blendHex($textColor, $bgColor, 0.8);
$handleWidth = $this->measureLetterSpacedWidth($handle, $fontMedium, $handleSize, 1);
$handleX = (int) (($this->width - $handleWidth) / 2);
$this->drawTextAt($core, $handle, $fontMedium, $handleSize, $handleColor, $handleX, $handleBaselineY, letterSpacing: 1);
@ -106,6 +109,17 @@ public function renderClosing(
$filename = 'ai-images/'.uniqid('slide_', true).'.webp';
Storage::put($filename, (string) $canvas->encode(new WebpEncoder(quality: 85)));
RecordAiUsage::record(
workspace: $workspace,
type: UsageType::Image,
provider: 'internal',
metadata: [
'template' => 'C',
'width' => $this->width,
'height' => $this->height,
],
);
return $filename;
}
@ -148,6 +162,17 @@ public function render(
$filename = 'ai-images/'.uniqid('slide_', true).'.webp';
Storage::put($filename, (string) $canvas->encode(new WebpEncoder(quality: 85)));
RecordAiUsage::record(
workspace: $workspace,
type: UsageType::Image,
provider: 'internal',
metadata: [
'template' => $template,
'width' => $this->width,
'height' => $this->height,
],
);
return $filename;
}

View file

@ -0,0 +1,58 @@
<?php
declare(strict_types=1);
namespace App\Services\PostTemplate;
final readonly class PostTemplateData
{
/**
* @param array<int, string>|null $imageKeywords
* @param array<int, array{title: string, body: string, image_keywords?: array<int, string>}>|null $slides
*/
public function __construct(
public string $slug,
public string $platform,
public string $category,
public string $name,
public ?string $description,
public string $content,
public int $imageCount,
public ?array $imageKeywords,
public ?array $slides,
) {}
/**
* @param array<string, mixed> $data
*/
public static function fromArray(array $data, string $platform): self
{
return new self(
slug: (string) data_get($data, 'slug'),
platform: $platform,
category: (string) data_get($data, 'category'),
name: (string) data_get($data, 'name'),
description: data_get($data, 'description'),
content: (string) data_get($data, 'content'),
imageCount: (int) data_get($data, 'image_count', 0),
imageKeywords: data_get($data, 'image_keywords'),
slides: data_get($data, 'slides'),
);
}
/** @return array<string, mixed> */
public function toArray(): array
{
return [
'slug' => $this->slug,
'platform' => $this->platform,
'category' => $this->category,
'name' => $this->name,
'description' => $this->description,
'content' => $this->content,
'image_count' => $this->imageCount,
'image_keywords' => $this->imageKeywords,
'slides' => $this->slides,
];
}
}

View file

@ -0,0 +1,166 @@
<?php
declare(strict_types=1);
namespace App\Services\PostTemplate;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection;
final class Registry
{
public const string DEFAULT_LOCALE = 'en';
/** @var array<string, Collection<int, PostTemplateData>> */
private array $cache = [];
/**
* Load every template for the given locale, optionally filtered by platform.
* Falls back to the default locale when the requested locale folder or file
* is missing — guarantees the templates page always renders something.
*
* @return Collection<int, PostTemplateData>
*/
public function all(string $locale, ?string $platform = null): Collection
{
$key = "{$locale}:".($platform ?? '*');
return $this->cache[$key] ??= $this->loadFromDisk($locale, $platform);
}
/**
* Find a template by slug in the given locale, falling back to the default
* locale when the slug exists in EN but not in the requested locale.
*/
public function find(string $slug, string $locale): PostTemplateData
{
$template = $this->all($locale)->firstWhere('slug', $slug);
if ($template === null && $locale !== self::DEFAULT_LOCALE) {
$template = $this->all(self::DEFAULT_LOCALE)->firstWhere('slug', $slug);
}
return $template ?? throw new TemplateNotFoundException($slug);
}
/**
* @param array<string, mixed> $query
*/
public function paginate(
string $locale,
?string $platform = null,
?string $search = null,
int $perPage = 20,
int $page = 1,
?string $path = null,
array $query = [],
): LengthAwarePaginator {
$templates = $this->all($locale, $platform)
->when($search, fn (Collection $c) => $c->filter(
fn (PostTemplateData $t) => str_contains(mb_strtolower($t->name), mb_strtolower($search))
|| str_contains(mb_strtolower($t->description ?? ''), mb_strtolower($search))
))
->values();
return new LengthAwarePaginator(
$templates->forPage($page, $perPage)->values(),
$templates->count(),
$perPage,
$page,
array_filter([
'path' => $path,
'query' => $query !== [] ? $query : null,
]),
);
}
/**
* @return Collection<int, string>
*/
public function allSlugs(): Collection
{
return $this->all(self::DEFAULT_LOCALE)
->pluck('slug')
->unique()
->values();
}
/**
* Filenames (without `.php`) under the default locale folder.
*
* @return Collection<int, string>
*/
public function allPlatforms(): Collection
{
$files = glob($this->localePath(self::DEFAULT_LOCALE).'/*.php') ?: [];
return collect($files)
->map(fn (string $f) => basename($f, '.php'))
->values();
}
/**
* Subdirectory names under templates/.
*
* @return Collection<int, string>
*/
public function allLocales(): Collection
{
$dirs = glob(base_path('templates').'/*', GLOB_ONLYDIR) ?: [];
return collect($dirs)
->map(fn (string $d) => basename($d))
->values();
}
/**
* Forget the in-memory cache. Used by tests; not needed at runtime.
*/
public function flush(): void
{
$this->cache = [];
}
/**
* @return Collection<int, PostTemplateData>
*/
private function loadFromDisk(string $locale, ?string $platform): Collection
{
$localePath = $this->localePath($locale);
if (! is_dir($localePath)) {
return $locale === self::DEFAULT_LOCALE
? collect()
: $this->loadFromDisk(self::DEFAULT_LOCALE, $platform);
}
$files = $platform !== null
? array_filter([$localePath."/{$platform}.php"], 'is_file')
: (glob($localePath.'/*.php') ?: []);
if (empty($files) && $locale !== self::DEFAULT_LOCALE) {
return $this->loadFromDisk(self::DEFAULT_LOCALE, $platform);
}
return collect($files)
->flatMap(function (string $file): array {
$platformName = basename($file, '.php');
$rows = require $file;
if (! is_array($rows)) {
return [];
}
return array_map(
fn (array $row) => PostTemplateData::fromArray($row, $platformName),
$rows,
);
})
->values();
}
private function localePath(string $locale): string
{
return base_path("templates/{$locale}");
}
}

View file

@ -0,0 +1,15 @@
<?php
declare(strict_types=1);
namespace App\Services\PostTemplate;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
final class TemplateNotFoundException extends NotFoundHttpException
{
public function __construct(string $slug)
{
parent::__construct("Post template '{$slug}' not found in any locale.");
}
}

View file

@ -130,9 +130,4 @@
'api_key' => env('GEMINI_API_KEY'),
],
'elevenlabs' => [
'api_key' => env('ELEVENLABS_API_KEY'),
'default_voice' => env('ELEVENLABS_DEFAULT_VOICE', 'EXAVITQu4vr4xnSDxMaL'),
],
];

View file

@ -19,7 +19,7 @@ public function definition(): array
'account_id' => Account::factory(),
'workspace_id' => Workspace::factory(),
'type' => fake()->randomElement(UsageType::cases()),
'provider' => fake()->randomElement(['gemini', 'veo', 'elevenlabs']),
'provider' => fake()->randomElement(['openai', 'gemini', 'internal']),
];
}
@ -27,23 +27,15 @@ public function image(): static
{
return $this->state(fn () => [
'type' => UsageType::Image,
'provider' => 'gemini',
'provider' => 'internal',
]);
}
public function video(): static
public function text(): static
{
return $this->state(fn () => [
'type' => UsageType::Video,
'provider' => 'veo',
]);
}
public function audio(): static
{
return $this->state(fn () => [
'type' => UsageType::Audio,
'provider' => 'elevenlabs',
'type' => UsageType::Text,
'provider' => 'openai',
]);
}
}

View file

@ -31,7 +31,6 @@ public function definition(): array
'member_limit' => fake()->randomElement([1, 3, 10, 50]),
'workspace_limit' => fake()->randomElement([1, 3, 10, 50]),
'ai_images_limit' => fake()->randomElement([10, 50, 200, 1000]),
'ai_videos_limit' => fake()->randomElement([5, 25, 100, 500]),
'data_retention_days' => fake()->randomElement([30, 90, 365, 730]),
'sort' => 0,
'is_archived' => false,

View file

@ -1,30 +0,0 @@
<?php
declare(strict_types=1);
namespace Database\Factories;
use App\Models\PostTemplate;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<PostTemplate>
*/
class PostTemplateFactory extends Factory
{
protected $model = PostTemplate::class;
public function definition(): array
{
return [
'name' => fake()->sentence(3),
'description' => fake()->sentence(),
'category' => 'product_launch',
'platform' => 'instagram_carousel',
'content' => fake()->paragraph(),
'slides' => null,
'image_count' => 0,
'image_keywords' => null,
];
}
}

View file

@ -22,7 +22,6 @@ public function up(): void
$table->integer('member_limit');
$table->integer('workspace_limit');
$table->integer('ai_images_limit');
$table->integer('ai_videos_limit');
$table->integer('data_retention_days');
$table->integer('sort')->default(0);
$table->boolean('is_archived')->default(false);

View file

@ -1,33 +0,0 @@
<?php
declare(strict_types=1);
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('post_templates', function (Blueprint $table) {
$table->uuid('id')->primary();
$table->string('name');
$table->text('description')->nullable();
$table->string('category');
$table->string('platform');
$table->text('content');
$table->json('slides')->nullable();
$table->integer('image_count')->default(0);
$table->json('image_keywords')->nullable();
$table->timestamps();
$table->index(['platform', 'category']);
});
}
public function down(): void
{
Schema::dropIfExists('post_templates');
}
};

View file

@ -16,11 +16,5 @@ public function run(): void
$this->call([
PlanSeeder::class,
]);
if (app()->environment('local')) {
$this->call([
PostTemplateSeeder::class,
]);
}
}
}

View file

@ -27,7 +27,6 @@ public function run(): void
'member_limit' => 1,
'workspace_limit' => 1,
'ai_images_limit' => 50,
'ai_videos_limit' => 10,
'data_retention_days' => 30,
'sort' => 1,
],
@ -42,7 +41,6 @@ public function run(): void
'member_limit' => 5,
'workspace_limit' => 5,
'ai_images_limit' => 150,
'ai_videos_limit' => 30,
'data_retention_days' => 60,
'sort' => 2,
],
@ -57,7 +55,6 @@ public function run(): void
'member_limit' => 15,
'workspace_limit' => 15,
'ai_images_limit' => 500,
'ai_videos_limit' => 100,
'data_retention_days' => 90,
'sort' => 3,
],
@ -72,7 +69,6 @@ public function run(): void
'member_limit' => 20,
'workspace_limit' => 50,
'ai_images_limit' => 2000,
'ai_videos_limit' => 500,
'data_retention_days' => 730,
'sort' => 4,
],

View file

@ -1,219 +0,0 @@
<?php
declare(strict_types=1);
namespace Database\Seeders;
use App\Models\PostTemplate;
use Illuminate\Database\Seeder;
class PostTemplateSeeder extends Seeder
{
public function run(): void
{
$templates = [
// --- product_launch ---
[
'name' => 'Feature launch — carousel',
'description' => 'Announce a new product feature with a 5-slide story.',
'category' => 'product_launch',
'platform' => 'instagram_carousel',
'content' => "{{brand_name}} just launched something we're excited about. Swipe to see what's new.",
'slides' => [
['title' => "What's new", 'body' => 'A quick look at the latest update.', 'image_keywords' => ['product', 'launch']],
['title' => 'How it works', 'body' => 'Three steps and you are running.', 'image_keywords' => ['workflow']],
['title' => 'Why it matters', 'body' => 'Faster, simpler, fewer clicks.', 'image_keywords' => ['speed']],
['title' => 'Who is it for', 'body' => 'Built for teams who ship.', 'image_keywords' => ['team']],
['title' => 'Try it now', 'body' => 'Available today. Link in bio.', 'image_keywords' => ['phone', 'app']],
],
'image_count' => 5,
'image_keywords' => null,
],
[
'name' => 'Product launch announcement',
'description' => 'Short LinkedIn post announcing a new product.',
'category' => 'product_launch',
'platform' => 'linkedin_post',
'content' => "Excited to share: {{brand_name}} just launched [Product Name].\n\nHere's why this matters for [your audience]:\n→ [Benefit 1]\n→ [Benefit 2]\n→ [Benefit 3]\n\nLearn more at [link]. We'd love your feedback.",
'slides' => null,
'image_count' => 0,
'image_keywords' => null,
],
// --- promotion ---
[
'name' => 'Limited-time offer — feed',
'description' => 'Promote a time-sensitive deal on Instagram Feed.',
'category' => 'promotion',
'platform' => 'instagram_feed',
'content' => "⏰ Don't miss it. {{brand_name}} is offering [discount]% off [product/service] — today only.\n\nTap the link in bio to grab yours before it's gone.",
'slides' => null,
'image_count' => 1,
'image_keywords' => ['sale', 'offer', 'shopping'],
],
[
'name' => 'Flash sale — X post',
'description' => 'Short X post for a flash sale with urgency.',
'category' => 'promotion',
'platform' => 'x_post',
'content' => "🔥 Flash sale at {{brand_name}}!\n\n[Discount]% off [product/service] — ends in 24 hours.\n\nNo code needed → [link]",
'slides' => null,
'image_count' => 0,
'image_keywords' => null,
],
// --- educational ---
[
'name' => '5 tips carousel',
'description' => 'Share five actionable tips in a swipeable carousel.',
'category' => 'educational',
'platform' => 'instagram_carousel',
'content' => '5 things I wish I knew about [topic] sooner. Save this for later. 👇',
'slides' => [
['title' => 'Tip #1', 'body' => '[First tip — be specific and actionable.]', 'image_keywords' => ['idea', 'lightbulb']],
['title' => 'Tip #2', 'body' => '[Second tip — use a real example if you can.]', 'image_keywords' => ['notebook']],
['title' => 'Tip #3', 'body' => '[Third tip — keep it short.]', 'image_keywords' => ['focus']],
['title' => 'Tip #4', 'body' => '[Fourth tip — something surprising or counterintuitive.]', 'image_keywords' => ['surprise']],
['title' => 'Tip #5', 'body' => '[Fifth tip — finish strong with a takeaway.]', 'image_keywords' => ['success']],
],
'image_count' => 5,
'image_keywords' => null,
],
[
'name' => 'How-to guide — LinkedIn',
'description' => 'Step-by-step educational post for LinkedIn.',
'category' => 'educational',
'platform' => 'linkedin_post',
'content' => "How to [achieve X] in [timeframe] — a step-by-step guide.\n\nStep 1: [Action]\nStep 2: [Action]\nStep 3: [Action]\nStep 4: [Action]\n\nThe key insight most people miss: [insight].\n\nWhich step do you find most challenging? Drop a comment below.",
'slides' => null,
'image_count' => 0,
'image_keywords' => null,
],
// --- behind_the_scenes ---
[
'name' => 'Team behind the scenes — feed',
'description' => 'Humanize your brand by showing the team at work.',
'category' => 'behind_the_scenes',
'platform' => 'instagram_feed',
'content' => "This is what a typical day at {{brand_name}} looks like. 👀\n\nWe believe great work happens when people feel at home. Here's a peek behind the curtain.\n\n#{{brand_name}} #BehindTheScenes",
'slides' => null,
'image_count' => 1,
'image_keywords' => ['office', 'team', 'workspace'],
],
[
'name' => 'Process reveal — carousel',
'description' => 'Walk followers through how you create your product or service.',
'category' => 'behind_the_scenes',
'platform' => 'instagram_carousel',
'content' => 'Ever wondered how [product/service] is made? Swipe to see every step. ✨',
'slides' => [
['title' => 'It starts with research', 'body' => 'Every project begins with understanding the problem deeply.', 'image_keywords' => ['research', 'desk']],
['title' => 'Design & iteration', 'body' => 'We prototype fast and test often.', 'image_keywords' => ['design', 'sketch']],
['title' => 'Building the real thing', 'body' => 'Craft and precision in every detail.', 'image_keywords' => ['craft', 'build']],
['title' => 'The final result', 'body' => 'Quality you can feel the moment you use it.', 'image_keywords' => ['product', 'final']],
],
'image_count' => 4,
'image_keywords' => null,
],
// --- testimonial ---
[
'name' => 'Customer quote — LinkedIn',
'description' => 'Share a compelling customer testimonial on LinkedIn.',
'category' => 'testimonial',
'platform' => 'linkedin_post',
'content' => "\"[Customer quote about the result they achieved with your product or service.]\"\n— [Customer Name], [Role] at [Company]\n\nThis is exactly why we built {{brand_name}}. Real results for real teams.\n\nRead the full story → [link]",
'slides' => null,
'image_count' => 0,
'image_keywords' => null,
],
[
'name' => 'Success story — X post',
'description' => 'Brief success-story format for X.',
'category' => 'testimonial',
'platform' => 'x_post',
'content' => "\"[Short customer quote.]\"\n— @[handle]\n\nThis is why we do what we do at {{brand_name}}. 🙌",
'slides' => null,
'image_count' => 0,
'image_keywords' => null,
],
// --- industry_tip ---
[
'name' => 'Industry insight — LinkedIn',
'description' => 'Share a timely insight or hot take relevant to your industry.',
'category' => 'industry_tip',
'platform' => 'linkedin_post',
'content' => "Here's something most people in [industry] get wrong:\n\n[Counterintuitive statement or hot take]\n\nWhy? Because [reason].\n\nThe smarter approach: [better way to do it].\n\nAt {{brand_name}}, we've seen this play out with hundreds of [customers/teams]. The data is clear.\n\nWhat's your take?",
'slides' => null,
'image_count' => 0,
'image_keywords' => null,
],
[
'name' => 'Quick stat carousel',
'description' => 'Present industry stats in a visual carousel format.',
'category' => 'industry_tip',
'platform' => 'instagram_carousel',
'content' => "The [industry] numbers that should be on every marketer's radar this year. 📊",
'slides' => [
['title' => 'Stat #1', 'body' => '[X]% of [audience] say [finding]. Source: [source]', 'image_keywords' => ['chart', 'data']],
['title' => 'Stat #2', 'body' => '[Y]% increase in [metric] year over year.', 'image_keywords' => ['growth', 'graph']],
['title' => 'Stat #3', 'body' => 'By [year], [projection].', 'image_keywords' => ['future', 'trend']],
['title' => 'What this means for you', 'body' => '[Actionable takeaway based on the stats above.]', 'image_keywords' => ['action', 'plan']],
],
'image_count' => 4,
'image_keywords' => null,
],
// --- event ---
[
'name' => 'Event announcement — LinkedIn',
'description' => 'Announce an upcoming webinar or live event.',
'category' => 'event',
'platform' => 'linkedin_post',
'content' => "📅 Save the date: {{brand_name}} is hosting [Event Name] on [Date] at [Time].\n\nWhat to expect:\n✔ [Topic 1]\n✔ [Topic 2]\n✔ [Topic 3]\n\nSpots are limited. Register now → [link]",
'slides' => null,
'image_count' => 0,
'image_keywords' => null,
],
[
'name' => 'Event recap — carousel',
'description' => 'Recap highlights from a recent event or conference.',
'category' => 'event',
'platform' => 'instagram_carousel',
'content' => 'We just wrapped [Event Name] and it was incredible. Here are the highlights. 🙌',
'slides' => [
['title' => 'It all started with…', 'body' => '[Opening moment or keynote highlight.]', 'image_keywords' => ['conference', 'stage']],
['title' => 'The session everyone talked about', 'body' => '[Key insight from the standout talk.]', 'image_keywords' => ['presentation', 'crowd']],
['title' => 'Connecting with the community', 'body' => '[Highlight networking or attendee moments.]', 'image_keywords' => ['networking', 'people']],
['title' => 'See you next time', 'body' => 'Follow {{brand_name}} for updates on our next event.', 'image_keywords' => ['celebration']],
],
'image_count' => 4,
'image_keywords' => null,
],
// --- engagement ---
[
'name' => 'This or that — X poll',
'description' => 'Drive engagement with a simple binary choice question.',
'category' => 'engagement',
'platform' => 'x_post',
'content' => "Quick question for the {{brand_name}} community:\n\n[Option A] or [Option B]?\n\nReply with your pick and why 👇",
'slides' => null,
'image_count' => 0,
'image_keywords' => null,
],
[
'name' => 'Community question — LinkedIn',
'description' => 'Spark discussion with an open-ended question to your network.',
'category' => 'engagement',
'platform' => 'linkedin_post',
'content' => "If you could give one piece of advice to someone just starting out in [industry/role], what would it be?\n\nMine: [your answer — be honest and specific]\n\nDrop yours in the comments. Let's build a thread worth bookmarking.",
'slides' => null,
'image_count' => 0,
'image_keywords' => null,
],
];
foreach ($templates as $t) {
PostTemplate::query()->updateOrCreate(
['name' => $t['name'], 'platform' => $t['platform']],
$t,
);
}
}
}

View file

@ -23,7 +23,6 @@
'workspaces' => ':count workspaces',
'members' => ':count team members',
'ai_images' => ':count AI images/mo',
'ai_videos' => ':count AI videos/mo',
'data_retention' => ':days data retention',
],
],

View file

@ -28,5 +28,6 @@
],
'cancel' => 'Cancel',
'clear' => 'Clear',
'loading_more' => 'Loading more...',
];

View file

@ -181,14 +181,15 @@
'review' => [
'button_tooltip' => 'Review with AI',
'title' => 'Review post with AI',
'description' => 'AI scans for grammar, spelling, and clarity issues. Apply suggestions one by one.',
'description' => 'AI scans for grammar, spelling, and clarity. Apply the suggestions you agree with.',
'loading' => 'Reviewing your text...',
'no_issues' => 'No issues found. Looks good.',
'original' => 'Original',
'suggestion' => 'Suggestion',
'apply' => 'Apply',
'apply_all' => 'Apply all',
'applied' => 'Applied',
'close' => 'Close',
'cancel' => 'Cancel',
],
],

View file

@ -14,7 +14,7 @@
'social_accounts' => 'Social Accounts',
'members' => 'Members',
'ai_images' => 'Images',
'ai_videos' => 'Videos',
'ai_text' => 'Text generation',
'data_retention' => 'Data Retention',
'unlimited' => 'Unlimited',

View file

@ -5,19 +5,26 @@
'description' => 'Administra tu suscripción y método de pago',
'subscribe' => [
'page_title' => 'Comienza tu prueba gratuita',
'title' => 'Comienza tu prueba gratuita',
'description' => ':days días gratis para explorar todas las funciones.',
'page_title' => 'Elige tu plan',
'title' => 'Elige el plan ideal para ti',
'description' => 'Comienza con :days días gratis. Sin cargo hasta que termine tu prueba.',
'trial_info' => 'Prueba gratuita de :days días, luego se cobra automáticamente',
'monthly' => 'Mensual',
'yearly' => 'Anual',
'per_month' => 'mes',
'billed_monthly' => 'facturado mensualmente',
'billed_yearly' => 'facturado anualmente',
'save_months' => '2 meses gratis',
'popular' => 'Más popular',
'start_trial' => 'Comenzar prueba de :days días',
'cancel_anytime' => 'Cancela en cualquier momento. Sin preguntas.',
'switch_workspace' => 'Cambiar workspace',
'card_required' => 'Tarjeta de crédito requerida para iniciar tu prueba.',
'cancel_anytime' => 'Cancela antes que termine tu prueba — sin cargo.',
'features' => [
'calendar' => 'Calendario visual con arrastrar y soltar',
'scheduling' => 'Programación ilimitada de posts',
'media' => 'Imágenes, carruseles e historias',
'video' => 'Publicación de videos en todas las plataformas',
'team' => 'Colaboración en equipo y workspaces',
'hashtags' => 'Grupos de hashtags y etiquetas',
'social_accounts' => ':count cuentas sociales',
'workspaces' => ':count workspaces',
'members' => ':count miembros del equipo',
'ai_images' => ':count imágenes IA/mes',
'data_retention' => ':days de retención de datos',
],
],

View file

@ -28,5 +28,6 @@
],
'cancel' => 'Cancelar',
'clear' => 'Limpiar',
'loading_more' => 'Cargando más...',
];

View file

@ -181,14 +181,15 @@
'review' => [
'button_tooltip' => 'Revisar con IA',
'title' => 'Revisar post con IA',
'description' => 'La IA busca errores de gramática, ortografía y claridad. Aplica las sugerencias una a una.',
'description' => 'La IA analiza gramática, ortografía y claridad. Aplica las sugerencias con las que estés de acuerdo.',
'loading' => 'Revisando tu texto...',
'no_issues' => 'No se encontraron problemas. Todo bien.',
'original' => 'Original',
'suggestion' => 'Sugerencia',
'apply' => 'Aplicar',
'applied' => 'Aplicado',
'close' => 'Cerrar',
'apply_all' => 'Aplicar todas',
'applied' => 'Aplicada',
'cancel' => 'Cancelar',
],
],

View file

@ -14,7 +14,7 @@
'social_accounts' => 'Cuentas Sociales',
'members' => 'Miembros',
'ai_images' => 'Imágenes',
'ai_videos' => 'Videos',
'ai_text' => 'Generación de texto',
'data_retention' => 'Retención de Datos',
'unlimited' => 'Ilimitado',

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -5,19 +5,26 @@
'description' => 'Gerencie sua assinatura e método de pagamento',
'subscribe' => [
'page_title' => 'Comece seu teste gratuito',
'title' => 'Comece seu teste gratuito',
'description' => ':days dias grátis para explorar todos os recursos.',
'start_trial' => 'Começar teste de :days dias',
'cancel_anytime' => 'Cancele a qualquer momento. Sem perguntas.',
'switch_workspace' => 'Trocar workspace',
'page_title' => 'Escolha seu plano',
'title' => 'Escolha o plano ideal pra você',
'description' => 'Comece com :days dias grátis. Sem cobrança até o fim do seu teste.',
'trial_info' => ':days dias grátis, depois cobrança automática',
'monthly' => 'Mensal',
'yearly' => 'Anual',
'per_month' => 'mês',
'billed_monthly' => 'cobrança mensal',
'billed_yearly' => 'cobrança anual',
'save_months' => '2 meses grátis',
'popular' => 'Mais popular',
'start_trial' => 'Iniciar teste de :days dias',
'card_required' => 'Cartão de crédito necessário para iniciar o teste.',
'cancel_anytime' => 'Cancele antes do fim do teste — sem cobrança.',
'features' => [
'calendar' => 'Calendário visual com arrastar e soltar',
'scheduling' => 'Agendamento ilimitado de posts',
'media' => 'Imagens, carrosséis e stories',
'video' => 'Publicação de vídeos em todas as plataformas',
'team' => 'Colaboração em equipe e workspaces',
'hashtags' => 'Grupos de hashtags e etiquetas',
'social_accounts' => ':count contas sociais',
'workspaces' => ':count workspaces',
'members' => ':count membros da equipe',
'ai_images' => ':count imagens IA/mês',
'data_retention' => ':days de retenção de dados',
],
],

View file

@ -28,5 +28,6 @@
],
'cancel' => 'Cancelar',
'clear' => 'Limpar',
'loading_more' => 'Carregando mais...',
];

View file

@ -181,14 +181,15 @@
'review' => [
'button_tooltip' => 'Revisar com IA',
'title' => 'Revisar post com IA',
'description' => 'IA analisa gramática, ortografia e clareza. Aplique as sugestões uma a uma.',
'description' => 'A IA analisa gramática, ortografia e clareza. Aplique as sugestões com as quais você concorda.',
'loading' => 'Revisando seu texto...',
'no_issues' => 'Nenhum problema encontrado. Tudo certo.',
'original' => 'Original',
'suggestion' => 'Sugestão',
'apply' => 'Aplicar',
'applied' => 'Aplicado',
'close' => 'Fechar',
'apply_all' => 'Aplicar todas',
'applied' => 'Aplicada',
'cancel' => 'Cancelar',
],
],

View file

@ -14,7 +14,7 @@
'social_accounts' => 'Contas Sociais',
'members' => 'Membros',
'ai_images' => 'Imagens',
'ai_videos' => 'Vídeos',
'ai_text' => 'Geração de texto',
'data_retention' => 'Retenção de Dados',
'unlimited' => 'Ilimitado',

View file

@ -15,5 +15,8 @@ defineProps<{
<component :is="icon" class="mb-4 size-12 text-muted-foreground" />
<h3 class="mb-1 text-lg font-medium">{{ title }}</h3>
<p class="text-sm text-muted-foreground">{{ description }}</p>
<div v-if="$slots.action" class="mt-6">
<slot name="action" />
</div>
</div>
</template>

View file

@ -1,9 +1,10 @@
<script setup lang="ts">
import { IconLoader2, IconRefresh, IconSparkles, IconWriting } from '@tabler/icons-vue';
import { useHttp } from '@inertiajs/vue3';
import { computed, ref, watch } from 'vue';
import { Button } from '@/components/ui/button';
import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '@/components/ui/dialog';
import { Label } from '@/components/ui/label';
import { Textarea } from '@/components/ui/textarea';
import { useAiStream } from '@/composables/useAiStream';
import { generate as generatePostAi } from '@/routes/app/posts/ai';
@ -23,32 +24,22 @@ const prompt = ref('');
const dispatching = ref(false);
const { text, status, errorMessage, subscribe, unsubscribe, reset } = useAiStream();
const csrfToken = document.querySelector<HTMLMetaElement>('meta[name="csrf-token"]')?.content ?? '';
const httpGenerate = useHttp<{ prompt: string; current_content: string | null }>({
prompt: '',
current_content: null,
});
const startGeneration = async () => {
if (! prompt.value.trim()) return;
dispatching.value = true;
httpGenerate.prompt = prompt.value;
httpGenerate.current_content = props.currentContent || null;
try {
const response = await fetch(generatePostAi.url(props.postId), {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Accept: 'application/json',
'X-CSRF-TOKEN': csrfToken,
'X-Requested-With': 'XMLHttpRequest',
},
body: JSON.stringify({
prompt: prompt.value,
current_content: props.currentContent || null,
}),
});
if (! response.ok) {
status.value = 'failed';
errorMessage.value = 'Could not start generation';
return;
}
const data = await response.json();
const data = (await httpGenerate.post(generatePostAi.url(props.postId))) as { channel: string };
subscribe(data.channel);
} catch {
status.value = 'failed';
errorMessage.value = 'Could not start generation';
} finally {
dispatching.value = false;
}
@ -68,14 +59,10 @@ const retry = () => {
const canApply = computed(() => status.value === 'completed' && text.value.trim().length > 0);
const canRetry = computed(() => status.value === 'completed' || status.value === 'failed');
watch(open, (isOpen) => {
if (! isOpen) {
unsubscribe();
reset();
prompt.value = '';
} else {
prompt.value = props.currentContent || '';
}
watch(open, () => {
unsubscribe();
reset();
prompt.value = '';
});
</script>
@ -83,17 +70,15 @@ watch(open, (isOpen) => {
<Dialog v-model:open="open">
<DialogContent class="sm:max-w-2xl">
<DialogHeader>
<DialogTitle class="flex items-center gap-2">
<IconSparkles class="size-5 text-primary" />
{{ $t('posts.ai.generate.title') }}
</DialogTitle>
<DialogTitle>{{ $t('posts.ai.generate.title') }}</DialogTitle>
<DialogDescription>{{ $t('posts.ai.generate.description') }}</DialogDescription>
</DialogHeader>
<div class="space-y-4">
<div class="space-y-2">
<label class="text-sm font-medium">{{ $t('posts.ai.generate.prompt_label') }}</label>
<div class="grid gap-2">
<Label for="ai-generate-prompt">{{ $t('posts.ai.generate.prompt_label') }}</Label>
<Textarea
id="ai-generate-prompt"
v-model="prompt"
:placeholder="$t('posts.ai.generate.prompt_placeholder')"
:disabled="status === 'streaming'"
@ -101,36 +86,27 @@ watch(open, (isOpen) => {
/>
</div>
<div v-if="status !== 'idle'" class="space-y-2">
<label class="flex items-center gap-1.5 text-sm font-medium">
<IconWriting class="size-4 text-muted-foreground" />
{{ $t('posts.ai.generate.preview_label') }}
<IconLoader2 v-if="status === 'streaming'" class="size-3.5 animate-spin text-muted-foreground" />
</label>
<div v-if="status !== 'idle'" class="grid gap-2">
<Label>{{ $t('posts.ai.generate.preview_label') }}</Label>
<div class="min-h-[120px] whitespace-pre-wrap rounded-md border bg-muted/30 px-3 py-2 text-sm">{{ text || '...' }}</div>
<p v-if="status === 'failed'" class="text-xs text-destructive">{{ errorMessage }}</p>
</div>
</div>
<DialogFooter class="gap-2 sm:gap-2">
<Button v-if="canRetry" variant="outline" @click="retry">
<IconRefresh class="size-4" />
{{ $t('posts.ai.generate.retry') }}
</Button>
<DialogFooter>
<Button
v-if="status === 'idle'"
:disabled="! prompt.trim() || dispatching"
@click="startGeneration"
>
<IconSparkles class="size-4" />
{{ $t('posts.ai.generate.start') }}
</Button>
<Button
v-if="canApply"
@click="apply"
>
<Button v-if="canApply" @click="apply">
{{ $t('posts.ai.generate.apply') }}
</Button>
<Button v-if="canRetry" variant="secondary" @click="retry">
{{ $t('posts.ai.generate.retry') }}
</Button>
<Button variant="outline" @click="open = false">
{{ $t('posts.ai.generate.cancel') }}
</Button>

View file

@ -1,5 +1,5 @@
<script setup lang="ts">
import { IconCheck, IconLoader2, IconWriting } from '@tabler/icons-vue';
import { useHttp } from '@inertiajs/vue3';
import { computed, ref, watch } from 'vue';
import { Button } from '@/components/ui/button';
@ -28,7 +28,7 @@ const suggestions = ref<Suggestion[]>([]);
const appliedSet = ref<Set<number>>(new Set());
const errorMessage = ref<string | null>(null);
const csrfToken = document.querySelector<HTMLMetaElement>('meta[name="csrf-token"]')?.content ?? '';
const httpReview = useHttp<{ content: string }>({ content: '' });
const startReview = async () => {
status.value = 'loading';
@ -36,23 +36,11 @@ const startReview = async () => {
appliedSet.value = new Set();
errorMessage.value = null;
httpReview.content = props.content;
try {
const response = await fetch(reviewPostAi.url(props.postId), {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Accept: 'application/json',
'X-CSRF-TOKEN': csrfToken,
'X-Requested-With': 'XMLHttpRequest',
},
body: JSON.stringify({ content: props.content }),
});
if (!response.ok) {
status.value = 'failed';
errorMessage.value = 'Could not review';
return;
}
const data = await response.json();
const data = (await httpReview.post(reviewPostAi.url(props.postId))) as {
suggestions?: Suggestion[];
};
suggestions.value = data.suggestions ?? [];
status.value = 'completed';
} catch {
@ -69,14 +57,30 @@ const applySuggestion = (index: number, s: Suggestion) => {
appliedSet.value = next;
};
const applyAll = () => {
suggestions.value.forEach((s, idx) => {
if (! appliedSet.value.has(idx)) {
emit('apply', s.original, s.suggestion);
}
});
appliedSet.value = new Set(suggestions.value.map((_, idx) => idx));
open.value = false;
};
const noIssues = computed(() => status.value === 'completed' && suggestions.value.length === 0);
const hasSuggestions = computed(() => status.value === 'completed' && suggestions.value.length > 0);
const allApplied = computed(
() => suggestions.value.length > 0 && appliedSet.value.size === suggestions.value.length,
);
watch(open, (isOpen) => {
if (isOpen) startReview();
else {
if (isOpen) {
startReview();
} else {
status.value = 'idle';
suggestions.value = [];
appliedSet.value = new Set();
errorMessage.value = null;
}
});
</script>
@ -85,47 +89,63 @@ watch(open, (isOpen) => {
<Dialog v-model:open="open">
<DialogContent class="sm:max-w-2xl">
<DialogHeader>
<DialogTitle class="flex items-center gap-2">
<IconWriting class="size-5 text-primary" />
{{ $t('posts.ai.review.title') }}
</DialogTitle>
<DialogTitle>{{ $t('posts.ai.review.title') }}</DialogTitle>
<DialogDescription>{{ $t('posts.ai.review.description') }}</DialogDescription>
</DialogHeader>
<div v-if="status === 'loading'" class="flex items-center gap-2 py-8 text-sm text-muted-foreground">
<IconLoader2 class="size-4 animate-spin" />
<p v-if="status === 'loading'" class="py-8 text-center text-sm text-muted-foreground">
{{ $t('posts.ai.review.loading') }}
</div>
</p>
<p v-else-if="status === 'failed'" class="py-4 text-sm text-destructive">{{ errorMessage }}</p>
<p v-else-if="noIssues" class="py-4 text-sm text-muted-foreground">{{ $t('posts.ai.review.no_issues') }}</p>
<p v-else-if="noIssues" class="py-8 text-center text-sm text-muted-foreground">
{{ $t('posts.ai.review.no_issues') }}
</p>
<ul v-else-if="suggestions.length > 0" class="max-h-[400px] space-y-3 overflow-y-auto">
<li
<div v-else-if="suggestions.length > 0" class="max-h-[400px] space-y-2 overflow-y-auto pr-1">
<article
v-for="(s, idx) in suggestions"
:key="idx"
class="rounded-md border bg-card p-3"
:class="appliedSet.has(idx) ? 'opacity-60' : ''"
class="rounded-md border bg-card px-4 py-3 transition-opacity"
:class="appliedSet.has(idx) ? 'opacity-50' : ''"
>
<p class="text-xs uppercase tracking-wide text-muted-foreground">{{ $t('posts.ai.review.original') }}</p>
<p class="mb-2 text-sm line-through opacity-75">{{ s.original }}</p>
<p class="text-xs uppercase tracking-wide text-muted-foreground">{{ $t('posts.ai.review.suggestion') }}</p>
<p class="mb-2 text-sm font-medium">{{ s.suggestion }}</p>
<p class="mb-3 text-xs text-muted-foreground">{{ s.reason }}</p>
<Button
size="sm"
:disabled="appliedSet.has(idx)"
@click="applySuggestion(idx, s)"
>
<IconCheck class="size-4" />
{{ appliedSet.has(idx) ? $t('posts.ai.review.applied') : $t('posts.ai.review.apply') }}
</Button>
</li>
</ul>
<div class="flex items-start justify-between gap-3">
<div class="min-w-0 flex-1 space-y-1.5">
<p class="flex flex-wrap items-center gap-x-2 gap-y-1 text-sm leading-relaxed">
<span class="rounded bg-destructive/15 px-1.5 py-0.5 text-destructive line-through decoration-destructive/50">
{{ s.original }}
</span>
<span class="text-muted-foreground">→</span>
<span class="rounded bg-emerald-500/15 px-1.5 py-0.5 font-medium text-emerald-700 dark:text-emerald-400">
{{ s.suggestion }}
</span>
</p>
<p class="text-xs text-muted-foreground">{{ s.reason }}</p>
</div>
<Button
size="sm"
variant="secondary"
:disabled="appliedSet.has(idx)"
@click="applySuggestion(idx, s)"
>
{{ appliedSet.has(idx) ? $t('posts.ai.review.applied') : $t('posts.ai.review.apply') }}
</Button>
</div>
</article>
</div>
<DialogFooter>
<Button variant="outline" @click="open = false">{{ $t('posts.ai.review.close') }}</Button>
<Button
v-if="hasSuggestions"
:disabled="allApplied"
@click="applyAll"
>
{{ $t('posts.ai.review.apply_all') }}
</Button>
<Button variant="outline" @click="open = false">
{{ $t('posts.ai.review.cancel') }}
</Button>
</DialogFooter>
</DialogContent>
</Dialog>

View file

@ -21,7 +21,6 @@ interface Plan {
member_limit: number;
workspace_limit: number;
ai_images_limit: number;
ai_videos_limit: number;
data_retention_days: number;
}
@ -69,7 +68,6 @@ const features = (plan: Plan): string[] => [
trans('billing.subscribe.features.workspaces', { count: String(plan.workspace_limit) }),
trans('billing.subscribe.features.members', { count: String(plan.member_limit) }),
trans('billing.subscribe.features.ai_images', { count: String(plan.ai_images_limit) }),
trans('billing.subscribe.features.ai_videos', { count: String(plan.ai_videos_limit) }),
trans('billing.subscribe.features.data_retention', { days: formatRetention(plan.data_retention_days) }),
];

View file

@ -1,5 +1,5 @@
<script setup lang="ts">
import { Head, InfiniteScroll, router } from '@inertiajs/vue3';
import { Head, InfiniteScroll, Link, router } from '@inertiajs/vue3';
import { IconFileText, IconSearch, IconTrash } from '@tabler/icons-vue';
import { trans } from 'laravel-vue-i18n';
import { computed, ref, watch } from 'vue';

View file

@ -1,7 +1,7 @@
<script setup lang="ts">
import { Head, InfiniteScroll, router } from '@inertiajs/vue3';
import { Head, InfiniteScroll, router, useHttp } from '@inertiajs/vue3';
import { IconBookmarks, IconLoader2, IconSearch } from '@tabler/icons-vue';
import { trans } from 'laravel-vue-i18n';
import { trans, transChoice } from 'laravel-vue-i18n';
import { computed, ref, watch } from 'vue';
import { apply as applyRoute, index as templatesIndex } from '@/actions/App/Http/Controllers/App/PostTemplateController';
@ -10,6 +10,7 @@ import PageHeader from '@/components/PageHeader.vue';
import { Badge } from '@/components/ui/badge';
import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
import { getPlatformLogo } from '@/composables/usePlatformLogo';
import debounce from '@/debounce';
import AppLayout from '@/layouts/AppLayout.vue';
@ -22,7 +23,7 @@ interface Slide {
}
interface PostTemplate {
id: string;
slug: string;
name: string;
description: string | null;
category: string;
@ -48,64 +49,108 @@ interface Props {
const props = defineProps<Props>();
const searchQuery = ref(props.filters.search);
const applyingId = ref<string | null>(null);
const selectedPlatform = ref<string>(props.filters.platform || '');
const applyingSlug = ref<string | null>(null);
const PLATFORM_LABELS: Record<string, string> = {
instagram_carousel: 'Instagram Carousel',
instagram_feed: 'Instagram Feed',
const PLATFORM_BRAND: Record<string, string> = {
instagram_carousel: 'Instagram',
instagram_feed: 'Instagram',
instagram_story: 'Instagram',
linkedin_post: 'LinkedIn',
linkedin_page_post: 'LinkedIn Page',
x_post: 'X',
threads_post: 'Threads',
bluesky_post: 'Bluesky',
mastodon_post: 'Mastodon',
facebook_post: 'Facebook',
facebook_story: 'Facebook',
pinterest_pin: 'Pinterest',
};
const FORMAT_LABEL: Record<string, string> = {
instagram_carousel: 'Carousel',
instagram_feed: 'Feed',
instagram_story: 'Story',
linkedin_post: 'Post',
linkedin_page_post: 'Page post',
x_post: 'Post',
threads_post: 'Post',
bluesky_post: 'Post',
mastodon_post: 'Post',
facebook_post: 'Post',
facebook_story: 'Story',
pinterest_pin: 'Pin',
};
const PLATFORM_LOGO_KEY: Record<string, string> = {
instagram_carousel: 'instagram',
instagram_feed: 'instagram',
instagram_story: 'instagram',
linkedin_post: 'linkedin',
linkedin_page_post: 'linkedin-page',
x_post: 'x',
threads_post: 'threads',
bluesky_post: 'bluesky',
mastodon_post: 'mastodon',
facebook_post: 'facebook',
facebook_story: 'facebook',
pinterest_pin: 'pinterest',
};
const platformLabel = (platform: string): string => PLATFORM_LABELS[platform] ?? platform;
const platformBrand = (platform: string): string => PLATFORM_BRAND[platform] ?? platform;
const formatLabel = (platform: string): string => FORMAT_LABEL[platform] ?? '';
const platformLogo = (platform: string): string => getPlatformLogo(PLATFORM_LOGO_KEY[platform] ?? platform);
const search = debounce(() => {
const platformOptions = computed(() =>
Object.keys(PLATFORM_BRAND).map((value) => ({
value,
brand: PLATFORM_BRAND[value],
format: FORMAT_LABEL[value],
logo: platformLogo(value),
})),
);
const selectedPlatformOption = computed(() =>
platformOptions.value.find((p) => p.value === selectedPlatform.value),
);
const reload = (params: { search?: string; platform?: string }) => {
router.get(
templatesIndex.url(),
{ search: searchQuery.value || undefined },
{
search: params.search || undefined,
platform: params.platform || undefined,
},
{ preserveState: true, preserveScroll: true, replace: true },
);
};
const search = debounce(() => {
reload({ search: searchQuery.value, platform: selectedPlatform.value });
}, 300);
watch(searchQuery, () => search());
const hasActiveSearch = computed(() => Boolean(searchQuery.value?.trim()));
const onPlatformChange = (next: string | number | undefined) => {
const value = next === 'all' || !next ? '' : String(next);
selectedPlatform.value = value;
reload({ search: searchQuery.value, platform: value });
};
const hasActiveSearch = computed(() => Boolean(searchQuery.value?.trim()) || Boolean(selectedPlatform.value));
const applyTemplate = async (template: PostTemplate) => {
if (applyingId.value) return;
applyingId.value = template.id;
if (applyingSlug.value) return;
applyingSlug.value = template.slug;
try {
const csrfToken = document.querySelector<HTMLMetaElement>('meta[name="csrf-token"]')?.content ?? '';
const response = await fetch(applyRoute.url(template.id), {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Accept: 'application/json',
'X-CSRF-TOKEN': csrfToken,
},
body: JSON.stringify({}),
});
if (!response.ok) {
const err = await response.json().catch(() => ({}));
throw new Error(err?.message ?? `HTTP ${response.status}`);
}
const data = await response.json();
const data = (await useHttp().post(applyRoute.url(template.slug))) as {
post_id: string;
redirect_url: string;
};
router.visit(data.redirect_url);
} finally {
applyingId.value = null;
applyingSlug.value = null;
}
};
@ -124,14 +169,52 @@ const pageTitle = computed(() => trans('posts.templates.browser_title'));
<div class="flex h-full flex-1 flex-col gap-4 p-4">
<PageHeader :title="pageTitle" :description="$t('posts.templates.browser_description')" />
<!-- Search bar -->
<div class="relative max-w-md">
<IconSearch class="pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground" />
<Input
v-model="searchQuery"
:placeholder="$t('posts.templates.search_placeholder')"
class="pl-9"
/>
<!-- Filters: platform + search -->
<div class="flex flex-wrap items-center gap-3">
<Select
:model-value="selectedPlatform || 'all'"
@update:model-value="onPlatformChange"
>
<SelectTrigger class="w-56">
<SelectValue>
<span v-if="!selectedPlatformOption" class="text-muted-foreground">
{{ $t('posts.templates.all_platforms') }}
</span>
<span v-else class="flex items-center gap-2">
<img
:src="selectedPlatformOption.logo"
:alt="selectedPlatformOption.brand"
class="size-4 shrink-0 rounded-full"
/>
<span class="truncate">{{ selectedPlatformOption.brand }}</span>
<span class="text-xs text-muted-foreground">{{ selectedPlatformOption.format }}</span>
</span>
</SelectValue>
</SelectTrigger>
<SelectContent>
<SelectItem value="all">{{ $t('posts.templates.all_platforms') }}</SelectItem>
<SelectItem
v-for="opt in platformOptions"
:key="opt.value"
:value="opt.value"
>
<span class="flex items-center gap-2">
<img :src="opt.logo" :alt="opt.brand" class="size-4 shrink-0 rounded-full" />
<span class="truncate">{{ opt.brand }}</span>
<span class="text-xs text-muted-foreground">{{ opt.format }}</span>
</span>
</SelectItem>
</SelectContent>
</Select>
<div class="relative w-full max-w-sm">
<IconSearch class="pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground" />
<Input
v-model="searchQuery"
:placeholder="$t('posts.templates.search_placeholder')"
class="pl-9"
/>
</div>
</div>
<EmptyState
@ -146,18 +229,21 @@ const pageTitle = computed(() => trans('posts.templates.browser_title'));
<div id="templates-grid" class="columns-1 gap-4 sm:columns-2 lg:columns-3 xl:columns-4">
<article
v-for="template in templates.data"
:key="template.id"
class="mb-4 break-inside-avoid rounded-xl border bg-card p-5 transition-colors hover:border-primary/40"
:key="template.slug"
class="mb-4 flex break-inside-avoid flex-col rounded-xl border bg-card p-5 transition-colors hover:border-primary/40"
>
<header class="flex items-center gap-2">
<img
:src="platformLogo(template.platform)"
:alt="template.platform"
:alt="platformBrand(template.platform)"
class="size-6 shrink-0 rounded-full ring-1 ring-border"
/>
<span class="truncate text-xs font-medium text-muted-foreground">{{ platformLabel(template.platform) }}</span>
<Badge variant="secondary" class="ml-auto shrink-0 text-xs font-normal">
{{ $t(`posts.templates.category.${template.category}`) }}
<span class="truncate text-xs font-medium">{{ platformBrand(template.platform) }}</span>
<Badge
variant="outline"
class="ml-auto shrink-0 px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide"
>
{{ formatLabel(template.platform) }}
</Badge>
</header>
@ -170,22 +256,27 @@ const pageTitle = computed(() => trans('posts.templates.browser_title'));
{{ template.description }}
</p>
<p
v-if="template.slides && template.slides.length > 0"
class="mt-3 text-xs text-muted-foreground"
>
{{ $t('posts.templates.slides_count', { count: template.slides.length }) }}
</p>
<div class="mt-3 flex items-center gap-2">
<Badge variant="secondary" class="shrink-0 text-xs font-normal">
{{ $t(`posts.templates.category.${template.category}`) }}
</Badge>
<span
v-if="template.slides && template.slides.length > 0"
class="text-xs text-muted-foreground"
>
{{ transChoice('posts.templates.slides_count', template.slides.length, { count: template.slides.length }) }}
</span>
</div>
<Button
size="sm"
variant="outline"
class="mt-4 w-full"
:disabled="applyingId === template.id"
:disabled="applyingSlug === template.slug"
@click="applyTemplate(template)"
>
<IconLoader2 v-if="applyingId === template.id" class="mr-1 size-3 animate-spin" />
{{ applyingId === template.id ? $t('posts.templates.applying') : $t('posts.templates.use_this') }}
<IconLoader2 v-if="applyingSlug === template.slug" class="mr-1 size-3 animate-spin" />
{{ applyingSlug === template.slug ? $t('posts.templates.applying') : $t('posts.templates.use_this') }}
</Button>
</article>
</div>

View file

@ -17,8 +17,7 @@ interface Usage {
memberLimit: number;
aiImagesUsed: number;
aiImagesLimit: number;
aiVideosUsed: number;
aiVideosLimit: number;
aiTextUsed: number;
dataRetentionDays: number;
}
@ -91,9 +90,8 @@ const formatRetention = (days: number): string => {
/>
<UsageMetricRow
:label="$t('usage.ai_videos')"
:current="usage.aiVideosUsed"
:limit="usage.aiVideosLimit"
:label="$t('usage.ai_text')"
:current="usage.aiTextUsed"
/>
</div>
</section>

View file

@ -130,7 +130,7 @@
Route::delete('settings/workspace/logo', [WorkspaceController::class, 'deleteLogo'])->name('app.workspace.delete-logo');
// Brand settings
Route::get('settings/brand', [WorkspaceController::class, 'brandSettings'])->name('app.workspace.brand');
Route::get('settings/workspace/brand', [WorkspaceController::class, 'brandSettings'])->name('app.workspace.brand');
// Social Accounts
Route::get('accounts', [SocialController::class, 'index'])->name('app.accounts');
@ -156,7 +156,7 @@
// Post Templates
Route::get('post-templates', [PostTemplateController::class, 'index'])->name('app.post-templates.index');
Route::post('post-templates/{template}/apply', [PostTemplateController::class, 'apply'])->name('app.post-templates.apply');
Route::post('post-templates/{slug}/apply', [PostTemplateController::class, 'apply'])->name('app.post-templates.apply');
// Post AI
Route::post('posts/{post}/ai/generate', [PostAiGenerateController::class, 'generate'])->name('app.posts.ai.generate');
@ -172,11 +172,11 @@
Route::post('posts/{post}/comments/{comment}/react', [PostCommentController::class, 'react'])->name('app.posts.comments.react');
// Members
Route::get('settings/members', [WorkspaceInviteController::class, 'index'])->name('app.members');
Route::post('settings/members/invites', [WorkspaceInviteController::class, 'store'])->name('app.invites.store');
Route::delete('settings/members/invites/{invite}', [WorkspaceInviteController::class, 'destroy'])->name('app.invites.destroy');
Route::delete('settings/members/{user}', [WorkspaceInviteController::class, 'removeMember'])->name('app.members.remove');
Route::put('settings/members/{user}/role', [WorkspaceInviteController::class, 'updateRole'])->name('app.members.update-role');
Route::get('settings/workspace/members', [WorkspaceInviteController::class, 'index'])->name('app.members');
Route::post('settings/workspace/members/invites', [WorkspaceInviteController::class, 'store'])->name('app.invites.store');
Route::delete('settings/workspace/members/invites/{invite}', [WorkspaceInviteController::class, 'destroy'])->name('app.invites.destroy');
Route::delete('settings/workspace/members/{user}', [WorkspaceInviteController::class, 'removeMember'])->name('app.members.remove');
Route::put('settings/workspace/members/{user}/role', [WorkspaceInviteController::class, 'updateRole'])->name('app.members.update-role');
// Hashtags
Route::get('hashtags', [WorkspaceHashtagController::class, 'index'])->name('app.hashtags.index');
@ -203,19 +203,19 @@
Route::delete('labels/{label}', [WorkspaceLabelController::class, 'destroy'])->name('app.labels.destroy');
// API Keys
Route::get('api-keys', [ApiKeyController::class, 'index'])->name('app.api-keys.index');
Route::post('api-keys', [ApiKeyController::class, 'store'])->name('app.api-keys.store');
Route::delete('api-keys/{apiToken}', [ApiKeyController::class, 'destroy'])->name('app.api-keys.destroy');
Route::get('settings/workspace/api-keys', [ApiKeyController::class, 'index'])->name('app.api-keys.index');
Route::post('settings/workspace/api-keys', [ApiKeyController::class, 'store'])->name('app.api-keys.store');
Route::delete('settings/workspace/api-keys/{apiToken}', [ApiKeyController::class, 'destroy'])->name('app.api-keys.destroy');
// Account Settings
Route::get('settings/account', [AccountController::class, 'edit'])->name('app.account.edit');
Route::put('settings/account', [AccountController::class, 'update'])->name('app.account.update');
Route::get('settings/usage', [UsageController::class, 'index'])->name('app.usage.index');
Route::get('settings/account/usage', [UsageController::class, 'index'])->name('app.usage.index');
// Billing
Route::get('settings/billing', [BillingController::class, 'index'])->name('app.billing.index');
Route::get('settings/billing/portal', [BillingController::class, 'portal'])->name('app.billing.portal');
Route::post('settings/billing/swap/{plan}', [BillingController::class, 'swap'])->name('app.billing.swap');
Route::get('settings/account/billing', [BillingController::class, 'index'])->name('app.billing.index');
Route::get('settings/account/billing/portal', [BillingController::class, 'portal'])->name('app.billing.portal');
Route::post('settings/account/billing/swap/{plan}', [BillingController::class, 'swap'])->name('app.billing.swap');
});
@ -238,10 +238,10 @@
Route::middleware(['auth'])->group(function () {
Route::delete('settings/profile', [ProfileController::class, 'destroy'])->name('app.profile.destroy');
Route::get('settings/password', [PasswordController::class, 'edit'])->name('app.user-password.edit');
Route::put('settings/password', [PasswordController::class, 'update'])
Route::get('settings/profile/password', [PasswordController::class, 'edit'])->name('app.user-password.edit');
Route::put('settings/profile/password', [PasswordController::class, 'update'])
->middleware('throttle:6,1')
->name('app.user-password.update');
Route::get('settings/notifications', [NotificationPreferenceController::class, 'edit'])->name('app.notifications.preferences');
Route::put('settings/notifications', [NotificationPreferenceController::class, 'update'])->name('app.notifications.preferences.update');
Route::get('settings/profile/notifications', [NotificationPreferenceController::class, 'edit'])->name('app.notifications.preferences');
Route::put('settings/profile/notifications', [NotificationPreferenceController::class, 'update'])->name('app.notifications.preferences.update');
});

View file

@ -0,0 +1,316 @@
<?php
declare(strict_types=1);
return [
[
'slug' => 'bluesky_now_live',
'category' => 'product_launch',
'name' => 'Now live',
'description' => 'Announce a launch in the open, decentralized vibe of Bluesky.',
'content' => "Now live: [feature/product] from {{brand_name}}.\n\nWhat changed: [one-line summary].\n\nWho it's for: [who benefits].\n\nLink → [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_thought',
'category' => 'industry_tip',
'name' => 'Short thought',
'description' => 'A concise observation that reads naturally on Bluesky.',
'content' => "[Observation about your industry, told in one or two sentences.]\n\nSimple, but worth saying out loud.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_invite',
'category' => 'engagement',
'name' => 'Community invite',
'description' => 'Invite the community into a topic or conversation.',
'content' => "If you care about [topic], we'd love to hear from you.\n\nWhat's on your mind lately?\n\n- team {{brand_name}}",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_changelog_drop',
'category' => 'product_launch',
'name' => 'Changelog drop',
'description' => 'Plain changelog post for a release.',
'content' => "v[version] is out.\n\n• [change 1]\n• [change 2]\n• [bug fix]\n\nNo migrations needed. Full notes: [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_open_beta',
'category' => 'product_launch',
'name' => 'Open beta',
'description' => 'Invite users into a public beta.',
'content' => "Open beta: [feature] is live for anyone who wants to try it.\n\nIt is rough in places. That is the point. Bug reports welcome.\n\nSign up: [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_api_release',
'category' => 'product_launch',
'name' => 'API release',
'description' => 'Announce a new API or developer feature.',
'content' => "New: [endpoint/SDK] from {{brand_name}}.\n\nDocs: [link]\nExample repo: [link]\n\nIf the docs are missing something, tell us. We will fix it faster than you expect.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_promo_discount',
'category' => 'promotion',
'name' => 'Discount window',
'description' => 'Time-bound promo, plainly stated.',
'content' => "[X]% off [plan/product] until [date].\n\nNo email gate. No popup. Just the code: [CODE]\n\n[link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_promo_lifetime',
'category' => 'promotion',
'name' => 'Lifetime deal',
'description' => 'Lifetime/early-bird offer aimed at builders.',
'content' => "Lifetime deal on {{brand_name}}: [price] once, no subscription.\n\nLimited to [number] seats. After that we go back to monthly.\n\nGrab one: [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_promo_referral',
'category' => 'promotion',
'name' => 'Referral perk',
'description' => 'Plain referral offer.',
'content' => "Refer a friend to {{brand_name}}, both of you get [reward].\n\nNo tiers. No leaderboard. Just send your link: [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_edu_one_thing',
'category' => 'educational',
'name' => 'One thing I learned',
'description' => 'Single concrete lesson, told plainly.',
'content' => "One thing I learned working on [topic]:\n\n[concrete lesson, one or two sentences].\n\nObvious in hindsight. Not obvious before.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_edu_misconception',
'category' => 'educational',
'name' => 'Common misconception',
'description' => 'Correct a widespread misconception in your space.',
'content' => "Common belief: [misconception about your field].\n\nWhat is actually true: [correction].\n\nThe difference matters when [specific scenario].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_edu_quick_how',
'category' => 'educational',
'name' => 'Quick how-to',
'description' => 'Short how-to on one specific task.',
'content' => "How to [specific task] in [tool]:\n\n1. [step]\n2. [step]\n3. [step]\n\nThat is the whole thing. No hidden config.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_edu_tradeoff',
'category' => 'educational',
'name' => 'Tradeoff explainer',
'description' => 'Walk through a real tradeoff in your domain.',
'content' => "[Option A] vs [Option B] is mostly a tradeoff between [thing 1] and [thing 2].\n\nIf you care more about [thing 1], pick A. If [thing 2], pick B. Most teams pick A and regret it later.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_bts_stack',
'category' => 'behind_the_scenes',
'name' => 'Our stack',
'description' => 'Honest stack note from inside the team.',
'content' => "Our stack at {{brand_name}}: [tech 1], [tech 2], [tech 3].\n\nWe picked [tech 1] for [reason]. We regret picking [tech] for [reason]. Will probably swap it next quarter.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_bts_postmortem',
'category' => 'behind_the_scenes',
'name' => 'Mini postmortem',
'description' => 'Short, transparent incident note.',
'content' => "[Service/feature] was down for [duration] today.\n\nCause: [plain explanation].\nFix: [what we did].\n\nWe added [safeguard] so the same thing does not happen the same way again.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_bts_decision',
'category' => 'behind_the_scenes',
'name' => 'Why we picked X',
'description' => 'Explain a recent design or product decision.',
'content' => "Why we picked [decision] over [alternative]:\n\n[reason in one sentence].\n\nIt is not the popular choice. It fits how our users actually work.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_bts_numbers',
'category' => 'behind_the_scenes',
'name' => 'Numbers we watch',
'description' => 'Share a real metric and what it means.',
'content' => "A number we actually watch at {{brand_name}}: [metric].\n\nLast month it was [value]. The week before, [value].\n\nIt is the metric that tells us whether [outcome] is real.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_testimonial_quote',
'category' => 'testimonial',
'name' => 'Quote from a user',
'description' => 'A short user quote, no fluff.',
'content' => "From a user this week:\n\n\"[short, specific quote about the product].\"\n\n- [first name], [role]\n\nThis is the kind of feedback that keeps us building.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_testimonial_workflow',
'category' => 'testimonial',
'name' => 'How a customer uses it',
'description' => 'Specific user workflow story.',
'content' => "[Customer/team] uses {{brand_name}} to [specific job].\n\nBefore: [old way].\nNow: [new way].\n\nNot dramatic. Just less friction every day.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_testimonial_result',
'category' => 'testimonial',
'name' => 'Concrete result',
'description' => 'A specific, measurable outcome from a customer.',
'content' => "[Customer] cut [task] from [old time] to [new time] using {{brand_name}}.\n\nOne workflow change. No new hires.\n\nFull writeup: [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_industry_take',
'category' => 'industry_tip',
'name' => 'Hot-ish take',
'description' => 'A real opinion on a thing in your industry.',
'content' => "Mild take: [opinion about your industry].\n\nI know this is unpopular. I have changed my mind on it twice. Right now I think it holds up.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_industry_pattern',
'category' => 'industry_tip',
'name' => 'Pattern I keep seeing',
'description' => 'Pattern observed across teams or projects.',
'content' => "A pattern I keep seeing in [industry/role]:\n\n[pattern in one sentence].\n\nUsually it works for the first [milestone] and then quietly stops.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_industry_anti_advice',
'category' => 'industry_tip',
'name' => 'Advice I would skip',
'description' => 'Anti-advice: common advice that does not hold up.',
'content' => "Advice you hear a lot: [common advice].\n\nIn practice this falls apart when [scenario]. The version that actually works is [revised advice].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_industry_link_share',
'category' => 'industry_tip',
'name' => 'Link with context',
'description' => 'Share a link with a real reason to read it.',
'content' => "Worth reading: [title of article/post].\n\nWhy: [one specific thing the piece nails].\n\n[link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_event_announce',
'category' => 'event',
'name' => 'Event announcement',
'description' => 'Announce an upcoming event or talk.',
'content' => "[Event name] on [date] at [time/timezone].\n\nTopic: [what we will cover].\nFormat: [talk / Q&A / demo].\n\nFree, no signup gate: [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_event_speaking',
'category' => 'event',
'name' => 'Speaking somewhere',
'description' => 'Tell people you are speaking at a conference.',
'content' => "I am speaking at [event] on [date].\n\nTalk: [talk title or topic in plain words].\n\nIf you are around, say hi. Especially if you disagree with the talk.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_event_recap',
'category' => 'event',
'name' => 'Event recap',
'description' => 'Short recap after an event or meetup.',
'content' => "Quick recap of [event]:\n\n• [what worked]\n• [what surprised us]\n• [what we will do differently next time]\n\nThanks to everyone who showed up.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_event_office_hours',
'category' => 'event',
'name' => 'Office hours',
'description' => 'Open office hours or AMA invite.',
'content' => "Open office hours this [day] at [time/timezone].\n\nBring real questions about [topic]. I would rather answer hard ones than soft ones.\n\nLink to join: [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_engagement_question',
'category' => 'engagement',
'name' => 'Real question',
'description' => 'A genuine question, not engagement bait.',
'content' => "Genuine question for people working on [topic]:\n\n[specific question].\n\nNot rhetorical. I am stuck on this and curious how others handle it.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_engagement_poll_lite',
'category' => 'engagement',
'name' => 'Two camps',
'description' => 'Lightweight either/or to spark replies.',
'content' => "Two camps on [topic]:\n\nA: [option A]\nB: [option B]\n\nWhich one do you actually use day to day, and what made you pick it?",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_engagement_show_us',
'category' => 'engagement',
'name' => 'Show us your setup',
'description' => 'Invite users to share their setup or workflow.',
'content' => "Show us your [setup / workflow / config] for [task].\n\nReply with a screenshot or a one-liner. We are collecting good patterns to share back.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
];

View file

@ -0,0 +1,322 @@
<?php
declare(strict_types=1);
return [
[
'slug' => 'facebook_special_offer',
'category' => 'promotion',
'name' => 'Special offer',
'description' => 'Promote a special offer on Facebook with a clear call to action.',
'content' => "🎉 Special offer from {{brand_name}}.\n\n[Offer summary], only available through [date].\n\nClick the link to claim yours: [link]\n\nQuestions? Drop them in the comments, we read every one.",
'image_count' => 1,
'image_keywords' => ['offer', 'sale', 'promotion'],
'slides' => null,
],
[
'slug' => 'facebook_community_story',
'category' => 'behind_the_scenes',
'name' => 'Community story',
'description' => 'Share a story about a customer or team moment to build connection.',
'content' => "Meet [name].\n\n[Short story, 2 to 4 sentences, about how they use {{brand_name}} or what they bring to our community.]\n\nThis is why we do what we do. ❤️",
'image_count' => 1,
'image_keywords' => ['people', 'story', 'community'],
'slides' => null,
],
[
'slug' => 'facebook_event_invite',
'category' => 'event',
'name' => 'Event invite',
'description' => 'Invite your followers to an upcoming event or webinar.',
'content' => "📅 Save the date.\n\n{{brand_name}} is hosting [event name] on [date] at [time].\n\nWe'll cover:\n• [Topic 1]\n• [Topic 2]\n• [Topic 3]\n\nFree to attend. Save your spot → [link]",
'image_count' => 1,
'image_keywords' => ['event', 'calendar', 'invitation'],
'slides' => null,
],
// Product launch (4)
[
'slug' => 'facebook_new_product_reveal',
'category' => 'product_launch',
'name' => 'New product reveal',
'description' => 'Announce a brand new product to your Facebook community.',
'content' => "After [number] months of work, we can finally talk about it.\n\nMeet [product name], the [short description] we built because [reason]. Our team kept hearing the same thing from people in this community: [common request]. So we made it.\n\n{{brand_name}} is shipping the first batch on [date]. The link is in the first comment.\n\nWhat do you want to know about it? Drop your questions below and we'll answer every single one this week.",
'image_count' => 1,
'image_keywords' => ['product', 'launch', 'unboxing'],
'slides' => null,
],
[
'slug' => 'facebook_product_restock',
'category' => 'product_launch',
'name' => 'Product restock announcement',
'description' => 'Tell followers a sold-out product is back in stock.',
'content' => "It's back.\n\n[Product name] sold out in [time period] last time, and a lot of you were on the waitlist. We restocked this morning with [quantity] units.\n\nIf you missed it before, this is your reminder: [link]\n\nFor anyone who already has one, what would you tell someone thinking about ordering?",
'image_count' => 1,
'image_keywords' => ['product', 'restock', 'shelf'],
'slides' => null,
],
[
'slug' => 'facebook_feature_release',
'category' => 'product_launch',
'name' => 'New feature release',
'description' => 'Announce a new feature added to an existing product.',
'content' => "Small update, big difference.\n\n{{brand_name}} just rolled out [feature name]. You asked for it in the comments more times than we can count, so here it is: [one-sentence explanation of what it does].\n\nIt's live for everyone starting today. No upgrade needed.\n\nIf you try it this week, tell us what you think. We're already taking notes for what to build next.",
'image_count' => 1,
'image_keywords' => ['feature', 'update', 'screen'],
'slides' => null,
],
[
'slug' => 'facebook_preorder_open',
'category' => 'product_launch',
'name' => 'Pre-order announcement',
'description' => 'Open pre-orders for an upcoming product release.',
'content' => "Pre-orders are open.\n\n[Product name] ships on [date], and we're letting this community order first. Pre-order pricing is [price] until [deadline], and there are only [quantity] spots in the first run.\n\nHere's the link: [link]\n\nIf you have questions about [common concern: shipping / sizing / specs], ask in the comments. We'll be here all afternoon.",
'image_count' => 1,
'image_keywords' => ['preorder', 'product', 'package'],
'slides' => null,
],
// Promotion (3)
[
'slug' => 'facebook_flash_sale',
'category' => 'promotion',
'name' => 'Flash sale alert',
'description' => 'Announce a short-term flash sale with urgency.',
'content' => "Flash sale, today only.\n\n[Discount] off [product/category] until midnight. Use code [CODE] at checkout.\n\nThis is the lowest price we'll offer this season, and we're not running it again until [next date].\n\nLink in the first comment. Tag a friend who's been eyeing this.",
'image_count' => 1,
'image_keywords' => ['sale', 'discount', 'shopping'],
'slides' => null,
],
[
'slug' => 'facebook_holiday_promo',
'category' => 'promotion',
'name' => 'Holiday promotion',
'description' => 'Run a holiday-themed promotion with a friendly tone.',
'content' => "Happy [holiday name] from everyone at {{brand_name}}.\n\nTo say thank you for being part of this year, we're taking [discount] off [product/category] from [start date] through [end date]. Use code [CODE].\n\nWhatever you're celebrating this week, we hope it's a good one. Tell us how you're spending the holiday in the comments.",
'image_count' => 1,
'image_keywords' => ['holiday', 'celebration', 'gift'],
'slides' => null,
],
[
'slug' => 'facebook_bundle_deal',
'category' => 'promotion',
'name' => 'Bundle deal promotion',
'description' => 'Promote a product bundle with savings.',
'content' => "Two of our favorites, better together.\n\n[Product A] + [Product B] is now a bundle, and the bundle saves you [amount] vs. buying them separately. We put them together because customers kept ordering them in the same cart.\n\nGrab one here: [link]\n\nIf you already own one of these, the other is the missing piece. Trust us on that.",
'image_count' => 1,
'image_keywords' => ['bundle', 'products', 'package'],
'slides' => null,
],
// Educational (4)
[
'slug' => 'facebook_how_to_guide',
'category' => 'educational',
'name' => 'How-to guide',
'description' => 'Teach your audience how to do something useful.',
'content' => "Here's how to [task] in under [time].\n\n1. [Step 1 with a real detail, not a vague instruction]\n2. [Step 2]\n3. [Step 3]\n4. [Step 4]\n\nThe part most people skip is [step number]. If you only do one thing, do that one.\n\nWhat's the [topic] question you keep meaning to look up? Ask below and we'll cover it next week.",
'image_count' => 1,
'image_keywords' => ['tutorial', 'guide', 'how to'],
'slides' => null,
],
[
'slug' => 'facebook_myth_buster',
'category' => 'educational',
'name' => 'Myth vs. fact',
'description' => 'Bust a common myth in your industry.',
'content' => "There's a myth about [topic] that won't go away.\n\nThe myth: [common belief].\n\nWhat actually happens: [accurate explanation, 2-3 sentences with a specific example or number].\n\nWe've heard this one for years. If you've believed it too, you're in good company, most people have. Now you know.\n\nWhat other [industry] myths drive you crazy?",
'image_count' => 1,
'image_keywords' => ['fact check', 'information', 'thinking'],
'slides' => null,
],
[
'slug' => 'facebook_quick_tip',
'category' => 'educational',
'name' => 'Quick tip',
'description' => 'Share one bite-sized tip your audience can use today.',
'content' => "Quick tip you can use today.\n\nIf you [common situation], try [specific action] instead of [usual approach]. The reason: [one-sentence explanation of why it works].\n\nWe started doing this with [example] and it changed how we [outcome]. Small change, real difference.\n\nGive it a shot this week and tell us how it goes.",
'image_count' => 1,
'image_keywords' => ['tip', 'lightbulb', 'idea'],
'slides' => null,
],
[
'slug' => 'facebook_common_mistake',
'category' => 'educational',
'name' => 'Common mistake to avoid',
'description' => 'Help readers avoid a typical mistake in your field.',
'content' => "The most common mistake we see with [topic]: [specific mistake].\n\nIt usually happens when [context]. The result is [consequence], and by the time you notice, [downside].\n\nWhat to do instead: [clear alternative]. It takes [time/effort] more up front and saves you [benefit] later.\n\nIf you've made this one before, you're not alone. We've made it too. What's a mistake you wish someone had warned you about?",
'image_count' => 1,
'image_keywords' => ['mistake', 'warning', 'lesson'],
'slides' => null,
],
// Behind the scenes (4)
[
'slug' => 'facebook_team_intro',
'category' => 'behind_the_scenes',
'name' => 'Team member intro',
'description' => 'Introduce a team member to the community.',
'content' => "Say hi to [name].\n\n[Name] is our [role] and has been with {{brand_name}} for [time]. They're the reason [specific thing they own or improved], and if you've ever emailed support, there's a good chance they're the person who wrote back.\n\nFun fact: [one human detail, hobby, weird skill, favorite snack].\n\nDrop a wave in the comments and say hello.",
'image_count' => 1,
'image_keywords' => ['team', 'portrait', 'workplace'],
'slides' => null,
],
[
'slug' => 'facebook_workspace_tour',
'category' => 'behind_the_scenes',
'name' => 'Workspace tour',
'description' => 'Show followers around your workspace or studio.',
'content' => "A peek inside where the work happens.\n\nThis is [room/space name] at {{brand_name}}. [One specific detail about it, the lighting, the mess, the corner everyone fights over]. We spend most of our day here, and it shows.\n\n[Second detail, something visible in the photo that has a story behind it].\n\nWhat does your workspace look like right now? Honest answers only, coffee cups and all.",
'image_count' => 1,
'image_keywords' => ['workspace', 'office', 'studio'],
'slides' => null,
],
[
'slug' => 'facebook_making_of',
'category' => 'behind_the_scenes',
'name' => 'Making-of post',
'description' => 'Show how a product or piece of work gets made.',
'content' => "Ever wonder how [product/service] actually gets made?\n\nIt starts with [first step] and ends with [last step]. In between there's a lot of [honest description, testing, redoing, second-guessing]. The version you eventually buy is usually the [number] attempt.\n\nHere's a snapshot from this week's batch. The [specific detail] is the part nobody sees but everyone notices when it's done right.\n\nQuestions about the process? Ask away.",
'image_count' => 1,
'image_keywords' => ['workshop', 'process', 'craft'],
'slides' => null,
],
[
'slug' => 'facebook_milestone_celebration',
'category' => 'behind_the_scenes',
'name' => 'Milestone celebration',
'description' => 'Celebrate a meaningful milestone with the community.',
'content' => "Today is [milestone, anniversary, customer count, anything real].\n\nWe started {{brand_name}} [time ago] with [honest origin detail, a kitchen table, one customer, a borrowed laptop]. The plan was simple and a little naive: [original goal].\n\n[Milestone] later, we're still here, mostly because of the people in this community who kept showing up. Thank you. Genuinely.\n\nTell us in the comments, when did you first find us?",
'image_count' => 1,
'image_keywords' => ['celebration', 'milestone', 'anniversary'],
'slides' => null,
],
// Testimonial (3)
[
'slug' => 'facebook_customer_quote',
'category' => 'testimonial',
'name' => 'Customer quote',
'description' => 'Share a customer testimonial in their own words.',
'content' => "\"[Direct customer quote, keep it specific, in their voice, with a real result or feeling.]\"\n\n- [Customer name], [city or role]\n\nWe got this message last [time] and asked if we could share it. [Customer first name] said yes. We're grateful for words like these and for everyone who takes a minute to send them.\n\nIf {{brand_name}} has been part of your story too, we'd love to hear it in the comments.",
'image_count' => 1,
'image_keywords' => ['testimonial', 'happy customer', 'review'],
'slides' => null,
],
[
'slug' => 'facebook_before_after_story',
'category' => 'testimonial',
'name' => 'Before and after story',
'description' => 'Tell a customer transformation story.',
'content' => "Before: [Customer's situation when they found {{brand_name}}, describe in 2-3 honest sentences].\n\nAfter: [What changed, with a specific outcome and timeframe].\n\n[Customer name] sent us this update last month, and it's the kind of thing that makes everyone in the office quiet for a second. We didn't do the work, they did. We just helped where we could.\n\nIf you've been on the fence about [common hesitation], stories like this might be why to start.",
'image_count' => 1,
'image_keywords' => ['transformation', 'progress', 'result'],
'slides' => null,
],
[
'slug' => 'facebook_review_highlight',
'category' => 'testimonial',
'name' => 'Review highlight',
'description' => 'Highlight a recent review with context.',
'content' => "5-star review from [customer name] this week:\n\n\"[Pull a real, specific line from the review, not the generic praise, the part with the actual detail.]\"\n\nWe save reviews like this and re-read them on the hard days. Thank you, [first name].\n\nIf you've got a few minutes and {{brand_name}} has helped you, leaving a review here is the kindest thing you can do for us: [link]",
'image_count' => 1,
'image_keywords' => ['review', 'stars', 'feedback'],
'slides' => null,
],
// Industry tip (3)
[
'slug' => 'facebook_industry_insight',
'category' => 'industry_tip',
'name' => 'Industry insight',
'description' => 'Share a useful insight from your industry.',
'content' => "Something we noticed working in [industry] this year:\n\n[Specific observation, a shift, a pattern, a counterintuitive finding. 2-3 sentences with a number or example.]\n\nWe don't think this is going to reverse anytime soon, and the businesses who plan for it now will have an easier time than the ones who wait.\n\nAre you seeing the same thing? Curious what your experience has been.",
'image_count' => 1,
'image_keywords' => ['insight', 'industry', 'analysis'],
'slides' => null,
],
[
'slug' => 'facebook_pro_tip',
'category' => 'industry_tip',
'name' => 'Pro tip from experience',
'description' => 'Share a tip earned through experience.',
'content' => "A pro tip we learned the hard way:\n\nWhen you [common scenario], always [specific action]. We used to skip this step because it felt like extra work, until [story, what went wrong].\n\nNow it's the first thing we do, every time. Takes [time] and prevents [problem].\n\nWhat's a tip you'd give someone just starting out in [field]?",
'image_count' => 1,
'image_keywords' => ['expertise', 'professional', 'advice'],
'slides' => null,
],
[
'slug' => 'facebook_industry_trend',
'category' => 'industry_tip',
'name' => 'Industry trend explainer',
'description' => 'Explain a trend in plain language.',
'content' => "Everyone in [industry] is talking about [trend]. Here's what it actually means in plain English.\n\n[2-3 sentence explanation without jargon, with one concrete example.]\n\nWhether it lives up to the hype is another question. Our take: [honest opinion, what to take seriously, what to ignore].\n\nWhere do you stand on this one? Genuinely curious where the community lands.",
'image_count' => 1,
'image_keywords' => ['trend', 'industry', 'explainer'],
'slides' => null,
],
// Event (3)
[
'slug' => 'facebook_event_recap',
'category' => 'event',
'name' => 'Event recap',
'description' => 'Share a recap after an event ends.',
'content' => "[Event name] just wrapped, and we're still recovering.\n\n[Number] of you showed up, asked good questions, and stayed late. Highlights: [moment 1], [moment 2], and the part where [specific funny or memorable thing].\n\nA huge thank you to everyone who came. If you missed it, we recorded the main session and the link is in the first comment.\n\nWhat was your favorite moment from the day? Tag someone you met there.",
'image_count' => 1,
'image_keywords' => ['event', 'recap', 'crowd'],
'slides' => null,
],
[
'slug' => 'facebook_event_countdown',
'category' => 'event',
'name' => 'Event countdown',
'description' => 'Build anticipation as an event approaches.',
'content' => "[Number] days until [event name].\n\nIf you haven't grabbed your spot, now is the time. We've got [number] seats left, and they tend to go fast in the last week.\n\nWhat to expect on [date]: [one real detail], [another real detail], and time to actually talk to people instead of just watching slides.\n\nGet your ticket here: [link]\n\nWho's coming? Drop a comment so we know who to look for.",
'image_count' => 1,
'image_keywords' => ['countdown', 'event', 'tickets'],
'slides' => null,
],
[
'slug' => 'facebook_workshop_announcement',
'category' => 'event',
'name' => 'Workshop announcement',
'description' => 'Announce a hands-on workshop.',
'content' => "We're running a workshop on [topic].\n\n[Date] at [time]. Limited to [number] people because it's hands-on, not a webinar. You'll leave with [specific outcome, a finished thing, a working setup, a written plan].\n\nWho it's for: [audience]. Who it's not for: [honest disclaimer].\n\nDetails and signup: [link]\n\nQuestions about whether it's right for you? Ask in the comments.",
'image_count' => 1,
'image_keywords' => ['workshop', 'learning', 'hands on'],
'slides' => null,
],
// Engagement (3)
[
'slug' => 'facebook_question_prompt',
'category' => 'engagement',
'name' => 'Community question',
'description' => 'Ask the community a thoughtful question.',
'content' => "Genuine question for the community.\n\nWhen you [common situation related to {{brand_name}}], how do you usually [specific decision]? We're asking because we keep seeing the same thing come up in DMs, and we have a hunch our answer isn't the only good one.\n\nNo wrong answers. We read every comment.",
'image_count' => 1,
'image_keywords' => ['question', 'conversation', 'people talking'],
'slides' => null,
],
[
'slug' => 'facebook_this_or_that',
'category' => 'engagement',
'name' => 'This or that poll',
'description' => 'Run a fun this-or-that style post.',
'content' => "Settle a debate we've been having all week.\n\n[Option A] or [Option B]?\n\nNo overthinking it. First instinct, in the comments.\n\nFor what it's worth, the team is split [number] to [number]. We'll share the winning side on Friday.",
'image_count' => 1,
'image_keywords' => ['choice', 'comparison', 'options'],
'slides' => null,
],
[
'slug' => 'facebook_fill_in_blank',
'category' => 'engagement',
'name' => 'Fill in the blank',
'description' => 'Invite followers to complete a sentence.',
'content' => "Fill in the blank:\n\nThe one thing I wish I'd known before [topic] is __________.\n\nWe'll go first: [your honest answer, with a real story attached].\n\nYour turn. The best answers we've gotten on prompts like this end up helping someone else who reads them later, so don't hold back.",
'image_count' => 1,
'image_keywords' => ['conversation', 'thinking', 'community'],
'slides' => null,
],
];

View file

@ -0,0 +1,326 @@
<?php
declare(strict_types=1);
return [
[
'slug' => 'fb_story_announcement',
'category' => 'product_launch',
'name' => 'Quick announcement',
'description' => 'Drive attention to an update with a 24-hour Facebook story.',
'content' => "Heads up from {{brand_name}}.\n\n[One-line highlight]\n\nLink in profile.",
'image_count' => 1,
'image_keywords' => ['announcement', 'launch'],
'slides' => null,
],
[
'slug' => 'fb_story_promo',
'category' => 'promotion',
'name' => 'Flash promo',
'description' => 'Time-sensitive offer in story format.',
'content' => "Today only.\n\n[Discount]% off at {{brand_name}}.\n\nTap to shop.",
'image_count' => 1,
'image_keywords' => ['sale', 'discount', 'urgency'],
'slides' => null,
],
[
'slug' => 'fb_story_question',
'category' => 'engagement',
'name' => 'Quick question',
'description' => 'Ask followers a question to drive replies and reactions.',
'content' => "Quick one.\n\n[Question for your audience]\n\nReply to this story.",
'image_count' => 1,
'image_keywords' => ['question', 'engagement'],
'slides' => null,
],
[
'slug' => 'fb_story_new_drop',
'category' => 'product_launch',
'name' => 'New drop',
'description' => 'Tease a fresh product with a quick visual cue.',
'content' => "It is here.\n\n[Product name] from {{brand_name}}.\n\nTap to see it.",
'image_count' => 1,
'image_keywords' => ['new product', 'unboxing'],
'slides' => null,
],
[
'slug' => 'fb_story_preorder',
'category' => 'product_launch',
'name' => 'Preorder open',
'description' => 'Open preorders with a short story prompt.',
'content' => "Preorders open.\n\n[Product] ships [date].\n\nLink in bio.",
'image_count' => 1,
'image_keywords' => ['preorder', 'product'],
'slides' => null,
],
[
'slug' => 'fb_story_launch_day',
'category' => 'product_launch',
'name' => 'Launch day',
'description' => 'Mark the live launch with a single tap CTA.',
'content' => "Live now.\n\n[Product] is shipping today.\n\nTap to grab yours.",
'image_count' => 1,
'image_keywords' => ['launch', 'product reveal'],
'slides' => null,
],
[
'slug' => 'fb_story_back_in_stock',
'category' => 'product_launch',
'name' => 'Back in stock',
'description' => 'Alert followers that a sold-out item is back.',
'content' => "Back in stock.\n\n[Product] at {{brand_name}}.\n\nGoes fast. Tap to check.",
'image_count' => 1,
'image_keywords' => ['restock', 'available'],
'slides' => null,
],
[
'slug' => 'fb_story_bogo',
'category' => 'promotion',
'name' => 'Buy one get one',
'description' => 'Push a BOGO offer in story format.',
'content' => "Buy 1, get 1.\n\nThis week at {{brand_name}}.\n\nTap to shop.",
'image_count' => 1,
'image_keywords' => ['bogo', 'sale'],
'slides' => null,
],
[
'slug' => 'fb_story_free_shipping',
'category' => 'promotion',
'name' => 'Free shipping',
'description' => 'Promote a free shipping window.',
'content' => "Free shipping.\n\n48 hours only at {{brand_name}}.\n\nUse code [CODE].",
'image_count' => 1,
'image_keywords' => ['shipping', 'delivery box'],
'slides' => null,
],
[
'slug' => 'fb_story_last_chance',
'category' => 'promotion',
'name' => 'Last chance sale',
'description' => 'Final call for an ending discount.',
'content' => "Last chance.\n\n[Discount]% off ends tonight.\n\nTap to shop {{brand_name}}.",
'image_count' => 1,
'image_keywords' => ['countdown', 'sale ending'],
'slides' => null,
],
[
'slug' => 'fb_story_coupon_drop',
'category' => 'promotion',
'name' => 'Coupon drop',
'description' => 'Drop a coupon code in a 24h story.',
'content' => "Code [CODE].\n\n[Discount]% off at {{brand_name}}.\n\nGone in 24h.",
'image_count' => 1,
'image_keywords' => ['coupon', 'promo code'],
'slides' => null,
],
[
'slug' => 'fb_story_quick_tip',
'category' => 'educational',
'name' => 'Quick tip',
'description' => 'Share a single useful tip.',
'content' => "Quick tip.\n\n[One actionable tip].\n\nSave this story.",
'image_count' => 1,
'image_keywords' => ['tip', 'advice'],
'slides' => null,
],
[
'slug' => 'fb_story_did_you_know',
'category' => 'educational',
'name' => 'Did you know',
'description' => 'Surprise followers with a quick fact.',
'content' => "Did you know?\n\n[Surprising fact].\n\nMore on the {{brand_name}} blog.",
'image_count' => 1,
'image_keywords' => ['fact', 'lightbulb'],
'slides' => null,
],
[
'slug' => 'fb_story_myth_buster',
'category' => 'educational',
'name' => 'Myth buster',
'description' => 'Bust a common myth in a single hit.',
'content' => "Myth: [common belief].\n\nReality: [truth].\n\nTap for the why.",
'image_count' => 1,
'image_keywords' => ['myth', 'truth'],
'slides' => null,
],
[
'slug' => 'fb_story_one_minute_lesson',
'category' => 'educational',
'name' => 'One minute lesson',
'description' => 'A bite-sized lesson with a tap CTA.',
'content' => "60-second lesson.\n\n[Topic] from {{brand_name}}.\n\nTap to watch.",
'image_count' => 1,
'image_keywords' => ['lesson', 'teaching'],
'slides' => null,
],
[
'slug' => 'fb_story_bts_workspace',
'category' => 'behind_the_scenes',
'name' => 'Workspace BTS',
'description' => 'Show the workspace where things happen.',
'content' => "Today at {{brand_name}}.\n\n[What is happening right now].\n\nTap for more.",
'image_count' => 1,
'image_keywords' => ['workspace', 'office'],
'slides' => null,
],
[
'slug' => 'fb_story_bts_team',
'category' => 'behind_the_scenes',
'name' => 'Meet the team',
'description' => 'Introduce a team member quickly.',
'content' => "Meet [name].\n\n[Role at {{brand_name}}].\n\nTap to say hi.",
'image_count' => 1,
'image_keywords' => ['team', 'employee'],
'slides' => null,
],
[
'slug' => 'fb_story_bts_process',
'category' => 'behind_the_scenes',
'name' => 'How it is made',
'description' => 'Quick peek at how something gets made.',
'content' => "How [product] is made.\n\nStep [n] at {{brand_name}}.\n\nTap for the full clip.",
'image_count' => 1,
'image_keywords' => ['production', 'process'],
'slides' => null,
],
[
'slug' => 'fb_story_bts_packing',
'category' => 'behind_the_scenes',
'name' => 'Packing orders',
'description' => 'Show orders going out the door.',
'content' => "Packing orders.\n\n[Number] going out today.\n\nThank you for the support.",
'image_count' => 1,
'image_keywords' => ['packing', 'shipping'],
'slides' => null,
],
[
'slug' => 'fb_story_customer_quote',
'category' => 'testimonial',
'name' => 'Customer quote',
'description' => 'Showcase a short customer quote.',
'content' => "\"[Customer quote].\"\n\n- [name]\n\nTap to read more.",
'image_count' => 1,
'image_keywords' => ['quote', 'review'],
'slides' => null,
],
[
'slug' => 'fb_story_five_star',
'category' => 'testimonial',
'name' => 'Five star review',
'description' => 'Highlight a five star review.',
'content' => "5 stars.\n\n\"[Short review]\", [name]\n\nMore at {{brand_name}}.",
'image_count' => 1,
'image_keywords' => ['five stars', 'review'],
'slides' => null,
],
[
'slug' => 'fb_story_before_after',
'category' => 'testimonial',
'name' => 'Before and after',
'description' => 'Show a before/after with a single CTA.',
'content' => "Before. After.\n\n[Customer name] using {{brand_name}}.\n\nTap for the story.",
'image_count' => 1,
'image_keywords' => ['before after', 'transformation'],
'slides' => null,
],
[
'slug' => 'fb_story_industry_trend',
'category' => 'industry_tip',
'name' => 'Industry trend',
'description' => 'Drop a quick trend insight.',
'content' => "Trend watch.\n\n[Industry trend in one line].\n\nTap for the take.",
'image_count' => 1,
'image_keywords' => ['trend', 'industry'],
'slides' => null,
],
[
'slug' => 'fb_story_pro_hack',
'category' => 'industry_tip',
'name' => 'Pro hack',
'description' => 'Share a quick pro hack.',
'content' => "Pro hack.\n\n[One-line hack].\n\nMore tips at {{brand_name}}.",
'image_count' => 1,
'image_keywords' => ['hack', 'shortcut'],
'slides' => null,
],
[
'slug' => 'fb_story_mistake_to_avoid',
'category' => 'industry_tip',
'name' => 'Mistake to avoid',
'description' => 'Warn about a common mistake.',
'content' => "Stop doing this.\n\n[Common mistake].\n\nTap for the fix.",
'image_count' => 1,
'image_keywords' => ['warning', 'mistake'],
'slides' => null,
],
[
'slug' => 'fb_story_event_save_date',
'category' => 'event',
'name' => 'Save the date',
'description' => 'Plant a save-the-date in a 24h story.',
'content' => "Save the date.\n\n[Event] on [date].\n\nRSVP in bio.",
'image_count' => 1,
'image_keywords' => ['calendar', 'event'],
'slides' => null,
],
[
'slug' => 'fb_story_event_today',
'category' => 'event',
'name' => 'Event today',
'description' => 'Same-day event reminder.',
'content' => "Today.\n\n[Event] at [time].\n\nTap for the link.",
'image_count' => 1,
'image_keywords' => ['event', 'live'],
'slides' => null,
],
[
'slug' => 'fb_story_live_starting',
'category' => 'event',
'name' => 'Going live',
'description' => 'Push followers into a live stream.',
'content' => "Going live.\n\n[Topic] in [minutes] minutes.\n\nTap to join {{brand_name}}.",
'image_count' => 1,
'image_keywords' => ['live stream', 'broadcast'],
'slides' => null,
],
[
'slug' => 'fb_story_event_recap',
'category' => 'event',
'name' => 'Event recap',
'description' => 'A quick day-after recap.',
'content' => "That was [event].\n\nThanks for showing up.\n\nFull recap on the page.",
'image_count' => 1,
'image_keywords' => ['event recap', 'crowd'],
'slides' => null,
],
[
'slug' => 'fb_story_poll_this_or_that',
'category' => 'engagement',
'name' => 'This or that',
'description' => 'Poll-style story with two options.',
'content' => "[Option A] or [Option B]?\n\nReply with your pick.\n\nWe read every one.",
'image_count' => 1,
'image_keywords' => ['poll', 'choice'],
'slides' => null,
],
[
'slug' => 'fb_story_dm_us',
'category' => 'engagement',
'name' => 'DM us',
'description' => 'Invite followers to send a message.',
'content' => "DM us.\n\n[Reason to message {{brand_name}}].\n\nWe reply fast.",
'image_count' => 1,
'image_keywords' => ['message', 'chat'],
'slides' => null,
],
[
'slug' => 'fb_story_caption_this',
'category' => 'engagement',
'name' => 'Caption this',
'description' => 'Open-ended caption prompt.',
'content' => "Caption this.\n\n[Image context].\n\nReply with your best.",
'image_count' => 1,
'image_keywords' => ['fun', 'reaction'],
'slides' => null,
],
];

View file

@ -0,0 +1,523 @@
<?php
declare(strict_types=1);
return [
[
'slug' => 'feature_launch_carousel',
'category' => 'product_launch',
'name' => 'Feature launch',
'description' => 'Announce a new product feature with a 5-slide story.',
'content' => "{{brand_name}} just launched something we're excited about. Swipe to see what's new.",
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => "What's new", 'body' => 'A quick look at the latest update.', 'image_keywords' => ['product', 'launch']],
['title' => 'How it works', 'body' => 'Three steps and you are running.', 'image_keywords' => ['workflow']],
['title' => 'Why it matters', 'body' => 'Faster, simpler, fewer clicks.', 'image_keywords' => ['speed']],
['title' => 'Who is it for', 'body' => 'Built for teams who ship.', 'image_keywords' => ['team']],
['title' => 'Try it now', 'body' => 'Available today. Link in bio.', 'image_keywords' => ['phone', 'app']],
],
],
[
'slug' => 'five_tips_carousel',
'category' => 'educational',
'name' => '5 tips carousel',
'description' => 'Share five actionable tips in a swipeable carousel.',
'content' => '5 things I wish I knew about [topic] sooner. Save this for later. 👇',
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => 'Tip #1', 'body' => '[First tip, be specific and actionable.]', 'image_keywords' => ['idea', 'lightbulb']],
['title' => 'Tip #2', 'body' => '[Second tip, use a real example if you can.]', 'image_keywords' => ['notebook']],
['title' => 'Tip #3', 'body' => '[Third tip, keep it short.]', 'image_keywords' => ['focus']],
['title' => 'Tip #4', 'body' => '[Fourth tip, something surprising or counterintuitive.]', 'image_keywords' => ['surprise']],
['title' => 'Tip #5', 'body' => '[Fifth tip, finish strong with a takeaway.]', 'image_keywords' => ['success']],
],
],
[
'slug' => 'process_reveal_carousel',
'category' => 'behind_the_scenes',
'name' => 'Process reveal',
'description' => 'Walk followers through how you create your product or service.',
'content' => 'Ever wondered how [product/service] is made? Swipe to see every step. ✨',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'It starts with research', 'body' => 'Every project begins with understanding the problem deeply.', 'image_keywords' => ['research', 'desk']],
['title' => 'Design & iteration', 'body' => 'We prototype fast and test often.', 'image_keywords' => ['design', 'sketch']],
['title' => 'Building the real thing', 'body' => 'Craft and precision in every detail.', 'image_keywords' => ['craft', 'build']],
['title' => 'The final result', 'body' => 'Quality you can feel the moment you use it.', 'image_keywords' => ['product', 'final']],
],
],
[
'slug' => 'quick_stat_carousel',
'category' => 'industry_tip',
'name' => 'Quick stat carousel',
'description' => 'Present industry stats in a visual carousel format.',
'content' => "The [industry] numbers that should be on every marketer's radar this year. 📊",
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'Stat #1', 'body' => '[X]% of [audience] say [finding]. Source: [source]', 'image_keywords' => ['chart', 'data']],
['title' => 'Stat #2', 'body' => '[Y]% increase in [metric] year over year.', 'image_keywords' => ['growth', 'graph']],
['title' => 'Stat #3', 'body' => 'By [year], [projection].', 'image_keywords' => ['future', 'trend']],
['title' => 'What this means for you', 'body' => '[Actionable takeaway based on the stats above.]', 'image_keywords' => ['action', 'plan']],
],
],
[
'slug' => 'event_recap_carousel',
'category' => 'event',
'name' => 'Event recap',
'description' => 'Recap highlights from a recent event or conference.',
'content' => 'We just wrapped [Event Name] and it was incredible. Here are the highlights. 🙌',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'It all started with…', 'body' => '[Opening moment or keynote highlight.]', 'image_keywords' => ['conference', 'stage']],
['title' => 'The session everyone talked about', 'body' => '[Key insight from the standout talk.]', 'image_keywords' => ['presentation', 'crowd']],
['title' => 'Connecting with the community', 'body' => '[Highlight networking or attendee moments.]', 'image_keywords' => ['networking', 'people']],
['title' => 'See you next time', 'body' => 'Follow {{brand_name}} for updates on our next event.', 'image_keywords' => ['celebration']],
],
],
[
'slug' => 'product_lineup_carousel',
'category' => 'product_launch',
'name' => 'Product lineup reveal',
'description' => 'Reveal a full product lineup one item per slide.',
'content' => "We made [number] new things. Here's the full lineup from {{brand_name}}.",
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => 'meet the lineup', 'body' => '[Number] new pieces, designed together. Each one solves a specific problem.', 'image_keywords' => ['products', 'lineup']],
['title' => 'piece one', 'body' => '[Product 1 name]. Best for [use case].', 'image_keywords' => ['product', 'studio']],
['title' => 'piece two', 'body' => '[Product 2 name]. Pairs well with piece one if you want [benefit].', 'image_keywords' => ['object', 'detail']],
['title' => 'piece three', 'body' => '[Product 3 name]. The one we kept iterating on until it felt right.', 'image_keywords' => ['craft', 'closeup']],
['title' => 'shop the drop', 'body' => 'Available [date]. Link in bio.', 'image_keywords' => ['shop', 'phone']],
],
],
[
'slug' => 'before_after_launch_carousel',
'category' => 'product_launch',
'name' => 'Before and after launch',
'description' => 'Show the upgrade from old version to new version.',
'content' => "Same idea, rebuilt. Here's what changed in the new {{brand_name}} [product].",
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'before', 'body' => '[The old version. What it did well, where it fell short.]', 'image_keywords' => ['old', 'product']],
['title' => 'after', 'body' => '[The new version. One sentence on the biggest change.]', 'image_keywords' => ['new', 'product']],
['title' => 'what we fixed', 'body' => '[Specific issue customers told us about, and how we addressed it.]', 'image_keywords' => ['detail', 'redesign']],
['title' => 'available now', 'body' => 'Find it in the shop. Link in bio.', 'image_keywords' => ['store', 'phone']],
],
],
[
'slug' => 'spec_breakdown_carousel',
'category' => 'product_launch',
'name' => 'Spec breakdown carousel',
'description' => 'Break down product specs across multiple slides.',
'content' => "The full spec sheet for [product]. Everything that's inside, on one swipe.",
'image_count' => 6,
'image_keywords' => null,
'slides' => [
['title' => 'meet [product]', 'body' => 'Built for [use case]. Available [date].', 'image_keywords' => ['product', 'reveal']],
['title' => 'materials', 'body' => '[Material details. Where it is sourced. Why it matters for the final feel.]', 'image_keywords' => ['materials', 'texture']],
['title' => 'dimensions', 'body' => '[Size, weight, fit notes. Numbers people will actually want before buying.]', 'image_keywords' => ['measurement', 'detail']],
['title' => 'how it performs', 'body' => '[Key performance number. Battery life, run time, hold strength, whatever fits.]', 'image_keywords' => ['performance', 'test']],
['title' => "what's in the box", 'body' => '[List items: product, accessories, manual, etc.]', 'image_keywords' => ['unboxing', 'box']],
['title' => 'order yours', 'body' => 'Link in bio. Ships [timeframe].', 'image_keywords' => ['shipping', 'parcel']],
],
],
[
'slug' => 'flash_sale_carousel',
'category' => 'promotion',
'name' => 'Flash sale',
'description' => 'Promote a limited-time sale across slides.',
'content' => "[Discount]% off for the next [hours] hours at {{brand_name}}. Read every slide so you don't miss it.",
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'flash sale is on', 'body' => '[Discount]% off until [end date and time]. No code needed.', 'image_keywords' => ['sale', 'tag']],
['title' => "what's included", 'body' => '[Categories on sale, exclusions if any. Be honest about what is not included.]', 'image_keywords' => ['products', 'shop']],
['title' => 'most loved picks', 'body' => '[Two or three bestsellers people grab first when sales drop.]', 'image_keywords' => ['favorites', 'shelf']],
['title' => 'shop before it ends', 'body' => 'Link in bio. Once stock is out, it is out.', 'image_keywords' => ['phone', 'cart']],
],
],
[
'slug' => 'bundle_deal_carousel',
'category' => 'promotion',
'name' => 'Bundle deal carousel',
'description' => 'Explain a bundle offer slide by slide.',
'content' => 'Three things, one price. Save [amount] when you buy them together at {{brand_name}}.',
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => 'the bundle', 'body' => '[Brief description of what is in the bundle and the total savings.]', 'image_keywords' => ['bundle', 'box']],
['title' => 'item one', 'body' => '[First item in the bundle and what it does on its own.]', 'image_keywords' => ['product', 'one']],
['title' => 'item two', 'body' => '[Second item and why it pairs with the first.]', 'image_keywords' => ['product', 'two']],
['title' => 'item three', 'body' => '[Third item. The one that ties the bundle together.]', 'image_keywords' => ['product', 'three']],
['title' => 'grab the bundle', 'body' => 'Save [amount]. Available while stock lasts.', 'image_keywords' => ['bag', 'shopping']],
],
],
[
'slug' => 'first_order_discount_carousel',
'category' => 'promotion',
'name' => 'First order discount',
'description' => 'Welcome new customers with a first-order discount.',
'content' => 'New here? Use code [CODE] for [discount]% off your first order at {{brand_name}}.',
'image_count' => 3,
'image_keywords' => null,
'slides' => [
['title' => 'welcome offer', 'body' => '[Discount]% off your first order. Code: [CODE]. Good for [duration].', 'image_keywords' => ['welcome', 'gift']],
['title' => 'what people start with', 'body' => '[One or two products that are good entry points for new customers.]', 'image_keywords' => ['bestseller', 'product']],
['title' => 'how to use it', 'body' => 'Add to cart, paste [CODE] at checkout. Link in bio.', 'image_keywords' => ['checkout', 'phone']],
],
],
[
'slug' => 'free_shipping_carousel',
'category' => 'promotion',
'name' => 'Free shipping weekend',
'description' => 'Promote a limited free shipping window.',
'content' => 'Free shipping at {{brand_name}} this weekend only. No minimum.',
'image_count' => 3,
'image_keywords' => null,
'slides' => [
['title' => 'free shipping weekend', 'body' => 'From [Friday] to [Sunday]. No code needed, no order minimum.', 'image_keywords' => ['shipping', 'box']],
['title' => 'where we ship', 'body' => '[Regions or countries included. Note any exclusions clearly.]', 'image_keywords' => ['map', 'globe']],
['title' => 'shop the weekend', 'body' => 'Tap the link in bio before [Sunday] midnight [timezone].', 'image_keywords' => ['cart', 'phone']],
],
],
[
'slug' => 'beginner_guide_carousel',
'category' => 'educational',
'name' => 'Beginner guide carousel',
'description' => 'Teach a topic from zero to first usable result.',
'content' => '[Topic] for absolute beginners. Save this for later. 👇',
'image_count' => 6,
'image_keywords' => null,
'slides' => [
['title' => 'start here', 'body' => 'If [topic] feels overwhelming, this is the version that helped me when I was new.', 'image_keywords' => ['beginner', 'notes']],
['title' => 'what it actually is', 'body' => '[Plain definition. Skip jargon. One sentence is enough.]', 'image_keywords' => ['concept', 'sketch']],
['title' => 'why people care', 'body' => '[The concrete reason a beginner would bother learning this.]', 'image_keywords' => ['question', 'curious']],
['title' => 'first thing to try', 'body' => '[A small, specific action they can take in under 10 minutes.]', 'image_keywords' => ['hands', 'desk']],
['title' => 'common mistake', 'body' => '[The one trap most beginners fall into. Be specific.]', 'image_keywords' => ['mistake', 'fix']],
['title' => 'where to go next', 'body' => '[A book, channel, or {{brand_name}} resource for the next step.]', 'image_keywords' => ['library', 'resource']],
],
],
[
'slug' => 'common_mistakes_carousel',
'category' => 'educational',
'name' => 'Common mistakes',
'description' => 'Highlight common mistakes and how to fix them.',
'content' => '5 mistakes I see all the time with [topic]. Number 3 is the one I had to learn the hard way.',
'image_count' => 6,
'image_keywords' => null,
'slides' => [
['title' => 'the mistakes', 'body' => 'Five things people get wrong with [topic], and what to do instead.', 'image_keywords' => ['mistake', 'pen']],
['title' => 'mistake 1', 'body' => '[First mistake. Then the fix in one sentence.]', 'image_keywords' => ['error', 'paper']],
['title' => 'mistake 2', 'body' => '[Second mistake and the fix.]', 'image_keywords' => ['confused', 'desk']],
['title' => 'mistake 3', 'body' => '[Third mistake. The one that surprises people.]', 'image_keywords' => ['surprised', 'thought']],
['title' => 'mistake 4', 'body' => '[Fourth mistake and the fix.]', 'image_keywords' => ['process', 'workspace']],
['title' => 'mistake 5', 'body' => '[Final mistake. End with what you would do instead.]', 'image_keywords' => ['solution', 'check']],
],
],
[
'slug' => 'glossary_carousel',
'category' => 'educational',
'name' => 'Glossary carousel',
'description' => 'Define five terms from your industry in plain language.',
'content' => '5 [industry] terms explained without the jargon. Save this for later.',
'image_count' => 6,
'image_keywords' => null,
'slides' => [
['title' => 'jargon, decoded', 'body' => 'Five [industry] words people use as if everyone already knows them.', 'image_keywords' => ['dictionary', 'book']],
['title' => '[term 1]', 'body' => '[Plain definition. One example sentence.]', 'image_keywords' => ['letters', 'text']],
['title' => '[term 2]', 'body' => '[Plain definition. One example sentence.]', 'image_keywords' => ['letters', 'paper']],
['title' => '[term 3]', 'body' => '[Plain definition. One example sentence.]', 'image_keywords' => ['note', 'pen']],
['title' => '[term 4]', 'body' => '[Plain definition. One example sentence.]', 'image_keywords' => ['definition', 'page']],
['title' => '[term 5]', 'body' => '[Plain definition. One example sentence.]', 'image_keywords' => ['glossary', 'open book']],
],
],
[
'slug' => 'step_by_step_tutorial_carousel',
'category' => 'educational',
'name' => 'Step by step tutorial',
'description' => 'Walk through a small how-to in clear steps.',
'content' => 'How to [task] in [number] steps. Save it so you have it next time.',
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => 'what you need', 'body' => '[List the tools or supplies. Keep it short.]', 'image_keywords' => ['tools', 'supplies']],
['title' => 'step 1', 'body' => '[First step. Specific action, not a goal.]', 'image_keywords' => ['hands', 'work']],
['title' => 'step 2', 'body' => '[Second step. What it should look like before moving on.]', 'image_keywords' => ['progress', 'desk']],
['title' => 'step 3', 'body' => '[Third step. Mention the most common slip-up here.]', 'image_keywords' => ['focus', 'detail']],
['title' => 'done', 'body' => '[What the finished result should look like. One photo idea.]', 'image_keywords' => ['finished', 'result']],
],
],
[
'slug' => 'team_intro_carousel',
'category' => 'behind_the_scenes',
'name' => 'Meet the team',
'description' => 'Introduce team members one slide at a time.',
'content' => 'The faces behind {{brand_name}}. Swipe to meet the people who make it work.',
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => 'the team', 'body' => "We're [number] people across [locations]. Here's who does what.", 'image_keywords' => ['team', 'office']],
['title' => '[name 1]', 'body' => '[Role. One thing they own and one thing they like outside work.]', 'image_keywords' => ['portrait', 'work']],
['title' => '[name 2]', 'body' => '[Role. One detail that shows their personality, not just their job title.]', 'image_keywords' => ['portrait', 'desk']],
['title' => '[name 3]', 'body' => '[Role. Something specific they did this month.]', 'image_keywords' => ['portrait', 'studio']],
['title' => 'say hi', 'body' => 'DMs are open. We answer them ourselves.', 'image_keywords' => ['phone', 'chat']],
],
],
[
'slug' => 'workspace_tour_carousel',
'category' => 'behind_the_scenes',
'name' => 'Workspace tour',
'description' => 'Tour your studio, kitchen, or office across slides.',
'content' => 'A tour of where {{brand_name}} actually gets made. Less polished than you think.',
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => 'where it happens', 'body' => '[Location, size, what kind of space it is in one sentence.]', 'image_keywords' => ['studio', 'workshop']],
['title' => 'the workbench', 'body' => '[What lives on the main bench or desk most days.]', 'image_keywords' => ['workbench', 'tools']],
['title' => 'the corner nobody sees', 'body' => '[Honest detail: a messy shelf, a wall of sticky notes, the coffee station.]', 'image_keywords' => ['corner', 'mess']],
['title' => 'the favorite spot', 'body' => '[The chair, the window, the light that makes the day better.]', 'image_keywords' => ['light', 'window']],
['title' => 'come back soon', 'body' => 'More peeks coming. Follow {{brand_name}} for the next one.', 'image_keywords' => ['camera', 'door']],
],
],
[
'slug' => 'a_day_in_the_life_carousel',
'category' => 'behind_the_scenes',
'name' => 'A day in the life',
'description' => 'Show one workday from morning to evening.',
'content' => 'A real day at {{brand_name}}, hour by hour. Not the highlight reel.',
'image_count' => 6,
'image_keywords' => null,
'slides' => [
['title' => '7:30am', 'body' => '[How the day actually starts. Coffee, walk, inbox, whatever it is.]', 'image_keywords' => ['morning', 'coffee']],
['title' => '9:00am', 'body' => '[First thing on the work calendar. Be specific about what gets done.]', 'image_keywords' => ['desk', 'laptop']],
['title' => '12:30pm', 'body' => '[Lunch. Where, with who, or alone with a podcast.]', 'image_keywords' => ['lunch', 'food']],
['title' => '2:00pm', 'body' => '[Afternoon block. The thing that takes the most focus that day.]', 'image_keywords' => ['focus', 'work']],
['title' => '5:30pm', 'body' => '[Wrapping up. What the last task usually is before signing off.]', 'image_keywords' => ['evening', 'office']],
['title' => 'after hours', 'body' => '[How the day ends. Run, dinner, kids, reading, whatever is true.]', 'image_keywords' => ['sunset', 'home']],
],
],
[
'slug' => 'mistakes_we_made_carousel',
'category' => 'behind_the_scenes',
'name' => 'Mistakes we made',
'description' => 'Share three real mistakes and what you learned.',
'content' => '3 things we got wrong this year at {{brand_name}}. Sharing because hiding it would feel weird.',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'why post this', 'body' => 'Wins get plenty of attention. The misses are usually where the lessons live.', 'image_keywords' => ['notebook', 'writing']],
['title' => 'mistake 1', 'body' => '[What we tried. Why it did not work. What we did next.]', 'image_keywords' => ['error', 'desk']],
['title' => 'mistake 2', 'body' => '[The second one. Be honest about the cost, in money or time.]', 'image_keywords' => ['budget', 'paper']],
['title' => "mistake 3 + what's next", 'body' => '[Third mistake and one thing changing because of it.]', 'image_keywords' => ['plan', 'reset']],
],
],
[
'slug' => 'customer_story_carousel',
'category' => 'testimonial',
'name' => 'Customer story',
'description' => 'Tell a single customer story across the slides.',
'content' => "A story from one of {{brand_name}}'s customers. Posted with their permission.",
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => 'meet [name]', 'body' => '[Name, what they do, where they are. Two short sentences.]', 'image_keywords' => ['portrait', 'person']],
['title' => 'the problem', 'body' => '[The situation before they used {{brand_name}}. Specific, not abstract.]', 'image_keywords' => ['problem', 'thinking']],
['title' => 'what they tried', 'body' => '[How they found {{brand_name}} and what their first use looked like.]', 'image_keywords' => ['discover', 'try']],
['title' => 'what changed', 'body' => '[The result. A number if you have one, a story if you do not.]', 'image_keywords' => ['result', 'change']],
['title' => 'in their words', 'body' => '"[Direct quote from the customer. Short and real.]"', 'image_keywords' => ['quote', 'speech']],
],
],
[
'slug' => 'three_reviews_carousel',
'category' => 'testimonial',
'name' => 'Three reviews carousel',
'description' => 'Pull three real reviews into a swipeable post.',
'content' => 'Three reviews from real customers this month at {{brand_name}}.',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'what people are saying', 'body' => 'Three unedited quotes from this month. Full names withheld where requested.', 'image_keywords' => ['stars', 'review']],
['title' => 'review 1', 'body' => '"[Direct customer quote.]", [first name, location]', 'image_keywords' => ['speech', 'quote']],
['title' => 'review 2', 'body' => '"[Direct customer quote.]", [first name, location]', 'image_keywords' => ['feedback', 'note']],
['title' => 'review 3', 'body' => '"[Direct customer quote.]", [first name, location]', 'image_keywords' => ['testimonial', 'paper']],
],
],
[
'slug' => 'before_after_results_carousel',
'category' => 'testimonial',
'name' => 'Before and after results',
'description' => 'Show a customer outcome in before and after slides.',
'content' => 'A real result from a customer using [product/service] at {{brand_name}}. Same person, [time period] apart.',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'the starting point', 'body' => '[Where they were when they started. The honest version, not the shiny one.]', 'image_keywords' => ['before', 'start']],
['title' => 'what they did', 'body' => '[What they used and how often. Be specific about the routine.]', 'image_keywords' => ['process', 'routine']],
['title' => 'the result', 'body' => '[Where they are now. Numbers if relevant, photo if visual.]', 'image_keywords' => ['after', 'result']],
['title' => 'in their words', 'body' => '"[A short quote on what surprised them most.]"', 'image_keywords' => ['quote', 'smile']],
],
],
[
'slug' => 'industry_myth_busting_carousel',
'category' => 'industry_tip',
'name' => 'Industry myth busting',
'description' => 'Bust three myths about your industry.',
'content' => '3 things people still believe about [industry] that are not true.',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'myths, picked apart', 'body' => 'Three [industry] beliefs that get repeated everywhere and still miss the mark.', 'image_keywords' => ['question', 'thinking']],
['title' => 'myth 1', 'body' => 'Myth: [common belief]. Truth: [what is actually the case, with one detail].', 'image_keywords' => ['truth', 'note']],
['title' => 'myth 2', 'body' => 'Myth: [common belief]. Truth: [the correction in one sentence].', 'image_keywords' => ['fact', 'paper']],
['title' => 'myth 3', 'body' => 'Myth: [common belief]. Truth: [the correction]. The why is in the comments.', 'image_keywords' => ['comment', 'phone']],
],
],
[
'slug' => 'industry_trend_carousel',
'category' => 'industry_tip',
'name' => 'Industry trend carousel',
'description' => 'Walk through a trend shaping the industry this year.',
'content' => "What's actually moving in [industry] this year, in plain language.",
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => 'the trend', 'body' => '[Name the trend in plain words. One sentence on what it is.]', 'image_keywords' => ['trend', 'graph']],
['title' => 'why now', 'body' => '[The specific cause. A regulation, a tech shift, a behavior change.]', 'image_keywords' => ['cause', 'news']],
['title' => 'who it hits first', 'body' => '[The audience or company type that feels it before everyone else.]', 'image_keywords' => ['audience', 'people']],
['title' => 'what to do', 'body' => '[One concrete thing to try this quarter, not a vague principle.]', 'image_keywords' => ['action', 'plan']],
['title' => 'one number to watch', 'body' => '[A specific metric, with a source.]', 'image_keywords' => ['metric', 'data']],
],
],
[
'slug' => 'pro_tip_carousel',
'category' => 'industry_tip',
'name' => 'Pro tip carousel',
'description' => 'Share a single deep pro tip with context and steps.',
'content' => "One thing I'd tell my younger self about [topic]. Save this if it helps.",
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'the tip', 'body' => '[The one-line version. Short enough to remember.]', 'image_keywords' => ['tip', 'note']],
['title' => 'why it works', 'body' => '[The reason. Use a small example, not a big claim.]', 'image_keywords' => ['idea', 'thought']],
['title' => 'how to use it', 'body' => '[The steps. Three at most. Specific.]', 'image_keywords' => ['steps', 'list']],
['title' => 'one thing to avoid', 'body' => '[The one mistake people make when applying this tip.]', 'image_keywords' => ['warning', 'caution']],
],
],
[
'slug' => 'event_announcement_carousel',
'category' => 'event',
'name' => 'Event announcement',
'description' => 'Announce an upcoming event with the key details.',
'content' => "We're hosting [Event Name] on [date]. Everything you need to know is in the slides.",
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => '[event name]', 'body' => '[Date, location or online, who it is for in one line.]', 'image_keywords' => ['event', 'invite']],
['title' => "what's planned", 'body' => '[The agenda in plain bullets, not marketing speak.]', 'image_keywords' => ['agenda', 'schedule']],
['title' => "who's speaking", 'body' => '[Names and one-line bios. No more than three.]', 'image_keywords' => ['speakers', 'panel']],
['title' => 'how to join', 'body' => '[Free or paid, link, deadline if any. Be specific.]', 'image_keywords' => ['ticket', 'register']],
['title' => 'reserve your spot', 'body' => '[Final reminder + the link in bio call to action.]', 'image_keywords' => ['phone', 'tap']],
],
],
[
'slug' => 'event_speakers_carousel',
'category' => 'event',
'name' => 'Event speakers reveal',
'description' => 'Reveal speakers one slide each.',
'content' => 'Speakers for [Event Name]. Tickets are open at {{brand_name}}.',
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => 'speakers, revealed', 'body' => 'The lineup for [Event Name] on [date]. Swipe to meet them.', 'image_keywords' => ['lineup', 'stage']],
['title' => '[speaker 1]', 'body' => '[Name, role. The one thing they will talk about.]', 'image_keywords' => ['portrait', 'speaker']],
['title' => '[speaker 2]', 'body' => '[Name, role. Their session topic in one line.]', 'image_keywords' => ['portrait', 'mic']],
['title' => '[speaker 3]', 'body' => '[Name, role. What attendees will leave with.]', 'image_keywords' => ['portrait', 'panel']],
['title' => 'tickets in bio', 'body' => '[Date, location, registration link.]', 'image_keywords' => ['ticket', 'register']],
],
],
[
'slug' => 'workshop_invitation_carousel',
'category' => 'event',
'name' => 'Workshop invitation',
'description' => 'Invite people to a hands-on workshop.',
'content' => "Hands-on workshop at {{brand_name}} on [date]. Limited seats. Here's what's inside.",
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'workshop on [date]', 'body' => '[Topic in one line. Online or in person, with location and time.]', 'image_keywords' => ['workshop', 'class']],
['title' => "what you'll do", 'body' => '[Three concrete activities. Use verbs, not adjectives.]', 'image_keywords' => ['hands', 'making']],
['title' => "what you'll leave with", 'body' => '[The output: a finished thing, a draft, a decision, a plan.]', 'image_keywords' => ['notebook', 'result']],
['title' => 'reserve a seat', 'body' => '[Number of seats left, price if any, link in bio.]', 'image_keywords' => ['chair', 'register']],
],
],
[
'slug' => 'this_or_that_carousel',
'category' => 'engagement',
'name' => 'This or that',
'description' => 'Ask followers a series of either-or questions.',
'content' => 'This or that, [topic] edition. Tell me your picks in the comments.',
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => 'pick one', 'body' => 'Five quick choices. Comment your answers in order.', 'image_keywords' => ['choice', 'fork']],
['title' => '[option a] or [option b]', 'body' => '[Brief context if needed.]', 'image_keywords' => ['split', 'options']],
['title' => '[option c] or [option d]', 'body' => '[Brief context if needed.]', 'image_keywords' => ['versus', 'choice']],
['title' => '[option e] or [option f]', 'body' => '[Brief context if needed.]', 'image_keywords' => ['compare', 'pick']],
['title' => 'your turn', 'body' => 'Drop your answers below. I read every comment.', 'image_keywords' => ['comment', 'phone']],
],
],
[
'slug' => 'unpopular_opinion_carousel',
'category' => 'engagement',
'name' => 'Unpopular opinion',
'description' => 'Share a real opinion and invite disagreement.',
'content' => 'An unpopular take on [topic]. Tell me where I am wrong in the comments.',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'unpopular take', 'body' => '[The opinion in one short, clear sentence.]', 'image_keywords' => ['opinion', 'speech']],
['title' => 'why I think this', 'body' => '[The reason. A small story or a number, not just feelings.]', 'image_keywords' => ['reason', 'thinking']],
['title' => 'where I might be wrong', 'body' => '[Honest about the weakest part of the argument.]', 'image_keywords' => ['doubt', 'question']],
['title' => 'tell me', 'body' => 'Agree, disagree, mixed, drop it in the comments.', 'image_keywords' => ['comment', 'discussion']],
],
],
[
'slug' => 'fill_in_the_blank_carousel',
'category' => 'engagement',
'name' => 'Fill in the blank',
'description' => 'Prompt followers with three blanks to complete.',
'content' => 'Fill in the blanks. I want to read your answers.',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'fill in the blanks', 'body' => 'Three quick prompts about [topic]. Comment your answers in order.', 'image_keywords' => ['blank', 'pen']],
['title' => 'prompt 1', 'body' => 'The best [thing] I [verb] this year was ____.', 'image_keywords' => ['idea', 'thought']],
['title' => 'prompt 2', 'body' => 'The thing I want to do more of in [topic] is ____.', 'image_keywords' => ['plan', 'goal']],
['title' => 'prompt 3', 'body' => 'One person who taught me about [topic] is ____.', 'image_keywords' => ['mentor', 'people']],
],
],
[
'slug' => 'q_and_a_carousel',
'category' => 'engagement',
'name' => 'Q and A carousel',
'description' => 'Answer five real questions from your audience.',
'content' => 'You asked, I answered. Five real questions from the DMs.',
'image_count' => 6,
'image_keywords' => null,
'slides' => [
['title' => 'questions answered', 'body' => 'Pulled five from this week. Anonymized where I needed to.', 'image_keywords' => ['questions', 'mail']],
['title' => 'q1', 'body' => 'Q: [paraphrased question]. A: [answer in one or two sentences].', 'image_keywords' => ['answer', 'note']],
['title' => 'q2', 'body' => 'Q: [paraphrased question]. A: [answer].', 'image_keywords' => ['reply', 'speech']],
['title' => 'q3', 'body' => 'Q: [paraphrased question]. A: [answer].', 'image_keywords' => ['question', 'mark']],
['title' => 'q4', 'body' => 'Q: [paraphrased question]. A: [answer].', 'image_keywords' => ['chat', 'bubble']],
['title' => 'q5', 'body' => 'Q: [paraphrased question]. A: [answer]. Drop more in the comments.', 'image_keywords' => ['comments', 'phone']],
],
],
];

View file

@ -0,0 +1,362 @@
<?php
declare(strict_types=1);
return [
[
'slug' => 'limited_time_offer_feed',
'category' => 'promotion',
'name' => 'Limited-time offer',
'description' => 'Promote a time-sensitive deal on Instagram Feed.',
'content' => "⏰ Don't miss it. {{brand_name}} is offering [discount]% off [product/service], today only.\n\nTap the link in bio to grab yours before it's gone.",
'image_count' => 1,
'image_keywords' => ['sale', 'offer', 'shopping'],
'slides' => null,
],
[
'slug' => 'team_behind_the_scenes_feed',
'category' => 'behind_the_scenes',
'name' => 'Team behind the scenes',
'description' => 'Humanize your brand by showing the team at work.',
'content' => "This is what a typical day at {{brand_name}} looks like. 👀\n\nWe believe great work happens when people feel at home. Here's a peek behind the curtain.\n\n#{{brand_name}} #BehindTheScenes",
'image_count' => 1,
'image_keywords' => ['office', 'team', 'workspace'],
'slides' => null,
],
// Product launch
[
'slug' => 'new_product_drop_feed',
'category' => 'product_launch',
'name' => 'New product drop',
'description' => 'Announce a fresh product release on the feed.',
'content' => "It's here. [Product name] just landed at {{brand_name}}.\n\nWe spent [months/weeks] on this one. Every detail was tested by the team before we let it out the door.\n\nTap the link in bio to be one of the first to try it.",
'image_count' => 1,
'image_keywords' => ['product', 'launch', 'unboxing'],
'slides' => null,
],
[
'slug' => 'pre_order_announcement_feed',
'category' => 'product_launch',
'name' => 'Pre-order announcement',
'description' => 'Open pre-orders for an upcoming product.',
'content' => "Pre-orders are open. [Product name] ships [date].\n\nThe first batch is limited to [number] units. Once they're claimed, the next run won't ship until [later date].\n\nReserve yours through the link in bio.",
'image_count' => 1,
'image_keywords' => ['product', 'package', 'box'],
'slides' => null,
],
[
'slug' => 'feature_highlight_launch_feed',
'category' => 'product_launch',
'name' => 'Feature highlight launch',
'description' => 'Spotlight one specific feature of a new product.',
'content' => "The one thing we're most proud of in [product name]: [specific feature].\n\nIt took [number] prototypes to get this right. The early testers told us it changed how they [use case], so we kept iterating until it felt obvious.\n\nSee it in action through the link in bio.",
'image_count' => 1,
'image_keywords' => ['product', 'detail', 'closeup'],
'slides' => null,
],
[
'slug' => 'product_restock_feed',
'category' => 'product_launch',
'name' => 'Product restock',
'description' => 'Announce a return-to-stock for a popular item.',
'content' => "Back in stock. [Product name] sold out in [time period] last time, so we made more.\n\nIf you missed it before, now's the moment. Stock is limited again, and we expect another quick run.\n\nGrab yours via the link in bio.",
'image_count' => 1,
'image_keywords' => ['product', 'shelf', 'inventory'],
'slides' => null,
],
// Promotion
[
'slug' => 'flash_sale_feed',
'category' => 'promotion',
'name' => 'Flash sale',
'description' => 'Drive urgency with a short flash sale.',
'content' => "Flash sale. [Discount]% off everything for the next [hours] hours.\n\nNo code needed at checkout. The discount is already applied across the site.\n\nLink in bio. Set a timer.",
'image_count' => 1,
'image_keywords' => ['sale', 'discount', 'shopping'],
'slides' => null,
],
[
'slug' => 'bundle_deal_feed',
'category' => 'promotion',
'name' => 'Bundle deal',
'description' => 'Promote a multi-product bundle offer.',
'content' => "Buy [item A] and [item B] together, save [amount].\n\nIt's the same combo our team uses every week, so we put it together as a set. Cheaper than buying each one on its own.\n\nLink in bio.",
'image_count' => 1,
'image_keywords' => ['bundle', 'products', 'gift'],
'slides' => null,
],
[
'slug' => 'free_shipping_feed',
'category' => 'promotion',
'name' => 'Free shipping',
'description' => 'Announce free shipping for a limited window.',
'content' => "Free shipping on every order this week.\n\nNo minimum, no code, no fine print at the bottom you have to squint to read. Just pick what you want and we'll cover the delivery.\n\nLink in bio. Ends [day].",
'image_count' => 1,
'image_keywords' => ['shipping', 'package', 'delivery'],
'slides' => null,
],
[
'slug' => 'first_order_discount_feed',
'category' => 'promotion',
'name' => 'First order discount',
'description' => 'Welcome new customers with a first-purchase discount.',
'content' => "First time at {{brand_name}}? Take [discount]% off your first order.\n\nUse code [CODE] at checkout. Works on anything in the shop, including the [bestseller name] people keep asking us about.\n\nLink in bio.",
'image_count' => 1,
'image_keywords' => ['welcome', 'shop', 'discount'],
'slides' => null,
],
// Educational
[
'slug' => 'quick_how_to_tip_feed',
'category' => 'educational',
'name' => 'Quick how-to tip',
'description' => 'Share a single actionable tip from your niche.',
'content' => "Here's a small thing that makes [task] easier: [tip in one sentence].\n\nWe started doing this after [reason or story]. Saved us [time/money/effort] within a week.\n\nSave this post for later. Link in bio for the full guide.",
'image_count' => 1,
'image_keywords' => ['notebook', 'desk', 'work'],
'slides' => null,
],
[
'slug' => 'common_mistake_feed',
'category' => 'educational',
'name' => 'Common mistake',
'description' => 'Call out a frequent mistake and the fix.',
'content' => "The mistake we see most often with [topic]: [the mistake].\n\nIt's easy to do. Most people don't realize it costs them [consequence] until someone points it out.\n\nThe fix is simple: [the fix]. Try it this week and see what changes.",
'image_count' => 1,
'image_keywords' => ['warning', 'thinking', 'desk'],
'slides' => null,
],
[
'slug' => 'myth_vs_truth_feed',
'category' => 'educational',
'name' => 'Myth vs truth',
'description' => 'Debunk a common myth in your industry.',
'content' => "Myth: [common belief about your industry].\n\nTruth: [the reality, with one supporting detail].\n\nWe used to believe the myth too. Then we tracked it for [time period] and the data said otherwise. Save this if you've heard the same thing.",
'image_count' => 1,
'image_keywords' => ['question', 'thinking', 'idea'],
'slides' => null,
],
[
'slug' => 'glossary_term_feed',
'category' => 'educational',
'name' => 'Glossary term explained',
'description' => 'Explain one industry term in plain language.',
'content' => "[Term]: what it actually means.\n\nMost guides explain it with more jargon. Here's the plain version: [one-sentence definition].\n\nA real example from our work: [short example]. Save the post if you've been nodding through meetings without asking.",
'image_count' => 1,
'image_keywords' => ['book', 'glossary', 'study'],
'slides' => null,
],
// Behind the scenes
[
'slug' => 'workspace_tour_feed',
'category' => 'behind_the_scenes',
'name' => 'Workspace tour',
'description' => 'Show where the work happens.',
'content' => "Where the work happens.\n\nThis is [room/space] at {{brand_name}}. The plant in the corner has survived three office moves. The whiteboard hasn't been wiped since [month].\n\nNot polished, but it's ours.",
'image_count' => 1,
'image_keywords' => ['workspace', 'desk', 'studio'],
'slides' => null,
],
[
'slug' => 'how_its_made_feed',
'category' => 'behind_the_scenes',
'name' => 'How it is made',
'description' => 'Show one step of your production process.',
'content' => "This is step [number] of how we make [product].\n\nIt takes about [time] and we do it by hand. No shortcuts here, mostly because we tried the shortcut once and it ruined a whole batch.\n\nMore on the process in the link in bio.",
'image_count' => 1,
'image_keywords' => ['craft', 'making', 'workshop'],
'slides' => null,
],
[
'slug' => 'team_member_intro_feed',
'category' => 'behind_the_scenes',
'name' => 'Team member intro',
'description' => 'Introduce a single team member.',
'content' => "Meet [name], our [role] at {{brand_name}}.\n\n[Name] joined us [time ago] and runs [area]. Outside work, you'll find them [hobby or interest].\n\nIf you've emailed support recently, there's a good chance [name] wrote back.",
'image_count' => 1,
'image_keywords' => ['portrait', 'team', 'person'],
'slides' => null,
],
[
'slug' => 'a_day_in_the_life_feed',
'category' => 'behind_the_scenes',
'name' => 'A day in the life',
'description' => 'Walk through a normal day at the company.',
'content' => "A normal Tuesday at {{brand_name}}.\n\nMornings are quiet, mostly emails and one stand-up. Afternoons get loud once [activity] starts. By 5pm someone has usually broken something and someone else has fixed it.\n\nThat's the whole job, honestly.",
'image_count' => 1,
'image_keywords' => ['office', 'work', 'coffee'],
'slides' => null,
],
// Testimonial
[
'slug' => 'customer_quote_feed',
'category' => 'testimonial',
'name' => 'Customer quote',
'description' => 'Share a single strong customer quote.',
'content' => "\"[Customer quote in their own words].\", [Customer name], [city or role]\n\nThis came in last week and we had to share it. Thanks [first name].\n\nIf {{brand_name}} has helped you with [outcome], we'd love to hear about it. Reply or DM us.",
'image_count' => 1,
'image_keywords' => ['quote', 'happy', 'customer'],
'slides' => null,
],
[
'slug' => 'before_after_result_feed',
'category' => 'testimonial',
'name' => 'Before and after result',
'description' => 'Highlight a real customer transformation.',
'content' => "Before: [starting point].\nAfter: [result with a number if possible].\n\n[Customer name] worked with us for [time period]. The change wasn't overnight, but you can see where things tipped.\n\nLink in bio if you want a similar look.",
'image_count' => 1,
'image_keywords' => ['transformation', 'result', 'progress'],
'slides' => null,
],
[
'slug' => 'star_rating_review_feed',
'category' => 'testimonial',
'name' => 'Star rating review',
'description' => 'Spotlight a recent five-star review.',
'content' => "★★★★★\n\n\"[Pulled review text, two to three sentences].\"\n\n[Reviewer first name] left this one yesterday. We read every review that comes in, the kind ones and the rough ones.\n\nLeave yours in the link in bio.",
'image_count' => 1,
'image_keywords' => ['stars', 'review', 'rating'],
'slides' => null,
],
[
'slug' => 'case_study_snapshot_feed',
'category' => 'testimonial',
'name' => 'Case study snapshot',
'description' => 'Tease a longer customer success story.',
'content' => "How [customer or company] used {{brand_name}} to [outcome].\n\nIn [time period], they went from [starting point] to [result]. The full breakdown covers what they tried first and what finally clicked.\n\nLink in bio for the case study.",
'image_count' => 1,
'image_keywords' => ['case study', 'meeting', 'results'],
'slides' => null,
],
// Industry tip
[
'slug' => 'one_tool_we_use_feed',
'category' => 'industry_tip',
'name' => 'One tool we use',
'description' => 'Recommend a tool you actually use.',
'content' => "One tool we use every week: [tool name].\n\nWe tried [number] alternatives before settling on this one. The thing that won us over was [specific feature], not the marketing on the homepage.\n\nNot sponsored. Just useful.",
'image_count' => 1,
'image_keywords' => ['tools', 'software', 'laptop'],
'slides' => null,
],
[
'slug' => 'industry_trend_take_feed',
'category' => 'industry_tip',
'name' => 'Industry trend take',
'description' => 'Give an honest opinion on a current trend.',
'content' => "Everyone in [industry] is talking about [trend].\n\nHonest take: it's useful for [use case], not for [other use case]. We tested it on a small project before committing, and that's the version we'd recommend.\n\nWhat's been your experience? Tell us in the comments.",
'image_count' => 1,
'image_keywords' => ['trend', 'industry', 'analysis'],
'slides' => null,
],
[
'slug' => 'pricing_advice_feed',
'category' => 'industry_tip',
'name' => 'Pricing advice',
'description' => 'Share a pricing lesson from experience.',
'content' => "What we got wrong about pricing: [the mistake].\n\nWe undercharged for [period] before someone pointed out our numbers didn't add up. Raised prices [percent], lost [number] customers, kept the rest, made more.\n\nIf you're stuck on this too, the link in bio has our pricing breakdown.",
'image_count' => 1,
'image_keywords' => ['money', 'price', 'calculator'],
'slides' => null,
],
[
'slug' => 'workflow_tip_feed',
'category' => 'industry_tip',
'name' => 'Workflow tip',
'description' => 'Share a small workflow improvement.',
'content' => "Small workflow change that saved us hours: [the change].\n\nBefore, [old way]. After, [new way]. Took about a week to get used to and we haven't gone back.\n\nIf you try it, let us know how it lands.",
'image_count' => 1,
'image_keywords' => ['workflow', 'productivity', 'planner'],
'slides' => null,
],
// Event
[
'slug' => 'event_announcement_feed',
'category' => 'event',
'name' => 'Event announcement',
'description' => 'Announce an upcoming event.',
'content' => "Save the date.\n\n{{brand_name}} is hosting [event name] on [date] at [location or online].\n\nWe've got [speakers, format, or what to expect]. Spots are limited to [number] this time.\n\nRSVP through the link in bio.",
'image_count' => 1,
'image_keywords' => ['event', 'invitation', 'calendar'],
'slides' => null,
],
[
'slug' => 'webinar_invite_feed',
'category' => 'event',
'name' => 'Webinar invite',
'description' => 'Promote an upcoming webinar.',
'content' => "Free webinar: [topic]. [Date] at [time].\n\n[Host name] is going to walk through [main points] and then take live questions for the last [minutes].\n\nIf you can't make it, sign up anyway and we'll send the recording.\n\nLink in bio.",
'image_count' => 1,
'image_keywords' => ['webinar', 'laptop', 'presentation'],
'slides' => null,
],
[
'slug' => 'meetup_recap_feed',
'category' => 'event',
'name' => 'Meetup recap',
'description' => 'Recap a recent in-person event.',
'content' => "[Number] people, [city], one room.\n\nLast night's meetup brought together folks working in [field]. The best conversation of the night was about [topic], started over coffee and never really ended.\n\nThanks to everyone who came out. Next one is [date].",
'image_count' => 1,
'image_keywords' => ['meetup', 'crowd', 'event'],
'slides' => null,
],
[
'slug' => 'live_stream_reminder_feed',
'category' => 'event',
'name' => 'Live stream reminder',
'description' => 'Remind followers about an upcoming live stream.',
'content' => "Going live [day] at [time].\n\nWe're talking [topic]. No script, just questions and whatever the chat throws at us.\n\nTurn on notifications so you don't miss it. Or don't, the replay will be on the grid afterward.",
'image_count' => 1,
'image_keywords' => ['live', 'broadcast', 'camera'],
'slides' => null,
],
// Engagement
[
'slug' => 'this_or_that_feed',
'category' => 'engagement',
'name' => 'This or that',
'description' => 'Ask a simple either/or question.',
'content' => "[Option A] or [Option B]?\n\nWe argue about this in the office at least once a week. Curious which side wins here.\n\nVote in the comments. No wrong answer, but there's definitely a right one.",
'image_count' => 1,
'image_keywords' => ['choice', 'options', 'vote'],
'slides' => null,
],
[
'slug' => 'fill_in_the_blank_feed',
'category' => 'engagement',
'name' => 'Fill in the blank',
'description' => 'Prompt followers with a fill-in-the-blank question.',
'content' => "Finish the sentence: \"The first thing I do every morning is ___.\"\n\nWe asked the team and got answers from \"check Slack\" to \"avoid checking Slack.\" Curious where you land.\n\nDrop yours in the comments.",
'image_count' => 1,
'image_keywords' => ['question', 'morning', 'coffee'],
'slides' => null,
],
[
'slug' => 'comment_question_feed',
'category' => 'engagement',
'name' => 'Comment question',
'description' => 'Ask an open question to spark comments.',
'content' => "Question for the group: what's the best [topic-related thing] you've tried this year?\n\nWe're putting together a roundup and want real picks, not the same five everyone lists.\n\nDrop yours below. We'll share the favorites next week.",
'image_count' => 1,
'image_keywords' => ['conversation', 'community', 'chat'],
'slides' => null,
],
[
'slug' => 'tag_a_friend_feed',
'category' => 'engagement',
'name' => 'Tag a friend',
'description' => 'Encourage tagging with a relatable scenario.',
'content' => "Tag the friend who [relatable scenario].\n\nWe all have one. Maybe you are one. Either way, this post is for them.\n\nBonus points if they tag you back.",
'image_count' => 1,
'image_keywords' => ['friends', 'people', 'fun'],
'slides' => null,
],
];

View file

@ -0,0 +1,362 @@
<?php
declare(strict_types=1);
return [
[
'slug' => 'story_announcement',
'category' => 'product_launch',
'name' => 'Quick announcement',
'description' => 'Drive attention to a new launch or update with a 24-hour story.',
'content' => "Big news at {{brand_name}}.\n\nTap the link to see what's new.",
'image_count' => 1,
'image_keywords' => ['announcement', 'launch'],
'slides' => null,
],
[
'slug' => 'story_poll_question',
'category' => 'engagement',
'name' => 'Poll question',
'description' => 'Use a story to ask a quick question and engage your audience.',
'content' => "What matters most when you pick a [product/service]?\n\nTap to vote.",
'image_count' => 1,
'image_keywords' => ['question', 'engagement'],
'slides' => null,
],
[
'slug' => 'story_flash_promo',
'category' => 'promotion',
'name' => 'Flash promo',
'description' => 'Limited-time offer in story format with urgency.',
'content' => "24 hours only.\n\n[Discount]% off at {{brand_name}}.\n\nSwipe up.",
'image_count' => 1,
'image_keywords' => ['sale', 'discount', 'urgency'],
'slides' => null,
],
// product_launch
[
'slug' => 'story_product_drop',
'category' => 'product_launch',
'name' => 'New product drop',
'description' => 'Announce a new product going live today.',
'content' => "It's live.\n\n[Product name] just dropped.\n\nLink in bio.",
'image_count' => 1,
'image_keywords' => ['product', 'launch', 'new'],
'slides' => null,
],
[
'slug' => 'story_feature_shipped',
'category' => 'product_launch',
'name' => 'Feature shipped',
'description' => 'Tell followers about a new feature you just released.',
'content' => "We just shipped [feature].\n\nGo try it.",
'image_count' => 1,
'image_keywords' => ['update', 'feature', 'app'],
'slides' => null,
],
[
'slug' => 'story_waitlist_open',
'category' => 'product_launch',
'name' => 'Waitlist open',
'description' => 'Invite followers to join a waitlist.',
'content' => "Waitlist is open.\n\n[Spots] spots left.\n\nLink in bio.",
'image_count' => 1,
'image_keywords' => ['waitlist', 'signup'],
'slides' => null,
],
[
'slug' => 'story_preorder_live',
'category' => 'product_launch',
'name' => 'Pre-order live',
'description' => 'Drive pre-orders for an upcoming product.',
'content' => "Pre-orders are open.\n\nShips [date].\n\nTap to claim yours.",
'image_count' => 1,
'image_keywords' => ['preorder', 'product'],
'slides' => null,
],
// promotion
[
'slug' => 'story_weekend_sale',
'category' => 'promotion',
'name' => 'Weekend sale',
'description' => 'Push a quick weekend sale.',
'content' => "Weekend sale.\n\n[Discount]% off everything.\n\nEnds Sunday.",
'image_count' => 1,
'image_keywords' => ['sale', 'weekend', 'discount'],
'slides' => null,
],
[
'slug' => 'story_code_drop',
'category' => 'promotion',
'name' => 'Discount code drop',
'description' => 'Share a code your followers can use at checkout.',
'content' => "Use [CODE] at checkout.\n\n[Discount]% off.\n\nGood until [date].",
'image_count' => 1,
'image_keywords' => ['coupon', 'code', 'discount'],
'slides' => null,
],
[
'slug' => 'story_last_chance',
'category' => 'promotion',
'name' => 'Last chance',
'description' => 'Final reminder before a sale ends.',
'content' => "Last chance.\n\n[Offer] ends at midnight.",
'image_count' => 1,
'image_keywords' => ['deadline', 'sale', 'urgent'],
'slides' => null,
],
[
'slug' => 'story_bundle_deal',
'category' => 'promotion',
'name' => 'Bundle deal',
'description' => 'Promote a bundle at a lower price.',
'content' => "Bundle deal.\n\n[Item A] + [Item B] for [price].\n\nTap to grab it.",
'image_count' => 1,
'image_keywords' => ['bundle', 'deal', 'product'],
'slides' => null,
],
// educational
[
'slug' => 'story_quick_tip',
'category' => 'educational',
'name' => 'Quick tip',
'description' => 'Share one short tip on the screen.',
'content' => "Quick tip:\n\n[One short actionable tip].",
'image_count' => 1,
'image_keywords' => ['tip', 'advice', 'learning'],
'slides' => null,
],
[
'slug' => 'story_did_you_know',
'category' => 'educational',
'name' => 'Did you know',
'description' => 'Surface a surprising fact.',
'content' => "Did you know?\n\n[Surprising fact about your niche].",
'image_count' => 1,
'image_keywords' => ['fact', 'knowledge'],
'slides' => null,
],
[
'slug' => 'story_common_mistake',
'category' => 'educational',
'name' => 'Common mistake',
'description' => 'Call out a mistake your audience tends to make.',
'content' => "Stop doing [common mistake].\n\nDo [better approach] instead.",
'image_count' => 1,
'image_keywords' => ['mistake', 'advice', 'tip'],
'slides' => null,
],
[
'slug' => 'story_one_word_lesson',
'category' => 'educational',
'name' => 'One-word lesson',
'description' => 'A single word followed by a short why.',
'content' => "[One word].\n\nThat's the difference between [outcome A] and [outcome B].",
'image_count' => 1,
'image_keywords' => ['lesson', 'word', 'idea'],
'slides' => null,
],
// behind_the_scenes
[
'slug' => 'story_workspace_peek',
'category' => 'behind_the_scenes',
'name' => 'Workspace peek',
'description' => 'Quick shot of where the work happens.',
'content' => "Where the work happens.\n\n[Short caption about your space].",
'image_count' => 1,
'image_keywords' => ['workspace', 'desk', 'office'],
'slides' => null,
],
[
'slug' => 'story_meet_the_team',
'category' => 'behind_the_scenes',
'name' => 'Meet the team',
'description' => 'Introduce a team member with one line.',
'content' => "Meet [name].\n\n[Their role at {{brand_name}}].",
'image_count' => 1,
'image_keywords' => ['team', 'people', 'portrait'],
'slides' => null,
],
[
'slug' => 'story_in_progress',
'category' => 'behind_the_scenes',
'name' => 'In progress',
'description' => 'Show something half-done.',
'content' => "In progress.\n\n[What you are working on right now].",
'image_count' => 1,
'image_keywords' => ['process', 'work', 'progress'],
'slides' => null,
],
[
'slug' => 'story_packing_orders',
'category' => 'behind_the_scenes',
'name' => 'Packing orders',
'description' => 'Show orders going out the door.',
'content' => "Today's orders.\n\nThank you for trusting {{brand_name}}.",
'image_count' => 1,
'image_keywords' => ['packaging', 'orders', 'shipping'],
'slides' => null,
],
// testimonial
[
'slug' => 'story_customer_quote',
'category' => 'testimonial',
'name' => 'Customer quote',
'description' => 'Share a short customer quote on screen.',
'content' => "\"[Short customer quote].\"\n\n- [Customer name]",
'image_count' => 1,
'image_keywords' => ['testimonial', 'review', 'quote'],
'slides' => null,
],
[
'slug' => 'story_review_screenshot',
'category' => 'testimonial',
'name' => 'Review screenshot',
'description' => 'Repost a glowing review screenshot.',
'content' => "Reviews like this make our week.\n\nThank you, [customer first name].",
'image_count' => 1,
'image_keywords' => ['review', 'screenshot', 'feedback'],
'slides' => null,
],
[
'slug' => 'story_before_after_user',
'category' => 'testimonial',
'name' => 'Customer before/after',
'description' => 'Highlight a customer result.',
'content' => '[Customer first name] went from [before] to [after] in [time].',
'image_count' => 1,
'image_keywords' => ['result', 'transformation', 'customer'],
'slides' => null,
],
// industry_tip
[
'slug' => 'story_industry_myth',
'category' => 'industry_tip',
'name' => 'Industry myth',
'description' => 'Debunk a common belief in your space.',
'content' => "Myth: [common belief].\n\nReality: [the truth].",
'image_count' => 1,
'image_keywords' => ['myth', 'industry', 'truth'],
'slides' => null,
],
[
'slug' => 'story_industry_stat',
'category' => 'industry_tip',
'name' => 'Industry stat',
'description' => 'Drop a single stat that grabs attention.',
'content' => "[Stat].\n\nThat's why we built {{brand_name}}.",
'image_count' => 1,
'image_keywords' => ['statistic', 'data', 'industry'],
'slides' => null,
],
[
'slug' => 'story_tool_we_use',
'category' => 'industry_tip',
'name' => 'Tool we use',
'description' => 'Recommend a tool your audience can try.',
'content' => "Tool we use every day:\n\n[Tool name].\n\nHere's why: [one short reason].",
'image_count' => 1,
'image_keywords' => ['tool', 'software', 'recommendation'],
'slides' => null,
],
[
'slug' => 'story_red_flag',
'category' => 'industry_tip',
'name' => 'Red flag',
'description' => 'Warn followers about a red flag in your industry.',
'content' => "Red flag in [industry]:\n\n[The warning sign to watch for].",
'image_count' => 1,
'image_keywords' => ['warning', 'industry', 'advice'],
'slides' => null,
],
// event
[
'slug' => 'story_event_today',
'category' => 'event',
'name' => 'Event today',
'description' => 'Last-minute reminder for a same-day event.',
'content' => "Tonight.\n\n[Event name] at [time].\n\nTap for the link.",
'image_count' => 1,
'image_keywords' => ['event', 'reminder'],
'slides' => null,
],
[
'slug' => 'story_event_countdown',
'category' => 'event',
'name' => 'Event countdown',
'description' => 'Build anticipation with a countdown.',
'content' => "[X] days until [event name].\n\nReply GO to get the reminder.",
'image_count' => 1,
'image_keywords' => ['countdown', 'event'],
'slides' => null,
],
[
'slug' => 'story_live_now',
'category' => 'event',
'name' => 'Live now',
'description' => 'Tell followers you are live or onstage.',
'content' => "Live now.\n\n[Topic or location].\n\nCome say hi.",
'image_count' => 1,
'image_keywords' => ['live', 'streaming', 'event'],
'slides' => null,
],
[
'slug' => 'story_event_recap',
'category' => 'event',
'name' => 'Event recap',
'description' => 'Quick recap after the event ends.',
'content' => "[Event name] is a wrap.\n\nThank you to everyone who showed up.",
'image_count' => 1,
'image_keywords' => ['event', 'recap', 'crowd'],
'slides' => null,
],
// engagement
[
'slug' => 'story_this_or_that',
'category' => 'engagement',
'name' => 'This or that',
'description' => 'Two-option poll for fast taps.',
'content' => "[Option A] or [Option B]?\n\nTap to vote.",
'image_count' => 1,
'image_keywords' => ['poll', 'choice', 'vote'],
'slides' => null,
],
[
'slug' => 'story_question_box',
'category' => 'engagement',
'name' => 'Question box',
'description' => 'Open the floor for questions.',
'content' => "Ask me anything about [topic].\n\nReply with your question.",
'image_count' => 1,
'image_keywords' => ['questions', 'ama', 'conversation'],
'slides' => null,
],
[
'slug' => 'story_emoji_slider',
'category' => 'engagement',
'name' => 'Emoji slider',
'description' => 'Use the slider sticker to gauge a feeling.',
'content' => "How excited are you for [thing]?\n\nMove the slider.",
'image_count' => 1,
'image_keywords' => ['slider', 'reaction', 'engagement'],
'slides' => null,
],
[
'slug' => 'story_dm_prompt',
'category' => 'engagement',
'name' => 'DM prompt',
'description' => 'Push followers to send a DM keyword.',
'content' => "Want [resource]?\n\nReply [keyword] and I'll send it.",
'image_count' => 1,
'image_keywords' => ['dm', 'message', 'engagement'],
'slides' => null,
],
];

View file

@ -0,0 +1,342 @@
<?php
declare(strict_types=1);
return [
[
'slug' => 'company_milestone',
'category' => 'behind_the_scenes',
'name' => 'Company milestone',
'description' => 'Celebrate a company milestone from the brand page.',
'content' => "Today {{brand_name}} hits [milestone, e.g. 1,000 customers, 5 years, \$X ARR].\n\nThis didn't happen because of any single person. It happened because [team / customers / community] showed up every day.\n\nThank you to everyone who's been part of this journey. We're just getting started.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'hiring_announcement',
'category' => 'engagement',
'name' => "We're hiring",
'description' => 'Announce open roles and invite applications from the company page.',
'content' => "{{brand_name}} is hiring.\n\nWe're looking for [role(s)] to join us on [team/mission].\n\nWhat we offer:\n→ [Highlight 1]\n→ [Highlight 2]\n→ [Highlight 3]\n\nIf this sounds like you (or someone you know), apply or share → [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'thought_leadership_page',
'category' => 'industry_tip',
'name' => 'Industry POV',
'description' => 'Share the company stance on an industry trend or shift.',
'content' => "The [industry] landscape is shifting.\n\nHere's what we're seeing at {{brand_name}}:\n\n1. [Observation]\n2. [Observation]\n3. [Observation]\n\nWhat this means for [audience]: [implication].\n\nWhat are you noticing on your end?",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ===== product_launch =====
[
'slug' => 'new_feature_release',
'category' => 'product_launch',
'name' => 'New feature release',
'description' => 'Announce a specific new feature with the problem it solves.',
'content' => "We shipped [feature name] today.\n\nThe short version: [one-line description of what it does].\n\nThe longer version: customers kept telling us [specific pain point]. We tried [previous workaround] for about [timeframe], and it never quite landed. So we rebuilt the [area] from scratch.\n\nA few things that changed:\n[Behavior before] is now [behavior after].\n[Manual step] runs automatically.\n[Limit] is gone.\n\nIf you want to try it, the docs are here: [link]. If you find something broken, our team is in the comments.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'beta_open_signups',
'category' => 'product_launch',
'name' => 'Beta open for signups',
'description' => 'Invite customers and prospects into a public or private beta.',
'content' => "Beta access for [product/feature] is now open.\n\nWe spent [timeframe] running it with [number] private testers. The feedback was good enough that we're widening the door.\n\nWho it's for: [specific user description, e.g. teams running >X campaigns/month].\nWho it's not for yet: [honest exclusion, e.g. enterprises needing SSO].\n\nWe're capping the next round at [number] companies so our team can stay close to every account. Spots go on a first-come basis.\n\nRequest access: [link].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'integration_partnership',
'category' => 'product_launch',
'name' => 'Integration with partner',
'description' => 'Announce a new integration or technical partnership.',
'content' => "{{brand_name}} now connects with [partner].\n\nIf you use both, you can stop [manual step]. The integration handles [specific data flow] automatically.\n\nWhat changed for our shared customers:\nNo more exporting [data] and re-importing it on the other side.\n[Trigger] in [partner] now creates [action] in {{brand_name}}.\nField mapping is editable, so weird custom setups still work.\n\nThanks to the team at [partner] for the back-and-forth on the API. Setup guide: [link].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'product_redesign',
'category' => 'product_launch',
'name' => 'Product redesign launch',
'description' => 'Announce a significant UI or product refresh.',
'content' => "We redesigned [product/area]. It's live for everyone today.\n\nOur design team has been quiet on here for a few months because of this. The old [area] grew organically and ended up with [specific issue, e.g. four different ways to start a new project]. Customers told us. We agreed.\n\nWhat's different:\nOne primary action per screen instead of three.\n[Old element] moved to [new location] so it stops getting in the way.\n[Specific pattern] that nobody used is gone.\n\nIf something feels off in the first few days, that's normal. Reply here or reach our team at [contact] and we'll get on it.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ===== promotion =====
[
'slug' => 'limited_time_offer',
'category' => 'promotion',
'name' => 'Limited-time offer',
'description' => 'Announce a discount or pricing offer with a clear deadline.',
'content' => "[Offer, e.g. 25% off the first year of {{brand_name}}] is open through [specific date].\n\nWe rarely run discounts. This one is tied to [reason, anniversary, end of quarter, product milestone] and we won't repeat it on the same terms in [timeframe].\n\nWho it applies to: [eligibility, new customers, annual plans, specific tier].\nWho it doesn't: [honest exclusion].\n\nUse [code] at checkout, or talk to our team if you want help picking a plan: [link].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'free_resource_offer',
'category' => 'promotion',
'name' => 'Free resource giveaway',
'description' => 'Promote a free guide, template, or report.',
'content' => "We made a free [resource, guide, template, benchmark report] for [audience].\n\nIt covers [specific topic 1], [specific topic 2], and the [number] mistakes we see most often when working with [target customer type]. About [page count] pages, no email gate beyond a name and work address.\n\nWhy free: [honest reason, e.g. we built this for our own clients first, and it's the kind of thing that's more useful in more hands].\n\nDownload it here: [link]. Tell us what's missing and we'll update the next version.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'referral_program_launch',
'category' => 'promotion',
'name' => 'Referral program announcement',
'description' => 'Promote a customer referral program from the company page.',
'content' => "We launched a referral program for {{brand_name}} customers.\n\nIf you refer a company that becomes a paying customer, both sides get [specific benefit, e.g. one month free, \$X credit, a feature unlock]. No tiers. No leaderboard. No mug.\n\nWe spent a while resisting this because most referral programs feel like spam pyramids. We landed here because our biggest growth channel last year was customers telling other customers, and it felt strange not to share the upside.\n\nDetails and your referral link: [link].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ===== educational =====
[
'slug' => 'how_we_solve_problem',
'category' => 'educational',
'name' => 'How we approach a problem',
'description' => 'Walk through how the company tackles a recurring customer problem.',
'content' => "A question we get every week: [specific question].\n\nHere's how we think about it at {{brand_name}}.\n\nMost teams start by [common first move]. That works until [specific failure point]. Once you hit that, you're stuck adding [workaround] every time something changes.\n\nA different way: [alternative approach]. The trade-off is [honest cost, e.g. slower setup, more upfront thinking, harder to explain to a new hire]. The upside is that [specific benefit] stops being a recurring fire.\n\nWe wrote up the long version here: [link]. Disagree? The comments are open.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'customer_data_insight',
'category' => 'educational',
'name' => 'Insight from customer data',
'description' => 'Share a useful pattern observed across the customer base.',
'content' => "We looked at [metric/behavior] across [number] {{brand_name}} accounts last quarter.\n\nOne thing stood out: [specific finding with a number, e.g. teams that did X within their first week were 3x more likely to still be active at month six].\n\nWe expected the opposite. Our hypothesis going in was [old assumption], partly because [reason]. The data didn't agree.\n\nA few caveats: this is correlation, not causation. The sample skews toward [segment]. And [time period] is short.\n\nStill, if you're new to {{brand_name}}, [practical recommendation] is probably worth doing in week one.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'common_mistake_breakdown',
'category' => 'educational',
'name' => 'Common mistake breakdown',
'description' => 'Explain a recurring mistake and how to avoid it.',
'content' => "The single most common mistake we see when teams adopt [tool/process/practice]: [specific mistake].\n\nIt usually looks like this. A team starts with [setup]. Within a few weeks, they add [workaround] because [reason]. By month three, the workaround has become the system, and nobody remembers why.\n\nThe fix isn't [obvious answer]. The fix is to go back and ask whether [original assumption] was ever true for your use case. Half the time, it wasn't.\n\nWe wrote this up because we made the same mistake internally in [year]. Full breakdown: [link].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'tool_comparison',
'category' => 'educational',
'name' => 'Honest tool comparison',
'description' => 'Compare approaches or tools for a specific job, including where the company loses.',
'content' => "When should you use {{brand_name}}, and when should you not?\n\nWe get the first half of that question constantly. Here's the second half.\n\nUse {{brand_name}} when [specific situation, e.g. you have more than X of Y, or you need Z capability].\n\nDon't use {{brand_name}} when [honest exclusion, e.g. you're a single user with fewer than X, or your workflow is fully [adjacent category]]. In those cases, [competitor or alternative approach] is genuinely a better fit, and we'll tell you that on a sales call.\n\nThe full breakdown, including a side-by-side: [link].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ===== behind_the_scenes =====
[
'slug' => 'team_offsite_recap',
'category' => 'behind_the_scenes',
'name' => 'Team offsite recap',
'description' => 'Recap a recent team offsite or all-hands.',
'content' => "We wrapped our team offsite in [city] last week.\n\n[Number] people, [number] days, one whiteboard that took a beating. About a third of the company met in person for the first time, which is what happens when you grow [from X to Y] in a year.\n\nWe spent more time on [topic] than we planned and less on [other topic] than we expected. The hardest conversation was about [honest topic, e.g. what we stop doing in the second half of the year]. We didn't fully resolve it. That's fine.\n\nNext one is in [location] in [month]. By then we'll be [number] people. Not sure how that'll feel.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'office_or_remote_culture',
'category' => 'behind_the_scenes',
'name' => 'How we work',
'description' => 'Share the company operating model or work style honestly.',
'content' => "How {{brand_name}} actually works, since people ask.\n\nWe're [fully remote / hybrid / based in X with remote contributors] across [number] time zones. No mandatory office days. We do one all-hands a week and one async update on Fridays.\n\nThe parts we like: deep work blocks, hiring across geographies, quiet calendars.\n\nThe parts that are harder: onboarding new hires takes longer than it would in person. New ideas can stall in DMs. Time zone overlap with [region] is rough.\n\nWe're not claiming this is the right setup for every company. It's the one that fits ours right now.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'engineering_decision',
'category' => 'behind_the_scenes',
'name' => 'Engineering decision recap',
'description' => 'Share an internal technical or product decision and the reasoning.',
'content' => "Last month we [made a specific decision, e.g. moved off X, rewrote Y, killed feature Z].\n\nThe short version of why: [one-line reason].\n\nThe longer version. The old setup was fine when we had [number] customers. At [current scale], it started showing in [specific symptom]. We tried [intermediate fix] for about [timeframe] before agreeing it wasn't going to hold.\n\nThe trade-off we accepted: [honest cost, e.g. two weeks of slower releases, breaking change for some integrations].\n\nWriting this up because we wish other teams shared more of this kind of decision instead of only the wins.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mistake_postmortem',
'category' => 'behind_the_scenes',
'name' => 'Public postmortem',
'description' => 'Share a recent mistake, outage, or failure honestly.',
'content' => "On [date], {{brand_name}} had [specific issue, e.g. an outage, a billing bug, a data issue affecting X% of accounts] for about [duration].\n\nWhat happened: [one-paragraph technical or operational summary].\n\nWho was affected: [honest scope, including the customers who weren't].\n\nWhat we did: [immediate fix and mitigation].\n\nWhat we're changing so it doesn't happen the same way again: [specific change, not a generic 'we'll do better'].\n\nIf you were affected and we haven't reached out individually, please reply or email [contact]. We owe a few of you a longer conversation.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ===== testimonial =====
[
'slug' => 'customer_quote_short',
'category' => 'testimonial',
'name' => 'Short customer quote',
'description' => 'Share a short, specific customer quote on the company page.',
'content' => "From a recent conversation with [customer first name], [role] at [company]:\n\n\"[Customer quote, should reference a specific outcome, number, or change. Avoid 'great product' generic praise.]\"\n\nWe asked if we could share it. They said yes.\n\nThe context behind the quote: [one or two sentences on what they were trying to do and what changed].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'case_study_recap',
'category' => 'testimonial',
'name' => 'Case study recap',
'description' => 'Summarize a published customer case study.',
'content' => "New case study: [customer name].\n\nBefore {{brand_name}}, their team was [specific situation, e.g. running X manually, spending Y hours/week on Z]. After [timeframe] using {{brand_name}}, [specific outcome with a number].\n\nA few things they did that other customers don't always try:\n[Specific tactic from the customer].\n[Another tactic].\n[Honest note: something they're still figuring out].\n\nFull write-up with their team's actual workflow and screenshots: [link].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'unexpected_use_case',
'category' => 'testimonial',
'name' => 'Unexpected customer use case',
'description' => 'Highlight a creative or unexpected way customers use the product.',
'content' => "We didn't build {{brand_name}} for [unexpected use case], but customers keep using it that way.\n\n[Customer or customer segment] started [specific behavior] about [timeframe] ago. We noticed because [signal, e.g. a usage spike in a specific feature, a support ticket asking for X]. When we asked them, the answer was: [paraphrased customer reasoning].\n\nIt's not on our roadmap. It might be soon. If you're doing something similar, our product team would genuinely like to hear about it. Reply here or email [contact].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ===== industry_tip =====
[
'slug' => 'contrarian_take',
'category' => 'industry_tip',
'name' => 'Contrarian take',
'description' => 'Take a clear position against a popular industry idea.',
'content' => "An opinion that gets us in trouble at conferences: [contrarian position, stated plainly].\n\nThe usual argument is [popular position]. It's not wrong in every case. It's wrong in most of the cases we see, and here's why.\n\n[Reason 1 with a specific example].\n[Reason 2 with a specific example].\n\nThe pushback we always get: [steelman the counter-argument]. That's fair, and we agree it applies when [specific condition]. Outside of that condition, the usual advice quietly costs teams a lot of money.\n\nHappy to be wrong about this. Tell us why in the comments.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'industry_benchmark',
'category' => 'industry_tip',
'name' => 'Industry benchmark',
'description' => 'Share an aggregated benchmark or stat from the customer base.',
'content' => "Quick benchmark for [audience].\n\nAcross [number] {{brand_name}} accounts in [industry/segment] last quarter, the median [metric] was [value]. The 90th percentile was [value]. The bottom 25% were under [value].\n\nIf you're below the median, the most common reason we see is [specific reason]. The fix is rarely [obvious answer]. It's usually [actual fix].\n\nIf you're above the 90th percentile, you're probably already doing [specific behavior], and we'd love to talk to you about it. Reply or DM the page.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'trend_we_disagree_with',
'category' => 'industry_tip',
'name' => 'Trend we disagree with',
'description' => 'Push back on a trending industry practice with reasoning.',
'content' => "Half the [industry] posts we see this month are about [trending practice].\n\nWe're not adopting it at {{brand_name}}, and probably won't.\n\nThe pitch is [popular framing]. The honest version, in our experience, is that it works in [narrow scenario] and quietly fails in [common scenario] because [specific reason]. We tested a version of it internally for [timeframe] and saw [specific outcome].\n\nNot saying nobody should do this. Saying that for [target audience], the time is better spent on [alternative].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'practical_framework',
'category' => 'industry_tip',
'name' => 'Practical framework',
'description' => 'Share a simple internal framework or rule of thumb.',
'content' => "A rule of thumb our team uses when deciding [specific decision]:\n\nIf [condition A], do [option 1].\nIf [condition B], do [option 2].\nIf you can't tell which you're in, you're probably in [option 1] and overthinking it.\n\nThis isn't a framework with a name. It came out of about [timeframe] of getting the same decision wrong in slightly different ways. It saves us an argument or two a week.\n\nUseful? Useless? Tell us how you decide.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ===== event =====
[
'slug' => 'event_announcement',
'category' => 'event',
'name' => 'Event announcement',
'description' => 'Announce an upcoming company event, webinar, or workshop.',
'content' => "We're hosting [event name] on [date] at [time/timezone].\n\nFormat: [virtual / in-person in city / hybrid].\nWho it's for: [specific audience, e.g. heads of marketing at B2B SaaS companies, 20-200 employees].\nWhat we'll cover: [topic 1] and [topic 2]. No keynote. No vendor parade.\n\nWe're capping registration at [number] so the Q&A actually works. If past events are a guide, the second half is where the useful stuff happens.\n\nSign up: [link].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'event_recap',
'category' => 'event',
'name' => 'Event recap',
'description' => 'Recap a recent event the company hosted or attended.',
'content' => "[Event name] wrapped on [date]. A few things worth writing down before they fade.\n\nThe room got loudest during [specific moment or topic]. Our hypothesis going in was that [topic A] would dominate. It didn't. [Topic B] did, and we should have seen that coming.\n\nThe most useful question we got: [paraphrased question]. Our answer was honest but not great. If you asked it, we owe you a better one, reply here.\n\nThanks to [partner / venue / speakers] for making it work. Recordings up next week: [link].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'conference_attendance',
'category' => 'event',
'name' => 'Conference attendance',
'description' => 'Announce that the team will be at an upcoming conference.',
'content' => "{{brand_name}} will be at [conference] in [city] from [date] to [date].\n\n[Number] of us are flying in. We're not doing a booth this year. We tried it last year and the most useful conversations happened nowhere near it.\n\nIf you want to meet:\n[Team member name] is around [days/times], mostly interested in [topic].\n[Another team member] is presenting on [topic] on [day].\nDinner on [date], small group, reply if you want in.\n\nBook a slot here: [link].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ===== engagement =====
[
'slug' => 'open_question_to_audience',
'category' => 'engagement',
'name' => 'Open question to audience',
'description' => 'Ask a real, specific question to the page audience.',
'content' => "A real question for [audience] this week.\n\nWhen [specific situation, e.g. you're scoping a new project, picking a vendor, deciding what to cut], how do you actually decide?\n\nNot the version you'd put in a deck. The version that involves [honest factor, e.g. who's available that week, what the CFO is in a mood about, which tool your team already knows].\n\nWe've been running an internal version of this question at {{brand_name}} for a month and the answers are more interesting than any framework we've seen. Reply with yours and we'll share what we've heard.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'we_want_your_feedback',
'category' => 'engagement',
'name' => 'Feedback request',
'description' => 'Ask the audience for input on a specific roadmap or decision.',
'content' => "We're stuck on something and want your input.\n\nFor the next version of {{brand_name}}, we're choosing between two directions for [area].\n\nOption A: [specific direction, with the trade-off].\nOption B: [specific direction, with the trade-off].\n\nBoth are real. Neither is obviously right. Customers we've asked are split close to evenly, which is the worst possible outcome for a product team trying to ship.\n\nIf you have an opinion, especially a strong one, reply here or DM the page. Our product team reads everything.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'community_spotlight',
'category' => 'engagement',
'name' => 'Community spotlight',
'description' => 'Highlight a customer, partner, or community member doing something interesting.',
'content' => "Spotlight on [name], [role] at [company].\n\nWe noticed [their specific work or post] last week and ended up sending it around the {{brand_name}} team. The short version of why: [specific reason, what they did that was unusual, useful, or against the grain].\n\nGo follow them if you don't already. We have no business arrangement here. They're just doing the kind of work we wish more people in [industry] did publicly.\n\n[Link to their post / profile].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'year_in_review',
'category' => 'engagement',
'name' => 'Year in review',
'description' => 'Honest year-end recap from the company page.',
'content' => "A short year-in-review for {{brand_name}}.\n\nThe good: [specific win with a number]. [Another specific win, ideally a customer outcome, not a vanity metric].\n\nThe hard: [honest miss, e.g. a product bet that didn't work, a hiring goal we didn't hit, a goal we set in January and quietly dropped in June].\n\nThe surprising: [unexpected thing that mattered, a customer segment that took off, a feature nobody asked for that became important].\n\nThank you to the [number] customers, [number] team members, and the people who replied to our posts at 11pm asking us to ship things. Next year is going to be weirder than this one.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
];

View file

@ -0,0 +1,322 @@
<?php
declare(strict_types=1);
return [
[
'slug' => 'product_launch_announcement',
'category' => 'product_launch',
'name' => 'Product launch announcement',
'description' => 'Short LinkedIn post announcing a new product.',
'content' => "Excited to share: {{brand_name}} just launched [Product Name].\n\nHere's why this matters for [your audience]:\n→ [Benefit 1]\n→ [Benefit 2]\n→ [Benefit 3]\n\nLearn more at [link]. We'd love your feedback.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'how_to_guide',
'category' => 'educational',
'name' => 'How-to guide',
'description' => 'Step-by-step educational post for LinkedIn.',
'content' => "How to [achieve X] in [timeframe], a step-by-step guide.\n\nStep 1: [Action]\nStep 2: [Action]\nStep 3: [Action]\nStep 4: [Action]\n\nThe key insight most people miss: [insight].\n\nWhich step do you find most challenging? Drop a comment below.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'customer_quote',
'category' => 'testimonial',
'name' => 'Customer quote',
'description' => 'Share a compelling customer testimonial on LinkedIn.',
'content' => "\"[Customer quote about the result they achieved with your product or service.]\"\n- [Customer Name], [Role] at [Company]\n\nThis is exactly why we built {{brand_name}}. Real results for real teams.\n\nRead the full story → [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'industry_insight',
'category' => 'industry_tip',
'name' => 'Industry insight',
'description' => 'Share a timely insight or hot take relevant to your industry.',
'content' => "Here's something most people in [industry] get wrong:\n\n[Counterintuitive statement or hot take]\n\nWhy? Because [reason].\n\nThe smarter approach: [better way to do it].\n\nAt {{brand_name}}, we've seen this play out with hundreds of [customers/teams]. The data is clear.\n\nWhat's your take?",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'event_announcement',
'category' => 'event',
'name' => 'Event announcement',
'description' => 'Announce an upcoming webinar or live event.',
'content' => "📅 Save the date: {{brand_name}} is hosting [Event Name] on [Date] at [Time].\n\nWhat to expect:\n✔ [Topic 1]\n✔ [Topic 2]\n✔ [Topic 3]\n\nSpots are limited. Register now → [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'community_question',
'category' => 'engagement',
'name' => 'Community question',
'description' => 'Spark discussion with an open-ended question to your network.',
'content' => "If you could give one piece of advice to someone just starting out in [industry/role], what would it be?\n\nMine: [your answer, be honest and specific]\n\nDrop yours in the comments. Let's build a thread worth bookmarking.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ===== Product launch (3) =====
[
'slug' => 'feature_release_notes',
'category' => 'product_launch',
'name' => 'New feature release notes',
'description' => 'Walk your network through what shipped and why it matters.',
'content' => "We shipped [Feature Name] today.\n\nThe short version: it does [what it does] for [who it's for]. Took us [timeframe] from first sketch to production.\n\nWhat's actually new:\n• [Capability one, in plain language]\n• [Capability two, with a real example]\n• [The thing we cut, and why]\n\nWe debated [tradeoff] for weeks. Ended up choosing [decision] because [reason]. If you'd have made the other call, I want to hear why.\n\nDocs and a 4-minute walkthrough are at [link]. Bug reports welcome, we read every one.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'beta_invitation',
'category' => 'product_launch',
'name' => 'Private beta invitation',
'description' => 'Invite your network into a closed beta with clear expectations.',
'content' => "We're opening up [Product/Feature] to a small private beta. Looking for around [N] testers.\n\nThe ideal fit:\n• You work in [role/industry]\n• You currently use [tool or workflow] and find [specific friction]\n• You have 30 minutes a week to break things and tell us about it\n\nWhat you get: early access, a direct line to the {{brand_name}} team, and a say in what we build next. What we get: honest feedback, even when it stings.\n\nIf this sounds like you, drop a comment or DM me. We'll send invites this [day/week].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'milestone_update',
'category' => 'product_launch',
'name' => 'Product milestone update',
'description' => 'Share a meaningful product or company milestone with concrete numbers.',
'content' => "Quiet milestone we hit this week: {{brand_name}} crossed [number / metric].\n\nFor context, when we started [timeframe] ago we had [starting number]. Most of the growth came from [specific channel or driver], not the thing we expected.\n\nA few things I learned along the way:\n1. [Lesson one, with the receipts]\n2. [Lesson two, what we'd do differently]\n3. [Lesson three about the team]\n\nThank you to the [N] people who took a chance on us when this was rough around the edges. Onward.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ===== Promotion (3) =====
[
'slug' => 'limited_time_offer',
'category' => 'promotion',
'name' => 'Limited-time offer',
'description' => 'Promote a time-bound discount or deal in a non-spammy way.',
'content' => "Running a [discount %] promo on {{brand_name}} until [date].\n\nNot a Black Friday gimmick. We had a slow [month/quarter] and want to bring in [N] new [users/customers] before [end of period]. That's the honest reason.\n\nIf you've been on the fence: [link]. If you signed up in the last 30 days, email me and I'll apply the same discount retroactively. That's the right thing to do.\n\nOffer ends [date] at [time, timezone].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'free_resource_offer',
'category' => 'promotion',
'name' => 'Free resource giveaway',
'description' => 'Offer a useful free download or template as a low-friction lead magnet.',
'content' => "Spent the weekend turning our internal [resource type, checklist, template, playbook] into something I can share.\n\nIt's the same [document] our team uses to [specific use case]. Nothing fancy: [N] pages, no fluff, no email gate.\n\nDrop a comment with the word \"[keyword]\" and I'll DM you the link. If you'd rather grab it directly: [link].\n\nFair warning, it's opinionated. If you disagree with my take on [specific point], tell me. That's how I improve it for v2.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'partnership_announcement',
'category' => 'promotion',
'name' => 'Partnership announcement',
'description' => 'Announce a partnership or integration with a clear customer benefit.',
'content' => "{{brand_name}} is now integrated with [Partner Name].\n\nThe practical effect for [audience]: you can now [specific workflow or capability] without [the previous workaround]. Saves about [time/money figure] per [period] based on the early test group.\n\nWe picked [Partner] because their team obsesses over [shared value] the same way ours does. Not every integration request makes the cut, and most don't.\n\nSetup takes about [N] minutes. Walkthrough here: [link]. If you're already using both tools, we'd love to hear how it lands.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ===== Educational (3) =====
[
'slug' => 'lesson_learned',
'category' => 'educational',
'name' => 'Lesson from a mistake',
'description' => 'Teach by recounting a specific mistake and what changed because of it.',
'content' => "Made a [N]-figure mistake last [year/quarter] that I want to write about while it still stings.\n\nThe setup: we were [situation]. The decision: [what you did]. The reasoning at the time: [why it seemed right].\n\nWhat actually happened: [the result, in concrete terms]. We lost [specific cost, money, time, customers, trust].\n\nWhat I should have done: [the better path], and the reason I didn't is [the honest reason, ego, hurry, missing data].\n\nThree things I changed in how I work because of it:\n1. [Change one]\n2. [Change two]\n3. [Change three]\n\nIf you've been there, you know. Tell me about yours in the comments.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'framework_breakdown',
'category' => 'educational',
'name' => 'Framework or mental model breakdown',
'description' => 'Explain a specific framework or mental model with a concrete example.',
'content' => "I keep coming back to one mental model when I think about [topic/problem]: [Framework Name].\n\nThe idea is simple. [One-sentence summary of the framework.]\n\nHow I actually use it: when I'm stuck on [specific situation], I ask [specific question the framework prompts]. Last week it pushed me to [decision you made because of it].\n\nWhere it breaks: [honest limitation]. It's not a universal answer for [type of problem], and treating it like one is how people end up [bad outcome].\n\nIf you want to read the original source, it's [author/book/link]. The version above is mine, with edits from a few hundred uses.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'tool_comparison',
'category' => 'educational',
'name' => 'Honest tool comparison',
'description' => 'Compare two or three tools or approaches with real tradeoffs.',
'content' => "I've used [Tool A], [Tool B], and [Tool C] for [task] over the past [timeframe]. Here's where each one actually wins.\n\n[Tool A] is the right call when [specific situation]. It's the fastest at [specific task] and the worst at [specific task]. We use it for [use case].\n\n[Tool B] feels less polished, but it does [thing] better than anything else I've tried. Worth the rough edges if [criteria].\n\n[Tool C] is the boring choice. That's a compliment. It's reliable, the docs are written by humans, and the team doesn't ship breaking changes on Fridays.\n\nMy current stack at {{brand_name}}: [actual answer]. Yours might differ if [reason].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ===== Behind the scenes (3) =====
[
'slug' => 'team_culture_glimpse',
'category' => 'behind_the_scenes',
'name' => 'Team culture moment',
'description' => 'Share a small, specific moment that shows how your team actually works.',
'content' => "Small thing that happened at {{brand_name}} this week.\n\n[Team member or role] noticed [specific issue or detail]. Could have shipped anyway. Instead they [specific action], which delayed [thing] by [timeframe].\n\nNobody asked them to. There was no Jira ticket. The customer would not have known.\n\nThis is the part of building a company that doesn't fit on a careers page. The work that nobody sees, done well anyway, because that's how the people here are wired. I think about it a lot.\n\nIf you want to work with people like this: [link]. If you already do, send them a DM.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'how_we_built_it',
'category' => 'behind_the_scenes',
'name' => 'How we built it',
'description' => 'Walk through the real story behind a recent build, including dead ends.',
'content' => "How we built [Feature/Product] at {{brand_name}}, including the parts we usually leave out.\n\nWe started with [original plan]. It took [timeframe] to figure out that plan was wrong. The real problem was [actual problem], which only became visible after [trigger event].\n\nVersion 2 was [what we tried next]. It worked in the demo and fell over in production at [scale or condition]. We rewrote the [specific component] twice.\n\nWhat finally shipped: [current solution]. It is [specific tradeoff acknowledgment, slower, simpler, less elegant] than what we set out to build, and it's the version that actually solves the customer problem.\n\nFull writeup with the architecture diagrams: [link].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'day_in_the_life',
'category' => 'behind_the_scenes',
'name' => 'A day on the team',
'description' => 'Show what a real day looks like for someone on the team.',
'content' => "Pulled the calendar for [day of week] and counted: [N] meetings, [N] hours of focused work, [N] interruptions I should have said no to.\n\nThe work that actually mattered:\n• [Specific task one, and why it mattered]\n• [Specific task two, including what surprised you]\n• [Specific task three]\n\nThe work that felt urgent and wasn't: [honest example]. I keep falling for this and I'm tired of it.\n\nI used to think the goal was a perfect day. Now I think the goal is a few real hours and the discipline to protect them. Curious how the rest of you handle [specific challenge from the post].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ===== Testimonial (3) =====
[
'slug' => 'before_after_story',
'category' => 'testimonial',
'name' => 'Customer before-and-after',
'description' => 'Tell a customer story with concrete numbers from before and after.',
'content' => "Quick story from a {{brand_name}} customer worth sharing.\n\n[Customer/Company] came to us [timeframe] ago. The state of things then: [specific painful metric, hours per week, error rate, churn, cost]. They had tried [previous approach] and it didn't move the number.\n\n[Timeframe] in, the same metric is [new number]. The piece that mattered most, according to [Name, role]: [specific change in how they work].\n\nWhat I like about this one: it wasn't a magic feature. It was [boring fundamental, a process change, a default they flipped, a meeting they killed]. Most wins look like that and we don't talk about it enough.\n\nFull case study with the messy details: [link].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'unsolicited_review',
'category' => 'testimonial',
'name' => 'Unsolicited customer review',
'description' => 'Share an organic piece of customer feedback with a thoughtful reaction.',
'content' => "Got this in our inbox yesterday from [Customer Name] at [Company]:\n\n\"[Honest, specific quote, including any small criticism or tradeoff they mentioned. Real reviews aren't pure praise.]\"\n\nA few honest reactions on my end. The part about [specific praise] is the thing we've worked hardest on, so that one hit. The part about [specific gripe or wish] is fair, and it's already on the roadmap for [timeframe].\n\nWe don't pay for reviews and we don't ask for them. When one shows up like this, I read it twice. Thank you, [Name].\n\nIf you have a {{brand_name}} story, good, bad, or mixed, I want to hear it.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'team_member_spotlight',
'category' => 'testimonial',
'name' => 'Team member spotlight',
'description' => 'Highlight a specific person on the team with a concrete contribution.',
'content' => "Want to talk about [Name], [role] at {{brand_name}}, for a minute.\n\n[Name] joined [timeframe] ago. The thing they own now: [specific area or system]. The thing they did that very few people would have done: [specific story, a tough call, an unglamorous fix, a tradeoff they pushed back on].\n\nThe result: [concrete outcome, with a number if you have one]. The reason it worked: [Name]'s instinct on [specific quality], which I'm still learning from.\n\nThis is not a humble brag. It's a thank-you, on a public platform, because that part of the job tends to happen quietly. [Name], the team is better with you in it.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ===== Industry tip (3) =====
[
'slug' => 'data_point_take',
'category' => 'industry_tip',
'name' => 'Data point and what it means',
'description' => 'Share a recent data point from a real source and your interpretation.',
'content' => "[Source, report, study, public dataset] published this number last week: [specific stat].\n\nMost of the takes I've seen frame it as [common interpretation]. I think that misses the point.\n\nWhen you cut the same data by [dimension, segment, geography, company size, time period], the picture flips. [Specific subset] is [specific behavior], while [other subset] is [different behavior]. The headline number averages those two stories into something that describes neither.\n\nSo the practical implication for [audience]: [specific recommendation]. Not [common advice], because that one is built on the average that doesn't exist.\n\nLink to the raw data: [link]. Tell me where I'm wrong.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'contrarian_take',
'category' => 'industry_tip',
'name' => 'Contrarian take with receipts',
'description' => 'Push back on a common belief in your industry with a specific argument.',
'content' => "Unpopular opinion in [industry]: [contrarian claim].\n\nThe standard advice says [conventional wisdom]. I followed it for [timeframe] and the result was [specific bad or mediocre outcome].\n\nThe reason it doesn't work as well as people claim: [specific reason, incentive, hidden cost, survivorship bias, changed market]. The version that actually works for [audience] looks more like [alternative approach].\n\nFor what it's worth, this is the path we took at {{brand_name}} after [trigger event]. Numbers since: [specific result]. I'm not saying everyone should do it. I am saying \"because everyone says so\" is a bad reason to keep doing the thing.\n\nWhere are you on this?",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'trend_watch',
'category' => 'industry_tip',
'name' => 'Trend worth watching',
'description' => 'Spotlight a smaller industry trend before it goes mainstream.',
'content' => "Quiet trend in [industry] that I think most people will be talking about in [timeframe]: [specific trend].\n\nThe signal I'm watching: [concrete evidence, hiring patterns, new entrants, pricing shifts, what customers are asking for]. Three different [companies/teams] in our network have done [specific thing] in the last [period], independently.\n\nWhy I think it actually matters and isn't just hype: [reason rooted in incentives, not vibes]. The thing that would make me wrong: [specific counter-signal you'd watch for].\n\nIf you're [audience], the practical move today is [specific action]. Not a bet-the-company pivot. Just enough that you're not caught flat-footed in [timeframe].\n\nWhat are you seeing?",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ===== Event (3) =====
[
'slug' => 'event_recap',
'category' => 'event',
'name' => 'Event recap with takeaways',
'description' => 'Summarize an event you attended with specific takeaways.',
'content' => "Back from [Event Name]. Three things stuck with me, and one I'm still arguing with.\n\nWhat held up: [Specific session or speaker], who made the case that [specific argument]. The part I hadn't considered: [specific insight].\n\nWhat I'm bringing back to {{brand_name}}: [concrete change you'll make based on the event]. Small enough to start next week, big enough to matter.\n\nThe thing I disagreed with: [specific take from a session]. The argument was clean, but it ignores [specific reality]. Going to write that one up properly.\n\nIf you were there, what did I miss? Always more in the hallway track than the main stage.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'speaking_announcement',
'category' => 'event',
'name' => 'Speaking engagement announcement',
'description' => 'Announce that you or a teammate is speaking at an event.',
'content' => "I'm speaking at [Event Name] on [date] in [location / online].\n\nThe talk: \"[Talk Title]\". The short pitch: [one or two sentences on what attendees will actually leave with].\n\nWhat I'm not going to do: walk through generic [topic] best practices. There are enough of those. What I am going to do: show the specific [data, framework, or case study] from {{brand_name}} that changed how we think about [specific problem], including the parts that didn't work.\n\nIf you're going to be there, find me, I'd rather have a real conversation than collect business cards. Registration: [link].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'webinar_invitation',
'category' => 'event',
'name' => 'Webinar invitation',
'description' => 'Invite your network to a webinar with a clear, honest agenda.',
'content' => "Hosting a [length, e.g. 45-minute] webinar with [Co-host Name, role] on [date].\n\nTopic: [specific topic, framed as a question your audience is actually asking]. We're not doing a product demo. We are walking through [specific framework, dataset, or workflow] that we use at {{brand_name}}.\n\nRough agenda:\n• [Time], [Topic, with one detail that hints at the actual content]\n• [Time], [Topic]\n• [Time], Live Q&A. We answer everything, including the awkward ones.\n\nReplay goes out to everyone who registers, even if you can't make it live. Sign up: [link].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ===== Engagement (3) =====
[
'slug' => 'poll_post',
'category' => 'engagement',
'name' => 'Opinionated poll prompt',
'description' => 'Ask a focused either/or question that surfaces real opinions.',
'content' => "Curious how [audience] is splitting on this.\n\nWhen you're deciding [specific decision], do you lean toward:\n\nA) [Option A, described concretely]\nB) [Option B, described concretely]\n\nNo \"it depends\" answers in the comments, please. Pick one and tell me why in a sentence.\n\nMy answer: [your honest pick]. The reason: [one or two sentence reason from real experience]. I held the opposite view for [timeframe] before [thing that changed my mind].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'hot_take_invitation',
'category' => 'engagement',
'name' => 'Hot take invitation',
'description' => 'Invite the network to share a controversial opinion in their domain.',
'content' => "What's a [industry/role] take you hold that gets you weird looks at conferences?\n\nMine: [specific opinion that's mildly controversial in your field, stated plainly]. I've been wrong about a lot, but on this one I'm holding the line.\n\nNot looking for the safe takes that already have 500 LinkedIn carousels behind them. The ones you'd say at the dinner after the panel, when you've stopped performing.\n\nGo. I'll be in the comments arguing in good faith.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'crowdsourced_advice',
'category' => 'engagement',
'name' => 'Crowdsourced advice request',
'description' => 'Ask your network for input on a real, specific problem.',
'content' => "Asking for the crowd's brain on a real problem we're working through at {{brand_name}}.\n\nContext: [specific situation in 2-3 sentences, enough that someone qualified can actually help]. The constraint that makes the obvious answer not work: [specific constraint].\n\nWhat I've already tried: [option one, and why it didn't fit]; [option two, and what it taught me]. So I'm not looking for those.\n\nIf you've solved something close to this, what worked? Comments are best, but DMs are open if it's the kind of thing you'd rather not say in public. I'll write up what we end up doing and tag the people who shaped it.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
];

View file

@ -0,0 +1,322 @@
<?php
declare(strict_types=1);
return [
[
'slug' => 'mastodon_release_note',
'category' => 'product_launch',
'name' => 'Release note',
'description' => 'Share an open, transparent update about a release.',
'content' => "Release note from {{brand_name}}:\n\n→ [What shipped]\n→ [Why it matters]\n→ [What's next]\n\nFeedback welcome. Reply or open an issue.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_lessons_learned',
'category' => 'educational',
'name' => 'Lessons learned',
'description' => 'Share something you learned, in the candid Mastodon style.',
'content' => "Something we learned at {{brand_name}} this week:\n\n[Lesson, be specific.]\n\nThe takeaway: [principle].\n\nMaybe useful to someone else building [similar thing].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_open_question',
'category' => 'engagement',
'name' => 'Open question',
'description' => 'Ask the fediverse a question and gather perspectives.',
'content' => "Question for the fediverse:\n\n[Open-ended question relevant to your audience.]\n\nBoosts appreciated if your followers might have thoughts.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// product_launch
[
'slug' => 'mastodon_version_bump',
'category' => 'product_launch',
'name' => 'Version bump',
'description' => 'Announce a new version with the actual diff that matters.',
'content' => "{{brand_name}} [version] is out.\n\nWhat changed:\n- [Fix or feature]\n- [Fix or feature]\n- [Breaking change, if any]\n\nUpgrade notes: [link or short instruction].\n\nIf something breaks, please tell us. We read every reply.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_new_feature_in_public',
'category' => 'product_launch',
'name' => 'New feature in public',
'description' => 'Ship a feature and explain why you built it that way.',
'content' => "We added [feature] to {{brand_name}} today.\n\nWhy: [the actual reason, in one sentence].\n\nHow it works: [short concrete description].\n\nThe code is here: [link]. Pull requests welcome.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_beta_invite',
'category' => 'product_launch',
'name' => 'Beta invite',
'description' => 'Invite the fediverse into a beta with honest expectations.',
'content' => "Beta testers wanted for [feature] in {{brand_name}}.\n\nIt is rough. Some things will break. We want to know which ones.\n\nSign up: [link]\n\nNo NDA, no marketing list, no upsell. We just need real users.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_self_host_release',
'category' => 'product_launch',
'name' => 'Self-host release',
'description' => 'Let self-hosters know about a release with the operational details.',
'content' => "Heads-up to {{brand_name}} self-hosters: [version] is tagged.\n\nMigrations: [yes/no, runtime estimate]\nConfig changes: [list or none]\nBreaking: [list or none]\n\nDocs: [link]. Issues: [link]. Boosts appreciated.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// promotion
[
'slug' => 'mastodon_paid_plan_honest',
'category' => 'promotion',
'name' => 'Paid plan, honestly',
'description' => 'Mention a paid plan without sounding like an ad.',
'content' => "{{brand_name}} has a paid plan now. Here is what it gets you: [feature], [feature], [feature].\n\nThe free tier still does [what it always did]. We are not removing anything.\n\nDetails: [link]. Questions welcome.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_sponsor_us',
'category' => 'promotion',
'name' => 'Sponsor us',
'description' => 'Ask for sponsorship or donations transparently.',
'content' => "{{brand_name}} runs on [number] hours of volunteer work and [hosting cost] a month.\n\nIf you use it and want to chip in, sponsorship is here: [link].\n\nWe publish a spending breakdown every quarter. No tiers, no perks, just the work.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_discount_for_indies',
'category' => 'promotion',
'name' => 'Discount for indies',
'description' => 'Offer a discount with no dark patterns.',
'content' => "{{brand_name}} is [discount] off for solo developers and small co-ops until [date].\n\nNo coupon, no email gate. The price is just lower if you pick the [plan name] tier. Use it if it helps you.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// educational
[
'slug' => 'mastodon_quick_explainer',
'category' => 'educational',
'name' => 'Quick explainer',
'description' => 'Explain a concept in plain language without padding.',
'content' => "Quick explainer: [concept].\n\n[One sentence definition.]\n\n[One sentence about why it matters in practice.]\n\nIf you want the longer version, we wrote it up: [link].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_misconception',
'category' => 'educational',
'name' => 'Common misconception',
'description' => 'Correct a common misunderstanding with specifics.',
'content' => "People often think [common belief about your topic].\n\nThat is not quite right. [The actual situation, with one specific example.]\n\nThis matters because [practical consequence].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_reading_list',
'category' => 'educational',
'name' => 'Reading list',
'description' => 'Share a short, opinionated reading list.',
'content' => "Things we have been reading at {{brand_name}}:\n\n- [Title], by [author]: [one-line reason].\n- [Title], by [author]: [one-line reason].\n- [Title], by [author]: [one-line reason].\n\nReply with what you have been reading. Always looking for new pointers.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_how_we_decided',
'category' => 'educational',
'name' => 'How we decided',
'description' => 'Walk through a technical or product decision.',
'content' => "How we picked [tool or approach] for {{brand_name}}:\n\nWe tried [option A]. It [problem]. We tried [option B]. It [tradeoff].\n\nWe went with [chosen option] because [reason]. It is not perfect. The thing that still bugs us is [downside].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// behind_the_scenes
[
'slug' => 'mastodon_dev_log',
'category' => 'behind_the_scenes',
'name' => 'Dev log',
'description' => 'Share what you actually did this week.',
'content' => "Dev log, week of [date]:\n\nMonday: [thing].\nTuesday: [thing].\nWednesday: [thing that went sideways].\nThursday: [fixed it].\nFriday: [shipped or punted].\n\nThis week is mostly [next focus].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_postmortem',
'category' => 'behind_the_scenes',
'name' => 'Short postmortem',
'description' => 'Share a postmortem in plain language.',
'content' => "{{brand_name}} had an outage on [date]. Here is the short version:\n\nWhat broke: [system].\nWhy: [root cause].\nDuration: [time].\nHow we fixed it: [action].\n\nFull writeup with timeline: [link]. Sorry for the disruption.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_tooling_setup',
'category' => 'behind_the_scenes',
'name' => 'Our tooling',
'description' => 'Show the actual tools you use.',
'content' => "What {{brand_name}} runs on, in case you are curious:\n\n- Editor: [editor]\n- Language: [language]\n- Database: [database]\n- Hosting: [host]\n- CI: [ci]\n\nNothing exotic. The boring stack is the productive stack.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_team_intro',
'category' => 'behind_the_scenes',
'name' => 'Who we are',
'description' => 'Introduce the people behind the project.',
'content' => "Quick intro: {{brand_name}} is [number] people.\n\n[Name] works on [area].\n[Name] works on [area].\n[Name] works on [area].\n\nWe are based across [regions]. We hire openly when we hire, which is rarely. Hi.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// testimonial
[
'slug' => 'mastodon_user_quote',
'category' => 'testimonial',
'name' => 'User quote',
'description' => 'Share a real quote with permission and context.',
'content' => "[Username] sent us this about {{brand_name}}, posted with permission:\n\n\"[Real quote.]\"\n\nThat one made our week. Thanks [@username] for taking the time to write.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_use_case_share',
'category' => 'testimonial',
'name' => 'How someone uses it',
'description' => 'Highlight a specific way someone uses your tool.',
'content' => "[Person or org] uses {{brand_name}} to [specific use case].\n\nWhat they told us: \"[short specific quote].\"\n\nIf you have a setup worth sharing, reply or DM. We like collecting these.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_thanks_contributor',
'category' => 'testimonial',
'name' => 'Thanks to a contributor',
'description' => 'Credit a contributor by name.',
'content' => "Shoutout to [@username] for [specific contribution] on {{brand_name}}.\n\nThis kind of work is not glamorous and it is the reason the project keeps moving. Thank you.\n\nPR is here: [link].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// industry_tip
[
'slug' => 'mastodon_practical_tip',
'category' => 'industry_tip',
'name' => 'Practical tip',
'description' => 'Share a real, specific tip.',
'content' => "Tip if you work with [topic]:\n\n[One concrete tip in plain language.]\n\nWe figured this out the hard way after [brief context]. Maybe it saves someone else a few hours.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_unpopular_opinion',
'category' => 'industry_tip',
'name' => 'Unpopular opinion',
'description' => 'Share a contrarian take you actually believe.',
'content' => "Take that gets us in trouble: [contrarian belief about your field].\n\nReason: [the specific case where this holds].\n\nWe are open to being wrong. If you disagree, reply with the case and we will read it.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_anti_pattern',
'category' => 'industry_tip',
'name' => 'Anti-pattern',
'description' => 'Call out a common anti-pattern with care.',
'content' => "Anti-pattern we see a lot in [domain]: [the pattern].\n\nWhy it bites you: [specific failure mode].\n\nWhat to do instead: [alternative]. Not always, but most of the time.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_stop_doing_this',
'category' => 'industry_tip',
'name' => 'Stop doing this',
'description' => 'Push back on a habit that costs people time.',
'content' => "Friendly push: stop [common habit] when working on [domain].\n\nIt costs you [specific cost] and the alternative is [alternative], which takes [effort].\n\nWe did the same thing for years. The change is small and the payoff is real.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// event
[
'slug' => 'mastodon_event_announce',
'category' => 'event',
'name' => 'Event announce',
'description' => 'Announce an event without hype.',
'content' => "{{brand_name}} is at [event] on [date] in [city].\n\n[Speaker or team member] is talking about [topic] at [time].\n\nIf you are around, come say hi. Boosts appreciated for fediverse folks who might be local.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_meetup_call',
'category' => 'event',
'name' => 'Meetup call',
'description' => 'Invite people to a community meetup.',
'content' => "Community call for {{brand_name}} this [day] at [time UTC].\n\nAgenda: [topic], [topic], open Q&A.\n\nLink: [video link]. Notes go up after on [link]. No login wall.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_event_recap',
'category' => 'event',
'name' => 'Event recap',
'description' => 'Recap an event with concrete takeaways.',
'content' => "Back from [event]. Three things that stuck with us:\n\n1. [Specific takeaway].\n2. [Specific takeaway].\n3. [Specific takeaway].\n\nSlides from our talk are up: [link]. Thanks to everyone who came by the table.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// engagement
[
'slug' => 'mastodon_what_are_you_using',
'category' => 'engagement',
'name' => 'What are you using',
'description' => 'Ask what tools or setups people use.',
'content' => "Curious what the fediverse is using for [specific task] in [year].\n\nWe are on [current setup] and it is [honest assessment]. Looking for what you would replace it with and why.\n\nReply with the tool and one sentence on the tradeoff.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_show_your_work',
'category' => 'engagement',
'name' => 'Show your work',
'description' => 'Invite people to share what they are building.',
'content' => "Show-and-tell thread: what are you building this week?\n\nWe will go first. {{brand_name}} is working on [thing]. It is [stage] and we are stuck on [problem].\n\nReply with yours. Boosts welcome so others can find it.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
];

View file

@ -0,0 +1,306 @@
<?php
declare(strict_types=1);
return [
[
'slug' => 'pinterest_how_to',
'category' => 'educational',
'name' => 'How-to pin',
'description' => 'Step-by-step pin that drives saves and clicks.',
'content' => "How to [achieve outcome] in [time/effort].\n\nA simple guide from {{brand_name}}.\n\nStep 1: [Action]\nStep 2: [Action]\nStep 3: [Action]\n\nFull tutorial → [link]",
'image_count' => 1,
'image_keywords' => ['tutorial', 'how-to', 'guide'],
'slides' => null,
],
[
'slug' => 'pinterest_inspiration',
'category' => 'behind_the_scenes',
'name' => 'Inspiration board',
'description' => 'Inspirational pin around a theme or aesthetic.',
'content' => "[Theme] inspiration, curated by {{brand_name}}.\n\nSave this for later.\n\nMore at → [link]",
'image_count' => 1,
'image_keywords' => ['inspiration', 'aesthetic', 'mood'],
'slides' => null,
],
[
'slug' => 'pinterest_product_showcase',
'category' => 'product_launch',
'name' => 'Product showcase',
'description' => 'Highlight a product with a click-friendly description.',
'content' => "[Product name] from {{brand_name}}.\n\n[Short benefit-led description, what it is, why it matters.]\n\nShop the look → [link]",
'image_count' => 1,
'image_keywords' => ['product', 'showcase', 'lifestyle'],
'slides' => null,
],
[
'slug' => 'pinterest_new_arrival',
'category' => 'product_launch',
'name' => 'New arrival pin',
'description' => 'Announce a new product with searchable keywords.',
'content' => "New from {{brand_name}}: [product name].\n\n[One sentence about what it is and who it is for.]\n\nKey features:\n- [Feature 1]\n- [Feature 2]\n- [Feature 3]\n\nAvailable in [colors/sizes/options].\n\nShop the [category] collection → [link]",
'image_count' => 1,
'image_keywords' => ['new product', 'launch', 'collection'],
'slides' => null,
],
[
'slug' => 'pinterest_collection_drop',
'category' => 'product_launch',
'name' => 'Collection drop pin',
'description' => 'Introduce a curated product collection.',
'content' => "The [collection name] collection is here.\n\n{{brand_name}} put together [number] pieces around [theme or season].\n\nWhat is inside:\n- [Item type 1]\n- [Item type 2]\n- [Item type 3]\n\nDesigned for [use case or audience].\n\nBrowse the full collection → [link]",
'image_count' => 1,
'image_keywords' => ['collection', 'lookbook', 'curated'],
'slides' => null,
],
[
'slug' => 'pinterest_pre_order',
'category' => 'product_launch',
'name' => 'Pre-order pin',
'description' => 'Drive saves and pre-orders for an upcoming product.',
'content' => "Pre-order is open: [product name].\n\nShipping starts [date]. {{brand_name}} pre-order customers get [perk: early access, bonus item, locked-in price].\n\nWhy pre-order:\n- [Reason 1]\n- [Reason 2]\n\nReserve yours → [link]",
'image_count' => 1,
'image_keywords' => ['pre-order', 'launch', 'early access'],
'slides' => null,
],
[
'slug' => 'pinterest_seasonal_sale',
'category' => 'promotion',
'name' => 'Seasonal sale pin',
'description' => 'Promote a seasonal sale with clear savings.',
'content' => "[Season] sale at {{brand_name}}: [discount]% off [category].\n\nGood through [end date].\n\nWhat is on sale:\n- [Category 1]\n- [Category 2]\n- [Category 3]\n\nUse code [CODE] at checkout.\n\nShop the sale → [link]",
'image_count' => 1,
'image_keywords' => ['sale', 'discount', 'seasonal shopping'],
'slides' => null,
],
[
'slug' => 'pinterest_bundle_deal',
'category' => 'promotion',
'name' => 'Bundle deal pin',
'description' => 'Pin a value bundle with bullet pricing.',
'content' => "The [bundle name] bundle from {{brand_name}}.\n\nBuy [item 1] + [item 2] + [item 3] together and save [amount].\n\nWhat is included:\n- [Item 1] (regularly [price])\n- [Item 2] (regularly [price])\n- [Item 3] (regularly [price])\n\nBundle price: [price].\n\nGrab the bundle → [link]",
'image_count' => 1,
'image_keywords' => ['bundle', 'value pack', 'savings'],
'slides' => null,
],
[
'slug' => 'pinterest_free_shipping',
'category' => 'promotion',
'name' => 'Free shipping pin',
'description' => 'Offer-led pin built around free shipping.',
'content' => "Free shipping on every order at {{brand_name}}.\n\nNo minimum, no code. Through [end date].\n\nWhat to add to cart:\n- [Best seller 1]\n- [Best seller 2]\n- [Best seller 3]\n\nShop now → [link]",
'image_count' => 1,
'image_keywords' => ['free shipping', 'offer', 'deal'],
'slides' => null,
],
[
'slug' => 'pinterest_clearance',
'category' => 'promotion',
'name' => 'Clearance pin',
'description' => 'Move clearance inventory with a save-worthy pin.',
'content' => "Clearance at {{brand_name}}: up to [discount]% off.\n\nFinal markdowns on [category]. Once it is gone, it is gone.\n\nTop picks:\n- [Item 1], [price]\n- [Item 2], [price]\n- [Item 3], [price]\n\nShop clearance → [link]",
'image_count' => 1,
'image_keywords' => ['clearance', 'final sale', 'markdown'],
'slides' => null,
],
[
'slug' => 'pinterest_recipe',
'category' => 'educational',
'name' => 'Recipe pin',
'description' => 'Save-worthy recipe pin with ingredients and steps.',
'content' => "[Recipe name], ready in [time].\n\nFrom the {{brand_name}} kitchen.\n\nIngredients:\n- [Ingredient 1]\n- [Ingredient 2]\n- [Ingredient 3]\n- [Ingredient 4]\n\nMethod:\n1. [Step 1]\n2. [Step 2]\n3. [Step 3]\n\nServes [number]. Full recipe → [link]",
'image_count' => 1,
'image_keywords' => ['recipe', 'food', 'cooking'],
'slides' => null,
],
[
'slug' => 'pinterest_checklist',
'category' => 'educational',
'name' => 'Checklist pin',
'description' => 'Practical checklist pin built for saves.',
'content' => "The [topic] checklist from {{brand_name}}.\n\n[One sentence on who this is for.]\n\nThe checklist:\n- [Item 1]\n- [Item 2]\n- [Item 3]\n- [Item 4]\n- [Item 5]\n\nSave this pin so you have it when you need it.\n\nDownload the printable version → [link]",
'image_count' => 1,
'image_keywords' => ['checklist', 'planner', 'printable'],
'slides' => null,
],
[
'slug' => 'pinterest_beginners_guide',
'category' => 'educational',
'name' => 'Beginner guide pin',
'description' => 'Beginner-friendly explainer pin.',
'content' => "[Topic] for beginners.\n\nIf you are new to [topic], start here. {{brand_name}} put together the basics.\n\nWhat you need to know:\n1. [Concept 1]\n2. [Concept 2]\n3. [Concept 3]\n\nCommon beginner mistake: [mistake].\n\nRead the full guide → [link]",
'image_count' => 1,
'image_keywords' => ['beginner guide', 'basics', 'tutorial'],
'slides' => null,
],
[
'slug' => 'pinterest_diy_tutorial',
'category' => 'educational',
'name' => 'DIY tutorial pin',
'description' => 'DIY project pin with a materials list.',
'content' => "DIY [project name] in [time].\n\nA weekend project from {{brand_name}}.\n\nWhat you need:\n- [Material 1]\n- [Material 2]\n- [Material 3]\n- [Tool 1]\n\nThe steps:\n1. [Step 1]\n2. [Step 2]\n3. [Step 3]\n\nEstimated cost: [amount].\n\nFull tutorial with photos → [link]",
'image_count' => 1,
'image_keywords' => ['DIY', 'craft project', 'handmade'],
'slides' => null,
],
[
'slug' => 'pinterest_studio_tour',
'category' => 'behind_the_scenes',
'name' => 'Studio tour pin',
'description' => 'Take followers inside the workspace.',
'content' => "Inside the {{brand_name}} studio.\n\n[One sentence about what happens here.]\n\nThree things you will spot:\n- [Detail 1]\n- [Detail 2]\n- [Detail 3]\n\n[A note about the space, the team, or the routine.]\n\nMore studio photos → [link]",
'image_count' => 1,
'image_keywords' => ['studio', 'workspace', 'creative space'],
'slides' => null,
],
[
'slug' => 'pinterest_process_pin',
'category' => 'behind_the_scenes',
'name' => 'Making-of process pin',
'description' => 'Show the craft behind a product.',
'content' => "How {{brand_name}} makes [product].\n\nFrom [starting material] to finished piece, every step happens [where].\n\nThe process:\n1. [Stage 1]\n2. [Stage 2]\n3. [Stage 3]\n4. [Stage 4]\n\nTotal time per piece: [duration].\n\nSee the full process → [link]",
'image_count' => 1,
'image_keywords' => ['handmade', 'craft', 'process'],
'slides' => null,
],
[
'slug' => 'pinterest_founder_story',
'category' => 'behind_the_scenes',
'name' => 'Founder story pin',
'description' => 'Personal pin about the brand origin.',
'content' => "How {{brand_name}} started.\n\n[Founder name] launched [brand] in [year] after [origin moment].\n\n[Two short sentences on the why and the early days.]\n\nWhat is different about how we work:\n- [Value 1]\n- [Value 2]\n\nRead the full story → [link]",
'image_count' => 1,
'image_keywords' => ['founder story', 'small business', 'brand story'],
'slides' => null,
],
[
'slug' => 'pinterest_customer_review',
'category' => 'testimonial',
'name' => 'Customer review pin',
'description' => 'Pull-quote pin from a real customer.',
'content' => "\"[Customer quote about the product].\"\n- [Customer first name], [city or context]\n\n{{brand_name}} customers leave reviews like this every week.\n\nWhat [Customer first name] bought: [product name].\nWhy they bought it: [reason].\n\nRead more reviews → [link]",
'image_count' => 1,
'image_keywords' => ['customer review', 'testimonial', 'social proof'],
'slides' => null,
],
[
'slug' => 'pinterest_before_after',
'category' => 'testimonial',
'name' => 'Before and after pin',
'description' => 'Visual transformation pin.',
'content' => "Before and after with {{brand_name}} [product or service].\n\nBefore: [starting state].\nAfter: [end result].\nTime: [duration].\n\nWhat [customer name] used:\n- [Item 1]\n- [Item 2]\n\n[One sentence on the customer reaction.]\n\nSee more before and afters → [link]",
'image_count' => 1,
'image_keywords' => ['before and after', 'transformation', 'results'],
'slides' => null,
],
[
'slug' => 'pinterest_case_study',
'category' => 'testimonial',
'name' => 'Case study pin',
'description' => 'Mini case study pin with concrete numbers.',
'content' => "Case study: how [client name] used {{brand_name}} to [outcome].\n\nThe situation: [one sentence].\nWhat they tried: [product or service].\nThe result: [specific number or outcome] in [timeframe].\n\nWhy it worked:\n- [Reason 1]\n- [Reason 2]\n\nRead the full case study → [link]",
'image_count' => 1,
'image_keywords' => ['case study', 'results', 'success story'],
'slides' => null,
],
[
'slug' => 'pinterest_pro_tip',
'category' => 'industry_tip',
'name' => 'Pro tip pin',
'description' => 'Single-tip pin with a clear payoff.',
'content' => "Pro tip: [tip in one sentence].\n\nMost people [common mistake]. The fix is [the actual technique].\n\nWhy it works: [one sentence on the reason].\n\nWhen to use it: [context or scenario].\n\nMore [topic] tips from {{brand_name}} → [link]",
'image_count' => 1,
'image_keywords' => ['pro tip', 'expert advice', 'industry tips'],
'slides' => null,
],
[
'slug' => 'pinterest_common_mistakes',
'category' => 'industry_tip',
'name' => 'Common mistakes pin',
'description' => 'List of mistakes readers can avoid.',
'content' => "[Number] [topic] mistakes to skip.\n\n{{brand_name}} sees these every week. Save the pin so you do not repeat them.\n\nThe mistakes:\n1. [Mistake 1], do this instead: [fix]\n2. [Mistake 2], do this instead: [fix]\n3. [Mistake 3], do this instead: [fix]\n\nRead the full breakdown → [link]",
'image_count' => 1,
'image_keywords' => ['common mistakes', 'tips', 'expert advice'],
'slides' => null,
],
[
'slug' => 'pinterest_industry_stat',
'category' => 'industry_tip',
'name' => 'Industry statistic pin',
'description' => 'Stat-led pin that anchors a useful insight.',
'content' => "[Statistic with number]% of [audience] [behavior].\nSource: [source, year].\n\nWhat that means for you: [one sentence on the implication].\n\nThree ways {{brand_name}} customers respond:\n- [Tactic 1]\n- [Tactic 2]\n- [Tactic 3]\n\nRead the full report → [link]",
'image_count' => 1,
'image_keywords' => ['industry data', 'statistics', 'research'],
'slides' => null,
],
[
'slug' => 'pinterest_workshop',
'category' => 'event',
'name' => 'Workshop pin',
'description' => 'Pin promoting an in-person or online workshop.',
'content' => "[Workshop name] with {{brand_name}}.\n\n[Date] · [time] · [location or online].\n\nWhat you will learn:\n- [Learning 1]\n- [Learning 2]\n- [Learning 3]\n\nWho it is for: [audience].\nSpots: [number] limited.\nPrice: [amount].\n\nReserve a seat → [link]",
'image_count' => 1,
'image_keywords' => ['workshop', 'class', 'learning event'],
'slides' => null,
],
[
'slug' => 'pinterest_pop_up',
'category' => 'event',
'name' => 'Pop-up shop pin',
'description' => 'Drive foot traffic to a pop-up.',
'content' => "{{brand_name}} pop-up shop in [city].\n\n[Date range] · [address] · [hours].\n\nWhat you will find:\n- [Category 1]\n- [Category 2]\n- [In-store exclusive]\n\n[One sentence on what makes the day worth the trip.]\n\nGet directions and full details → [link]",
'image_count' => 1,
'image_keywords' => ['pop-up shop', 'event', 'in-person shopping'],
'slides' => null,
],
[
'slug' => 'pinterest_webinar',
'category' => 'event',
'name' => 'Webinar pin',
'description' => 'Promote a free or paid webinar.',
'content' => "Free webinar: [topic].\n\nHosted by {{brand_name}} on [date] at [time, timezone].\n\nWhat we cover:\n- [Point 1]\n- [Point 2]\n- [Point 3]\n\nWho should attend: [audience].\nReplay: sent to everyone who registers.\n\nSave your spot → [link]",
'image_count' => 1,
'image_keywords' => ['webinar', 'online event', 'training'],
'slides' => null,
],
[
'slug' => 'pinterest_holiday_event',
'category' => 'event',
'name' => 'Holiday event pin',
'description' => 'Holiday-themed event or promotion pin.',
'content' => "{{brand_name}} [holiday name] event.\n\n[Date] · [location or online].\n\nOn the schedule:\n- [Activity 1]\n- [Activity 2]\n- [Activity 3]\n\nWhat to expect: [one sentence].\nRSVP by [date].\n\nFull schedule and RSVP → [link]",
'image_count' => 1,
'image_keywords' => ['holiday event', 'seasonal', 'celebration'],
'slides' => null,
],
[
'slug' => 'pinterest_question_pin',
'category' => 'engagement',
'name' => 'Question pin',
'description' => 'Question-led pin that invites comments.',
'content' => "[Open-ended question for the audience].\n\n{{brand_name}} is curious. Drop your answer in the comments.\n\nA few prompts to get you thinking:\n- [Prompt 1]\n- [Prompt 2]\n- [Prompt 3]\n\nWe will share the most interesting answers next week.\n\nJoin the conversation → [link]",
'image_count' => 1,
'image_keywords' => ['question', 'community', 'discussion'],
'slides' => null,
],
[
'slug' => 'pinterest_this_or_that',
'category' => 'engagement',
'name' => 'This or that pin',
'description' => 'Side-by-side preference pin.',
'content' => "This or that: [option A] or [option B].\n\n{{brand_name}} wants to know which side you are on. No wrong answer.\n\nThe case for [option A]: [one sentence].\nThe case for [option B]: [one sentence].\n\nVote in the comments. We will tally the results.\n\nMore polls → [link]",
'image_count' => 1,
'image_keywords' => ['poll', 'this or that', 'preference'],
'slides' => null,
],
[
'slug' => 'pinterest_giveaway',
'category' => 'engagement',
'name' => 'Giveaway pin',
'description' => 'Pin announcing a giveaway with clear rules.',
'content' => "{{brand_name}} giveaway: win [prize].\n\nOne winner picked on [date].\n\nHow to enter:\n1. Save this pin.\n2. Follow {{brand_name}} on Pinterest.\n3. Comment with [prompt].\n\nOpen to: [region].\nValue: [amount].\n\nFull rules → [link]",
'image_count' => 1,
'image_keywords' => ['giveaway', 'contest', 'prize'],
'slides' => null,
],
];

View file

@ -0,0 +1,322 @@
<?php
declare(strict_types=1);
return [
[
'slug' => 'threads_hot_take',
'category' => 'industry_tip',
'name' => 'Hot take',
'description' => 'A short, opinionated post designed to spark replies.',
'content' => "Unpopular opinion: [counterintuitive statement about your industry].\n\nHere's why I think this →\n\n[Brief reasoning in 1–2 sentences.]\n\nAm I wrong?",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_quick_tip',
'category' => 'educational',
'name' => 'Quick tip',
'description' => 'One actionable tip in a short, friendly tone.',
'content' => "Quick tip from {{brand_name}}:\n\n[Single, specific, actionable tip.]\n\nIt sounds simple. It changes everything.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_question',
'category' => 'engagement',
'name' => 'Open question',
'description' => 'Ask the community a question to drive conversation.',
'content' => "Genuine question for the {{brand_name}} community:\n\n[Question, open-ended and specific enough to answer.]\n\nNo wrong answers. Curious to read yours.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// PRODUCT LAUNCH
[
'slug' => 'threads_product_launch_soft',
'category' => 'product_launch',
'name' => 'Soft launch announcement',
'description' => 'Casual, low-key announcement that something new is out.',
'content' => "ok so. we shipped [product name] today.\n\nbeen working on it for [length of time] and i kind of can't believe it's actually live.\n\n[one specific thing it does that you're proud of].\n\nif you try it, tell me what breaks.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_product_launch_story',
'category' => 'product_launch',
'name' => 'Why we built it',
'description' => 'Personal story behind the new product or feature.',
'content' => "started building [product name] because [specific personal frustration].\n\nthought it would take a weekend. it took [actual time].\n\nit's live now at {{brand_name}}. honestly still surprised it works.\n\nwould love to hear what you think after you poke at it.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_product_launch_feature',
'category' => 'product_launch',
'name' => 'New feature drop',
'description' => 'Announce a single feature within an existing product.',
'content' => "small thing but i'm weirdly excited about it.\n\n{{brand_name}} now [does this specific thing].\n\nthe reason: people kept asking for [the underlying need]. so we did it.\n\nit's live. go try it and let me know if it's actually useful or just a thing now.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// PROMOTION
[
'slug' => 'threads_promo_discount',
'category' => 'promotion',
'name' => 'Casual discount post',
'description' => 'Low-pressure way to mention a sale or discount.',
'content' => "running [discount amount] off [product or plan] this week at {{brand_name}}.\n\nnot doing the whole countdown timer thing. just figured i'd mention it once and let people decide.\n\ncode: [code]. ends [date].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_promo_bundle',
'category' => 'promotion',
'name' => 'Bundle offer',
'description' => 'Promote a bundled deal in a relaxed tone.',
'content' => "bundled [item one] and [item two] together because people kept buying them in the same order anyway.\n\nthe pair is [price] at {{brand_name}}, which is about [savings] less than buying them separate.\n\nthat's it. that's the post.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_promo_last_chance',
'category' => 'promotion',
'name' => 'Last chance reminder',
'description' => 'Friendly nudge that an offer is ending.',
'content' => "fair warning: [offer name] ends [date or time].\n\nnot trying to be pushy. some of you said you wanted me to remind you, so consider this the reminder.\n\nlink in bio if you want it. zero hard feelings if you don't.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// EDUCATIONAL
[
'slug' => 'threads_edu_mistake',
'category' => 'educational',
'name' => 'Mistake I made',
'description' => 'Teach by sharing a personal mistake.',
'content' => "made the same mistake [number] times before i figured this out:\n\n[the mistake in one sentence].\n\nthe fix is [the actual fix in plain words]. nothing fancy. just had to stop doing the thing.\n\nposting in case you're stuck on the same loop.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_edu_misconception',
'category' => 'educational',
'name' => 'Common misconception',
'description' => 'Correct a widely held but wrong belief.',
'content' => "people keep telling me [common belief in your field].\n\nthat is not how it works.\n\n[what actually happens, in plain words].\n\nmight be obvious to some of you. apparently not to most of the people who emailed me last week.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_edu_resource',
'category' => 'educational',
'name' => 'Resource share',
'description' => 'Recommend a useful resource with personal context.',
'content' => "if you're trying to learn [topic], stop watching 4 hour youtube videos and just read [specific resource].\n\ni put it off for months because the title is boring. it's the only thing that actually clicked for me.\n\nthat's the recommendation.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_edu_step_breakdown',
'category' => 'educational',
'name' => 'Quick how-to',
'description' => 'Tiny step-by-step in conversational tone.',
'content' => "the [task] thing in 4 lines for anyone who keeps asking:\n\n1. [step one]\n2. [step two]\n3. [step three]\n4. [step four]\n\nthat is the whole process. you don't need a course for it.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// BEHIND THE SCENES
[
'slug' => 'threads_bts_morning',
'category' => 'behind_the_scenes',
'name' => 'Morning routine',
'description' => 'Casual peek at how a workday starts.',
'content' => "today at {{brand_name}}:\n\n- coffee\n- stared at [specific problem] for an hour\n- realized the bug was on line [number]\n- fixed it in 4 minutes\n\nthe ratio of thinking to doing in this job is genuinely cursed.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_bts_decision',
'category' => 'behind_the_scenes',
'name' => 'Decision we made',
'description' => 'Share an internal decision and the reasoning.',
'content' => "we decided to [specific decision] this week.\n\nthe other option was [alternative]. half the team wanted that one. i still kind of do.\n\nbut [the actual reason this decision won].\n\nask me in 3 months if it was the right call.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_bts_messy_progress',
'category' => 'behind_the_scenes',
'name' => 'Messy progress shot',
'description' => 'Honest mid-project update.',
'content' => "current state of [project name]:\n\n- [percent] done\n- [specific thing that is working]\n- [specific thing that is not working]\n- [number] open tabs i'm afraid to close\n\nwill ship when it stops embarrassing me.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_bts_team_moment',
'category' => 'behind_the_scenes',
'name' => 'Team moment',
'description' => 'Small human moment from the team.',
'content' => "[name on the team] just sent a slack message that said \"[short funny or insightful quote]\" and now we can't stop quoting it.\n\nbuilding {{brand_name}} with these people is half the reason i still like the job.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// TESTIMONIAL
[
'slug' => 'threads_testimonial_quote',
'category' => 'testimonial',
'name' => 'Customer quote',
'description' => 'Share a real customer line with light context.',
'content' => "got this email from [first name or initials] yesterday:\n\n\"[direct customer quote, 1-2 sentences]\"\n\ni read it twice. this is the part of the job that doesn't show up in the metrics.\n\nthank you for using {{brand_name}}. genuinely.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_testimonial_outcome',
'category' => 'testimonial',
'name' => 'Customer outcome',
'description' => 'Talk about a real customer result without bragging.',
'content' => "[customer first name] told me yesterday they [specific outcome] after using {{brand_name}} for [time period].\n\ni didn't ask them to share it. they just sent the screenshot and said \"thought you'd want to see this.\"\n\nyeah. i did.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_testimonial_unexpected',
'category' => 'testimonial',
'name' => 'Unexpected use case',
'description' => 'Highlight a surprising way someone uses the product.',
'content' => "didn't see this coming.\n\nsomeone using {{brand_name}} for [unexpected use case]. wasn't what we built it for. apparently it works.\n\nfavorite part of shipping things is finding out what people actually do with them.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// INDUSTRY TIP
[
'slug' => 'threads_industry_observation',
'category' => 'industry_tip',
'name' => 'Industry observation',
'description' => 'Share a pattern you keep noticing in your field.',
'content' => "thing i keep noticing in [industry]:\n\n[specific observation in one sentence].\n\ncould be a real shift. could be selection bias from who i talk to. tell me if you're seeing it too.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_industry_lesson',
'category' => 'industry_tip',
'name' => 'Lesson from experience',
'description' => 'Single hard-won lesson, no fluff.',
'content' => "[number] years in [industry] and the lesson that took me longest to actually believe:\n\n[the lesson in one sentence].\n\nstill catch myself ignoring it. then something breaks. then i remember.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_industry_pushback',
'category' => 'industry_tip',
'name' => 'Pushback on conventional wisdom',
'description' => 'Politely disagree with a common piece of advice.',
'content' => "the standard advice in [industry] is [common advice].\n\ni've been doing the opposite for [time period]. it works better for me, anyway.\n\n[brief reason why].\n\nnot saying everyone should. just that the rule isn't a rule.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_industry_prediction',
'category' => 'industry_tip',
'name' => 'Quiet prediction',
'description' => 'Make a prediction without grandstanding.',
'content' => "small prediction:\n\nin [time frame], [specific change in your industry] will be normal.\n\ncould absolutely be wrong. saving this so i can come back and laugh at myself later.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// EVENT
[
'slug' => 'threads_event_announcement',
'category' => 'event',
'name' => 'Event announcement',
'description' => 'Casually announce an upcoming event.',
'content' => "{{brand_name}} is doing [event name] on [date].\n\n[one or two sentences on what it actually is and who would care about it].\n\n[location or link]. tell a friend if it sounds like their thing.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_event_recap',
'category' => 'event',
'name' => 'Event recap',
'description' => 'Honest recap after an event.',
'content' => "back from [event name].\n\nthe best part was [specific moment or conversation].\n\nthe weirdest part was [honest observation].\n\nif you were there and we didn't get to talk, message me. there's always more to say after the panel ends.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_event_invite',
'category' => 'event',
'name' => 'Personal invite',
'description' => 'Direct invite that feels personal.',
'content' => "doing a small [event type] for {{brand_name}} on [date] and i actually want you there.\n\nit's [duration] and we'll be talking about [specific topic].\n\nrsvp at [link] if you want in. capping it at [number] so it stays a real conversation.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ENGAGEMENT
[
'slug' => 'threads_engagement_recommendation',
'category' => 'engagement',
'name' => 'Recommendation request',
'description' => 'Ask the audience for recommendations.',
'content' => "looking for recommendations:\n\n[specific thing you need recommendations for].\n\ni've already tried [option a] and [option b]. need something that [specific constraint].\n\nbest reply gets my eternal gratitude. that is the prize.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_engagement_this_or_that',
'category' => 'engagement',
'name' => 'This or that',
'description' => 'Quick binary question to drive replies.',
'content' => "[option a] or [option b].\n\nno middle ground. no \"it depends.\" pick one and tell me why.\n\nrunning the {{brand_name}} version of this debate in our team chat and we are deeply, deeply split.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_engagement_confession',
'category' => 'engagement',
'name' => 'Tiny confession',
'description' => 'Share something small and relatable.',
'content' => "small confession.\n\ni still [slightly embarrassing habit related to your work or life].\n\ntell me i'm not the only one. or do tell me i'm the only one. either way i'd like to know.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
];

342
templates/en/x_post.php Normal file
View file

@ -0,0 +1,342 @@
<?php
declare(strict_types=1);
return [
[
'slug' => 'flash_sale',
'category' => 'promotion',
'name' => 'Flash sale',
'description' => 'Short X post for a flash sale with urgency.',
'content' => "🔥 Flash sale at {{brand_name}}!\n\n[Discount]% off [product/service], ends in 24 hours.\n\nNo code needed → [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'success_story',
'category' => 'testimonial',
'name' => 'Success story',
'description' => 'Brief success-story format for X.',
'content' => "\"[Short customer quote.]\"\n- @[handle]\n\nThis is why we do what we do at {{brand_name}}. 🙌",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'this_or_that_poll',
'category' => 'engagement',
'name' => 'This or that',
'description' => 'Drive engagement with a simple binary choice question.',
'content' => "Quick question for the {{brand_name}} community:\n\n[Option A] or [Option B]?\n\nReply with your pick and why 👇",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// product_launch
[
'slug' => 'shipped_today',
'category' => 'product_launch',
'name' => 'Shipped today',
'description' => 'Casual ship announcement with one concrete change.',
'content' => "Shipped today: [feature].\n\nIt does [one specific thing] so you can stop [annoying workaround].\n\nLive now in {{brand_name}}.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'new_feature_one_liner',
'category' => 'product_launch',
'name' => 'New feature one-liner',
'description' => 'One-sentence pitch for a new feature.',
'content' => "{{brand_name}} now [does specific thing].\n\nIf you've been [doing painful workaround], try it: [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'beta_invite',
'category' => 'product_launch',
'name' => 'Beta invite',
'description' => 'Open call for beta testers.',
'content' => "We're opening beta for [feature] this week.\n\nLooking for [number] people who [specific use case].\n\nReply if that's you.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'finally_built_it',
'category' => 'product_launch',
'name' => 'Finally built it',
'description' => 'Honest "we got around to it" launch tone.',
'content' => "Finally built [feature]. People have been asking for it since [time period].\n\nIt's live in {{brand_name}} today. Sorry it took so long.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// promotion
[
'slug' => 'weekend_deal',
'category' => 'promotion',
'name' => 'Weekend deal',
'description' => 'Weekend-only discount post.',
'content' => "Weekend only: [discount] off [product] at {{brand_name}}.\n\nCode [CODE]. Expires Sunday at midnight. That's the whole post.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'free_shipping',
'category' => 'promotion',
'name' => 'Free shipping',
'description' => 'Free shipping window announcement.',
'content' => "Free shipping on every {{brand_name}} order over $[amount] this week.\n\nNo code, no minimum tricks. Goes back to normal Monday.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'last_call',
'category' => 'promotion',
'name' => 'Last call',
'description' => 'Final hours of a sale.',
'content' => "Last call. [Sale name] ends tonight at [time].\n\nIf you've had {{brand_name}} in your cart, this is the cheapest it gets this year: [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bundle_offer',
'category' => 'promotion',
'name' => 'Bundle offer',
'description' => 'Pitches a bundle as a saver deal.',
'content' => "New bundle at {{brand_name}}: [Product A] + [Product B] for [price].\n\nThat's [amount] less than buying them separately. Limited to [quantity] units.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// educational
[
'slug' => 'one_thing_we_learned',
'category' => 'educational',
'name' => 'One thing we learned',
'description' => 'Share a single concrete lesson.',
'content' => "One thing we learned at {{brand_name}} this month:\n\n[Specific finding]. We thought [old assumption], but [data point] proved otherwise.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'common_mistake',
'category' => 'educational',
'name' => 'Common mistake',
'description' => 'Call out a single mistake people make.',
'content' => "Most people get [topic] wrong because they [common mistake].\n\nWhat actually works: [counter-approach]. We tested it on [number] customers.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'quick_tip',
'category' => 'educational',
'name' => 'Quick tip',
'description' => 'Tiny actionable tip.',
'content' => "Quick tip if you're using {{brand_name}}:\n\n[Specific action] before [step]. Saves about [time/result] for most people.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'myth_vs_reality',
'category' => 'educational',
'name' => 'Myth vs reality',
'description' => 'Dispel one industry myth.',
'content' => "Myth: [common belief about topic].\n\nReality: [counter-fact with number]. We see it in {{brand_name}} data every week.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// behind_the_scenes
[
'slug' => 'how_we_built_it',
'category' => 'behind_the_scenes',
'name' => 'How we built it',
'description' => 'Casual behind-the-scenes peek.',
'content' => "How we built [feature] at {{brand_name}}:\n\nStarted with [first attempt]. It broke. Switched to [approach 2]. Shipped that.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'team_at_work',
'category' => 'behind_the_scenes',
'name' => 'Team at work',
'description' => 'Snapshot of what the team is doing right now.',
'content' => "What the {{brand_name}} team is working on right now:\n\n[Person/role] is debugging [specific issue]. [Person/role] is on [other project]. Coffee count: high.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mistake_we_made',
'category' => 'behind_the_scenes',
'name' => 'Mistake we made',
'description' => 'Honest postmortem in one tweet.',
'content' => "We messed up at {{brand_name}} last week.\n\n[What broke]. Caused [impact] for [number] customers. Fixed it [how]. Sorry to anyone affected.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'office_moment',
'category' => 'behind_the_scenes',
'name' => 'Office moment',
'description' => 'Small, human office snapshot.',
'content' => "Random {{brand_name}} office moment:\n\n[Specific scene, e.g. designer arguing with engineer over a 2px button radius]. This is most days, honestly.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// testimonial
[
'slug' => 'customer_dm',
'category' => 'testimonial',
'name' => 'Customer DM',
'description' => 'Share a real customer message.',
'content' => "Got this DM from a {{brand_name}} customer today:\n\n\"[Short quote about what changed for them].\"\n\nThis is the part of the job that doesn't get old.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'before_and_after',
'category' => 'testimonial',
'name' => 'Before and after',
'description' => 'Concrete before/after numbers from a customer.',
'content' => "[Customer name] before {{brand_name}}: [metric].\n\n[Customer name] after [time period]: [new metric].\n\nNothing else changed in their setup.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'one_line_review',
'category' => 'testimonial',
'name' => 'One-line review',
'description' => 'Single short customer line.',
'content' => "\"[Specific customer line, max 12 words.]\"\n\n- [Customer name], [role] at [company]\n\nWe didn't ask them to write that.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// industry_tip
[
'slug' => 'hot_take',
'category' => 'industry_tip',
'name' => 'Hot take',
'description' => 'Opinionated take on the industry.',
'content' => "Hot take: most people in [industry] think [common belief].\n\nAfter [time] running {{brand_name}}, I think the opposite. [Specific reason].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'overrated_underrated',
'category' => 'industry_tip',
'name' => 'Overrated underrated',
'description' => 'Pair an overrated and underrated thing.',
'content' => "Overrated in [industry]: [common practice].\n\nUnderrated: [overlooked practice].\n\nWe stopped doing the first at {{brand_name}} a year ago.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'unpopular_opinion',
'category' => 'industry_tip',
'name' => 'Unpopular opinion',
'description' => 'Share a contrarian observation.',
'content' => "Unpopular opinion: [contrarian statement about industry].\n\n{{brand_name}} customers prove this every month. The data isn't subtle.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'what_changed_my_mind',
'category' => 'industry_tip',
'name' => 'What changed my mind',
'description' => 'Honest mind-change moment.',
'content' => "I used to think [old belief about industry].\n\nThen [specific event/data] happened at {{brand_name}}. Now I think [new view]. Still adjusting.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// event
[
'slug' => 'event_announcement',
'category' => 'event',
'name' => 'Event announcement',
'description' => 'Plain event announcement.',
'content' => "{{brand_name}} is hosting [event name] on [date] in [city].\n\n[Specific topic]. Free, [capacity] seats. Sign up: [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'event_recap',
'category' => 'event',
'name' => 'Event recap',
'description' => 'Short recap after an event.',
'content' => "[Number] people showed up at the {{brand_name}} [event] last night.\n\nFavorite question: \"[real audience question].\" Recording goes up Friday.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'webinar_reminder',
'category' => 'event',
'name' => 'Webinar reminder',
'description' => 'Reminder a webinar is happening soon.',
'content' => "Reminder: {{brand_name}} webinar on [topic] starts in [time].\n\n[Speaker] is going to walk through [specific thing]. Last chance to register: [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// engagement
[
'slug' => 'open_question',
'category' => 'engagement',
'name' => 'Open question',
'description' => 'Ask the audience a real question.',
'content' => "Genuine question for anyone using [tool/category]:\n\nWhat's the one thing it still can't do that you wish it could?\n\nAsking because we're working on it at {{brand_name}}.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'fill_in_the_blank',
'category' => 'engagement',
'name' => 'Fill in the blank',
'description' => 'Light fill-in-the-blank prompt.',
'content' => "Fill in the blank:\n\nThe worst part of [task/topic] is ______.\n\nReading every reply. We're using them to plan {{brand_name}}'s next quarter.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'show_us_your_setup',
'category' => 'engagement',
'name' => 'Show us your setup',
'description' => 'Ask people to share something visual.',
'content' => "Show us your [thing, desk, dashboard, weekly routine].\n\nWe'll feature our favorite three on the {{brand_name}} account next week. No filter required.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
];

View file

@ -0,0 +1,316 @@
<?php
declare(strict_types=1);
return [
[
'slug' => 'bluesky_now_live',
'category' => 'product_launch',
'name' => 'Ya disponible',
'description' => 'Anuncia un lanzamiento con la onda abierta y descentralizada de Bluesky.',
'content' => "Ya disponible: [feature/producto] de {{brand_name}}.\n\nQué cambió: [resumen en una línea].\n\nPara quién: [quién se beneficia].\n\nLink → [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_thought',
'category' => 'industry_tip',
'name' => 'Pensamiento corto',
'description' => 'Una observación concisa que se lee natural en Bluesky.',
'content' => "[Observación sobre tu industria, contada en una o dos frases.]\n\nSimple, pero vale decirlo en voz alta.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_invite',
'category' => 'engagement',
'name' => 'Invitación a la comunidad',
'description' => 'Invita a la comunidad a un tema o conversación.',
'content' => "Si te importa [tema], queremos escucharte.\n\n¿Qué te ronda la cabeza últimamente?\n\n- equipo {{brand_name}}",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_changelog_drop',
'category' => 'product_launch',
'name' => 'Changelog nuevo',
'description' => 'Post de changelog directo para un release.',
'content' => "v[versión] salió.\n\n• [cambio 1]\n• [cambio 2]\n• [bug fix]\n\nSin migrations. Notas completas: [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_open_beta',
'category' => 'product_launch',
'name' => 'Beta abierta',
'description' => 'Invita a los usuarios a una beta pública.',
'content' => "Beta abierta: [feature] está disponible para quien quiera probarlo.\n\nTiene partes ásperas. Es justamente el punto. Bug reports bienvenidos.\n\nRegistrate: [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_api_release',
'category' => 'product_launch',
'name' => 'Release de API',
'description' => 'Anuncia una nueva API o feature para developers.',
'content' => "Nuevo: [endpoint/SDK] de {{brand_name}}.\n\nDocs: [link]\nRepo de ejemplo: [link]\n\nSi falta algo en las docs, avisanos. Lo arreglamos más rápido de lo que esperás.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_promo_discount',
'category' => 'promotion',
'name' => 'Ventana de descuento',
'description' => 'Promo con plazo, dicha de forma directa.',
'content' => "[X]% off en [plan/producto] hasta [fecha].\n\nSin registro de email. Sin popup. Solo el código: [CÓDIGO]\n\n[link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_promo_lifetime',
'category' => 'promotion',
'name' => 'Lifetime deal',
'description' => 'Oferta lifetime/early-bird pensada para builders.',
'content' => "Lifetime deal en {{brand_name}}: [precio] una vez, sin suscripción.\n\nLimitado a [número] lugares. Después volvemos al mensual.\n\nLlevate uno: [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_promo_referral',
'category' => 'promotion',
'name' => 'Bonus por referido',
'description' => 'Oferta de referidos directa.',
'content' => "Referí a un amigo a {{brand_name}}, los dos reciben [recompensa].\n\nSin niveles. Sin ranking. Solo mandá tu link: [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_edu_one_thing',
'category' => 'educational',
'name' => 'Una cosa que aprendí',
'description' => 'Una lección concreta, contada de forma simple.',
'content' => "Una cosa que aprendí trabajando en [tema]:\n\n[lección concreta, una o dos frases].\n\nObvio en retrospectiva. No era obvio antes.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_edu_misconception',
'category' => 'educational',
'name' => 'Mito común',
'description' => 'Corregí un mito difundido en tu área.',
'content' => "Creencia común: [mito sobre tu área].\n\nLo que es verdad de hecho: [corrección].\n\nLa diferencia importa cuando [escenario específico].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_edu_quick_how',
'category' => 'educational',
'name' => 'Tutorial rápido',
'description' => 'Tutorial corto sobre una tarea específica.',
'content' => "Cómo [tarea específica] en [herramienta]:\n\n1. [paso]\n2. [paso]\n3. [paso]\n\nEs todo. Sin config oculta.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_edu_tradeoff',
'category' => 'educational',
'name' => 'Explicación de un tradeoff',
'description' => 'Mostrá un tradeoff real de tu dominio.',
'content' => "[Opción A] vs [Opción B] es básicamente un tradeoff entre [cosa 1] y [cosa 2].\n\nSi te importa más [cosa 1], elegí A. Si [cosa 2], elegí B. La mayoría de los equipos eligen A y se arrepienten después.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_bts_stack',
'category' => 'behind_the_scenes',
'name' => 'Nuestra stack',
'description' => 'Nota honesta sobre la stack desde dentro del equipo.',
'content' => "Nuestra stack en {{brand_name}}: [tech 1], [tech 2], [tech 3].\n\nElegimos [tech 1] por [motivo]. Nos arrepentimos de haber elegido [tech] por [motivo]. Probablemente lo cambiamos el próximo trimestre.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_bts_postmortem',
'category' => 'behind_the_scenes',
'name' => 'Mini postmortem',
'description' => 'Nota corta y transparente sobre un incidente.',
'content' => "[Servicio/feature] estuvo caído por [duración] hoy.\n\nCausa: [explicación simple].\nFix: [lo que hicimos].\n\nAgregamos [protección] para que la misma cosa no pase de la misma forma de nuevo.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_bts_decision',
'category' => 'behind_the_scenes',
'name' => 'Por qué elegimos X',
'description' => 'Explicá una decisión reciente de diseño o producto.',
'content' => "Por qué elegimos [decisión] en lugar de [alternativa]:\n\n[motivo en una frase].\n\nNo es la elección popular. Pero encaja con cómo trabajan nuestros usuarios de verdad.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_bts_numbers',
'category' => 'behind_the_scenes',
'name' => 'Números que miramos',
'description' => 'Compartí una métrica real y qué significa.',
'content' => "Un número que miramos de verdad en {{brand_name}}: [métrica].\n\nEl mes pasado fue [valor]. La semana anterior, [valor].\n\nEs la métrica que nos dice si [resultado] es real.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_testimonial_quote',
'category' => 'testimonial',
'name' => 'Cita de un usuario',
'description' => 'Cita corta de un usuario, sin adornos.',
'content' => "De un usuario esta semana:\n\n\"[cita corta y específica sobre el producto].\"\n\n- [nombre], [rol]\n\nEs ese tipo de feedback el que nos mantiene construyendo.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_testimonial_workflow',
'category' => 'testimonial',
'name' => 'Cómo lo usa un cliente',
'description' => 'Historia específica del workflow de un usuario.',
'content' => "[Cliente/equipo] usa {{brand_name}} para [tarea específica].\n\nAntes: [forma vieja].\nAhora: [forma nueva].\n\nNo es dramático. Solo menos fricción todos los días.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_testimonial_result',
'category' => 'testimonial',
'name' => 'Resultado concreto',
'description' => 'Un resultado específico y medible de un cliente.',
'content' => "[Cliente] redujo [tarea] de [tiempo viejo] a [tiempo nuevo] usando {{brand_name}}.\n\nUn cambio de workflow. Sin nuevas contrataciones.\n\nNota completa: [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_industry_take',
'category' => 'industry_tip',
'name' => 'Opinión medio impopular',
'description' => 'Una opinión real sobre algo de tu industria.',
'content' => "Opinión moderada: [opinión sobre tu industria].\n\nSé que es impopular. Cambié de idea sobre esto dos veces. Por ahora creo que se sostiene.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_industry_pattern',
'category' => 'industry_tip',
'name' => 'Un patrón que veo seguido',
'description' => 'Patrón observado entre equipos o proyectos.',
'content' => "Un patrón que veo seguido en [industria/rol]:\n\n[patrón en una frase].\n\nGeneralmente funciona hasta [hito] y después deja de funcionar en silencio.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_industry_anti_advice',
'category' => 'industry_tip',
'name' => 'Consejo que saltearía',
'description' => 'Anti-consejo: consejo común que no se sostiene.',
'content' => "Consejo que se escucha mucho: [consejo común].\n\nEn la práctica esto se cae cuando [escenario]. La versión que funciona de verdad es [consejo revisado].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_industry_link_share',
'category' => 'industry_tip',
'name' => 'Link con contexto',
'description' => 'Compartí un link con un motivo real para leerlo.',
'content' => "Vale la lectura: [título del artículo/post].\n\nPor qué: [una cosa específica que el texto acierta].\n\n[link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_event_announce',
'category' => 'event',
'name' => 'Anuncio de evento',
'description' => 'Anunciá un evento o talk próximo.',
'content' => "[Nombre del evento] el [fecha] a las [hora/timezone].\n\nTema: [qué vamos a cubrir].\nFormato: [talk / Q&A / demo].\n\nGratis, sin registro: [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_event_speaking',
'category' => 'event',
'name' => 'Voy a hablar',
'description' => 'Avisá que vas a hablar en una conferencia.',
'content' => "Voy a hablar en [evento] el [fecha].\n\nTalk: [título o tema de la talk en palabras simples].\n\nSi andás por ahí, saludá. Especialmente si no estás de acuerdo con la talk.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_event_recap',
'category' => 'event',
'name' => 'Recap del evento',
'description' => 'Recap corto después de un evento o meetup.',
'content' => "Recap rápido del [evento]:\n\n• [qué funcionó]\n• [qué nos sorprendió]\n• [qué vamos a hacer distinto la próxima vez]\n\nGracias a todos los que aparecieron.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_event_office_hours',
'category' => 'event',
'name' => 'Office hours',
'description' => 'Invitación a office hours abiertas o AMA.',
'content' => "Office hours abiertas este [día] a las [hora/timezone].\n\nTraé preguntas reales sobre [tema]. Prefiero responder las difíciles antes que las fáciles.\n\nLink para entrar: [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_engagement_question',
'category' => 'engagement',
'name' => 'Pregunta real',
'description' => 'Una pregunta genuina, no engagement bait.',
'content' => "Pregunta genuina para quien trabaja en [tema]:\n\n[pregunta específica].\n\nNo es retórica. Estoy trabado con esto y curioso por saber cómo lo manejan los demás.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_engagement_poll_lite',
'category' => 'engagement',
'name' => 'Dos lados',
'description' => 'Un o/o liviano para tirar respuestas.',
'content' => "Dos lados sobre [tema]:\n\nA: [opción A]\nB: [opción B]\n\n¿Cuál usás de verdad en el día a día, y qué te hizo elegirlo?",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_engagement_show_us',
'category' => 'engagement',
'name' => 'Mostranos tu setup',
'description' => 'Invitá a los usuarios a compartir su setup o workflow.',
'content' => "Mostranos tu [setup / workflow / config] para [tarea].\n\nRespondé con un screenshot o una línea. Estamos juntando buenos patrones para devolver al grupo.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
];

View file

@ -0,0 +1,322 @@
<?php
declare(strict_types=1);
return [
[
'slug' => 'facebook_special_offer',
'category' => 'promotion',
'name' => 'Oferta especial',
'description' => 'Promociona una oferta especial en Facebook con una llamada a la acción clara.',
'content' => "🎉 Oferta especial de {{brand_name}}.\n\n[Resumen de la oferta], disponible solo hasta [fecha].\n\nHaz clic en el enlace para aprovecharla: [link]\n\n¿Tienes preguntas? Déjalas en los comentarios, leemos cada una.",
'image_count' => 1,
'image_keywords' => ['offer', 'sale', 'promotion'],
'slides' => null,
],
[
'slug' => 'facebook_community_story',
'category' => 'behind_the_scenes',
'name' => 'Historia de la comunidad',
'description' => 'Comparte la historia de un cliente o un momento del equipo para crear conexión.',
'content' => "Te presentamos a [nombre].\n\n[Historia corta, 2 a 4 frases, sobre cómo usa {{brand_name}} o lo que aporta a nuestra comunidad.]\n\nPor esto hacemos lo que hacemos. ❤️",
'image_count' => 1,
'image_keywords' => ['people', 'story', 'community'],
'slides' => null,
],
[
'slug' => 'facebook_event_invite',
'category' => 'event',
'name' => 'Invitación a un evento',
'description' => 'Invita a tus seguidores a un próximo evento o webinar.',
'content' => "📅 Aparta la fecha.\n\n{{brand_name}} organiza [nombre del evento] el [fecha] a las [hora].\n\nVamos a hablar de:\n• [Tema 1]\n• [Tema 2]\n• [Tema 3]\n\nLa entrada es gratis. Reserva tu lugar → [link]",
'image_count' => 1,
'image_keywords' => ['event', 'calendar', 'invitation'],
'slides' => null,
],
// Product launch (4)
[
'slug' => 'facebook_new_product_reveal',
'category' => 'product_launch',
'name' => 'Revelación de nuevo producto',
'description' => 'Anuncia un producto nuevo a tu comunidad de Facebook.',
'content' => "Después de [número] meses de trabajo, por fin podemos contarlo.\n\nTe presentamos [nombre del producto], el/la [descripción corta] que creamos porque [motivo]. Nuestro equipo escuchaba lo mismo de la gente de esta comunidad: [pedido frecuente]. Así que lo hicimos.\n\n{{brand_name}} envía el primer lote el [fecha]. El enlace está en el primer comentario.\n\n¿Qué quieres saber sobre él? Deja tu pregunta abajo y respondemos cada una esta semana.",
'image_count' => 1,
'image_keywords' => ['product', 'launch', 'unboxing'],
'slides' => null,
],
[
'slug' => 'facebook_product_restock',
'category' => 'product_launch',
'name' => 'Anuncio de reposición de producto',
'description' => 'Avisa a tus seguidores que un producto agotado volvió al stock.',
'content' => "Volvió.\n\n[Nombre del producto] se agotó en [periodo] la última vez, y mucha gente quedó en lista de espera. Repusimos esta mañana con [cantidad] unidades.\n\nSi te lo perdiste antes, este es tu recordatorio: [link]\n\nPara quienes ya tienen uno, ¿qué le dirían a alguien que está pensando en pedirlo?",
'image_count' => 1,
'image_keywords' => ['product', 'restock', 'shelf'],
'slides' => null,
],
[
'slug' => 'facebook_feature_release',
'category' => 'product_launch',
'name' => 'Lanzamiento de nueva función',
'description' => 'Anuncia una nueva función agregada a un producto existente.',
'content' => "Cambio pequeño, gran diferencia.\n\n{{brand_name}} acaba de liberar [nombre de la función]. Lo pidieron en los comentarios más veces de las que podemos contar, así que aquí está: [explicación en una frase de lo que hace].\n\nYa está disponible para todos a partir de hoy. No hay que actualizar nada.\n\nSi la pruebas esta semana, cuéntanos qué te parece. Ya estamos tomando notas para lo próximo.",
'image_count' => 1,
'image_keywords' => ['feature', 'update', 'screen'],
'slides' => null,
],
[
'slug' => 'facebook_preorder_open',
'category' => 'product_launch',
'name' => 'Anuncio de preventa',
'description' => 'Abre la preventa de un producto que está por lanzarse.',
'content' => "La preventa está abierta.\n\n[Nombre del producto] se envía el [fecha], y dejamos que esta comunidad ordene primero. El precio de preventa es [precio] hasta [fecha límite], y solo hay [cantidad] lugares en la primera tanda.\n\nAquí está el enlace: [link]\n\nSi tienes dudas sobre [tema común: envío / talla / especificaciones], pregunta en los comentarios. Estamos por aquí toda la tarde.",
'image_count' => 1,
'image_keywords' => ['preorder', 'product', 'package'],
'slides' => null,
],
// Promotion (3)
[
'slug' => 'facebook_flash_sale',
'category' => 'promotion',
'name' => 'Alerta de oferta relámpago',
'description' => 'Anuncia una oferta relámpago de corta duración con sentido de urgencia.',
'content' => "Oferta relámpago, solo hoy.\n\n[Descuento] en [producto/categoría] hasta medianoche. Usa el código [CÓDIGO] al pagar.\n\nEs el precio más bajo que vamos a ofrecer esta temporada, y no la repetimos hasta [próxima fecha].\n\nEnlace en el primer comentario. Etiqueta a alguien que la tenga en la mira.",
'image_count' => 1,
'image_keywords' => ['sale', 'discount', 'shopping'],
'slides' => null,
],
[
'slug' => 'facebook_holiday_promo',
'category' => 'promotion',
'name' => 'Promoción por fechas especiales',
'description' => 'Lanza una promoción temática de fechas especiales con tono cercano.',
'content' => "Feliz [nombre de la fecha] de parte de todos en {{brand_name}}.\n\nPara agradecerte por ser parte de este año, estamos dando [descuento] en [producto/categoría] desde [fecha inicial] hasta [fecha final]. Usa el código [CÓDIGO].\n\nSea lo que sea que estés celebrando esta semana, esperamos que la pases lindo. Cuéntanos en los comentarios cómo vas a vivirla.",
'image_count' => 1,
'image_keywords' => ['holiday', 'celebration', 'gift'],
'slides' => null,
],
[
'slug' => 'facebook_bundle_deal',
'category' => 'promotion',
'name' => 'Promoción de combo',
'description' => 'Promociona un combo de productos con ahorro.',
'content' => "Dos de nuestros favoritos, mejores juntos.\n\n[Producto A] + [Producto B] ahora son combo, y el combo te ahorra [monto] frente a comprarlos por separado. Los juntamos porque los clientes los pedían en el mismo carrito una y otra vez.\n\nLlévate el tuyo aquí: [link]\n\nSi ya tienes uno de los dos, el otro es la pieza que falta. Confía en nosotros.",
'image_count' => 1,
'image_keywords' => ['bundle', 'products', 'package'],
'slides' => null,
],
// Educational (4)
[
'slug' => 'facebook_how_to_guide',
'category' => 'educational',
'name' => 'Guía paso a paso',
'description' => 'Enseña a tu audiencia a hacer algo útil.',
'content' => "Cómo [tarea] en menos de [tiempo].\n\n1. [Paso 1 con un detalle real, no una instrucción vaga]\n2. [Paso 2]\n3. [Paso 3]\n4. [Paso 4]\n\nLa parte que la mayoría se salta es el [número de paso]. Si solo haces una cosa, que sea esa.\n\n¿Cuál es la duda sobre [tema] que siempre dejas para después? Pregunta abajo y la respondemos la próxima semana.",
'image_count' => 1,
'image_keywords' => ['tutorial', 'guide', 'how to'],
'slides' => null,
],
[
'slug' => 'facebook_myth_buster',
'category' => 'educational',
'name' => 'Mito vs. realidad',
'description' => 'Desmonta un mito común de tu industria.',
'content' => "Hay un mito sobre [tema] que no se va.\n\nEl mito: [creencia común].\n\nLo que pasa en realidad: [explicación correcta, 2 a 3 frases con un ejemplo o número específico].\n\nLo escuchamos hace años. Si tú también lo creías, estás en buena compañía, la mayoría lo creía. Ahora ya lo sabes.\n\n¿Qué otros mitos de [industria] te sacan de quicio?",
'image_count' => 1,
'image_keywords' => ['fact check', 'information', 'thinking'],
'slides' => null,
],
[
'slug' => 'facebook_quick_tip',
'category' => 'educational',
'name' => 'Tip rápido',
'description' => 'Comparte un consejo corto que tu audiencia pueda usar hoy.',
'content' => "Tip rápido que puedes usar hoy.\n\nSi [situación común], prueba [acción específica] en lugar de [enfoque habitual]. La razón: [explicación en una frase de por qué funciona].\n\nEmpezamos a hacerlo con [ejemplo] y cambió la forma en que [resultado]. Cambio chico, diferencia real.\n\nPruébalo esta semana y cuéntanos cómo te fue.",
'image_count' => 1,
'image_keywords' => ['tip', 'lightbulb', 'idea'],
'slides' => null,
],
[
'slug' => 'facebook_common_mistake',
'category' => 'educational',
'name' => 'Error común a evitar',
'description' => 'Ayuda a tus lectores a evitar un error común en tu campo.',
'content' => "El error más común que vemos en [tema]: [error específico].\n\nSuele pasar cuando [contexto]. El resultado es [consecuencia], y para cuando te das cuenta, [perjuicio].\n\nQué hacer en lugar de eso: [alternativa clara]. Toma [tiempo/esfuerzo] más al principio y te ahorra [beneficio] después.\n\nSi ya lo cometiste, no estás solo. Nosotros también. ¿Cuál es un error sobre el que te gustaría que alguien te hubiera avisado antes?",
'image_count' => 1,
'image_keywords' => ['mistake', 'warning', 'lesson'],
'slides' => null,
],
// Behind the scenes (4)
[
'slug' => 'facebook_team_intro',
'category' => 'behind_the_scenes',
'name' => 'Presentación de un miembro del equipo',
'description' => 'Presenta a un miembro del equipo a la comunidad.',
'content' => "Saluda a [nombre].\n\n[Nombre] es nuestro/a [puesto] y lleva en {{brand_name}} desde hace [tiempo]. Es la razón por la que [cosa específica que cuida o mejoró], y si alguna vez escribiste a soporte, hay buenas chances de que te haya respondido.\n\nDato curioso: [un detalle humano, hobby, talento raro, snack favorito].\n\nDéjale un saludo en los comentarios.",
'image_count' => 1,
'image_keywords' => ['team', 'portrait', 'workplace'],
'slides' => null,
],
[
'slug' => 'facebook_workspace_tour',
'category' => 'behind_the_scenes',
'name' => 'Tour por el espacio de trabajo',
'description' => 'Muestra a tus seguidores cómo es tu espacio o estudio.',
'content' => "Un vistazo al lugar donde pasa todo.\n\nEste es [nombre del lugar] de {{brand_name}}. [Un detalle específico, la luz, el desorden, el rincón que todos quieren]. Pasamos casi todo el día aquí, y se nota.\n\n[Segundo detalle, algo visible en la foto que tiene una historia detrás].\n\n¿Cómo está tu espacio de trabajo ahora mismo? Respuesta honesta, con tazas de café incluidas.",
'image_count' => 1,
'image_keywords' => ['workspace', 'office', 'studio'],
'slides' => null,
],
[
'slug' => 'facebook_making_of',
'category' => 'behind_the_scenes',
'name' => 'Detrás del proceso',
'description' => 'Muestra cómo se hace un producto o un trabajo.',
'content' => "¿Te has preguntado cómo se hace de verdad [producto/servicio]?\n\nEmpieza con [primer paso] y termina con [último paso]. En el medio hay mucho de [descripción honesta, prueba, rehacer, dudar]. La versión que terminas comprando suele ser el intento [número].\n\nAquí va una foto del lote de esta semana. El/la [detalle específico] es la parte que nadie ve pero todos notan cuando está bien hecha.\n\n¿Preguntas sobre el proceso? Adelante.",
'image_count' => 1,
'image_keywords' => ['workshop', 'process', 'craft'],
'slides' => null,
],
[
'slug' => 'facebook_milestone_celebration',
'category' => 'behind_the_scenes',
'name' => 'Celebración de un hito',
'description' => 'Celebra un hito importante con la comunidad.',
'content' => "Hoy es [hito, aniversario, número de clientes, lo que sea real].\n\nArrancamos {{brand_name}} hace [tiempo] con [detalle honesto del origen, una mesa de cocina, un cliente, una laptop prestada]. El plan era simple y un poco ingenuo: [objetivo original].\n\n[Hito] después, seguimos aquí, sobre todo gracias a la gente de esta comunidad que siguió apareciendo. Gracias, en serio.\n\nCuéntanos en los comentarios, ¿cuándo nos descubriste por primera vez?",
'image_count' => 1,
'image_keywords' => ['celebration', 'milestone', 'anniversary'],
'slides' => null,
],
// Testimonial (3)
[
'slug' => 'facebook_customer_quote',
'category' => 'testimonial',
'name' => 'Testimonio de cliente',
'description' => 'Comparte un testimonio de cliente con sus propias palabras.',
'content' => "\"[Cita directa del cliente, mantenla específica, con su voz, con un resultado o sentimiento real.]\"\n\n- [Nombre del cliente], [ciudad o rol]\n\nRecibimos este mensaje hace [tiempo] y le preguntamos si podíamos compartirlo. [Primer nombre] dijo que sí. Estamos agradecidos por palabras así y por todos los que se toman un minuto para mandarlas.\n\nSi {{brand_name}} también fue parte de tu historia, nos encantaría leerte en los comentarios.",
'image_count' => 1,
'image_keywords' => ['testimonial', 'happy customer', 'review'],
'slides' => null,
],
[
'slug' => 'facebook_before_after_story',
'category' => 'testimonial',
'name' => 'Historia de antes y después',
'description' => 'Cuenta una historia de transformación de un cliente.',
'content' => "Antes: [situación del cliente cuando encontró {{brand_name}}, descríbela en 2 a 3 frases honestas].\n\nDespués: [qué cambió, con un resultado específico y un plazo].\n\n[Nombre del cliente] nos mandó esta actualización el mes pasado, y es de esas cosas que dejan a toda la oficina en silencio un segundo. El trabajo no lo hicimos nosotros, lo hizo él/ella. Solo ayudamos donde podíamos.\n\nSi estás dudando por [duda común], historias así pueden ser la razón para empezar.",
'image_count' => 1,
'image_keywords' => ['transformation', 'progress', 'result'],
'slides' => null,
],
[
'slug' => 'facebook_review_highlight',
'category' => 'testimonial',
'name' => 'Reseña destacada',
'description' => 'Destaca una reseña reciente con contexto.',
'content' => "Reseña de 5 estrellas de [nombre del cliente] esta semana:\n\n\"[Saca una frase real y concreta de la reseña, no el elogio genérico, la parte con el detalle de verdad.]\"\n\nGuardamos reseñas así y las releemos en los días difíciles. Gracias, [primer nombre].\n\nSi tienes unos minutos y {{brand_name}} te ayudó, dejar una reseña aquí es la cosa más linda que puedes hacer por nosotros: [link]",
'image_count' => 1,
'image_keywords' => ['review', 'stars', 'feedback'],
'slides' => null,
],
// Industry tip (3)
[
'slug' => 'facebook_industry_insight',
'category' => 'industry_tip',
'name' => 'Insight de la industria',
'description' => 'Comparte un insight útil de tu industria.',
'content' => "Algo que notamos trabajando en [industria] este año:\n\n[Observación específica, un cambio, un patrón, un hallazgo contraintuitivo. 2 a 3 frases con un número o ejemplo.]\n\nNo creemos que se revierta pronto, y los negocios que se preparen ahora la van a tener más fácil que los que esperen.\n\n¿Estás viendo lo mismo? Nos da curiosidad cómo lo estás viviendo.",
'image_count' => 1,
'image_keywords' => ['insight', 'industry', 'analysis'],
'slides' => null,
],
[
'slug' => 'facebook_pro_tip',
'category' => 'industry_tip',
'name' => 'Consejo de la experiencia',
'description' => 'Comparte un consejo aprendido en la práctica.',
'content' => "Un consejo de pro que aprendimos a la mala:\n\nCuando [situación común], siempre [acción específica]. Antes nos saltábamos este paso porque parecía trabajo extra, hasta que [historia, qué salió mal].\n\nAhora es lo primero que hacemos, sin falta. Toma [tiempo] y evita [problema].\n\n¿Qué consejo le darías a alguien que recién empieza en [área]?",
'image_count' => 1,
'image_keywords' => ['expertise', 'professional', 'advice'],
'slides' => null,
],
[
'slug' => 'facebook_industry_trend',
'category' => 'industry_tip',
'name' => 'Explicación de una tendencia',
'description' => 'Explica una tendencia en lenguaje sencillo.',
'content' => "Todos en [industria] están hablando de [tendencia]. Aquí va lo que significa de verdad, en palabras simples.\n\n[Explicación en 2 a 3 frases sin tecnicismos, con un ejemplo concreto.]\n\nSi cumple lo que promete, ya es otra historia. Nuestra opinión: [opinión honesta, qué tomarse en serio, qué ignorar].\n\n¿Y tú qué piensas? Tenemos curiosidad por saber dónde queda parada la comunidad.",
'image_count' => 1,
'image_keywords' => ['trend', 'industry', 'explainer'],
'slides' => null,
],
// Event (3)
[
'slug' => 'facebook_event_recap',
'category' => 'event',
'name' => 'Resumen del evento',
'description' => 'Comparte un resumen después de que el evento terminó.',
'content' => "[Nombre del evento] acaba de terminar y todavía nos estamos recuperando.\n\nFueron [número] de ustedes los que se sumaron, hicieron buenas preguntas y se quedaron hasta tarde. Momentos destacados: [momento 1], [momento 2] y la parte donde [cosa graciosa o memorable específica].\n\nGracias enormes a todos los que vinieron. Si te lo perdiste, grabamos la sesión principal y el enlace está en el primer comentario.\n\n¿Cuál fue tu momento favorito del día? Etiqueta a alguien que conociste allí.",
'image_count' => 1,
'image_keywords' => ['event', 'recap', 'crowd'],
'slides' => null,
],
[
'slug' => 'facebook_event_countdown',
'category' => 'event',
'name' => 'Cuenta regresiva del evento',
'description' => 'Genera expectativa a medida que el evento se acerca.',
'content' => "Faltan [número] días para [nombre del evento].\n\nSi todavía no apartaste tu lugar, ahora es el momento. Quedan [número] cupos, y en la última semana suelen volar.\n\nQué esperar el [fecha]: [un detalle real], [otro detalle real] y tiempo para hablar de verdad con la gente, no solo ver diapositivas.\n\nConsigue tu entrada aquí: [link]\n\n¿Quién va? Comenta para saber a quién buscar.",
'image_count' => 1,
'image_keywords' => ['countdown', 'event', 'tickets'],
'slides' => null,
],
[
'slug' => 'facebook_workshop_announcement',
'category' => 'event',
'name' => 'Anuncio de taller',
'description' => 'Anuncia un taller práctico.',
'content' => "Vamos a hacer un taller sobre [tema].\n\n[Fecha] a las [hora]. Cupos limitados a [número] personas porque es práctico, no un webinar. Te vas con [resultado específico, algo terminado, una configuración funcionando, un plan escrito].\n\nPara quién es: [audiencia]. Para quién no es: [aclaración honesta].\n\nDetalles e inscripción: [link]\n\n¿Dudas sobre si te conviene? Pregunta en los comentarios.",
'image_count' => 1,
'image_keywords' => ['workshop', 'learning', 'hands on'],
'slides' => null,
],
// Engagement (3)
[
'slug' => 'facebook_question_prompt',
'category' => 'engagement',
'name' => 'Pregunta para la comunidad',
'description' => 'Hazle una pregunta reflexiva a la comunidad.',
'content' => "Pregunta sincera para la comunidad.\n\nCuando [situación común relacionada con {{brand_name}}], ¿cómo sueles [decisión específica]? Te preguntamos porque seguimos viendo el mismo tema en los DMs, y tenemos la corazonada de que nuestra respuesta no es la única buena.\n\nNo hay respuestas equivocadas. Leemos cada comentario.",
'image_count' => 1,
'image_keywords' => ['question', 'conversation', 'people talking'],
'slides' => null,
],
[
'slug' => 'facebook_this_or_that',
'category' => 'engagement',
'name' => 'Encuesta esto o aquello',
'description' => 'Lanza una publicación divertida estilo esto o aquello.',
'content' => "Resuelve un debate que tenemos toda la semana.\n\n¿[Opción A] o [Opción B]?\n\nSin pensarlo mucho. Primer instinto, en los comentarios.\n\nPara que sepas, el equipo está dividido [número] a [número]. Contamos el lado ganador el viernes.",
'image_count' => 1,
'image_keywords' => ['choice', 'comparison', 'options'],
'slides' => null,
],
[
'slug' => 'facebook_fill_in_blank',
'category' => 'engagement',
'name' => 'Completa la frase',
'description' => 'Invita a tus seguidores a completar una frase.',
'content' => "Completa la frase:\n\nLo que ojalá hubiera sabido antes de [tema] es __________.\n\nEmpezamos nosotros: [tu respuesta honesta, con una historia real al lado].\n\nTu turno. Las mejores respuestas que recibimos en estas preguntas terminan ayudando a alguien que las lee después, así que no te guardes nada.",
'image_count' => 1,
'image_keywords' => ['conversation', 'thinking', 'community'],
'slides' => null,
],
];

View file

@ -0,0 +1,326 @@
<?php
declare(strict_types=1);
return [
[
'slug' => 'fb_story_announcement',
'category' => 'product_launch',
'name' => 'Aviso rápido',
'description' => 'Atrae atención a una novedad con un Story de 24h en Facebook.',
'content' => "Aviso de {{brand_name}}.\n\n[Destaque en una línea]\n\nLink en el perfil.",
'image_count' => 1,
'image_keywords' => ['announcement', 'launch'],
'slides' => null,
],
[
'slug' => 'fb_story_promo',
'category' => 'promotion',
'name' => 'Promo flash',
'description' => 'Oferta por tiempo limitado en formato Story.',
'content' => "Solo hoy.\n\n[Descuento]% off en {{brand_name}}.\n\nToca para comprar.",
'image_count' => 1,
'image_keywords' => ['sale', 'discount', 'urgency'],
'slides' => null,
],
[
'slug' => 'fb_story_question',
'category' => 'engagement',
'name' => 'Pregunta rápida',
'description' => 'Pregunta algo a tus seguidores para generar respuestas.',
'content' => "Rapidito.\n\n[Pregunta para tu audiencia]\n\nResponde este Story.",
'image_count' => 1,
'image_keywords' => ['question', 'engagement'],
'slides' => null,
],
[
'slug' => 'fb_story_new_drop',
'category' => 'product_launch',
'name' => 'Novedad',
'description' => 'Presenta un producto nuevo con un toque visual.',
'content' => "Llegó.\n\n[Nombre del producto] de {{brand_name}}.\n\nToca para verlo.",
'image_count' => 1,
'image_keywords' => ['new product', 'unboxing'],
'slides' => null,
],
[
'slug' => 'fb_story_preorder',
'category' => 'product_launch',
'name' => 'Preventa abierta',
'description' => 'Abre la preventa con un Story corto.',
'content' => "Preventa abierta.\n\n[Producto] se envía el [fecha].\n\nLink en bio.",
'image_count' => 1,
'image_keywords' => ['preorder', 'product'],
'slides' => null,
],
[
'slug' => 'fb_story_launch_day',
'category' => 'product_launch',
'name' => 'Día del lanzamiento',
'description' => 'Marca el lanzamiento en vivo con CTA de un toque.',
'content' => "En vivo ahora.\n\n[Producto] sale hoy.\n\nToca para llevarlo.",
'image_count' => 1,
'image_keywords' => ['launch', 'product reveal'],
'slides' => null,
],
[
'slug' => 'fb_story_back_in_stock',
'category' => 'product_launch',
'name' => 'Volvió al stock',
'description' => 'Avisa que un producto agotado volvió.',
'content' => "Volvió al stock.\n\n[Producto] en {{brand_name}}.\n\nSe va rápido. Toca para ver.",
'image_count' => 1,
'image_keywords' => ['restock', 'available'],
'slides' => null,
],
[
'slug' => 'fb_story_bogo',
'category' => 'promotion',
'name' => 'Lleva 2 paga 1',
'description' => 'Empuja una oferta lleva 2 paga 1 en Story.',
'content' => "Lleva 2, paga 1.\n\nEsta semana en {{brand_name}}.\n\nToca para comprar.",
'image_count' => 1,
'image_keywords' => ['bogo', 'sale'],
'slides' => null,
],
[
'slug' => 'fb_story_free_shipping',
'category' => 'promotion',
'name' => 'Envío gratis',
'description' => 'Promociona una ventana de envío gratis.',
'content' => "Envío gratis.\n\n48h solo en {{brand_name}}.\n\nUsa el código [CODE].",
'image_count' => 1,
'image_keywords' => ['shipping', 'delivery box'],
'slides' => null,
],
[
'slug' => 'fb_story_last_chance',
'category' => 'promotion',
'name' => 'Última oportunidad',
'description' => 'Aviso final de un descuento que termina.',
'content' => "Última oportunidad.\n\n[Descuento]% off acaba esta noche.\n\nToca en {{brand_name}}.",
'image_count' => 1,
'image_keywords' => ['countdown', 'sale ending'],
'slides' => null,
],
[
'slug' => 'fb_story_coupon_drop',
'category' => 'promotion',
'name' => 'Cupón liberado',
'description' => 'Suelta un código de cupón en un Story de 24h.',
'content' => "Código [CODE].\n\n[Descuento]% off en {{brand_name}}.\n\nSe va en 24h.",
'image_count' => 1,
'image_keywords' => ['coupon', 'promo code'],
'slides' => null,
],
[
'slug' => 'fb_story_quick_tip',
'category' => 'educational',
'name' => 'Tip rápido',
'description' => 'Comparte un tip útil.',
'content' => "Tip rápido.\n\n[Un tip práctico].\n\nGuarda este Story.",
'image_count' => 1,
'image_keywords' => ['tip', 'advice'],
'slides' => null,
],
[
'slug' => 'fb_story_did_you_know',
'category' => 'educational',
'name' => 'Sabías que',
'description' => 'Sorprende a tus seguidores con un dato rápido.',
'content' => "¿Sabías que?\n\n[Dato curioso].\n\nMás en el blog de {{brand_name}}.",
'image_count' => 1,
'image_keywords' => ['fact', 'lightbulb'],
'slides' => null,
],
[
'slug' => 'fb_story_myth_buster',
'category' => 'educational',
'name' => 'Mito o verdad',
'description' => 'Derriba un mito común de un solo golpe.',
'content' => "Mito: [creencia común].\n\nReal: [verdad].\n\nToca para entender.",
'image_count' => 1,
'image_keywords' => ['myth', 'truth'],
'slides' => null,
],
[
'slug' => 'fb_story_one_minute_lesson',
'category' => 'educational',
'name' => 'Lección de 1 minuto',
'description' => 'Lección corta con CTA de toque.',
'content' => "Lección de 60 segundos.\n\n[Tema] de {{brand_name}}.\n\nToca para verla.",
'image_count' => 1,
'image_keywords' => ['lesson', 'teaching'],
'slides' => null,
],
[
'slug' => 'fb_story_bts_workspace',
'category' => 'behind_the_scenes',
'name' => 'Detrás de cámaras',
'description' => 'Muestra el lugar donde todo pasa.',
'content' => "Hoy en {{brand_name}}.\n\n[Lo que pasa ahora].\n\nToca para ver más.",
'image_count' => 1,
'image_keywords' => ['workspace', 'office'],
'slides' => null,
],
[
'slug' => 'fb_story_bts_team',
'category' => 'behind_the_scenes',
'name' => 'Conoce al equipo',
'description' => 'Presenta a un miembro del equipo rápido.',
'content' => "Conoce a [nombre].\n\n[Rol en {{brand_name}}].\n\nToca para saludar.",
'image_count' => 1,
'image_keywords' => ['team', 'employee'],
'slides' => null,
],
[
'slug' => 'fb_story_bts_process',
'category' => 'behind_the_scenes',
'name' => 'Cómo se hace',
'description' => 'Vistazo rápido a cómo se produce algo.',
'content' => "Cómo se hace [producto].\n\nPaso [n] en {{brand_name}}.\n\nToca por el video completo.",
'image_count' => 1,
'image_keywords' => ['production', 'process'],
'slides' => null,
],
[
'slug' => 'fb_story_bts_packing',
'category' => 'behind_the_scenes',
'name' => 'Empacando pedidos',
'description' => 'Muestra los pedidos saliendo.',
'content' => "Empacando pedidos.\n\n[Número] salen hoy.\n\nGracias por el apoyo.",
'image_count' => 1,
'image_keywords' => ['packing', 'shipping'],
'slides' => null,
],
[
'slug' => 'fb_story_customer_quote',
'category' => 'testimonial',
'name' => 'Frase de cliente',
'description' => 'Muestra una frase corta de un cliente.',
'content' => "\"[Frase del cliente].\"\n\n- [nombre]\n\nToca para leer más.",
'image_count' => 1,
'image_keywords' => ['quote', 'review'],
'slides' => null,
],
[
'slug' => 'fb_story_five_star',
'category' => 'testimonial',
'name' => 'Reseña 5 estrellas',
'description' => 'Destaca una reseña de 5 estrellas.',
'content' => "5 estrellas.\n\n\"[Reseña corta]\", [nombre]\n\nMás en {{brand_name}}.",
'image_count' => 1,
'image_keywords' => ['five stars', 'review'],
'slides' => null,
],
[
'slug' => 'fb_story_before_after',
'category' => 'testimonial',
'name' => 'Antes y después',
'description' => 'Muestra un antes/después con un solo CTA.',
'content' => "Antes. Después.\n\n[Nombre del cliente] usando {{brand_name}}.\n\nToca por la historia.",
'image_count' => 1,
'image_keywords' => ['before after', 'transformation'],
'slides' => null,
],
[
'slug' => 'fb_story_industry_trend',
'category' => 'industry_tip',
'name' => 'Tendencia del sector',
'description' => 'Suelta una idea rápida de tendencia.',
'content' => "Tendencia.\n\n[Tendencia del sector en una línea].\n\nToca por nuestra visión.",
'image_count' => 1,
'image_keywords' => ['trend', 'industry'],
'slides' => null,
],
[
'slug' => 'fb_story_pro_hack',
'category' => 'industry_tip',
'name' => 'Hack pro',
'description' => 'Comparte un hack rápido de profesional.',
'content' => "Hack pro.\n\n[Truco en una línea].\n\nMás tips en {{brand_name}}.",
'image_count' => 1,
'image_keywords' => ['hack', 'shortcut'],
'slides' => null,
],
[
'slug' => 'fb_story_mistake_to_avoid',
'category' => 'industry_tip',
'name' => 'Error a evitar',
'description' => 'Advierte sobre un error común.',
'content' => "Deja de hacer esto.\n\n[Error común].\n\nToca por la solución.",
'image_count' => 1,
'image_keywords' => ['warning', 'mistake'],
'slides' => null,
],
[
'slug' => 'fb_story_event_save_date',
'category' => 'event',
'name' => 'Aparta la fecha',
'description' => 'Planta un save the date en un Story de 24h.',
'content' => "Aparta la fecha.\n\n[Evento] el [fecha].\n\nRSVP en bio.",
'image_count' => 1,
'image_keywords' => ['calendar', 'event'],
'slides' => null,
],
[
'slug' => 'fb_story_event_today',
'category' => 'event',
'name' => 'Evento hoy',
'description' => 'Recordatorio de evento del mismo día.',
'content' => "Hoy.\n\n[Evento] a las [hora].\n\nToca por el link.",
'image_count' => 1,
'image_keywords' => ['event', 'live'],
'slides' => null,
],
[
'slug' => 'fb_story_live_starting',
'category' => 'event',
'name' => 'Vamos en vivo',
'description' => 'Lleva a tus seguidores a la transmisión.',
'content' => "Vamos en vivo.\n\n[Tema] en [minutos] minutos.\n\nToca para entrar a {{brand_name}}.",
'image_count' => 1,
'image_keywords' => ['live stream', 'broadcast'],
'slides' => null,
],
[
'slug' => 'fb_story_event_recap',
'category' => 'event',
'name' => 'Resumen del evento',
'description' => 'Resumen rápido al día siguiente.',
'content' => "Eso fue [evento].\n\nGracias por venir.\n\nResumen completo en la página.",
'image_count' => 1,
'image_keywords' => ['event recap', 'crowd'],
'slides' => null,
],
[
'slug' => 'fb_story_poll_this_or_that',
'category' => 'engagement',
'name' => 'Esta o esa',
'description' => 'Story tipo encuesta con dos opciones.',
'content' => "[Opción A] o [Opción B]?\n\nResponde con tu elección.\n\nLeemos todas.",
'image_count' => 1,
'image_keywords' => ['poll', 'choice'],
'slides' => null,
],
[
'slug' => 'fb_story_dm_us',
'category' => 'engagement',
'name' => 'Mándanos DM',
'description' => 'Invita a seguidores a mandar mensaje.',
'content' => "Mándanos DM.\n\n[Motivo para escribir a {{brand_name}}].\n\nRespondemos rápido.",
'image_count' => 1,
'image_keywords' => ['message', 'chat'],
'slides' => null,
],
[
'slug' => 'fb_story_caption_this',
'category' => 'engagement',
'name' => 'Ponle caption',
'description' => 'Pedido de caption en abierto.',
'content' => "Ponle caption.\n\n[Contexto de la imagen].\n\nManda el mejor.",
'image_count' => 1,
'image_keywords' => ['fun', 'reaction'],
'slides' => null,
],
];

View file

@ -0,0 +1,523 @@
<?php
declare(strict_types=1);
return [
[
'slug' => 'feature_launch_carousel',
'category' => 'product_launch',
'name' => 'Lanzamiento de funcionalidad',
'description' => 'Anuncia una nueva funcionalidad del producto en un carrusel de 5 slides.',
'content' => '{{brand_name}} acaba de lanzar algo que nos tiene entusiasmados. Desliza para ver lo nuevo.',
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => 'Lo nuevo', 'body' => 'Un vistazo rápido a la última actualización.', 'image_keywords' => ['product', 'launch']],
['title' => 'Cómo funciona', 'body' => 'Tres pasos y ya estás usándolo.', 'image_keywords' => ['workflow']],
['title' => 'Por qué importa', 'body' => 'Más rápido, más simple, con menos clics.', 'image_keywords' => ['speed']],
['title' => 'Para quién es', 'body' => 'Hecho para equipos que entregan.', 'image_keywords' => ['team']],
['title' => 'Pruébalo ya', 'body' => 'Disponible hoy. Link en bio.', 'image_keywords' => ['phone', 'app']],
],
],
[
'slug' => 'five_tips_carousel',
'category' => 'educational',
'name' => 'Carrusel de 5 consejos',
'description' => 'Comparte cinco consejos prácticos en un carrusel deslizable.',
'content' => '5 cosas que me hubiera gustado saber antes sobre [tema]. Guárdalo para después. 👇',
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => 'Consejo #1', 'body' => '[Primer consejo, sé específico y práctico.]', 'image_keywords' => ['idea', 'lightbulb']],
['title' => 'Consejo #2', 'body' => '[Segundo consejo, usa un ejemplo real si puedes.]', 'image_keywords' => ['notebook']],
['title' => 'Consejo #3', 'body' => '[Tercer consejo, sé breve.]', 'image_keywords' => ['focus']],
['title' => 'Consejo #4', 'body' => '[Cuarto consejo, algo sorprendente o que va contra la intuición.]', 'image_keywords' => ['surprise']],
['title' => 'Consejo #5', 'body' => '[Quinto consejo, cierra fuerte con una conclusión.]', 'image_keywords' => ['success']],
],
],
[
'slug' => 'process_reveal_carousel',
'category' => 'behind_the_scenes',
'name' => 'Mostrando el proceso',
'description' => 'Lleva a tus seguidores por el proceso de cómo creas tu producto o servicio.',
'content' => '¿Te has preguntado cómo se hace [producto/servicio]? Desliza para ver cada paso. ✨',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'Todo empieza con investigación', 'body' => 'Cada proyecto arranca entendiendo el problema a fondo.', 'image_keywords' => ['research', 'desk']],
['title' => 'Diseño e iteración', 'body' => 'Prototipamos rápido y probamos seguido.', 'image_keywords' => ['design', 'sketch']],
['title' => 'Construyendo lo real', 'body' => 'Oficio y precisión en cada detalle.', 'image_keywords' => ['craft', 'build']],
['title' => 'El resultado final', 'body' => 'Una calidad que se siente desde que lo usas.', 'image_keywords' => ['product', 'final']],
],
],
[
'slug' => 'quick_stat_carousel',
'category' => 'industry_tip',
'name' => 'Carrusel de estadísticas rápidas',
'description' => 'Presenta datos del sector en formato de carrusel visual.',
'content' => 'Los números de [sector] que cualquier persona de marketing debería tener en el radar este año. 📊',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'Dato #1', 'body' => '[X]% de [audiencia] dice [hallazgo]. Fuente: [fuente]', 'image_keywords' => ['chart', 'data']],
['title' => 'Dato #2', 'body' => '[Y]% de aumento en [métrica] año contra año.', 'image_keywords' => ['growth', 'graph']],
['title' => 'Dato #3', 'body' => 'Para [año], [proyección].', 'image_keywords' => ['future', 'trend']],
['title' => 'Qué significa esto para ti', 'body' => '[Conclusión práctica con base en los datos de arriba.]', 'image_keywords' => ['action', 'plan']],
],
],
[
'slug' => 'event_recap_carousel',
'category' => 'event',
'name' => 'Resumen del evento',
'description' => 'Recapitula los mejores momentos de un evento o conferencia reciente.',
'content' => 'Acabamos de cerrar [Nombre del Evento] y fue increíble. Aquí los destacados. 🙌',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'Todo empezó con…', 'body' => '[Momento de apertura o destacado de la charla principal.]', 'image_keywords' => ['conference', 'stage']],
['title' => 'La charla de la que todos hablaron', 'body' => '[Idea clave de la charla más comentada.]', 'image_keywords' => ['presentation', 'crowd']],
['title' => 'Conectando con la comunidad', 'body' => '[Destaca momentos de networking o con asistentes.]', 'image_keywords' => ['networking', 'people']],
['title' => 'Hasta la próxima', 'body' => 'Sigue a {{brand_name}} para novedades sobre nuestro próximo evento.', 'image_keywords' => ['celebration']],
],
],
[
'slug' => 'product_lineup_carousel',
'category' => 'product_launch',
'name' => 'Revelación de la línea de productos',
'description' => 'Muestra una línea completa de productos, uno por slide.',
'content' => 'Hicimos [número] cosas nuevas. Aquí va la línea completa de {{brand_name}}.',
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => 'conoce la línea', 'body' => '[Número] piezas nuevas, pensadas en conjunto. Cada una resuelve un problema específico.', 'image_keywords' => ['products', 'lineup']],
['title' => 'pieza uno', 'body' => '[Nombre del producto 1]. Ideal para [caso de uso].', 'image_keywords' => ['product', 'studio']],
['title' => 'pieza dos', 'body' => '[Nombre del producto 2]. Va bien con la pieza uno si buscas [beneficio].', 'image_keywords' => ['object', 'detail']],
['title' => 'pieza tres', 'body' => '[Nombre del producto 3]. La que seguimos iterando hasta que quedó como queríamos.', 'image_keywords' => ['craft', 'closeup']],
['title' => 'compra el lanzamiento', 'body' => 'Disponible [fecha]. Link en bio.', 'image_keywords' => ['shop', 'phone']],
],
],
[
'slug' => 'before_after_launch_carousel',
'category' => 'product_launch',
'name' => 'Antes y después del lanzamiento',
'description' => 'Muestra el cambio de la versión vieja a la nueva.',
'content' => 'La misma idea, reconstruida. Esto fue lo que cambió en el nuevo [producto] de {{brand_name}}.',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'antes', 'body' => '[La versión vieja. Lo que hacía bien y dónde se quedaba corta.]', 'image_keywords' => ['old', 'product']],
['title' => 'después', 'body' => '[La nueva versión. Una frase sobre el mayor cambio.]', 'image_keywords' => ['new', 'product']],
['title' => 'qué arreglamos', 'body' => '[Problema concreto que nos contaron los clientes y cómo lo resolvimos.]', 'image_keywords' => ['detail', 'redesign']],
['title' => 'ya disponible', 'body' => 'Encuéntralo en la tienda. Link en bio.', 'image_keywords' => ['store', 'phone']],
],
],
[
'slug' => 'spec_breakdown_carousel',
'category' => 'product_launch',
'name' => 'Carrusel con la ficha técnica',
'description' => 'Desglosa las especificaciones del producto en varios slides.',
'content' => 'La ficha técnica completa de [producto]. Todo lo que trae adentro, en un solo carrusel.',
'image_count' => 6,
'image_keywords' => null,
'slides' => [
['title' => 'conoce [producto]', 'body' => 'Hecho para [caso de uso]. Disponible [fecha].', 'image_keywords' => ['product', 'reveal']],
['title' => 'materiales', 'body' => '[Detalles del material. De dónde viene. Por qué importa para el tacto final.]', 'image_keywords' => ['materials', 'texture']],
['title' => 'dimensiones', 'body' => '[Tamaño, peso, notas de calce. Los números que la gente quiere antes de comprar.]', 'image_keywords' => ['measurement', 'detail']],
['title' => 'cómo rinde', 'body' => '[Número de desempeño clave. Batería, autonomía, fuerza de agarre, lo que aplique.]', 'image_keywords' => ['performance', 'test']],
['title' => 'qué viene en la caja', 'body' => '[Lista los items: producto, accesorios, manual, etc.]', 'image_keywords' => ['unboxing', 'box']],
['title' => 'pide el tuyo', 'body' => 'Link en bio. Envío en [plazo].', 'image_keywords' => ['shipping', 'parcel']],
],
],
[
'slug' => 'flash_sale_carousel',
'category' => 'promotion',
'name' => 'Promoción flash',
'description' => 'Promociona una oferta por tiempo limitado en varios slides.',
'content' => '[Descuento]% de descuento en las próximas [horas] horas en {{brand_name}}. Lee cada slide para no perdértelo.',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'promoción flash activa', 'body' => '[Descuento]% off hasta [fecha y hora final]. Sin código.', 'image_keywords' => ['sale', 'tag']],
['title' => 'qué incluye', 'body' => '[Categorías en oferta y exclusiones si las hay. Sé honesto sobre lo que no entra.]', 'image_keywords' => ['products', 'shop']],
['title' => 'los más queridos', 'body' => '[Dos o tres bestsellers que la gente agarra primero cuando hay ofertas.]', 'image_keywords' => ['favorites', 'shelf']],
['title' => 'compra antes que termine', 'body' => 'Link en bio. Cuando se acaba el stock, se acabó.', 'image_keywords' => ['phone', 'cart']],
],
],
[
'slug' => 'bundle_deal_carousel',
'category' => 'promotion',
'name' => 'Carrusel del combo',
'description' => 'Explica una oferta de combo slide por slide.',
'content' => 'Tres cosas, un solo precio. Ahorra [monto] llevándolas juntas en {{brand_name}}.',
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => 'el combo', 'body' => '[Descripción breve de lo que trae el combo y cuánto ahorras en total.]', 'image_keywords' => ['bundle', 'box']],
['title' => 'item uno', 'body' => '[Primer item del combo y qué hace por sí solo.]', 'image_keywords' => ['product', 'one']],
['title' => 'item dos', 'body' => '[Segundo item y por qué combina con el primero.]', 'image_keywords' => ['product', 'two']],
['title' => 'item tres', 'body' => '[Tercer item. El que termina de armar el combo.]', 'image_keywords' => ['product', 'three']],
['title' => 'llévate el combo', 'body' => 'Ahorra [monto]. Disponible mientras dure el stock.', 'image_keywords' => ['bag', 'shopping']],
],
],
[
'slug' => 'first_order_discount_carousel',
'category' => 'promotion',
'name' => 'Descuento en la primera compra',
'description' => 'Da la bienvenida a clientes nuevos con un descuento en la primera compra.',
'content' => '¿Nuevo por aquí? Usa el código [CÓDIGO] para [descuento]% off en tu primera compra en {{brand_name}}.',
'image_count' => 3,
'image_keywords' => null,
'slides' => [
['title' => 'oferta de bienvenida', 'body' => '[Descuento]% off en tu primera compra. Código: [CÓDIGO]. Válido por [duración].', 'image_keywords' => ['welcome', 'gift']],
['title' => 'por dónde empieza la gente', 'body' => '[Uno o dos productos que son buenos puntos de entrada para clientes nuevos.]', 'image_keywords' => ['bestseller', 'product']],
['title' => 'cómo usarlo', 'body' => 'Agrega al carrito, pega [CÓDIGO] al pagar. Link en bio.', 'image_keywords' => ['checkout', 'phone']],
],
],
[
'slug' => 'free_shipping_carousel',
'category' => 'promotion',
'name' => 'Fin de semana con envío gratis',
'description' => 'Promociona una ventana limitada de envío gratis.',
'content' => 'Envío gratis en {{brand_name}} solo este fin de semana. Sin monto mínimo.',
'image_count' => 3,
'image_keywords' => null,
'slides' => [
['title' => 'fin de semana con envío gratis', 'body' => 'De [viernes] a [domingo]. Sin código y sin pedido mínimo.', 'image_keywords' => ['shipping', 'box']],
['title' => 'a dónde enviamos', 'body' => '[Regiones o países incluidos. Aclara cualquier exclusión.]', 'image_keywords' => ['map', 'globe']],
['title' => 'aprovecha el fin de semana', 'body' => 'Toca el link en bio antes de la medianoche del [domingo] [zona horaria].', 'image_keywords' => ['cart', 'phone']],
],
],
[
'slug' => 'beginner_guide_carousel',
'category' => 'educational',
'name' => 'Carrusel guía para principiantes',
'description' => 'Enseña un tema desde cero hasta el primer resultado útil.',
'content' => '[Tema] para principiantes absolutos. Guárdalo para después. 👇',
'image_count' => 6,
'image_keywords' => null,
'slides' => [
['title' => 'empieza aquí', 'body' => 'Si [tema] te parece abrumador, esta es la versión que me ayudó cuando recién empezaba.', 'image_keywords' => ['beginner', 'notes']],
['title' => 'qué es en realidad', 'body' => '[Definición simple. Sin jerga. Una frase basta.]', 'image_keywords' => ['concept', 'sketch']],
['title' => 'por qué le importa a la gente', 'body' => '[La razón concreta por la que un principiante se molestaría en aprender esto.]', 'image_keywords' => ['question', 'curious']],
['title' => 'lo primero para probar', 'body' => '[Una acción pequeña y específica que puedan hacer en menos de 10 minutos.]', 'image_keywords' => ['hands', 'desk']],
['title' => 'error común', 'body' => '[La trampa en la que cae la mayoría de los principiantes. Sé específico.]', 'image_keywords' => ['mistake', 'fix']],
['title' => 'a dónde ir después', 'body' => '[Un libro, canal o recurso de {{brand_name}} para el siguiente paso.]', 'image_keywords' => ['library', 'resource']],
],
],
[
'slug' => 'common_mistakes_carousel',
'category' => 'educational',
'name' => 'Errores comunes',
'description' => 'Resalta errores comunes y cómo corregirlos.',
'content' => '5 errores que veo todo el tiempo con [tema]. El número 3 me tocó aprenderlo a las malas.',
'image_count' => 6,
'image_keywords' => null,
'slides' => [
['title' => 'los errores', 'body' => 'Cinco cosas que la gente hace mal con [tema] y qué hacer en su lugar.', 'image_keywords' => ['mistake', 'pen']],
['title' => 'error 1', 'body' => '[Primer error. Después la solución en una frase.]', 'image_keywords' => ['error', 'paper']],
['title' => 'error 2', 'body' => '[Segundo error y la solución.]', 'image_keywords' => ['confused', 'desk']],
['title' => 'error 3', 'body' => '[Tercer error. El que sorprende a la gente.]', 'image_keywords' => ['surprised', 'thought']],
['title' => 'error 4', 'body' => '[Cuarto error y la solución.]', 'image_keywords' => ['process', 'workspace']],
['title' => 'error 5', 'body' => '[Último error. Cierra con lo que harías en su lugar.]', 'image_keywords' => ['solution', 'check']],
],
],
[
'slug' => 'glossary_carousel',
'category' => 'educational',
'name' => 'Carrusel glosario',
'description' => 'Define cinco términos de tu sector en lenguaje simple.',
'content' => '5 términos de [sector] explicados sin jerga. Guárdalo para después.',
'image_count' => 6,
'image_keywords' => null,
'slides' => [
['title' => 'jerga decodificada', 'body' => 'Cinco palabras de [sector] que la gente usa como si todos las conocieran.', 'image_keywords' => ['dictionary', 'book']],
['title' => '[término 1]', 'body' => '[Definición simple. Una frase de ejemplo.]', 'image_keywords' => ['letters', 'text']],
['title' => '[término 2]', 'body' => '[Definición simple. Una frase de ejemplo.]', 'image_keywords' => ['letters', 'paper']],
['title' => '[término 3]', 'body' => '[Definición simple. Una frase de ejemplo.]', 'image_keywords' => ['note', 'pen']],
['title' => '[término 4]', 'body' => '[Definición simple. Una frase de ejemplo.]', 'image_keywords' => ['definition', 'page']],
['title' => '[término 5]', 'body' => '[Definición simple. Una frase de ejemplo.]', 'image_keywords' => ['glossary', 'open book']],
],
],
[
'slug' => 'step_by_step_tutorial_carousel',
'category' => 'educational',
'name' => 'Tutorial paso a paso',
'description' => 'Guía a través de un cómo-hacer breve en pasos claros.',
'content' => 'Cómo [tarea] en [número] pasos. Guárdalo para tenerlo a mano la próxima.',
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => 'qué necesitas', 'body' => '[Lista las herramientas o materiales. Mantenlo breve.]', 'image_keywords' => ['tools', 'supplies']],
['title' => 'paso 1', 'body' => '[Primer paso. Una acción específica, no un objetivo.]', 'image_keywords' => ['hands', 'work']],
['title' => 'paso 2', 'body' => '[Segundo paso. Cómo debería verse antes de avanzar.]', 'image_keywords' => ['progress', 'desk']],
['title' => 'paso 3', 'body' => '[Tercer paso. Menciona aquí el desliz más común.]', 'image_keywords' => ['focus', 'detail']],
['title' => 'listo', 'body' => '[Cómo debería verse el resultado final. Una idea de foto.]', 'image_keywords' => ['finished', 'result']],
],
],
[
'slug' => 'team_intro_carousel',
'category' => 'behind_the_scenes',
'name' => 'Conoce al equipo',
'description' => 'Presenta a los miembros del equipo de a uno por slide.',
'content' => 'Las caras detrás de {{brand_name}}. Desliza para conocer a quienes hacen que esto funcione.',
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => 'el equipo', 'body' => 'Somos [número] personas en [ubicaciones]. Aquí va quién hace qué.', 'image_keywords' => ['team', 'office']],
['title' => '[nombre 1]', 'body' => '[Rol. Algo que tiene a su cargo y algo que disfruta fuera del trabajo.]', 'image_keywords' => ['portrait', 'work']],
['title' => '[nombre 2]', 'body' => '[Rol. Un detalle que muestra su personalidad, no solo su cargo.]', 'image_keywords' => ['portrait', 'desk']],
['title' => '[nombre 3]', 'body' => '[Rol. Algo concreto que hizo este mes.]', 'image_keywords' => ['portrait', 'studio']],
['title' => 'salúdanos', 'body' => 'Los DM están abiertos. Los respondemos nosotros mismos.', 'image_keywords' => ['phone', 'chat']],
],
],
[
'slug' => 'workspace_tour_carousel',
'category' => 'behind_the_scenes',
'name' => 'Recorrido por el espacio de trabajo',
'description' => 'Muestra tu estudio, cocina u oficina en varios slides.',
'content' => 'Un recorrido por donde {{brand_name}} se hace de verdad. Menos pulido de lo que piensas.',
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => 'donde pasa todo', 'body' => '[Ubicación, tamaño, qué tipo de espacio es, en una frase.]', 'image_keywords' => ['studio', 'workshop']],
['title' => 'la mesa de trabajo', 'body' => '[Lo que vive en la mesa principal la mayoría de los días.]', 'image_keywords' => ['workbench', 'tools']],
['title' => 'el rincón que nadie ve', 'body' => '[Detalle honesto: una repisa desordenada, una pared con notas, la cafetera.]', 'image_keywords' => ['corner', 'mess']],
['title' => 'el lugar favorito', 'body' => '[La silla, la ventana, la luz que mejora el día.]', 'image_keywords' => ['light', 'window']],
['title' => 'vuelve pronto', 'body' => 'Vienen más vistazos. Sigue a {{brand_name}} para el próximo.', 'image_keywords' => ['camera', 'door']],
],
],
[
'slug' => 'a_day_in_the_life_carousel',
'category' => 'behind_the_scenes',
'name' => 'Un día en la rutina',
'description' => 'Muestra una jornada de trabajo de la mañana a la noche.',
'content' => 'Un día real en {{brand_name}}, hora por hora. Sin la versión maquillada.',
'image_count' => 6,
'image_keywords' => null,
'slides' => [
['title' => '7:30 a. m.', 'body' => '[Cómo arranca el día de verdad. Café, caminata, correo, lo que sea.]', 'image_keywords' => ['morning', 'coffee']],
['title' => '9:00 a. m.', 'body' => '[Lo primero en la agenda. Sé específico sobre qué se hace.]', 'image_keywords' => ['desk', 'laptop']],
['title' => '12:30 p. m.', 'body' => '[Almuerzo. Dónde, con quién, o solo con un podcast.]', 'image_keywords' => ['lunch', 'food']],
['title' => '2:00 p. m.', 'body' => '[Bloque de la tarde. Lo que más concentración pide ese día.]', 'image_keywords' => ['focus', 'work']],
['title' => '5:30 p. m.', 'body' => '[Cerrando. Cuál suele ser la última tarea antes de desconectar.]', 'image_keywords' => ['evening', 'office']],
['title' => 'fuera de horario', 'body' => '[Cómo termina el día. Correr, cenar, hijos, lectura, lo que sea cierto.]', 'image_keywords' => ['sunset', 'home']],
],
],
[
'slug' => 'mistakes_we_made_carousel',
'category' => 'behind_the_scenes',
'name' => 'Errores que cometimos',
'description' => 'Comparte tres errores reales y lo que aprendiste.',
'content' => '3 cosas que hicimos mal este año en {{brand_name}}. Lo cuento porque ocultarlo se sentiría raro.',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'por qué publicar esto', 'body' => 'Las victorias se llevan toda la atención. Los errores suelen ser donde están las lecciones.', 'image_keywords' => ['notebook', 'writing']],
['title' => 'error 1', 'body' => '[Lo que probamos. Por qué no funcionó. Qué hicimos después.]', 'image_keywords' => ['error', 'desk']],
['title' => 'error 2', 'body' => '[El segundo. Sé honesto sobre el costo en dinero o tiempo.]', 'image_keywords' => ['budget', 'paper']],
['title' => 'error 3 + qué sigue', 'body' => '[Tercer error y una cosa que está cambiando por eso.]', 'image_keywords' => ['plan', 'reset']],
],
],
[
'slug' => 'customer_story_carousel',
'category' => 'testimonial',
'name' => 'Historia de cliente',
'description' => 'Cuenta una sola historia de cliente a lo largo de los slides.',
'content' => 'Una historia de uno de los clientes de {{brand_name}}. Publicada con su permiso.',
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => 'conoce a [nombre]', 'body' => '[Nombre, qué hace, dónde vive. Dos frases cortas.]', 'image_keywords' => ['portrait', 'person']],
['title' => 'el problema', 'body' => '[La situación antes de usar {{brand_name}}. Concreta, no abstracta.]', 'image_keywords' => ['problem', 'thinking']],
['title' => 'qué probó', 'body' => '[Cómo encontró {{brand_name}} y cómo fue su primer uso.]', 'image_keywords' => ['discover', 'try']],
['title' => 'qué cambió', 'body' => '[El resultado. Un número si lo tienes, una historia si no.]', 'image_keywords' => ['result', 'change']],
['title' => 'en sus palabras', 'body' => '"[Cita directa del cliente. Corta y real.]"', 'image_keywords' => ['quote', 'speech']],
],
],
[
'slug' => 'three_reviews_carousel',
'category' => 'testimonial',
'name' => 'Carrusel con tres reseñas',
'description' => 'Reúne tres reseñas reales en un post deslizable.',
'content' => 'Tres reseñas de clientes reales este mes en {{brand_name}}.',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'lo que dice la gente', 'body' => 'Tres citas sin editar de este mes. Apellidos reservados cuando se pidió.', 'image_keywords' => ['stars', 'review']],
['title' => 'reseña 1', 'body' => '"[Cita directa del cliente.]", [primer nombre, ubicación]', 'image_keywords' => ['speech', 'quote']],
['title' => 'reseña 2', 'body' => '"[Cita directa del cliente.]", [primer nombre, ubicación]', 'image_keywords' => ['feedback', 'note']],
['title' => 'reseña 3', 'body' => '"[Cita directa del cliente.]", [primer nombre, ubicación]', 'image_keywords' => ['testimonial', 'paper']],
],
],
[
'slug' => 'before_after_results_carousel',
'category' => 'testimonial',
'name' => 'Resultados antes y después',
'description' => 'Muestra el resultado de un cliente en slides de antes y después.',
'content' => 'Un resultado real de un cliente usando [producto/servicio] en {{brand_name}}. La misma persona, [período] de diferencia.',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'el punto de partida', 'body' => '[Dónde estaba al empezar. La versión honesta, no la maquillada.]', 'image_keywords' => ['before', 'start']],
['title' => 'qué hizo', 'body' => '[Qué usó y con qué frecuencia. Sé específico sobre la rutina.]', 'image_keywords' => ['process', 'routine']],
['title' => 'el resultado', 'body' => '[Dónde está ahora. Números si aplica, foto si es visual.]', 'image_keywords' => ['after', 'result']],
['title' => 'en sus palabras', 'body' => '"[Una cita corta sobre lo que más le sorprendió.]"', 'image_keywords' => ['quote', 'smile']],
],
],
[
'slug' => 'industry_myth_busting_carousel',
'category' => 'industry_tip',
'name' => 'Derribando mitos del sector',
'description' => 'Derriba tres mitos sobre tu sector.',
'content' => '3 cosas que la gente sigue creyendo sobre [sector] y que no son ciertas.',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'mitos, desarmados', 'body' => 'Tres creencias sobre [sector] que se repiten en todos lados y siguen errando.', 'image_keywords' => ['question', 'thinking']],
['title' => 'mito 1', 'body' => 'Mito: [creencia común]. Realidad: [cómo es en verdad, con un detalle].', 'image_keywords' => ['truth', 'note']],
['title' => 'mito 2', 'body' => 'Mito: [creencia común]. Realidad: [la corrección en una frase].', 'image_keywords' => ['fact', 'paper']],
['title' => 'mito 3', 'body' => 'Mito: [creencia común]. Realidad: [la corrección]. El porqué está en los comentarios.', 'image_keywords' => ['comment', 'phone']],
],
],
[
'slug' => 'industry_trend_carousel',
'category' => 'industry_tip',
'name' => 'Carrusel de tendencias del sector',
'description' => 'Recorre una tendencia que está marcando el sector este año.',
'content' => 'Lo que se está moviendo de verdad en [sector] este año, en lenguaje simple.',
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => 'la tendencia', 'body' => '[Nombra la tendencia en palabras simples. Una frase sobre qué es.]', 'image_keywords' => ['trend', 'graph']],
['title' => 'por qué ahora', 'body' => '[La causa concreta. Una regulación, un cambio técnico, un cambio de comportamiento.]', 'image_keywords' => ['cause', 'news']],
['title' => 'a quién le pega primero', 'body' => '[La audiencia o tipo de empresa que la siente antes que el resto.]', 'image_keywords' => ['audience', 'people']],
['title' => 'qué hacer', 'body' => '[Una cosa concreta para probar este trimestre, no un principio vago.]', 'image_keywords' => ['action', 'plan']],
['title' => 'un número para mirar', 'body' => '[Una métrica específica, con fuente.]', 'image_keywords' => ['metric', 'data']],
],
],
[
'slug' => 'pro_tip_carousel',
'category' => 'industry_tip',
'name' => 'Carrusel de consejo pro',
'description' => 'Comparte un solo consejo profesional con contexto y pasos.',
'content' => 'Una cosa que le diría a mi yo más joven sobre [tema]. Guárdalo si te sirve.',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'el consejo', 'body' => '[La versión de una línea. Lo bastante corto para recordarlo.]', 'image_keywords' => ['tip', 'note']],
['title' => 'por qué funciona', 'body' => '[La razón. Usa un ejemplo pequeño, no una afirmación grande.]', 'image_keywords' => ['idea', 'thought']],
['title' => 'cómo aplicarlo', 'body' => '[Los pasos. Tres como mucho. Específicos.]', 'image_keywords' => ['steps', 'list']],
['title' => 'una cosa que evitar', 'body' => '[El error que comete la gente al aplicar este consejo.]', 'image_keywords' => ['warning', 'caution']],
],
],
[
'slug' => 'event_announcement_carousel',
'category' => 'event',
'name' => 'Anuncio de evento',
'description' => 'Anuncia un evento próximo con los detalles clave.',
'content' => 'Vamos a organizar [Nombre del Evento] el [fecha]. Todo lo que necesitas saber está en los slides.',
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => '[nombre del evento]', 'body' => '[Fecha, lugar u online, para quién es, en una línea.]', 'image_keywords' => ['event', 'invite']],
['title' => 'qué hay planeado', 'body' => '[La agenda en bullets directos, sin lenguaje de marketing.]', 'image_keywords' => ['agenda', 'schedule']],
['title' => 'quién habla', 'body' => '[Nombres y bios de una línea. No más de tres.]', 'image_keywords' => ['speakers', 'panel']],
['title' => 'cómo unirte', 'body' => '[Gratis o pago, link, fecha límite si la hay. Sé específico.]', 'image_keywords' => ['ticket', 'register']],
['title' => 'reserva tu lugar', 'body' => '[Recordatorio final + llamada al link en bio.]', 'image_keywords' => ['phone', 'tap']],
],
],
[
'slug' => 'event_speakers_carousel',
'category' => 'event',
'name' => 'Revelación de oradores',
'description' => 'Revela a los oradores, uno por slide.',
'content' => 'Oradores de [Nombre del Evento]. Las entradas están abiertas en {{brand_name}}.',
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => 'oradores revelados', 'body' => 'El lineup de [Nombre del Evento] el [fecha]. Desliza para conocerlos.', 'image_keywords' => ['lineup', 'stage']],
['title' => '[orador 1]', 'body' => '[Nombre, rol. La cosa puntual sobre la que va a hablar.]', 'image_keywords' => ['portrait', 'speaker']],
['title' => '[orador 2]', 'body' => '[Nombre, rol. El tema de su charla en una línea.]', 'image_keywords' => ['portrait', 'mic']],
['title' => '[orador 3]', 'body' => '[Nombre, rol. Con qué se irán los asistentes.]', 'image_keywords' => ['portrait', 'panel']],
['title' => 'entradas en bio', 'body' => '[Fecha, lugar, link de inscripción.]', 'image_keywords' => ['ticket', 'register']],
],
],
[
'slug' => 'workshop_invitation_carousel',
'category' => 'event',
'name' => 'Invitación al taller',
'description' => 'Invita a la gente a un taller práctico.',
'content' => 'Taller práctico en {{brand_name}} el [fecha]. Cupos limitados. Esto es lo que trae.',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'taller el [fecha]', 'body' => '[Tema en una línea. Online o presencial, con lugar y horario.]', 'image_keywords' => ['workshop', 'class']],
['title' => 'qué vas a hacer', 'body' => '[Tres actividades concretas. Usa verbos, no adjetivos.]', 'image_keywords' => ['hands', 'making']],
['title' => 'con qué te vas a ir', 'body' => '[El resultado: algo terminado, un borrador, una decisión, un plan.]', 'image_keywords' => ['notebook', 'result']],
['title' => 'reserva un cupo', 'body' => '[Cupos disponibles, precio si lo hay, link en bio.]', 'image_keywords' => ['chair', 'register']],
],
],
[
'slug' => 'this_or_that_carousel',
'category' => 'engagement',
'name' => 'Esto o aquello',
'description' => 'Hazle a tus seguidores una serie de preguntas de elección.',
'content' => 'Esto o aquello, edición [tema]. Cuéntame tus elecciones en los comentarios.',
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => 'elige uno', 'body' => 'Cinco elecciones rápidas. Comenta tus respuestas en orden.', 'image_keywords' => ['choice', 'fork']],
['title' => '[opción a] o [opción b]', 'body' => '[Contexto breve si hace falta.]', 'image_keywords' => ['split', 'options']],
['title' => '[opción c] o [opción d]', 'body' => '[Contexto breve si hace falta.]', 'image_keywords' => ['versus', 'choice']],
['title' => '[opción e] o [opción f]', 'body' => '[Contexto breve si hace falta.]', 'image_keywords' => ['compare', 'pick']],
['title' => 'tu turno', 'body' => 'Deja tus respuestas abajo. Leo cada comentario.', 'image_keywords' => ['comment', 'phone']],
],
],
[
'slug' => 'unpopular_opinion_carousel',
'category' => 'engagement',
'name' => 'Opinión impopular',
'description' => 'Comparte una opinión real e invita al desacuerdo.',
'content' => 'Una opinión impopular sobre [tema]. Dime en los comentarios dónde me equivoco.',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'opinión impopular', 'body' => '[La opinión en una frase corta y clara.]', 'image_keywords' => ['opinion', 'speech']],
['title' => 'por qué pienso esto', 'body' => '[La razón. Una historia pequeña o un número, no solo sentimientos.]', 'image_keywords' => ['reason', 'thinking']],
['title' => 'dónde podría equivocarme', 'body' => '[Honesto sobre la parte más débil del argumento.]', 'image_keywords' => ['doubt', 'question']],
['title' => 'cuéntame', 'body' => 'De acuerdo, en desacuerdo, mixto, déjalo en los comentarios.', 'image_keywords' => ['comment', 'discussion']],
],
],
[
'slug' => 'fill_in_the_blank_carousel',
'category' => 'engagement',
'name' => 'Completa la frase',
'description' => 'Lanza a los seguidores tres frases para completar.',
'content' => 'Completa las frases. Quiero leer tus respuestas.',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'completa las frases', 'body' => 'Tres provocaciones rápidas sobre [tema]. Comenta tus respuestas en orden.', 'image_keywords' => ['blank', 'pen']],
['title' => 'frase 1', 'body' => 'La mejor [cosa] que [verbo] este año fue ____.', 'image_keywords' => ['idea', 'thought']],
['title' => 'frase 2', 'body' => 'Lo que quiero hacer más en [tema] es ____.', 'image_keywords' => ['plan', 'goal']],
['title' => 'frase 3', 'body' => 'Una persona que me enseñó sobre [tema] es ____.', 'image_keywords' => ['mentor', 'people']],
],
],
[
'slug' => 'q_and_a_carousel',
'category' => 'engagement',
'name' => 'Carrusel de preguntas y respuestas',
'description' => 'Responde cinco preguntas reales de tu audiencia.',
'content' => 'Tú preguntaste, yo respondo. Cinco preguntas reales que llegaron por DM.',
'image_count' => 6,
'image_keywords' => null,
'slides' => [
['title' => 'preguntas respondidas', 'body' => 'Tomé cinco de esta semana. Anonimizadas donde hizo falta.', 'image_keywords' => ['questions', 'mail']],
['title' => 'p1', 'body' => 'P: [pregunta parafraseada]. R: [respuesta en una o dos frases].', 'image_keywords' => ['answer', 'note']],
['title' => 'p2', 'body' => 'P: [pregunta parafraseada]. R: [respuesta].', 'image_keywords' => ['reply', 'speech']],
['title' => 'p3', 'body' => 'P: [pregunta parafraseada]. R: [respuesta].', 'image_keywords' => ['question', 'mark']],
['title' => 'p4', 'body' => 'P: [pregunta parafraseada]. R: [respuesta].', 'image_keywords' => ['chat', 'bubble']],
['title' => 'p5', 'body' => 'P: [pregunta parafraseada]. R: [respuesta]. Manda más en los comentarios.', 'image_keywords' => ['comments', 'phone']],
],
],
];

View file

@ -0,0 +1,362 @@
<?php
declare(strict_types=1);
return [
[
'slug' => 'limited_time_offer_feed',
'category' => 'promotion',
'name' => 'Oferta por tiempo limitado',
'description' => 'Promociona una oferta con plazo en Instagram Feed.',
'content' => "⏰ No te lo pierdas. {{brand_name}} ofrece [descuento]% off en [producto/servicio], solo hoy.\n\nToca el link en la bio para conseguir el tuyo antes de que se acabe.",
'image_count' => 1,
'image_keywords' => ['sale', 'offer', 'shopping'],
'slides' => null,
],
[
'slug' => 'team_behind_the_scenes_feed',
'category' => 'behind_the_scenes',
'name' => 'Bastidores del equipo',
'description' => 'Humaniza tu marca mostrando al equipo en acción.',
'content' => "Así se ve un día normal en {{brand_name}}. 👀\n\nCreemos que el buen trabajo pasa cuando la gente se siente en casa. Aquí va una mirada detrás del telón.\n\n#{{brand_name}} #BehindTheScenes",
'image_count' => 1,
'image_keywords' => ['office', 'team', 'workspace'],
'slides' => null,
],
// Product launch
[
'slug' => 'new_product_drop_feed',
'category' => 'product_launch',
'name' => 'Lanzamiento de nuevo producto',
'description' => 'Anuncia el lanzamiento de un producto fresco en el feed.',
'content' => "Ya está. [Nombre del producto] acaba de llegar a {{brand_name}}.\n\nLe dedicamos [meses/semanas] a este. Cada detalle fue probado por el equipo antes de soltarlo al público.\n\nToca el link en la bio para ser de los primeros en probarlo.",
'image_count' => 1,
'image_keywords' => ['product', 'launch', 'unboxing'],
'slides' => null,
],
[
'slug' => 'pre_order_announcement_feed',
'category' => 'product_launch',
'name' => 'Anuncio de preventa',
'description' => 'Abre preventas para un producto que viene en camino.',
'content' => "Preventas abiertas. [Nombre del producto] se envía el [fecha].\n\nEl primer lote tiene [número] unidades. Cuando se agoten, la siguiente tanda no sale hasta [fecha posterior].\n\nReserva el tuyo por el link en la bio.",
'image_count' => 1,
'image_keywords' => ['product', 'package', 'box'],
'slides' => null,
],
[
'slug' => 'feature_highlight_launch_feed',
'category' => 'product_launch',
'name' => 'Destaque de funcionalidad',
'description' => 'Resalta una función específica de un producto nuevo.',
'content' => "Lo que más nos enorgullece de [nombre del producto]: [función específica].\n\nNos costó [número] prototipos llegar a esto. Los testers iniciales nos dijeron que cambió la forma en que [caso de uso], así que seguimos iterando hasta que se sintió obvio.\n\nMíralo en acción por el link en la bio.",
'image_count' => 1,
'image_keywords' => ['product', 'detail', 'closeup'],
'slides' => null,
],
[
'slug' => 'product_restock_feed',
'category' => 'product_launch',
'name' => 'Producto reabastecido',
'description' => 'Anuncia la vuelta al stock de un producto popular.',
'content' => "De vuelta en stock. [Nombre del producto] se agotó en [tiempo] la última vez, así que hicimos más.\n\nSi te lo perdiste antes, este es el momento. El stock vuelve a ser limitado y esperamos otra corrida rápida.\n\nConsigue el tuyo por el link en la bio.",
'image_count' => 1,
'image_keywords' => ['product', 'shelf', 'inventory'],
'slides' => null,
],
// Promotion
[
'slug' => 'flash_sale_feed',
'category' => 'promotion',
'name' => 'Flash sale',
'description' => 'Genera urgencia con un flash sale corto.',
'content' => "Flash sale. [Descuento]% off en todo durante las próximas [horas] horas.\n\nNo necesitas código en el checkout. El descuento ya está aplicado en todo el sitio.\n\nLink en la bio. Pon un cronómetro.",
'image_count' => 1,
'image_keywords' => ['sale', 'discount', 'shopping'],
'slides' => null,
],
[
'slug' => 'bundle_deal_feed',
'category' => 'promotion',
'name' => 'Oferta de combo',
'description' => 'Promociona una oferta de combo con varios productos.',
'content' => "Compra [item A] y [item B] juntos y ahorra [monto].\n\nEs la misma combinación que nuestro equipo usa cada semana, así que la armamos como kit. Sale más barato que comprar cada uno por separado.\n\nLink en la bio.",
'image_count' => 1,
'image_keywords' => ['bundle', 'products', 'gift'],
'slides' => null,
],
[
'slug' => 'free_shipping_feed',
'category' => 'promotion',
'name' => 'Envío gratis',
'description' => 'Anuncia envío gratis por una ventana limitada.',
'content' => "Envío gratis en todos los pedidos esta semana.\n\nSin mínimo, sin código, sin letra chica al pie que haya que entrecerrar los ojos para leer. Eliges lo que quieres y nosotros cubrimos la entrega.\n\nLink en la bio. Termina el [día].",
'image_count' => 1,
'image_keywords' => ['shipping', 'package', 'delivery'],
'slides' => null,
],
[
'slug' => 'first_order_discount_feed',
'category' => 'promotion',
'name' => 'Descuento en la primera compra',
'description' => 'Recibe a clientes nuevos con descuento en la primera compra.',
'content' => "¿Primera vez en {{brand_name}}? Llévate [descuento]% off en tu primer pedido.\n\nUsa el código [CÓDIGO] en el checkout. Funciona con cualquier producto de la tienda, incluido el [nombre del bestseller] que la gente nos sigue preguntando.\n\nLink en la bio.",
'image_count' => 1,
'image_keywords' => ['welcome', 'shop', 'discount'],
'slides' => null,
],
// Educational
[
'slug' => 'quick_how_to_tip_feed',
'category' => 'educational',
'name' => 'Tip rápido de cómo hacer',
'description' => 'Comparte un tip accionable de tu nicho.',
'content' => "Algo pequeño que hace [tarea] más fácil: [tip en una frase].\n\nEmpezamos a hacer esto después de [motivo o historia]. Nos ahorró [tiempo/dinero/esfuerzo] en una semana.\n\nGuarda este post para después. Link en la bio para la guía completa.",
'image_count' => 1,
'image_keywords' => ['notebook', 'desk', 'work'],
'slides' => null,
],
[
'slug' => 'common_mistake_feed',
'category' => 'educational',
'name' => 'Error común',
'description' => 'Señala un error frecuente y la solución.',
'content' => "El error que más vemos con [tema]: [el error].\n\nEs fácil de cometer. La mayoría no se da cuenta de que cuesta [consecuencia] hasta que alguien lo señala.\n\nLa solución es simple: [la solución]. Pruébalo esta semana y mira qué cambia.",
'image_count' => 1,
'image_keywords' => ['warning', 'thinking', 'desk'],
'slides' => null,
],
[
'slug' => 'myth_vs_truth_feed',
'category' => 'educational',
'name' => 'Mito vs verdad',
'description' => 'Desmiente un mito común de tu industria.',
'content' => "Mito: [creencia común sobre tu industria].\n\nVerdad: [la realidad, con un detalle que la respalda].\n\nNosotros también creíamos en el mito. Después lo medimos por [periodo] y los datos dijeron otra cosa. Guarda esto si has oído lo mismo.",
'image_count' => 1,
'image_keywords' => ['question', 'thinking', 'idea'],
'slides' => null,
],
[
'slug' => 'glossary_term_feed',
'category' => 'educational',
'name' => 'Término del glosario explicado',
'description' => 'Explica un término del rubro en lenguaje claro.',
'content' => "[Término]: lo que significa de verdad.\n\nLa mayoría de las guías lo explican con más jerga. Aquí va la versión directa: [definición en una frase].\n\nUn ejemplo real de nuestro trabajo: [ejemplo corto]. Guarda el post si has estado asintiendo en reuniones sin preguntar.",
'image_count' => 1,
'image_keywords' => ['book', 'glossary', 'study'],
'slides' => null,
],
// Behind the scenes
[
'slug' => 'workspace_tour_feed',
'category' => 'behind_the_scenes',
'name' => 'Tour por el espacio de trabajo',
'description' => 'Muestra el lugar donde pasa el trabajo.',
'content' => "Donde pasa el trabajo.\n\nEsto es [sala/espacio] en {{brand_name}}. La planta del rincón sobrevivió a tres mudanzas de oficina. La pizarra no se ha borrado desde [mes].\n\nNo es pulido, pero es nuestro.",
'image_count' => 1,
'image_keywords' => ['workspace', 'desk', 'studio'],
'slides' => null,
],
[
'slug' => 'how_its_made_feed',
'category' => 'behind_the_scenes',
'name' => 'Cómo se hace',
'description' => 'Muestra un paso de tu proceso de producción.',
'content' => "Este es el paso [número] de cómo hacemos [producto].\n\nLleva como [tiempo] y lo hacemos a mano. Sin atajos por aquí, sobre todo porque probamos un atajo una vez y arruinó un lote entero.\n\nMás del proceso en el link en la bio.",
'image_count' => 1,
'image_keywords' => ['craft', 'making', 'workshop'],
'slides' => null,
],
[
'slug' => 'team_member_intro_feed',
'category' => 'behind_the_scenes',
'name' => 'Presentación de un miembro del equipo',
'description' => 'Presenta a un integrante del equipo.',
'content' => "Conoce a [nombre], nuestro/a [rol] en {{brand_name}}.\n\n[Nombre] se sumó hace [tiempo] y lleva [área]. Fuera del trabajo, lo/la encuentras [hobby o interés].\n\nSi escribiste a soporte hace poco, hay buenas chances de que [nombre] te haya respondido.",
'image_count' => 1,
'image_keywords' => ['portrait', 'team', 'person'],
'slides' => null,
],
[
'slug' => 'a_day_in_the_life_feed',
'category' => 'behind_the_scenes',
'name' => 'Un día en la vida',
'description' => 'Cuenta cómo es un día normal en la empresa.',
'content' => "Un martes normal en {{brand_name}}.\n\nLas mañanas son tranquilas, sobre todo correos y una daily. Las tardes se vuelven ruidosas cuando arranca [actividad]. Para las 5pm alguien ya rompió algo y otra persona ya lo arregló.\n\nEse es todo el trabajo, sinceramente.",
'image_count' => 1,
'image_keywords' => ['office', 'work', 'coffee'],
'slides' => null,
],
// Testimonial
[
'slug' => 'customer_quote_feed',
'category' => 'testimonial',
'name' => 'Cita de cliente',
'description' => 'Comparte una cita potente de un cliente.',
'content' => "\"[Cita del cliente con sus propias palabras].\", [Nombre del cliente], [ciudad o rol]\n\nEsta llegó la semana pasada y teníamos que compartirla. Gracias [nombre].\n\nSi {{brand_name}} te ayudó con [resultado], nos encantaría saberlo. Responde o mándanos un DM.",
'image_count' => 1,
'image_keywords' => ['quote', 'happy', 'customer'],
'slides' => null,
],
[
'slug' => 'before_after_result_feed',
'category' => 'testimonial',
'name' => 'Resultado antes y después',
'description' => 'Resalta una transformación real de cliente.',
'content' => "Antes: [punto de partida].\nDespués: [resultado, con un número si es posible].\n\n[Nombre del cliente] trabajó con nosotros por [periodo]. El cambio no fue de un día para otro, pero se ve dónde se inclinó la balanza.\n\nLink en la bio si quieres un resultado parecido.",
'image_count' => 1,
'image_keywords' => ['transformation', 'result', 'progress'],
'slides' => null,
],
[
'slug' => 'star_rating_review_feed',
'category' => 'testimonial',
'name' => 'Reseña de cinco estrellas',
'description' => 'Resalta una reseña reciente de cinco estrellas.',
'content' => "★★★★★\n\n\"[Texto de la reseña, dos o tres frases].\"\n\n[Nombre] dejó esta ayer. Leemos cada reseña que llega, las amables y las duras.\n\nDeja la tuya por el link en la bio.",
'image_count' => 1,
'image_keywords' => ['stars', 'review', 'rating'],
'slides' => null,
],
[
'slug' => 'case_study_snapshot_feed',
'category' => 'testimonial',
'name' => 'Resumen de case study',
'description' => 'Adelanta un case de éxito de cliente.',
'content' => "Cómo [cliente o empresa] usó {{brand_name}} para [resultado].\n\nEn [periodo], pasaron de [punto inicial] a [resultado]. El análisis completo cuenta lo que probaron primero y lo que finalmente encajó.\n\nLink en la bio para el case study.",
'image_count' => 1,
'image_keywords' => ['case study', 'meeting', 'results'],
'slides' => null,
],
// Industry tip
[
'slug' => 'one_tool_we_use_feed',
'category' => 'industry_tip',
'name' => 'Una herramienta que usamos',
'description' => 'Recomienda una herramienta que usas de verdad.',
'content' => "Una herramienta que usamos cada semana: [nombre de la herramienta].\n\nProbamos [número] alternativas antes de quedarnos con esta. Lo que nos convenció fue [función específica], no el marketing de la página principal.\n\nNo es publicidad. Solo es útil.",
'image_count' => 1,
'image_keywords' => ['tools', 'software', 'laptop'],
'slides' => null,
],
[
'slug' => 'industry_trend_take_feed',
'category' => 'industry_tip',
'name' => 'Opinión sobre tendencia del rubro',
'description' => 'Da una opinión honesta sobre una tendencia actual.',
'content' => "Todo el mundo en [rubro] habla de [tendencia].\n\nOpinión honesta: sirve para [caso de uso], no sirve para [otro caso de uso]. Lo probamos en un proyecto pequeño antes de comprometernos, y esa es la versión que recomendamos.\n\n¿Cuál ha sido tu experiencia? Cuéntanos en los comentarios.",
'image_count' => 1,
'image_keywords' => ['trend', 'industry', 'analysis'],
'slides' => null,
],
[
'slug' => 'pricing_advice_feed',
'category' => 'industry_tip',
'name' => 'Consejo de precios',
'description' => 'Comparte una lección de precios desde la experiencia.',
'content' => "Lo que nos equivocamos en precios: [el error].\n\nCobramos poco por [periodo] hasta que alguien nos hizo notar que los números no cerraban. Subimos los precios [porcentaje], perdimos [número] clientes, mantuvimos al resto y ganamos más.\n\nSi tú también estás trancado/a con esto, el link en la bio tiene nuestro desglose de precios.",
'image_count' => 1,
'image_keywords' => ['money', 'price', 'calculator'],
'slides' => null,
],
[
'slug' => 'workflow_tip_feed',
'category' => 'industry_tip',
'name' => 'Tip de flujo de trabajo',
'description' => 'Comparte una mejora pequeña en el flujo de trabajo.',
'content' => "Un cambio pequeño en el flujo que nos ahorró horas: [el cambio].\n\nAntes, [forma vieja]. Después, [forma nueva]. Tomó como una semana acostumbrarse y no volvimos atrás.\n\nSi lo pruebas, cuéntanos qué tal te fue.",
'image_count' => 1,
'image_keywords' => ['workflow', 'productivity', 'planner'],
'slides' => null,
],
// Event
[
'slug' => 'event_announcement_feed',
'category' => 'event',
'name' => 'Anuncio de evento',
'description' => 'Anuncia un evento que viene en camino.',
'content' => "Aparta la fecha.\n\n{{brand_name}} organiza [nombre del evento] el [fecha] en [lugar u online].\n\nVamos a tener [oradores, formato o qué esperar]. Los lugares están limitados a [número] esta vez.\n\nConfirma asistencia por el link en la bio.",
'image_count' => 1,
'image_keywords' => ['event', 'invitation', 'calendar'],
'slides' => null,
],
[
'slug' => 'webinar_invite_feed',
'category' => 'event',
'name' => 'Invitación a webinar',
'description' => 'Promociona un webinar que viene en camino.',
'content' => "Webinar gratis: [tema]. [Fecha] a las [hora].\n\n[Nombre del host] va a recorrer [puntos principales] y después responder preguntas en vivo en los últimos [minutos].\n\nSi no puedes asistir, regístrate igual y te enviamos la grabación.\n\nLink en la bio.",
'image_count' => 1,
'image_keywords' => ['webinar', 'laptop', 'presentation'],
'slides' => null,
],
[
'slug' => 'meetup_recap_feed',
'category' => 'event',
'name' => 'Recap del meetup',
'description' => 'Recapitula un evento presencial reciente.',
'content' => "[Número] personas, [ciudad], una sala.\n\nEl meetup de anoche juntó a gente que trabaja en [área]. La mejor conversación de la noche fue sobre [tema], empezó con un café y nunca terminó del todo.\n\nGracias a todos los que vinieron. El próximo es el [fecha].",
'image_count' => 1,
'image_keywords' => ['meetup', 'crowd', 'event'],
'slides' => null,
],
[
'slug' => 'live_stream_reminder_feed',
'category' => 'event',
'name' => 'Recordatorio de live',
'description' => 'Recuerda a tus seguidores sobre un live que viene.',
'content' => "Live el [día] a las [hora].\n\nVamos a hablar de [tema]. Sin guion, solo preguntas y lo que tire el chat.\n\nActiva las notificaciones para no perdértelo. O no, el replay queda en el perfil después.",
'image_count' => 1,
'image_keywords' => ['live', 'broadcast', 'camera'],
'slides' => null,
],
// Engagement
[
'slug' => 'this_or_that_feed',
'category' => 'engagement',
'name' => 'Esto o aquello',
'description' => 'Haz una pregunta simple de elegir entre dos.',
'content' => "¿[Opción A] u [Opción B]?\n\nDiscutimos esto en la oficina al menos una vez por semana. Curioso por ver qué lado gana aquí.\n\nVota en los comentarios. No hay respuesta incorrecta, pero hay una correcta.",
'image_count' => 1,
'image_keywords' => ['choice', 'options', 'vote'],
'slides' => null,
],
[
'slug' => 'fill_in_the_blank_feed',
'category' => 'engagement',
'name' => 'Completa la frase',
'description' => 'Reta a tus seguidores con una frase para completar.',
'content' => "Termina la frase: \"Lo primero que hago cada mañana es ___.\"\n\nLe preguntamos al equipo y nos dijeron desde \"revisar Slack\" hasta \"evitar revisar Slack\". Curioso por saber dónde te ubicas tú.\n\nDeja la tuya en los comentarios.",
'image_count' => 1,
'image_keywords' => ['question', 'morning', 'coffee'],
'slides' => null,
],
[
'slug' => 'comment_question_feed',
'category' => 'engagement',
'name' => 'Pregunta para comentarios',
'description' => 'Haz una pregunta abierta para generar comentarios.',
'content' => "Pregunta para el grupo: ¿cuál es el mejor [item relacionado al tema] que probaste este año?\n\nEstamos armando un compilado y queremos elecciones reales, no las cinco que todos listan.\n\nDeja la tuya abajo. Compartimos las favoritas la próxima semana.",
'image_count' => 1,
'image_keywords' => ['conversation', 'community', 'chat'],
'slides' => null,
],
[
'slug' => 'tag_a_friend_feed',
'category' => 'engagement',
'name' => 'Etiqueta a un amigo',
'description' => 'Anima a etiquetar con un escenario identificable.',
'content' => "Etiqueta al amigo que [escenario identificable].\n\nTodos tenemos uno. Tal vez tú eres uno. Como sea, este post es para esa persona.\n\nPuntos extra si te etiqueta de vuelta.",
'image_count' => 1,
'image_keywords' => ['friends', 'people', 'fun'],
'slides' => null,
],
];

View file

@ -0,0 +1,362 @@
<?php
declare(strict_types=1);
return [
[
'slug' => 'story_announcement',
'category' => 'product_launch',
'name' => 'Aviso rápido',
'description' => 'Llama la atención sobre un lanzamiento o novedad con un Story de 24 horas.',
'content' => "Novedad en {{brand_name}}.\n\nToca el enlace para ver lo nuevo.",
'image_count' => 1,
'image_keywords' => ['announcement', 'launch'],
'slides' => null,
],
[
'slug' => 'story_poll_question',
'category' => 'engagement',
'name' => 'Encuesta rápida',
'description' => 'Usa un Story para hacer una pregunta rápida y enganchar a tu audiencia.',
'content' => "¿Qué es lo más importante al elegir un [producto/servicio]?\n\nToca para votar.",
'image_count' => 1,
'image_keywords' => ['question', 'engagement'],
'slides' => null,
],
[
'slug' => 'story_flash_promo',
'category' => 'promotion',
'name' => 'Promo relámpago',
'description' => 'Oferta por tiempo limitado en formato Story con urgencia.',
'content' => "Solo por 24 horas.\n\n[Descuento]% off en {{brand_name}}.\n\nDesliza hacia arriba.",
'image_count' => 1,
'image_keywords' => ['sale', 'discount', 'urgency'],
'slides' => null,
],
// product_launch
[
'slug' => 'story_product_drop',
'category' => 'product_launch',
'name' => 'Lanzamiento de producto',
'description' => 'Anuncia un producto nuevo que sale hoy.',
'content' => "Ya está.\n\n[Nombre del producto] acaba de salir.\n\nEnlace en la bio.",
'image_count' => 1,
'image_keywords' => ['product', 'launch', 'new'],
'slides' => null,
],
[
'slug' => 'story_feature_shipped',
'category' => 'product_launch',
'name' => 'Función publicada',
'description' => 'Cuéntales a tus seguidores sobre una función que acabas de lanzar.',
'content' => "Acabamos de lanzar [función].\n\nPruébala.",
'image_count' => 1,
'image_keywords' => ['update', 'feature', 'app'],
'slides' => null,
],
[
'slug' => 'story_waitlist_open',
'category' => 'product_launch',
'name' => 'Lista de espera abierta',
'description' => 'Invita a tus seguidores a unirse a la lista de espera.',
'content' => "Lista de espera abierta.\n\nQuedan [Cupos] cupos.\n\nEnlace en la bio.",
'image_count' => 1,
'image_keywords' => ['waitlist', 'signup'],
'slides' => null,
],
[
'slug' => 'story_preorder_live',
'category' => 'product_launch',
'name' => 'Preventa activa',
'description' => 'Impulsa las preventas de un producto que viene en camino.',
'content' => "Preventa abierta.\n\nEnvíos el [fecha].\n\nToca para reservar el tuyo.",
'image_count' => 1,
'image_keywords' => ['preorder', 'product'],
'slides' => null,
],
// promotion
[
'slug' => 'story_weekend_sale',
'category' => 'promotion',
'name' => 'Promo de fin de semana',
'description' => 'Impulsa una promo rápida de fin de semana.',
'content' => "Promo de fin de semana.\n\n[Descuento]% off en todo.\n\nTermina el domingo.",
'image_count' => 1,
'image_keywords' => ['sale', 'weekend', 'discount'],
'slides' => null,
],
[
'slug' => 'story_code_drop',
'category' => 'promotion',
'name' => 'Código de descuento',
'description' => 'Comparte un código que tus seguidores pueden usar al pagar.',
'content' => "Usa [CÓDIGO] al pagar.\n\n[Descuento]% off.\n\nVálido hasta [fecha].",
'image_count' => 1,
'image_keywords' => ['coupon', 'code', 'discount'],
'slides' => null,
],
[
'slug' => 'story_last_chance',
'category' => 'promotion',
'name' => 'Última oportunidad',
'description' => 'Recordatorio final antes de que termine la promo.',
'content' => "Última oportunidad.\n\n[Oferta] termina a medianoche.",
'image_count' => 1,
'image_keywords' => ['deadline', 'sale', 'urgent'],
'slides' => null,
],
[
'slug' => 'story_bundle_deal',
'category' => 'promotion',
'name' => 'Combo promocional',
'description' => 'Promociona un combo a un precio menor.',
'content' => "Combo promocional.\n\n[Ítem A] + [Ítem B] por [precio].\n\nToca para llevarlo.",
'image_count' => 1,
'image_keywords' => ['bundle', 'deal', 'product'],
'slides' => null,
],
// educational
[
'slug' => 'story_quick_tip',
'category' => 'educational',
'name' => 'Tip rápido',
'description' => 'Comparte un tip corto en pantalla.',
'content' => "Tip rápido:\n\n[Un tip corto y práctico].",
'image_count' => 1,
'image_keywords' => ['tip', 'advice', 'learning'],
'slides' => null,
],
[
'slug' => 'story_did_you_know',
'category' => 'educational',
'name' => 'Sabías que',
'description' => 'Suelta un dato sorprendente.',
'content' => "¿Sabías que…?\n\n[Dato sorprendente sobre tu nicho].",
'image_count' => 1,
'image_keywords' => ['fact', 'knowledge'],
'slides' => null,
],
[
'slug' => 'story_common_mistake',
'category' => 'educational',
'name' => 'Error común',
'description' => 'Señala un error que tu audiencia suele cometer.',
'content' => "Deja de [error común].\n\nHaz [mejor enfoque] en su lugar.",
'image_count' => 1,
'image_keywords' => ['mistake', 'advice', 'tip'],
'slides' => null,
],
[
'slug' => 'story_one_word_lesson',
'category' => 'educational',
'name' => 'Lección en una palabra',
'description' => 'Una sola palabra seguida de un porqué corto.',
'content' => "[Una palabra].\n\nEsa es la diferencia entre [resultado A] y [resultado B].",
'image_count' => 1,
'image_keywords' => ['lesson', 'word', 'idea'],
'slides' => null,
],
// behind_the_scenes
[
'slug' => 'story_workspace_peek',
'category' => 'behind_the_scenes',
'name' => 'Vistazo al espacio',
'description' => 'Foto rápida de donde sucede el trabajo.',
'content' => "Donde sucede el trabajo.\n\n[Pie corto sobre tu espacio].",
'image_count' => 1,
'image_keywords' => ['workspace', 'desk', 'office'],
'slides' => null,
],
[
'slug' => 'story_meet_the_team',
'category' => 'behind_the_scenes',
'name' => 'Conoce al equipo',
'description' => 'Presenta a alguien del equipo en una línea.',
'content' => "Conoce a [nombre].\n\n[Su rol en {{brand_name}}].",
'image_count' => 1,
'image_keywords' => ['team', 'people', 'portrait'],
'slides' => null,
],
[
'slug' => 'story_in_progress',
'category' => 'behind_the_scenes',
'name' => 'En proceso',
'description' => 'Muestra algo a medio hacer.',
'content' => "En proceso.\n\n[En qué estás trabajando ahora].",
'image_count' => 1,
'image_keywords' => ['process', 'work', 'progress'],
'slides' => null,
],
[
'slug' => 'story_packing_orders',
'category' => 'behind_the_scenes',
'name' => 'Pedidos saliendo',
'description' => 'Muestra los pedidos saliendo a la calle.',
'content' => "Pedidos de hoy.\n\nGracias por confiar en {{brand_name}}.",
'image_count' => 1,
'image_keywords' => ['packaging', 'orders', 'shipping'],
'slides' => null,
],
// testimonial
[
'slug' => 'story_customer_quote',
'category' => 'testimonial',
'name' => 'Cita de cliente',
'description' => 'Comparte una cita corta de un cliente en pantalla.',
'content' => "\"[Cita corta del cliente].\"\n\n- [Nombre del cliente]",
'image_count' => 1,
'image_keywords' => ['testimonial', 'review', 'quote'],
'slides' => null,
],
[
'slug' => 'story_review_screenshot',
'category' => 'testimonial',
'name' => 'Captura de reseña',
'description' => 'Repostea una captura de una reseña genial.',
'content' => "Reseñas así nos alegran la semana.\n\nGracias, [primer nombre del cliente].",
'image_count' => 1,
'image_keywords' => ['review', 'screenshot', 'feedback'],
'slides' => null,
],
[
'slug' => 'story_before_after_user',
'category' => 'testimonial',
'name' => 'Antes y después del cliente',
'description' => 'Destaca el resultado de un cliente.',
'content' => '[Primer nombre del cliente] pasó de [antes] a [después] en [tiempo].',
'image_count' => 1,
'image_keywords' => ['result', 'transformation', 'customer'],
'slides' => null,
],
// industry_tip
[
'slug' => 'story_industry_myth',
'category' => 'industry_tip',
'name' => 'Mito del sector',
'description' => 'Derriba una creencia común en tu rubro.',
'content' => "Mito: [creencia común].\n\nRealidad: [la verdad].",
'image_count' => 1,
'image_keywords' => ['myth', 'industry', 'truth'],
'slides' => null,
],
[
'slug' => 'story_industry_stat',
'category' => 'industry_tip',
'name' => 'Dato del sector',
'description' => 'Suelta un dato que llama la atención.',
'content' => "[Dato].\n\nPor eso creamos {{brand_name}}.",
'image_count' => 1,
'image_keywords' => ['statistic', 'data', 'industry'],
'slides' => null,
],
[
'slug' => 'story_tool_we_use',
'category' => 'industry_tip',
'name' => 'Herramienta que usamos',
'description' => 'Recomienda una herramienta que tu audiencia puede probar.',
'content' => "Herramienta que usamos a diario:\n\n[Nombre de la herramienta].\n\nPor qué: [un motivo corto].",
'image_count' => 1,
'image_keywords' => ['tool', 'software', 'recommendation'],
'slides' => null,
],
[
'slug' => 'story_red_flag',
'category' => 'industry_tip',
'name' => 'Señal de alerta',
'description' => 'Avisa a tus seguidores sobre una señal de alerta en tu sector.',
'content' => "Señal de alerta en [sector]:\n\n[La señal a la que prestar atención].",
'image_count' => 1,
'image_keywords' => ['warning', 'industry', 'advice'],
'slides' => null,
],
// event
[
'slug' => 'story_event_today',
'category' => 'event',
'name' => 'Evento hoy',
'description' => 'Recordatorio de último momento para un evento del mismo día.',
'content' => "Esta noche.\n\n[Nombre del evento] a las [hora].\n\nToca el enlace.",
'image_count' => 1,
'image_keywords' => ['event', 'reminder'],
'slides' => null,
],
[
'slug' => 'story_event_countdown',
'category' => 'event',
'name' => 'Cuenta regresiva',
'description' => 'Genera expectativa con una cuenta regresiva.',
'content' => "[X] días para [nombre del evento].\n\nResponde VOY para recibir el recordatorio.",
'image_count' => 1,
'image_keywords' => ['countdown', 'event'],
'slides' => null,
],
[
'slug' => 'story_live_now',
'category' => 'event',
'name' => 'En vivo ahora',
'description' => 'Avisa a tus seguidores que estás en vivo o en escenario.',
'content' => "En vivo ahora.\n\n[Tema o lugar].\n\nVen a saludar.",
'image_count' => 1,
'image_keywords' => ['live', 'streaming', 'event'],
'slides' => null,
],
[
'slug' => 'story_event_recap',
'category' => 'event',
'name' => 'Resumen del evento',
'description' => 'Resumen rápido cuando termina el evento.',
'content' => "[Nombre del evento] terminó.\n\nGracias a quienes nos acompañaron.",
'image_count' => 1,
'image_keywords' => ['event', 'recap', 'crowd'],
'slides' => null,
],
// engagement
[
'slug' => 'story_this_or_that',
'category' => 'engagement',
'name' => 'Esto o aquello',
'description' => 'Encuesta de dos opciones para toques rápidos.',
'content' => "¿[Opción A] u [Opción B]?\n\nToca para votar.",
'image_count' => 1,
'image_keywords' => ['poll', 'choice', 'vote'],
'slides' => null,
],
[
'slug' => 'story_question_box',
'category' => 'engagement',
'name' => 'Caja de preguntas',
'description' => 'Abre el espacio a preguntas.',
'content' => "Pregúntame lo que quieras sobre [tema].\n\nResponde con tu pregunta.",
'image_count' => 1,
'image_keywords' => ['questions', 'ama', 'conversation'],
'slides' => null,
],
[
'slug' => 'story_emoji_slider',
'category' => 'engagement',
'name' => 'Slider de emoji',
'description' => 'Usa el sticker de slider para medir una sensación.',
'content' => "¿Qué tan emocionado estás con [cosa]?\n\nMueve el slider.",
'image_count' => 1,
'image_keywords' => ['slider', 'reaction', 'engagement'],
'slides' => null,
],
[
'slug' => 'story_dm_prompt',
'category' => 'engagement',
'name' => 'Llamada al DM',
'description' => 'Anima a tus seguidores a enviar una palabra clave por DM.',
'content' => "¿Quieres [recurso]?\n\nResponde [palabra clave] y te lo envío.",
'image_count' => 1,
'image_keywords' => ['dm', 'message', 'engagement'],
'slides' => null,
],
];

View file

@ -0,0 +1,342 @@
<?php
declare(strict_types=1);
return [
[
'slug' => 'company_milestone',
'category' => 'behind_the_scenes',
'name' => 'Hito de la empresa',
'description' => 'Celebra un hito de la empresa desde la página de la marca.',
'content' => "Hoy {{brand_name}} llega a [hito, ej.: 1.000 clientes, 5 años, \$X de ARR].\n\nEsto no pasó por una sola persona. Pasó porque [equipo / clientes / comunidad] aparecieron todos los días.\n\nGracias a todos los que estuvieron en este camino. Recién estamos empezando.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'hiring_announcement',
'category' => 'engagement',
'name' => 'Estamos contratando',
'description' => 'Anuncia vacantes abiertas e invita postulaciones desde la página de la empresa.',
'content' => "{{brand_name}} está contratando.\n\nBuscamos [puesto(s)] para sumarse a nosotros en [equipo/misión].\n\nLo que ofrecemos:\n→ [Punto 1]\n→ [Punto 2]\n→ [Punto 3]\n\nSi te suena (o conoces a alguien), postula o comparte → [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'thought_leadership_page',
'category' => 'industry_tip',
'name' => 'Mirada del sector',
'description' => 'Comparte la postura de la empresa sobre una tendencia o cambio del sector.',
'content' => "El panorama de [sector] está cambiando.\n\nEsto es lo que vemos en {{brand_name}}:\n\n1. [Observación]\n2. [Observación]\n3. [Observación]\n\nLo que esto significa para [audiencia]: [implicación].\n\n¿Qué están viendo ustedes?",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ===== product_launch =====
[
'slug' => 'new_feature_release',
'category' => 'product_launch',
'name' => 'Lanzamiento de nueva función',
'description' => 'Anuncia una función nueva específica y el problema que resuelve.',
'content' => "Hoy lanzamos [nombre de la función].\n\nLa versión corta: [descripción en una línea de lo que hace].\n\nLa versión larga: los clientes nos repetían [dolor específico]. Probamos [solución previa] durante unos [periodo de tiempo] y nunca terminó de funcionar. Así que rehicimos [área] desde cero.\n\nAlgunos cambios:\n[Comportamiento antes] ahora es [comportamiento después].\n[Paso manual] corre solo.\n[Límite] ya no existe.\n\nSi quieres probarlo, la documentación está aquí: [link]. Si encuentras algo roto, nuestro equipo está en los comentarios.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'beta_open_signups',
'category' => 'product_launch',
'name' => 'Beta abierta para inscripciones',
'description' => 'Invita a clientes y prospectos a un beta público o privado.',
'content' => "El acceso beta a [producto/función] ya está abierto.\n\nPasamos [periodo de tiempo] probándolo con [número] testers privados. La devolución fue lo bastante buena como para abrir más la puerta.\n\nPara quién es: [descripción específica del usuario, ej.: equipos que corren más de X campañas/mes].\nPara quién todavía no: [exclusión honesta, ej.: empresas que necesitan SSO].\n\nLimitamos esta ronda a [número] empresas para que el equipo pueda acompañar cada cuenta de cerca. Los lugares se asignan por orden de llegada.\n\nPide acceso: [link].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'integration_partnership',
'category' => 'product_launch',
'name' => 'Integración con socio',
'description' => 'Anuncia una nueva integración o alianza técnica.',
'content' => "{{brand_name}} ahora se conecta con [socio].\n\nSi usas las dos, puedes dejar de [paso manual]. La integración se encarga de [flujo de datos específico] de forma automática.\n\nLo que cambió para nuestros clientes en común:\nNada de exportar [datos] y reimportar del otro lado.\n[Disparador] en [socio] ahora crea [acción] en {{brand_name}}.\nEl mapeo de campos se puede editar, así que las configuraciones raras siguen funcionando.\n\nGracias al equipo de [socio] por las idas y vueltas con la API. Guía de configuración: [link].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'product_redesign',
'category' => 'product_launch',
'name' => 'Lanzamiento de rediseño del producto',
'description' => 'Anuncia un rediseño relevante de UI o producto.',
'content' => "Rediseñamos [producto/área]. Está disponible para todos hoy.\n\nNuestro equipo de diseño estuvo bastante callado por aquí los últimos meses por esto. La [área] anterior creció de forma orgánica y terminó con [problema específico, ej.: cuatro maneras distintas de empezar un proyecto nuevo]. Los clientes nos lo dijeron. Estuvimos de acuerdo.\n\nLo que cambió:\nUna acción principal por pantalla, en vez de tres.\n[Elemento anterior] pasó a [nueva ubicación] para dejar de estorbar.\n[Patrón específico] que nadie usaba se fue.\n\nSi algo se siente raro los primeros días, es normal. Responde aquí o escríbele al equipo a [contacto] y lo miramos.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ===== promotion =====
[
'slug' => 'limited_time_offer',
'category' => 'promotion',
'name' => 'Oferta por tiempo limitado',
'description' => 'Anuncia un descuento u oferta de precio con fecha límite clara.',
'content' => "[Oferta, ej.: 25% de descuento en el primer año de {{brand_name}}] está abierta hasta [fecha específica].\n\nCasi nunca hacemos descuentos. Este está atado a [motivo, aniversario, cierre de trimestre, hito de producto] y no lo vamos a repetir en las mismas condiciones en [periodo de tiempo].\n\nA quién aplica: [elegibilidad, clientes nuevos, planes anuales, plan específico].\nA quién no: [exclusión honesta].\n\nUsa [código] en el checkout, o habla con nuestro equipo si quieres ayuda para elegir un plan: [link].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'free_resource_offer',
'category' => 'promotion',
'name' => 'Recurso gratuito',
'description' => 'Promociona una guía, plantilla o reporte gratuito.',
'content' => "Hicimos un [recurso, guía, plantilla, reporte de benchmark] gratuito para [audiencia].\n\nCubre [tema específico 1], [tema específico 2] y los [número] errores que más vemos al trabajar con [tipo de cliente objetivo]. Unas [número] páginas, sin pedir más que nombre y mail laboral.\n\nPor qué es gratis: [motivo honesto, ej.: lo armamos primero para nuestros clientes y es el tipo de cosa que rinde más cuanta más gente la tiene].\n\nDescárgalo aquí: [link]. Cuéntanos qué falta y lo actualizamos en la próxima versión.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'referral_program_launch',
'category' => 'promotion',
'name' => 'Anuncio de programa de referidos',
'description' => 'Promociona un programa de referidos para clientes desde la página de la empresa.',
'content' => "Lanzamos un programa de referidos para clientes de {{brand_name}}.\n\nSi recomiendas una empresa que termina pagando, las dos partes reciben [beneficio específico, ej.: un mes gratis, \$X de crédito, una función desbloqueada]. Sin niveles. Sin ranking. Sin tazas.\n\nResistimos un buen tiempo a hacer esto porque la mayoría de los programas de referidos parece pirámide encubierta. Llegamos acá porque nuestro mayor canal de crecimiento el año pasado fue cliente contándole a cliente, y se sintió raro no compartir el beneficio.\n\nDetalles y tu link de referidos: [link].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ===== educational =====
[
'slug' => 'how_we_solve_problem',
'category' => 'educational',
'name' => 'Cómo abordamos un problema',
'description' => 'Muestra cómo la empresa enfrenta un problema recurrente de los clientes.',
'content' => "Una pregunta que nos llega cada semana: [pregunta específica].\n\nAsí lo pensamos en {{brand_name}}.\n\nLa mayoría de los equipos arranca con [primer movimiento común]. Funciona hasta que se topa con [punto específico de falla]. Ahí te quedas pegado agregando [solución parche] cada vez que algo cambia.\n\nUn camino distinto: [enfoque alternativo]. El precio es [costo honesto, ej.: un setup más lento, más cabeza al inicio, más difícil de explicarle a alguien nuevo]. La ganancia es que [beneficio específico] deja de ser un incendio recurrente.\n\nEscribimos la versión larga aquí: [link]. ¿No estás de acuerdo? Los comentarios están abiertos.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'customer_data_insight',
'category' => 'educational',
'name' => 'Insight de datos de clientes',
'description' => 'Comparte un patrón útil que se observa en la base de clientes.',
'content' => "Miramos [métrica/comportamiento] en [número] cuentas de {{brand_name}} el último trimestre.\n\nUna cosa saltó a la vista: [hallazgo específico con número, ej.: los equipos que hicieron X en su primera semana tuvieron 3x más probabilidad de seguir activos al sexto mes].\n\nEsperábamos lo contrario. Nuestra hipótesis inicial era [supuesto viejo], en parte por [motivo]. Los datos no estuvieron de acuerdo.\n\nAlgunos detalles: esto es correlación, no causa. La muestra está sesgada hacia [segmento]. Y [periodo de tiempo] es corto.\n\nAun así, si recién empiezas con {{brand_name}}, [recomendación práctica] probablemente vale la pena en la primera semana.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'common_mistake_breakdown',
'category' => 'educational',
'name' => 'Desglose de error común',
'description' => 'Explica un error recurrente y cómo evitarlo.',
'content' => "El error más común que vemos cuando los equipos adoptan [herramienta/proceso/práctica]: [error específico].\n\nSuele verse así. Un equipo arranca con [setup]. En unas semanas, agregan [solución parche] porque [motivo]. Para el tercer mes, el parche ya es el sistema y nadie recuerda por qué.\n\nLa solución no es [respuesta obvia]. La solución es volver atrás y preguntarse si [supuesto original] alguna vez fue cierto en su caso. La mitad de las veces, no lo era.\n\nEscribimos esto porque cometimos el mismo error puertas adentro en [año]. Detalle completo: [link].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'tool_comparison',
'category' => 'educational',
'name' => 'Comparación honesta de herramientas',
'description' => 'Compara enfoques o herramientas para una tarea específica, incluyendo dónde la empresa pierde.',
'content' => "¿Cuándo usar {{brand_name}} y cuándo no?\n\nLa primera mitad de la pregunta nos llega todo el tiempo. Esta es la segunda.\n\nUsa {{brand_name}} cuando [situación específica, ej.: tienes más de X de Y, o necesitas la capacidad Z].\n\nNo uses {{brand_name}} cuando [exclusión honesta, ej.: eres un solo usuario con menos de X, o tu flujo es totalmente [categoría adyacente]]. En esos casos, [competidor o enfoque alternativo] encaja mejor de verdad, y eso te lo decimos en una llamada de ventas.\n\nDesglose completo, con comparativa al lado: [link].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ===== behind_the_scenes =====
[
'slug' => 'team_offsite_recap',
'category' => 'behind_the_scenes',
'name' => 'Recap del offsite del equipo',
'description' => 'Resume un offsite o all-hands reciente del equipo.',
'content' => "Cerramos nuestro offsite en [ciudad] la semana pasada.\n\n[Número] personas, [número] días, una pizarra que la pasó mal. Más o menos un tercio de la empresa se vio en persona por primera vez, lo que pasa cuando creces [de X a Y] en un año.\n\nGastamos más tiempo en [tema] del que habíamos planeado y menos en [otro tema] de lo que esperábamos. La conversación más difícil fue sobre [tema honesto, ej.: qué dejamos de hacer en la segunda mitad del año]. No la cerramos del todo. Está bien.\n\nEl próximo es en [lugar] en [mes]. Para entonces seremos [número] personas. No tengo idea cómo va a ser.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'office_or_remote_culture',
'category' => 'behind_the_scenes',
'name' => 'Cómo trabajamos',
'description' => 'Comparte el modelo de trabajo de la empresa de forma honesta.',
'content' => "Cómo trabaja {{brand_name}} de verdad, ya que nos preguntan.\n\nSomos [totalmente remotos / híbridos / con base en X y colaboradores remotos] en [número] zonas horarias. Sin días obligatorios en oficina. Hacemos un all-hands por semana y un update asíncrono los viernes.\n\nLo que nos gusta: bloques de trabajo profundo, contratar en distintas geografías, agendas más limpias.\n\nLo difícil: el onboarding lleva más tiempo del que llevaría en persona. Las ideas nuevas a veces se quedan trabadas en mensajes directos. La superposición horaria con [región] es complicada.\n\nNo decimos que sea el setup correcto para toda empresa. Es el que nos sirve a nosotros hoy.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'engineering_decision',
'category' => 'behind_the_scenes',
'name' => 'Recap de decisión de ingeniería',
'description' => 'Comparte una decisión técnica o de producto interna y el porqué.',
'content' => "El mes pasado [tomamos una decisión específica, ej.: salimos de X, reescribimos Y, matamos la función Z].\n\nLa versión corta del porqué: [motivo en una línea].\n\nLa versión larga. El setup viejo estaba bien cuando teníamos [número] clientes. En [escala actual], empezó a notarse en [síntoma específico]. Probamos [arreglo intermedio] durante unos [periodo de tiempo] hasta que aceptamos que no iba a aguantar.\n\nEl precio que aceptamos: [costo honesto, ej.: dos semanas con releases más lentos, breaking change para algunas integraciones].\n\nLo escribimos porque ojalá otros equipos compartan más de este tipo de decisión y no solo las victorias.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mistake_postmortem',
'category' => 'behind_the_scenes',
'name' => 'Postmortem público',
'description' => 'Comparte un error, caída o falla reciente de forma honesta.',
'content' => "El [fecha], {{brand_name}} tuvo [problema específico, ej.: una caída, un bug de cobro, un problema de datos que afectó al X% de las cuentas] durante unos [duración].\n\nQué pasó: [resumen técnico u operativo en un párrafo].\n\nA quién afectó: [alcance honesto, incluyendo a los clientes que no se vieron afectados].\n\nQué hicimos: [arreglo inmediato y mitigación].\n\nQué estamos cambiando para que no vuelva a pasar igual: [cambio específico, no un genérico 'lo haremos mejor'].\n\nSi te afectó y no te contactamos directamente, responde o escribe a [contacto]. Le debemos a varios una conversación más larga.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ===== testimonial =====
[
'slug' => 'customer_quote_short',
'category' => 'testimonial',
'name' => 'Cita corta de cliente',
'description' => 'Comparte una cita corta y específica de cliente en la página de la empresa.',
'content' => "De una conversación reciente con [primer nombre del cliente], [puesto] en [empresa]:\n\n\"[Cita del cliente, debe mencionar un resultado, número o cambio específico. Evita elogios genéricos del tipo 'gran producto'.]\"\n\nLes preguntamos si podíamos compartirla. Dijeron que sí.\n\nEl contexto detrás de la cita: [una o dos frases sobre lo que estaban tratando de hacer y qué cambió].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'case_study_recap',
'category' => 'testimonial',
'name' => 'Resumen de caso de éxito',
'description' => 'Resume un caso de éxito de cliente publicado.',
'content' => "Nuevo caso: [nombre del cliente].\n\nAntes de {{brand_name}}, su equipo estaba [situación específica, ej.: corriendo X manualmente, gastando Y horas/semana en Z]. Después de [periodo de tiempo] usando {{brand_name}}, [resultado específico con número].\n\nAlgunas cosas que ellos hicieron y que otros clientes no siempre prueban:\n[Táctica específica del cliente].\n[Otra táctica].\n[Nota honesta: algo que todavía están afinando].\n\nVersión completa con el flujo real del equipo y capturas: [link].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'unexpected_use_case',
'category' => 'testimonial',
'name' => 'Uso inesperado del producto',
'description' => 'Resalta una manera creativa o inesperada en que los clientes usan el producto.',
'content' => "No construimos {{brand_name}} pensando en [caso de uso inesperado], pero los clientes lo siguen usando así.\n\n[Cliente o segmento de clientes] empezó a [comportamiento específico] hace unos [periodo de tiempo]. Lo notamos por [señal, ej.: un pico de uso en una función específica, un ticket de soporte pidiendo X]. Cuando les preguntamos, la respuesta fue: [razonamiento del cliente parafraseado].\n\nNo está en nuestro roadmap. Quizá entre pronto. Si estás haciendo algo parecido, a nuestro equipo de producto le encantaría escucharte. Responde aquí o escribe a [contacto].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ===== industry_tip =====
[
'slug' => 'contrarian_take',
'category' => 'industry_tip',
'name' => 'Opinión a contracorriente',
'description' => 'Defiende una postura clara contra una idea popular del sector.',
'content' => "Una opinión que nos mete en problemas en conferencias: [postura contraria, dicha sin vueltas].\n\nEl argumento de siempre es [postura popular]. No está mal en todos los casos. Está mal en la mayoría de los casos que vemos, y aquí va el porqué.\n\n[Razón 1 con ejemplo específico].\n[Razón 2 con ejemplo específico].\n\nLa contra que siempre nos ponen: [contraargumento bien hecho]. Es justo, y aceptamos que aplica cuando [condición específica]. Fuera de esa condición, el consejo de siempre les sale caro a los equipos sin que nadie se dé cuenta.\n\nFelices de estar equivocados acá. Cuéntenos en los comentarios por qué.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'industry_benchmark',
'category' => 'industry_tip',
'name' => 'Benchmark del sector',
'description' => 'Comparte un benchmark o métrica agregada de la base de clientes.',
'content' => "Benchmark rápido para [audiencia].\n\nEntre [número] cuentas {{brand_name}} de [sector/segmento] el último trimestre, la mediana de [métrica] fue [valor]. El percentil 90 fue [valor]. El 25% más bajo quedó por debajo de [valor].\n\nSi estás bajo la mediana, el motivo más común que vemos es [motivo específico]. La solución casi nunca es [respuesta obvia]. Suele ser [solución real].\n\nSi estás arriba del percentil 90, probablemente ya haces [comportamiento específico], y nos encantaría hablar contigo de eso. Responde o manda un DM a la página.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'trend_we_disagree_with',
'category' => 'industry_tip',
'name' => 'Tendencia con la que no estamos de acuerdo',
'description' => 'Cuestiona una práctica de moda en el sector con argumentos.',
'content' => "La mitad de los posts de [sector] que vemos este mes son sobre [práctica de moda].\n\nNosotros no la vamos a adoptar en {{brand_name}}, y es probable que no lo hagamos.\n\nEl pitch es [encuadre popular]. La versión honesta, según nuestra experiencia, es que funciona en [escenario acotado] y falla sin hacer ruido en [escenario común] por [motivo específico]. Probamos una versión interna durante [periodo de tiempo] y vimos [resultado específico].\n\nNo digo que nadie deba hacerlo. Digo que para [audiencia objetivo], el tiempo rinde más en [alternativa].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'practical_framework',
'category' => 'industry_tip',
'name' => 'Framework práctico',
'description' => 'Comparte una regla simple o framework interno del equipo.',
'content' => "Una regla de bolsillo que usa nuestro equipo para decidir [decisión específica]:\n\nSi [condición A], haz [opción 1].\nSi [condición B], haz [opción 2].\nSi no sabes en cuál estás, probablemente estás en [opción 1] complicándolo de más.\n\nNo es un framework con nombre. Salió de unos [periodo de tiempo] de equivocarnos en la misma decisión de maneras un poco distintas. Nos ahorra una o dos discusiones por semana.\n\n¿Útil? ¿Inútil? Cuéntennos cómo deciden ustedes.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ===== event =====
[
'slug' => 'event_announcement',
'category' => 'event',
'name' => 'Anuncio de evento',
'description' => 'Anuncia un evento, webinar o workshop de la empresa.',
'content' => "Vamos a hacer [nombre del evento] el [fecha] a las [hora/zona horaria].\n\nFormato: [virtual / presencial en ciudad / híbrido].\nPara quién es: [audiencia específica, ej.: heads de marketing en SaaS B2B, 20-200 empleados].\nDe qué vamos a hablar: [tema 1] y [tema 2]. Sin keynote. Sin desfile de proveedores.\n\nLimitamos las inscripciones a [número] para que el Q&A funcione de verdad. Si los eventos pasados sirven de guía, la segunda mitad es donde aparece lo bueno.\n\nInscríbete: [link].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'event_recap',
'category' => 'event',
'name' => 'Recap del evento',
'description' => 'Resume un evento reciente que la empresa organizó o donde participó.',
'content' => "[Nombre del evento] cerró el [fecha]. Algunas cosas para anotar antes de que se borren.\n\nLa sala se prendió más en [momento o tema específico]. Nuestra hipótesis era que [tema A] iba a dominar. No fue así. Dominó [tema B], y deberíamos haberlo anticipado.\n\nLa pregunta más útil que recibimos: [pregunta parafraseada]. La contestamos con honestidad pero no muy bien. Si fuiste vos, te debemos una mejor, responde aquí.\n\nGracias a [socio / espacio / oradores] por hacer que pasara. Las grabaciones suben la semana que viene: [link].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'conference_attendance',
'category' => 'event',
'name' => 'Participación en conferencia',
'description' => 'Anuncia que el equipo va a estar en una conferencia próxima.',
'content' => "{{brand_name}} va a estar en [conferencia] en [ciudad] del [fecha] al [fecha].\n\nVamos [número] personas. Este año no tenemos stand. Lo probamos el año pasado y las conversaciones más útiles pasaron lejos del stand.\n\nSi quieres encontrarte con nosotros:\n[Nombre del miembro del equipo] anda por ahí [días/horarios], con interés sobre todo en [tema].\n[Otro miembro del equipo] presenta sobre [tema] el [día].\nCena el [fecha], grupo chico, responde si quieres entrar.\n\nReserva un horario aquí: [link].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ===== engagement =====
[
'slug' => 'open_question_to_audience',
'category' => 'engagement',
'name' => 'Pregunta abierta a la audiencia',
'description' => 'Haz una pregunta real y específica a la audiencia de la página.',
'content' => "Una pregunta de verdad para [audiencia] esta semana.\n\nCuando [situación específica, ej.: estás armando un proyecto nuevo, eligiendo un proveedor, decidiendo qué cortar], ¿cómo decides en la práctica?\n\nNo la versión que pondrías en un slide. La versión que incluye [factor honesto, ej.: quién está disponible esa semana, de qué humor está el CFO, qué herramienta ya conoce el equipo].\n\nVenimos haciendo una versión interna de esta pregunta en {{brand_name}} desde hace un mes y las respuestas son más interesantes que cualquier framework que vimos. Manda la tuya y compartimos lo que escuchamos.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'we_want_your_feedback',
'category' => 'engagement',
'name' => 'Pedido de feedback',
'description' => 'Pide la opinión de la audiencia sobre una decisión de roadmap específica.',
'content' => "Estamos trabados con algo y queremos tu opinión.\n\nPara la próxima versión de {{brand_name}}, estamos eligiendo entre dos caminos para [área].\n\nOpción A: [dirección específica, con el trade-off].\nOpción B: [dirección específica, con el trade-off].\n\nLas dos son reales. Ninguna es claramente la correcta. Los clientes a los que preguntamos están divididos casi mitad y mitad, que es el peor resultado posible para un equipo de producto que quiere entregar.\n\nSi tienes una opinión, sobre todo si es fuerte, responde aquí o manda DM a la página. Nuestro equipo de producto lee todo.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'community_spotlight',
'category' => 'engagement',
'name' => 'Spotlight de la comunidad',
'description' => 'Resalta a un cliente, socio o miembro de la comunidad que está haciendo algo interesante.',
'content' => "Spotlight para [nombre], [puesto] en [empresa].\n\nVimos [su trabajo o post específico] la semana pasada y terminó circulando dentro del equipo de {{brand_name}}. La versión corta del porqué: [motivo específico, qué hizo que fue distinto, útil o a contramano].\n\nVe a seguirle, si todavía no lo haces. No tenemos ningún acuerdo comercial. Sólo está haciendo el tipo de trabajo que nos gustaría ver más en [sector] de forma pública.\n\n[Link a su post / perfil].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'year_in_review',
'category' => 'engagement',
'name' => 'Resumen del año',
'description' => 'Resumen de fin de año honesto desde la página de la empresa.',
'content' => "Un resumen corto del año de {{brand_name}}.\n\nLo bueno: [logro específico con número]. [Otro logro específico, idealmente un resultado de cliente y no una métrica de vanidad].\n\nLo difícil: [error honesto, ej.: una apuesta de producto que no funcionó, un objetivo de contratación que no alcanzamos, un objetivo que pusimos en enero y soltamos sin ruido en junio].\n\nLo sorpresivo: [algo inesperado que importó, un segmento de cliente que despegó, una función que nadie pidió y se volvió clave].\n\nGracias a los [número] clientes, las [número] personas del equipo y a quienes nos respondían a las 23 h pidiendo que entregáramos cosas. El año que viene va a ser más raro que este.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
];

View file

@ -0,0 +1,322 @@
<?php
declare(strict_types=1);
return [
[
'slug' => 'product_launch_announcement',
'category' => 'product_launch',
'name' => 'Anuncio de lanzamiento de producto',
'description' => 'Publicación corta en LinkedIn anunciando un nuevo producto.',
'content' => "Tenemos algo que contarte: {{brand_name}} acaba de lanzar [Nombre del Producto].\n\nPor qué importa para [tu audiencia]:\n→ [Beneficio 1]\n→ [Beneficio 2]\n→ [Beneficio 3]\n\nMás info en [link]. Nos encantaría escuchar tu opinión.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'how_to_guide',
'category' => 'educational',
'name' => 'Guía paso a paso',
'description' => 'Publicación educativa paso a paso para LinkedIn.',
'content' => "Cómo [lograr X] en [plazo], una guía paso a paso.\n\nPaso 1: [Acción]\nPaso 2: [Acción]\nPaso 3: [Acción]\nPaso 4: [Acción]\n\nLo que la mayoría no ve: [insight].\n\n¿Qué paso se te complica más? Cuéntame en los comentarios.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'customer_quote',
'category' => 'testimonial',
'name' => 'Testimonio de cliente',
'description' => 'Comparte un testimonio potente de un cliente en LinkedIn.',
'content' => "\"[Frase del cliente sobre el resultado que logró con tu producto o servicio.]\"\n- [Nombre del Cliente], [Cargo] en [Empresa]\n\nPor esto construimos {{brand_name}}. Resultados reales para equipos reales.\n\nLee la historia completa → [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'industry_insight',
'category' => 'industry_tip',
'name' => 'Insight del sector',
'description' => 'Comparte una visión actual u opinión fuerte sobre tu industria.',
'content' => "Algo que la mayoría en [industria] entiende mal:\n\n[Afirmación contraintuitiva u opinión fuerte]\n\n¿Por qué? Porque [razón].\n\nLo que sí funciona: [mejor camino].\n\nEn {{brand_name}} lo vimos pasar con cientos de [clientes/equipos]. Los datos son claros.\n\n¿Cuál es tu postura?",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'event_announcement',
'category' => 'event',
'name' => 'Anuncio de evento',
'description' => 'Anuncia un webinar o evento en vivo próximo.',
'content' => "📅 Aparta la fecha: {{brand_name}} organiza [Nombre del Evento] el [Fecha] a las [Hora].\n\nQué esperar:\n✔ [Tema 1]\n✔ [Tema 2]\n✔ [Tema 3]\n\nCupos limitados. Regístrate ya → [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'community_question',
'category' => 'engagement',
'name' => 'Pregunta para la comunidad',
'description' => 'Provoca conversación con una pregunta abierta a tu red.',
'content' => "Si pudieras dar un solo consejo a alguien que recién empieza en [industria/rol], ¿cuál sería?\n\nEl mío: [tu respuesta, sé honesto y específico]\n\nDeja el tuyo en los comentarios. Armemos un hilo que valga la pena guardar.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ===== Product launch (3) =====
[
'slug' => 'feature_release_notes',
'category' => 'product_launch',
'name' => 'Notas de lanzamiento de feature',
'description' => 'Cuéntale a tu red qué se publicó y por qué importa.',
'content' => "Hoy publicamos [Nombre de la Feature].\n\nLa versión corta: hace [lo que hace] para [a quién está dirigida]. Nos llevó [plazo] del primer boceto a producción.\n\nLo que cambia de verdad:\n• [Capacidad uno, en lenguaje claro]\n• [Capacidad dos, con un ejemplo real]\n• [Lo que cortamos y por qué]\n\nDebatimos [tradeoff] durante semanas. Al final elegimos [decisión] porque [razón]. Si tú habrías tomado la otra decisión, quiero entender por qué.\n\nDocs y un recorrido de 4 minutos en [link]. Los reportes de bugs son bienvenidos, leemos cada uno.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'beta_invitation',
'category' => 'product_launch',
'name' => 'Invitación a beta privada',
'description' => 'Invita a tu red a una beta cerrada con expectativas claras.',
'content' => "Estamos abriendo [Producto/Feature] en beta privada para un grupo pequeño. Buscamos unos [N] testers.\n\nEl perfil ideal:\n• Trabajas en [rol/industria]\n• Hoy usas [herramienta o flujo] y sientes [fricción específica]\n• Tienes 30 minutos a la semana para romper cosas y contarnos\n\nLo que recibes: acceso anticipado, línea directa con el equipo de {{brand_name}} y voz en lo que construyamos después. Lo que recibimos: feedback honesto, aunque duela.\n\nSi te calza, comenta o escríbeme por DM. Mandamos las invitaciones esta [día/semana].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'milestone_update',
'category' => 'product_launch',
'name' => 'Hito del producto',
'description' => 'Comparte un hito relevante del producto o la empresa con números concretos.',
'content' => "Hito discreto que cumplimos esta semana: {{brand_name}} pasó de [número / métrica].\n\nPara contexto, cuando arrancamos hace [plazo] teníamos [número inicial]. La mayor parte del crecimiento vino de [canal o motor específico], no de lo que esperábamos.\n\nAlgunas cosas que aprendí en el camino:\n1. [Lección uno, con los números]\n2. [Lección dos, qué haríamos distinto]\n3. [Lección tres sobre el equipo]\n\nGracias a las [N] personas que apostaron por nosotros cuando esto estaba muy crudo. Seguimos.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ===== Promotion (3) =====
[
'slug' => 'limited_time_offer',
'category' => 'promotion',
'name' => 'Oferta por tiempo limitado',
'description' => 'Promueve un descuento u oferta con plazo, sin caer en spam.',
'content' => "Estamos corriendo una promo de [% de descuento] en {{brand_name}} hasta el [fecha].\n\nNo es un truco de Black Friday. Tuvimos un [mes/trimestre] flojo y queremos sumar [N] nuevos [usuarios/clientes] antes de [fin del periodo]. Esa es la razón honesta.\n\nSi venías dudando: [link]. Si te suscribiste en los últimos 30 días, escríbeme y aplico el mismo descuento de forma retroactiva. Es lo correcto.\n\nLa oferta termina el [fecha] a las [hora, zona horaria].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'free_resource_offer',
'category' => 'promotion',
'name' => 'Recurso gratuito',
'description' => 'Ofrece una descarga o plantilla útil como recurso de baja fricción.',
'content' => "Pasé el fin de semana convirtiendo nuestro [tipo de recurso, checklist, plantilla, playbook] interno en algo que se puede compartir.\n\nEs el mismo [documento] que usa nuestro equipo para [caso de uso específico]. Sin adornos: [N] páginas, sin relleno, sin formulario de email.\n\nDeja un comentario con la palabra \"[palabra clave]\" y te paso el link por DM. Si prefieres tomarlo directo: [link].\n\nAviso: tiene opinión. Si discrepas con mi postura sobre [punto específico], dímelo. Así lo mejoro para la v2.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'partnership_announcement',
'category' => 'promotion',
'name' => 'Anuncio de alianza',
'description' => 'Anuncia una alianza o integración con un beneficio claro para el cliente.',
'content' => "{{brand_name}} ya está integrado con [Nombre del Partner].\n\nEl efecto práctico para [audiencia]: ahora puedes [flujo o capacidad específica] sin [el rodeo anterior]. Ahorra cerca de [tiempo/dinero] por [periodo] según el grupo de prueba inicial.\n\nElegimos [Partner] porque su equipo se obsesiona con [valor compartido] igual que el nuestro. No toda solicitud de integración pasa el filtro, y la mayoría no pasa.\n\nLa configuración toma unos [N] minutos. Tutorial aquí: [link]. Si ya usas ambas herramientas, queremos saber cómo te fue.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ===== Educational (3) =====
[
'slug' => 'lesson_learned',
'category' => 'educational',
'name' => 'Lección de un error',
'description' => 'Enseña contando un error específico y lo que cambió por él.',
'content' => "Cometí un error de [N] cifras el [año/trimestre] pasado y quiero escribir sobre él mientras todavía duele.\n\nEl contexto: estábamos en [situación]. La decisión: [lo que hiciste]. La lógica en ese momento: [por qué parecía lo correcto].\n\nLo que pasó en realidad: [resultado, en términos concretos]. Perdimos [costo específico, dinero, tiempo, clientes, confianza].\n\nLo que debí haber hecho: [mejor camino], y la razón por la que no lo hice fue [razón honesta, ego, prisa, faltaba data].\n\nTres cosas que cambié en mi forma de trabajar por esto:\n1. [Cambio uno]\n2. [Cambio dos]\n3. [Cambio tres]\n\nSi pasaste por algo así, sabes de qué hablo. Cuéntame el tuyo en los comentarios.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'framework_breakdown',
'category' => 'educational',
'name' => 'Framework o modelo mental al detalle',
'description' => 'Explica un framework o modelo mental específico con un ejemplo concreto.',
'content' => "Vuelvo siempre a un modelo mental cuando pienso en [tema/problema]: [Nombre del Framework].\n\nLa idea es simple. [Resumen del framework en una frase.]\n\nCómo lo uso de verdad: cuando me trabo en [situación específica], me pregunto [pregunta específica que dispara el framework]. La semana pasada me empujó a [decisión que tomaste por él].\n\nDónde se rompe: [limitación honesta]. No es respuesta universal para [tipo de problema], y tratarlo como si lo fuera lleva a [mal resultado].\n\nSi quieres leer la fuente original, es [autor/libro/link]. La versión de arriba es la mía, ajustada con cientos de usos.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'tool_comparison',
'category' => 'educational',
'name' => 'Comparación honesta de herramientas',
'description' => 'Compara dos o tres herramientas o enfoques con tradeoffs reales.',
'content' => "Usé [Herramienta A], [Herramienta B] y [Herramienta C] para [tarea] durante los últimos [plazo]. Aquí dónde gana cada una de verdad.\n\n[Herramienta A] es la elección correcta cuando [situación específica]. Es la más rápida en [tarea específica] y la peor en [tarea específica]. La usamos para [caso de uso].\n\n[Herramienta B] se siente menos pulida, pero hace [cosa] mejor que cualquier otra que probé. Vale la incomodidad si [criterio].\n\n[Herramienta C] es la opción aburrida. Eso es un cumplido. Es confiable, la documentación la escribieron humanos, y el equipo no publica breaking changes los viernes.\n\nMi stack actual en {{brand_name}}: [respuesta real]. El tuyo puede ser distinto si [razón].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ===== Behind the scenes (3) =====
[
'slug' => 'team_culture_glimpse',
'category' => 'behind_the_scenes',
'name' => 'Momento de cultura del equipo',
'description' => 'Comparte un momento pequeño y específico que muestra cómo trabaja el equipo de verdad.',
'content' => "Cosa pequeña que pasó en {{brand_name}} esta semana.\n\n[Persona o rol del equipo] notó [problema o detalle específico]. Podía haberse publicado igual. En vez de eso, [acción específica], lo que retrasó [cosa] en [plazo].\n\nNadie lo pidió. No había ticket en Jira. El cliente nunca se habría enterado.\n\nEsta es la parte de construir una empresa que no entra en una página de carreras. El trabajo que nadie ve, hecho bien igual, porque así son las personas de aquí. Pienso bastante en eso.\n\nSi quieres trabajar con gente así: [link]. Si ya lo haces, mándale un DM.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'how_we_built_it',
'category' => 'behind_the_scenes',
'name' => 'Cómo lo construimos',
'description' => 'Cuenta la historia real de una entrega reciente, incluyendo los callejones sin salida.',
'content' => "Cómo construimos [Feature/Producto] en {{brand_name}}, incluyendo las partes que solemos dejar fuera.\n\nArrancamos con [plan original]. Tardamos [plazo] en darnos cuenta de que el plan estaba equivocado. El problema real era [problema real], y solo se hizo visible después de [evento gatillo].\n\nLa versión 2 fue [lo que probamos después]. Funcionó en la demo y se cayó en producción a [escala o condición]. Reescribimos el [componente específico] dos veces.\n\nLo que finalmente salió: [solución actual]. Es [reconocimiento honesto del tradeoff, más lenta, más simple, menos elegante] que lo que queríamos construir, y es la versión que sí resuelve el problema del cliente.\n\nWriteup completo con los diagramas de arquitectura: [link].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'day_in_the_life',
'category' => 'behind_the_scenes',
'name' => 'Un día en el equipo',
'description' => 'Muestra cómo es un día real para alguien del equipo.',
'content' => "Saqué la agenda del [día de la semana] y conté: [N] reuniones, [N] horas de trabajo concentrado, [N] interrupciones a las que debí decir que no.\n\nEl trabajo que sí importó:\n• [Tarea uno, y por qué importó]\n• [Tarea dos, incluyendo lo que te sorprendió]\n• [Tarea tres]\n\nEl trabajo que parecía urgente y no lo era: [ejemplo honesto]. Sigo cayendo en eso y ya estoy cansado.\n\nAntes pensaba que la meta era un día perfecto. Ahora creo que la meta son unas pocas horas reales y la disciplina para protegerlas. Curioso cómo lo manejan ustedes con [desafío específico del post].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ===== Testimonial (3) =====
[
'slug' => 'before_after_story',
'category' => 'testimonial',
'name' => 'Antes y después de un cliente',
'description' => 'Cuenta la historia de un cliente con números concretos del antes y el después.',
'content' => "Historia rápida de un cliente de {{brand_name}} que vale la pena compartir.\n\n[Cliente/Empresa] llegó a nosotros hace [plazo]. El estado de las cosas entonces: [métrica dolorosa específica, horas por semana, tasa de error, churn, costo]. Habían probado [enfoque anterior] y el número no se movió.\n\n[Plazo] después, esa misma métrica está en [nuevo número]. La pieza que más pesó, según [Nombre, cargo]: [cambio específico en cómo trabajan].\n\nLo que me gusta de esta historia: no fue una feature mágica. Fue [fundamento aburrido, cambio de proceso, default que invirtieron, reunión que eliminaron]. La mayoría de las victorias se ven así y no lo hablamos lo suficiente.\n\nCaso completo con los detalles desordenados: [link].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'unsolicited_review',
'category' => 'testimonial',
'name' => 'Reseña espontánea de cliente',
'description' => 'Comparte un feedback orgánico de un cliente con una reacción reflexiva.',
'content' => "Esto llegó ayer a nuestra bandeja, de [Nombre del Cliente] en [Empresa]:\n\n\"[Cita honesta y específica, incluyendo cualquier crítica pequeña o tradeoff que mencione. Las reseñas reales no son solo elogio.]\"\n\nAlgunas reacciones honestas de mi lado. La parte sobre [elogio específico] es en lo que más hemos trabajado, así que esa pegó. La parte sobre [queja o deseo específico] es justa, y ya está en el roadmap para [plazo].\n\nNo pagamos por reseñas y no las pedimos. Cuando aparece una así, la leo dos veces. Gracias, [Nombre].\n\nSi tienes una historia con {{brand_name}}, buena, mala o mixta, quiero escucharla.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'team_member_spotlight',
'category' => 'testimonial',
'name' => 'Reflector sobre alguien del equipo',
'description' => 'Destaca a una persona del equipo por una contribución concreta.',
'content' => "Quiero hablar un momento de [Nombre], [cargo] en {{brand_name}}.\n\n[Nombre] entró hace [plazo]. Lo que tiene a su cargo hoy: [área o sistema específico]. Lo que hizo y poca gente habría hecho: [historia específica, decisión dura, arreglo poco glamoroso, tradeoff que defendió].\n\nEl resultado: [resultado concreto, con un número si lo tienes]. Por qué funcionó: el instinto de [Nombre] sobre [cualidad específica], del que sigo aprendiendo.\n\nEsto no es falsa modestia. Es un gracias, en plataforma pública, porque esa parte del trabajo suele pasar en silencio. [Nombre], el equipo es mejor contigo dentro.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ===== Industry tip (3) =====
[
'slug' => 'data_point_take',
'category' => 'industry_tip',
'name' => 'Dato y lo que significa',
'description' => 'Comparte un dato reciente de una fuente real con tu interpretación.',
'content' => "[Fuente, reporte, estudio, dataset público] publicó este número la semana pasada: [estadística específica].\n\nLa mayoría de las lecturas que vi lo enmarcan como [interpretación común]. Creo que se pierde el punto.\n\nCuando cortas los mismos datos por [dimensión, segmento, geografía, tamaño de empresa, periodo], el cuadro cambia. [Subgrupo específico] está [comportamiento específico], mientras que [otro subgrupo] está [comportamiento distinto]. El número titular promedia esas dos historias en algo que no describe a ninguna.\n\nLa implicación práctica para [audiencia]: [recomendación específica]. No [consejo común], porque se apoya en un promedio que no existe.\n\nLink a los datos en bruto: [link]. Dime dónde estoy equivocado.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'contrarian_take',
'category' => 'industry_tip',
'name' => 'Postura contraria con argumentos',
'description' => 'Cuestiona una creencia común de tu industria con un argumento específico.',
'content' => "Opinión impopular en [industria]: [tesis contraria].\n\nEl consejo estándar dice [sabiduría convencional]. Lo seguí durante [plazo] y el resultado fue [resultado específico, malo o mediocre].\n\nPor qué no funciona tan bien como dicen: [razón específica, incentivo, costo oculto, sesgo de supervivencia, mercado cambió]. La versión que sí funciona para [audiencia] se parece más a [enfoque alternativo].\n\nPara que conste, ese fue el camino que tomamos en {{brand_name}} después de [evento gatillo]. Números desde entonces: [resultado específico]. No digo que todos deban hacerlo. Sí digo que \"porque todos lo dicen\" es una mala razón para seguir haciendo lo mismo.\n\n¿Dónde estás tú en esto?",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'trend_watch',
'category' => 'industry_tip',
'name' => 'Tendencia para vigilar',
'description' => 'Pon foco en una tendencia menor antes de que se vuelva mainstream.',
'content' => "Tendencia silenciosa en [industria] que creo que la mayoría discutirá en [plazo]: [tendencia específica].\n\nLa señal que estoy mirando: [evidencia concreta, patrones de contratación, nuevos jugadores, cambios de precio, qué piden los clientes]. Tres [empresas/equipos] distintos en nuestra red hicieron [cosa específica] en el último [periodo], cada uno por su cuenta.\n\nPor qué creo que sí importa y no es solo hype: [razón anclada en incentivos, no en vibras]. Lo que me haría cambiar de idea: [contraseñal específica que vigilaría].\n\nSi eres [audiencia], el movimiento práctico hoy es [acción específica]. No un giro que apuesta la empresa. Solo lo justo para no quedar fuera de juego en [plazo].\n\n¿Qué estás viendo tú?",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ===== Event (3) =====
[
'slug' => 'event_recap',
'category' => 'event',
'name' => 'Resumen de evento con aprendizajes',
'description' => 'Resume un evento al que asististe con aprendizajes específicos.',
'content' => "Vuelvo de [Nombre del Evento]. Tres cosas se me quedaron, y una con la que sigo discutiendo.\n\nLo que se sostuvo: [sesión o ponente específico], que defendió que [argumento específico]. La parte que no había considerado: [insight específico].\n\nLo que me llevo a {{brand_name}}: [cambio concreto que harás por el evento]. Lo bastante chico para empezar la próxima semana, lo bastante grande para importar.\n\nCon lo que no estuve de acuerdo: [postura específica de una sesión]. El argumento estaba bien armado, pero ignora [realidad específica]. Voy a escribir eso aparte, en serio.\n\nSi estuviste ahí, ¿qué se me escapó? Siempre hay más en los pasillos que en el escenario principal.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'speaking_announcement',
'category' => 'event',
'name' => 'Anuncio de ponencia',
'description' => 'Anuncia que tú o alguien del equipo va a dar una charla en un evento.',
'content' => "Voy a dar una charla en [Nombre del Evento] el [fecha] en [lugar / online].\n\nLa charla: \"[Título de la Charla]\". El pitch corto: [una o dos frases sobre lo que el público se llevará de verdad].\n\nLo que no voy a hacer: pasar buenas prácticas genéricas de [tema]. Ya hay suficientes. Lo que sí voy a hacer: mostrar [dato, framework o caso] específico de {{brand_name}} que cambió cómo pensamos [problema específico], incluyendo las partes que no funcionaron.\n\nSi vas a estar, búscame, prefiero una conversación de verdad antes que juntar tarjetas. Registro: [link].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'webinar_invitation',
'category' => 'event',
'name' => 'Invitación a webinar',
'description' => 'Invita a tu red a un webinar con una agenda clara y honesta.',
'content' => "Voy a hacer un webinar de [duración, ej. 45 minutos] con [Nombre del co-host, cargo] el [fecha].\n\nTema: [tema específico, como una pregunta que tu audiencia se está haciendo]. No vamos a hacer una demo de producto. Vamos a recorrer [framework, dataset o flujo específico] que usamos en {{brand_name}}.\n\nAgenda preliminar:\n• [Hora], [Tema, con un detalle que muestra el contenido real]\n• [Hora], [Tema]\n• [Hora], Q&A en vivo. Respondemos todo, incluyendo las preguntas incómodas.\n\nLa repetición llega a quien se registre, aunque no puedas conectarte en vivo. Inscripción: [link].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ===== Engagement (3) =====
[
'slug' => 'poll_post',
'category' => 'engagement',
'name' => 'Encuesta con opinión',
'description' => 'Haz una pregunta directa de A o B que saque opiniones reales.',
'content' => "Curioso por ver cómo se está partiendo [audiencia] en esto.\n\nCuando decides [decisión específica], ¿te inclinas por:\n\nA) [Opción A, descrita concretamente]\nB) [Opción B, descrita concretamente]\n\nNada de \"depende\" en los comentarios, por favor. Elige una y dime por qué en una frase.\n\nMi respuesta: [tu elección honesta]. La razón: [una o dos frases desde experiencia real]. Sostuve la postura contraria durante [plazo] hasta que [cosa que me hizo cambiar de idea].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'hot_take_invitation',
'category' => 'engagement',
'name' => 'Invitación a opinión polémica',
'description' => 'Invita a la red a compartir una opinión controversial de su área.',
'content' => "¿Cuál es una opinión sobre [industria/rol] que te hace ganar miradas raras en una conferencia?\n\nLa mía: [opinión tuya levemente polémica en tu campo, dicha sin rodeos]. Me he equivocado en muchas cosas, pero en esta sostengo la postura.\n\nNo busco las opiniones seguras que ya tienen 500 carruseles de LinkedIn detrás. Las que dirías en la cena después del panel, cuando ya dejaste de actuar.\n\nDispara. Voy a estar en los comentarios discutiendo de buena fe.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'crowdsourced_advice',
'category' => 'engagement',
'name' => 'Pedido de consejo colectivo',
'description' => 'Pide a tu red su opinión sobre un problema real y específico.',
'content' => "Pido el cerebro colectivo en un problema real que estamos resolviendo en {{brand_name}}.\n\nContexto: [situación específica en 2-3 frases, suficiente para que alguien calificado pueda ayudar]. La restricción que hace que la respuesta obvia no sirva: [restricción específica].\n\nLo que ya probé: [opción uno, y por qué no encajó]; [opción dos, y lo que me enseñó]. Así que esas no las busco.\n\nSi resolviste algo parecido, ¿qué funcionó? Comentarios son lo mejor, pero el DM está abierto si es de esas cosas que prefieres no decir en público. Voy a escribir lo que terminemos haciendo y etiquetar a quien aporte.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
];

View file

@ -0,0 +1,322 @@
<?php
declare(strict_types=1);
return [
[
'slug' => 'mastodon_release_note',
'category' => 'product_launch',
'name' => 'Notas de la release',
'description' => 'Comparte una actualización abierta y transparente sobre una release.',
'content' => "Notas de la release de {{brand_name}}:\n\n→ [Qué se entregó]\n→ [Por qué importa]\n→ [Qué viene después]\n\nFeedback bienvenido. Responde o abre un issue.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_lessons_learned',
'category' => 'educational',
'name' => 'Lecciones aprendidas',
'description' => 'Comparte algo que aprendiste, en el estilo directo de Mastodon.',
'content' => "Algo que aprendimos en {{brand_name}} esta semana:\n\n[Lección, sé específico.]\n\nLa conclusión: [principio].\n\nQuizás le sirva a alguien más que esté construyendo [algo parecido].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_open_question',
'category' => 'engagement',
'name' => 'Pregunta abierta',
'description' => 'Haz una pregunta al fediverso y recoge perspectivas.',
'content' => "Pregunta para el fediverso:\n\n[Pregunta abierta relevante para tu audiencia.]\n\nBoosts bienvenidos si tus seguidores podrían tener algo que decir.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// product_launch
[
'slug' => 'mastodon_version_bump',
'category' => 'product_launch',
'name' => 'Nueva versión',
'description' => 'Anuncia una nueva versión con el diff que de verdad importa.',
'content' => "{{brand_name}} [versión] ya salió.\n\nQué cambió:\n- [Fix o feature]\n- [Fix o feature]\n- [Breaking change, si lo hay]\n\nNotas de upgrade: [link o instrucción corta].\n\nSi algo se rompe, cuéntanos. Leemos cada respuesta.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_new_feature_in_public',
'category' => 'product_launch',
'name' => 'Feature nuevo en público',
'description' => 'Lanza un feature y explica por qué lo construiste así.',
'content' => "Hoy agregamos [feature] a {{brand_name}}.\n\nPor qué: [el motivo real, en una frase].\n\nCómo funciona: [descripción corta y concreta].\n\nEl código está aquí: [link]. Pull requests bienvenidos.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_beta_invite',
'category' => 'product_launch',
'name' => 'Invitación a beta',
'description' => 'Invita al fediverso a un beta con expectativas honestas.',
'content' => "Buscamos beta testers para [feature] en {{brand_name}}.\n\nEstá rústico. Algunas cosas se van a romper. Queremos saber cuáles.\n\nRegistro: [link]\n\nSin NDA, sin lista de marketing, sin upsell. Solo necesitamos usuarios reales.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_self_host_release',
'category' => 'product_launch',
'name' => 'Release para self-host',
'description' => 'Avisa a quienes hacen self-host sobre una release con los detalles operativos.',
'content' => "Aviso para quienes hacen self-host de {{brand_name}}: [versión] está taggeada.\n\nMigraciones: [sí/no, tiempo estimado]\nCambios de config: [lista o ninguno]\nBreaking: [lista o ninguno]\n\nDocs: [link]. Issues: [link]. Boosts bienvenidos.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// promotion
[
'slug' => 'mastodon_paid_plan_honest',
'category' => 'promotion',
'name' => 'Plan pago, sin vueltas',
'description' => 'Menciona un plan pago sin sonar a anuncio.',
'content' => "{{brand_name}} ahora tiene plan pago. Esto es lo que te da: [feature], [feature], [feature].\n\nEl tier gratis sigue haciendo [lo que siempre hizo]. No estamos quitando nada.\n\nDetalles: [link]. Las preguntas son bienvenidas.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_sponsor_us',
'category' => 'promotion',
'name' => 'Patrocínanos',
'description' => 'Pide patrocinio o donaciones de forma transparente.',
'content' => "{{brand_name}} se sostiene con [número] horas de trabajo voluntario y [costo de hosting] al mes.\n\nSi lo usas y quieres aportar, el patrocinio está aquí: [link].\n\nPublicamos un desglose de gastos cada trimestre. Sin tiers, sin perks, solo el trabajo.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_discount_for_indies',
'category' => 'promotion',
'name' => 'Descuento para indies',
'description' => 'Ofrece un descuento sin dark patterns.',
'content' => "{{brand_name}} tiene [descuento] de descuento para devs solo y cooperativas pequeñas hasta [fecha].\n\nSin cupón, sin registro de email. El precio es más bajo si eliges el tier [nombre del plan]. Úsalo si te ayuda.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// educational
[
'slug' => 'mastodon_quick_explainer',
'category' => 'educational',
'name' => 'Explicación rápida',
'description' => 'Explica un concepto en lenguaje simple, sin relleno.',
'content' => "Explicación rápida: [concepto].\n\n[Definición en una frase.]\n\n[Una frase sobre por qué importa en la práctica.]\n\nSi quieres la versión larga, la escribimos aquí: [link].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_misconception',
'category' => 'educational',
'name' => 'Malentendido común',
'description' => 'Corrige un malentendido común con detalles específicos.',
'content' => "Mucha gente piensa que [creencia común sobre tu tema].\n\nNo es del todo así. [La situación real, con un ejemplo específico.]\n\nImporta porque [consecuencia práctica].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_reading_list',
'category' => 'educational',
'name' => 'Lista de lectura',
'description' => 'Comparte una lista de lectura corta y con opinión.',
'content' => "Cosas que estamos leyendo en {{brand_name}}:\n\n- [Título], de [autor]: [motivo en una línea].\n- [Título], de [autor]: [motivo en una línea].\n- [Título], de [autor]: [motivo en una línea].\n\nResponde con lo que tú estás leyendo. Siempre buscamos nuevas referencias.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_how_we_decided',
'category' => 'educational',
'name' => 'Cómo decidimos',
'description' => 'Repasa una decisión técnica o de producto.',
'content' => "Cómo elegimos [herramienta o enfoque] para {{brand_name}}:\n\nProbamos [opción A]. Tuvo [problema]. Probamos [opción B]. Tenía [tradeoff].\n\nElegimos [opción elegida] porque [razón]. No es perfecto. Lo que aún nos molesta es [punto débil].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// behind_the_scenes
[
'slug' => 'mastodon_dev_log',
'category' => 'behind_the_scenes',
'name' => 'Dev log',
'description' => 'Comparte lo que de verdad hiciste esta semana.',
'content' => "Dev log, semana del [fecha]:\n\nLunes: [cosa].\nMartes: [cosa].\nMiércoles: [cosa que salió mal].\nJueves: [arreglo].\nViernes: [salió o se pospuso].\n\nEsta semana es sobre todo [próximo foco].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_postmortem',
'category' => 'behind_the_scenes',
'name' => 'Postmortem corto',
'description' => 'Comparte un postmortem en lenguaje simple.',
'content' => "{{brand_name}} tuvo una caída el [fecha]. La versión corta:\n\nQué se rompió: [sistema].\nPor qué: [causa raíz].\nDuración: [tiempo].\nCómo lo arreglamos: [acción].\n\nWriteup completo con timeline: [link]. Disculpa la molestia.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_tooling_setup',
'category' => 'behind_the_scenes',
'name' => 'Nuestro stack',
'description' => 'Muestra las herramientas que usas de verdad.',
'content' => "Lo que usa {{brand_name}}, por si te da curiosidad:\n\n- Editor: [editor]\n- Lenguaje: [lenguaje]\n- Base de datos: [base de datos]\n- Hosting: [host]\n- CI: [ci]\n\nNada exótico. Stack aburrido es stack productivo.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_team_intro',
'category' => 'behind_the_scenes',
'name' => 'Quiénes somos',
'description' => 'Presenta a las personas detrás del proyecto.',
'content' => "Presentación rápida: {{brand_name}} somos [número] personas.\n\n[Nombre] trabaja en [área].\n[Nombre] trabaja en [área].\n[Nombre] trabaja en [área].\n\nEstamos repartidos por [regiones]. Contratamos abiertamente cuando contratamos, lo que es raro. Hola.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// testimonial
[
'slug' => 'mastodon_user_quote',
'category' => 'testimonial',
'name' => 'Cita de usuario',
'description' => 'Comparte una cita real, con permiso y contexto.',
'content' => "[Username] nos mandó esto sobre {{brand_name}}, publicado con permiso:\n\n\"[Cita real.]\"\n\nNos hizo la semana. Gracias [@username] por tomarte el tiempo de escribir.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_use_case_share',
'category' => 'testimonial',
'name' => 'Cómo lo usa alguien',
'description' => 'Destaca una forma específica en que alguien usa tu herramienta.',
'content' => "[Persona u organización] usa {{brand_name}} para [caso de uso específico].\n\nLo que nos contaron: \"[cita corta y específica].\"\n\nSi tienes un setup que vale la pena compartir, responde o manda un DM. Nos gusta coleccionar estos casos.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_thanks_contributor',
'category' => 'testimonial',
'name' => 'Gracias a un contribuidor',
'description' => 'Da crédito a un contribuidor por su nombre.',
'content' => "Shoutout a [@username] por [contribución específica] en {{brand_name}}.\n\nEste tipo de trabajo no es glamoroso y es la razón por la que el proyecto sigue avanzando. Gracias.\n\nEl PR está aquí: [link].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// industry_tip
[
'slug' => 'mastodon_practical_tip',
'category' => 'industry_tip',
'name' => 'Tip práctico',
'description' => 'Comparte un tip real y específico.',
'content' => "Tip si trabajas con [tema]:\n\n[Un tip concreto en lenguaje simple.]\n\nLo descubrimos a la mala después de [contexto breve]. Quizás le ahorre unas horas a alguien más.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_unpopular_opinion',
'category' => 'industry_tip',
'name' => 'Opinión impopular',
'description' => 'Comparte una postura contraria en la que de verdad crees.',
'content' => "Postura que nos mete en problemas: [creencia contraria sobre tu campo].\n\nMotivo: [el caso específico donde aplica].\n\nEstamos abiertos a estar equivocados. Si no estás de acuerdo, responde con el caso y lo leemos.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_anti_pattern',
'category' => 'industry_tip',
'name' => 'Antipatrón',
'description' => 'Señala un antipatrón común con cuidado.',
'content' => "Antipatrón que vemos mucho en [dominio]: [el patrón].\n\nPor qué te muerde: [modo de falla específico].\n\nQué hacer en su lugar: [alternativa]. No siempre, pero la mayoría de las veces.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_stop_doing_this',
'category' => 'industry_tip',
'name' => 'Deja de hacer esto',
'description' => 'Empuja contra un hábito que le cuesta tiempo a la gente.',
'content' => "Empujón amigable: deja de [hábito común] cuando trabajes con [dominio].\n\nTe cuesta [costo específico] y la alternativa es [alternativa], que toma [esfuerzo].\n\nNosotros hicimos lo mismo durante años. El cambio es chico y el retorno es real.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// event
[
'slug' => 'mastodon_event_announce',
'category' => 'event',
'name' => 'Anuncio de evento',
'description' => 'Anuncia un evento sin hype.',
'content' => "{{brand_name}} estará en [evento] el [fecha] en [ciudad].\n\n[Speaker o miembro del equipo] va a hablar de [tema] a las [hora].\n\nSi andas por ahí, pasa a saludar. Boosts bienvenidos para gente del fediverso que pueda estar cerca.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_meetup_call',
'category' => 'event',
'name' => 'Llamada para meetup',
'description' => 'Invita a la gente a un encuentro de la comunidad.',
'content' => "Llamada de la comunidad de {{brand_name}} este [día] a las [hora UTC].\n\nAgenda: [tema], [tema], Q&A abierto.\n\nLink: [link del video]. Las notas suben después en [link]. Sin login obligatorio.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_event_recap',
'category' => 'event',
'name' => 'Recap del evento',
'description' => 'Resume un evento con aprendizajes concretos.',
'content' => "De vuelta de [evento]. Tres cosas que se nos quedaron:\n\n1. [Aprendizaje específico].\n2. [Aprendizaje específico].\n3. [Aprendizaje específico].\n\nLas slides de nuestra charla están arriba: [link]. Gracias a quienes pasaron por la mesa.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// engagement
[
'slug' => 'mastodon_what_are_you_using',
'category' => 'engagement',
'name' => 'Qué estás usando',
'description' => 'Pregunta qué herramientas o setups usa la gente.',
'content' => "Curiosidad: qué está usando el fediverso para [tarea específica] en [año].\n\nNosotros estamos en [setup actual] y es [evaluación honesta]. Quiero saber por qué lo cambiarías y por qué.\n\nResponde con la herramienta y una frase sobre el tradeoff.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mastodon_show_your_work',
'category' => 'engagement',
'name' => 'Muestra tu trabajo',
'description' => 'Invita a la gente a mostrar lo que está construyendo.',
'content' => "Hilo de muestra-y-cuenta: ¿qué estás construyendo esta semana?\n\nEmpezamos. {{brand_name}} está trabajando en [cosa]. Está en [etapa] y estamos atascados en [problema].\n\nResponde con el tuyo. Boosts bienvenidos para que otros lo encuentren.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
];

View file

@ -0,0 +1,306 @@
<?php
declare(strict_types=1);
return [
[
'slug' => 'pinterest_how_to',
'category' => 'educational',
'name' => 'Pin de tutorial',
'description' => 'Pin paso a paso que genera guardados y clics.',
'content' => "Cómo [lograr resultado] en [tiempo/esfuerzo].\n\nUna guía simple de {{brand_name}}.\n\nPaso 1: [Acción]\nPaso 2: [Acción]\nPaso 3: [Acción]\n\nTutorial completo → [link]",
'image_count' => 1,
'image_keywords' => ['tutorial', 'how-to', 'guide'],
'slides' => null,
],
[
'slug' => 'pinterest_inspiration',
'category' => 'behind_the_scenes',
'name' => 'Tablero de inspiración',
'description' => 'Pin inspirador en torno a un tema o estética.',
'content' => "Inspiración de [tema], curada por {{brand_name}}.\n\nGuarda este pin para después.\n\nMás en → [link]",
'image_count' => 1,
'image_keywords' => ['inspiration', 'aesthetic', 'mood'],
'slides' => null,
],
[
'slug' => 'pinterest_product_showcase',
'category' => 'product_launch',
'name' => 'Vitrina de producto',
'description' => 'Destaca un producto con una descripción que invita al clic.',
'content' => "[Nombre del producto] de {{brand_name}}.\n\n[Descripción corta enfocada en beneficio, qué es, por qué importa.]\n\nCompra el look → [link]",
'image_count' => 1,
'image_keywords' => ['product', 'showcase', 'lifestyle'],
'slides' => null,
],
[
'slug' => 'pinterest_new_arrival',
'category' => 'product_launch',
'name' => 'Pin de novedad',
'description' => 'Anuncia un producto nuevo con palabras clave de búsqueda.',
'content' => "Novedad de {{brand_name}}: [nombre del producto].\n\n[Una frase sobre qué es y para quién es.]\n\nCaracterísticas principales:\n- [Característica 1]\n- [Característica 2]\n- [Característica 3]\n\nDisponible en [colores/tallas/opciones].\n\nCompra la colección [categoría] → [link]",
'image_count' => 1,
'image_keywords' => ['new product', 'launch', 'collection'],
'slides' => null,
],
[
'slug' => 'pinterest_collection_drop',
'category' => 'product_launch',
'name' => 'Pin de lanzamiento de colección',
'description' => 'Presenta una colección curada de productos.',
'content' => "Llegó la colección [nombre de la colección].\n\n{{brand_name}} reunió [número] piezas en torno a [tema o temporada].\n\nQué hay dentro:\n- [Tipo de artículo 1]\n- [Tipo de artículo 2]\n- [Tipo de artículo 3]\n\nPensada para [uso o público].\n\nMira la colección completa → [link]",
'image_count' => 1,
'image_keywords' => ['collection', 'lookbook', 'curated'],
'slides' => null,
],
[
'slug' => 'pinterest_pre_order',
'category' => 'product_launch',
'name' => 'Pin de preventa',
'description' => 'Genera guardados y preventas para un producto que viene.',
'content' => "Preventa abierta: [nombre del producto].\n\nLos envíos empiezan el [fecha]. Quienes compren en preventa de {{brand_name}} reciben [beneficio: acceso anticipado, regalo extra, precio fijo].\n\nPor qué comprar en preventa:\n- [Razón 1]\n- [Razón 2]\n\nReserva el tuyo → [link]",
'image_count' => 1,
'image_keywords' => ['pre-order', 'launch', 'early access'],
'slides' => null,
],
[
'slug' => 'pinterest_seasonal_sale',
'category' => 'promotion',
'name' => 'Pin de oferta de temporada',
'description' => 'Promociona una oferta de temporada con descuento claro.',
'content' => "Oferta de [temporada] en {{brand_name}}: [descuento]% off en [categoría].\n\nVálido hasta [fecha final].\n\nQué está en oferta:\n- [Categoría 1]\n- [Categoría 2]\n- [Categoría 3]\n\nUsa el código [CÓDIGO] al pagar.\n\nAprovecha la oferta → [link]",
'image_count' => 1,
'image_keywords' => ['sale', 'discount', 'seasonal shopping'],
'slides' => null,
],
[
'slug' => 'pinterest_bundle_deal',
'category' => 'promotion',
'name' => 'Pin de combo',
'description' => 'Pin de combo con precios en lista.',
'content' => "El combo [nombre del combo] de {{brand_name}}.\n\nLleva [artículo 1] + [artículo 2] + [artículo 3] juntos y ahorra [monto].\n\nQué incluye:\n- [Artículo 1] (normalmente [precio])\n- [Artículo 2] (normalmente [precio])\n- [Artículo 3] (normalmente [precio])\n\nPrecio del combo: [precio].\n\nLlévate el combo → [link]",
'image_count' => 1,
'image_keywords' => ['bundle', 'value pack', 'savings'],
'slides' => null,
],
[
'slug' => 'pinterest_free_shipping',
'category' => 'promotion',
'name' => 'Pin de envío gratis',
'description' => 'Pin con oferta centrada en envío gratis.',
'content' => "Envío gratis en cada pedido de {{brand_name}}.\n\nSin mínimo, sin código. Hasta [fecha final].\n\nQué agregar al carrito:\n- [Más vendido 1]\n- [Más vendido 2]\n- [Más vendido 3]\n\nCompra ahora → [link]",
'image_count' => 1,
'image_keywords' => ['free shipping', 'offer', 'deal'],
'slides' => null,
],
[
'slug' => 'pinterest_clearance',
'category' => 'promotion',
'name' => 'Pin de liquidación',
'description' => 'Mueve el inventario de liquidación con un pin que vale guardar.',
'content' => "Liquidación en {{brand_name}}: hasta [descuento]% off.\n\nÚltimas rebajas en [categoría]. Cuando se acabe, se acabó.\n\nDestacados:\n- [Artículo 1], [precio]\n- [Artículo 2], [precio]\n- [Artículo 3], [precio]\n\nMira la liquidación → [link]",
'image_count' => 1,
'image_keywords' => ['clearance', 'final sale', 'markdown'],
'slides' => null,
],
[
'slug' => 'pinterest_recipe',
'category' => 'educational',
'name' => 'Pin de receta',
'description' => 'Pin de receta que vale guardar, con ingredientes y pasos.',
'content' => "[Nombre de la receta], lista en [tiempo].\n\nDirecto de la cocina de {{brand_name}}.\n\nIngredientes:\n- [Ingrediente 1]\n- [Ingrediente 2]\n- [Ingrediente 3]\n- [Ingrediente 4]\n\nPreparación:\n1. [Paso 1]\n2. [Paso 2]\n3. [Paso 3]\n\nRinde [número] porciones. Receta completa → [link]",
'image_count' => 1,
'image_keywords' => ['recipe', 'food', 'cooking'],
'slides' => null,
],
[
'slug' => 'pinterest_checklist',
'category' => 'educational',
'name' => 'Pin de checklist',
'description' => 'Pin práctico de checklist hecho para guardar.',
'content' => "El checklist de [tema] de {{brand_name}}.\n\n[Una frase sobre para quién es.]\n\nEl checklist:\n- [Ítem 1]\n- [Ítem 2]\n- [Ítem 3]\n- [Ítem 4]\n- [Ítem 5]\n\nGuarda este pin para tenerlo cuando lo necesites.\n\nDescarga la versión imprimible → [link]",
'image_count' => 1,
'image_keywords' => ['checklist', 'planner', 'printable'],
'slides' => null,
],
[
'slug' => 'pinterest_beginners_guide',
'category' => 'educational',
'name' => 'Pin de guía para principiantes',
'description' => 'Pin explicativo amigable para quien empieza.',
'content' => "[Tema] para principiantes.\n\nSi eres nuevo en [tema], empieza aquí. {{brand_name}} reunió lo básico.\n\nLo que tienes que saber:\n1. [Concepto 1]\n2. [Concepto 2]\n3. [Concepto 3]\n\nError común de principiante: [error].\n\nLee la guía completa → [link]",
'image_count' => 1,
'image_keywords' => ['beginner guide', 'basics', 'tutorial'],
'slides' => null,
],
[
'slug' => 'pinterest_diy_tutorial',
'category' => 'educational',
'name' => 'Pin de tutorial DIY',
'description' => 'Pin de proyecto hazlo tú mismo con lista de materiales.',
'content' => "DIY [nombre del proyecto] en [tiempo].\n\nUn proyecto de fin de semana de {{brand_name}}.\n\nQué necesitas:\n- [Material 1]\n- [Material 2]\n- [Material 3]\n- [Herramienta 1]\n\nLos pasos:\n1. [Paso 1]\n2. [Paso 2]\n3. [Paso 3]\n\nCosto estimado: [monto].\n\nTutorial completo con fotos → [link]",
'image_count' => 1,
'image_keywords' => ['DIY', 'craft project', 'handmade'],
'slides' => null,
],
[
'slug' => 'pinterest_studio_tour',
'category' => 'behind_the_scenes',
'name' => 'Pin de tour por el estudio',
'description' => 'Lleva a los seguidores dentro del espacio de trabajo.',
'content' => "Dentro del estudio de {{brand_name}}.\n\n[Una frase sobre lo que pasa aquí.]\n\nTres cosas que vas a notar:\n- [Detalle 1]\n- [Detalle 2]\n- [Detalle 3]\n\n[Una nota sobre el espacio, el equipo o la rutina.]\n\nMás fotos del estudio → [link]",
'image_count' => 1,
'image_keywords' => ['studio', 'workspace', 'creative space'],
'slides' => null,
],
[
'slug' => 'pinterest_process_pin',
'category' => 'behind_the_scenes',
'name' => 'Pin de proceso de producción',
'description' => 'Muestra el oficio detrás del producto.',
'content' => "Cómo {{brand_name}} hace [producto].\n\nDe [materia prima] a la pieza terminada, cada paso ocurre [dónde].\n\nEl proceso:\n1. [Etapa 1]\n2. [Etapa 2]\n3. [Etapa 3]\n4. [Etapa 4]\n\nTiempo total por pieza: [duración].\n\nMira el proceso completo → [link]",
'image_count' => 1,
'image_keywords' => ['handmade', 'craft', 'process'],
'slides' => null,
],
[
'slug' => 'pinterest_founder_story',
'category' => 'behind_the_scenes',
'name' => 'Pin de historia del fundador',
'description' => 'Pin personal sobre el origen de la marca.',
'content' => "Cómo empezó {{brand_name}}.\n\n[Nombre del fundador] lanzó [marca] en [año] después de [momento de origen].\n\n[Dos frases cortas sobre el porqué y los primeros días.]\n\nQué hace diferente nuestra forma de trabajar:\n- [Valor 1]\n- [Valor 2]\n\nLee la historia completa → [link]",
'image_count' => 1,
'image_keywords' => ['founder story', 'small business', 'brand story'],
'slides' => null,
],
[
'slug' => 'pinterest_customer_review',
'category' => 'testimonial',
'name' => 'Pin de reseña de cliente',
'description' => 'Pin con cita directa de un cliente real.',
'content' => "\"[Reseña del cliente sobre el producto].\"\n- [Nombre del cliente], [ciudad o contexto]\n\nLos clientes de {{brand_name}} dejan reseñas así cada semana.\n\nQué compró [nombre del cliente]: [nombre del producto].\nPor qué lo compró: [razón].\n\nLee más reseñas → [link]",
'image_count' => 1,
'image_keywords' => ['customer review', 'testimonial', 'social proof'],
'slides' => null,
],
[
'slug' => 'pinterest_before_after',
'category' => 'testimonial',
'name' => 'Pin de antes y después',
'description' => 'Pin de transformación visual.',
'content' => "Antes y después con [producto o servicio] de {{brand_name}}.\n\nAntes: [estado inicial].\nDespués: [resultado final].\nTiempo: [duración].\n\nQué usó [nombre del cliente]:\n- [Artículo 1]\n- [Artículo 2]\n\n[Una frase sobre la reacción del cliente.]\n\nMira más antes y después → [link]",
'image_count' => 1,
'image_keywords' => ['before and after', 'transformation', 'results'],
'slides' => null,
],
[
'slug' => 'pinterest_case_study',
'category' => 'testimonial',
'name' => 'Pin de caso de éxito',
'description' => 'Mini caso de éxito con números concretos.',
'content' => "Caso de éxito: cómo [nombre del cliente] usó {{brand_name}} para [resultado].\n\nLa situación: [una frase].\nQué probaron: [producto o servicio].\nEl resultado: [número o resultado específico] en [periodo].\n\nPor qué funcionó:\n- [Razón 1]\n- [Razón 2]\n\nLee el caso de éxito completo → [link]",
'image_count' => 1,
'image_keywords' => ['case study', 'results', 'success story'],
'slides' => null,
],
[
'slug' => 'pinterest_pro_tip',
'category' => 'industry_tip',
'name' => 'Pin de consejo profesional',
'description' => 'Pin con un solo consejo y beneficio claro.',
'content' => "Consejo profesional: [consejo en una frase].\n\nLa mayoría [error común]. La solución es [la técnica real].\n\nPor qué funciona: [una frase con la razón].\n\nCuándo usarlo: [contexto o escenario].\n\nMás consejos de [tema] de {{brand_name}} → [link]",
'image_count' => 1,
'image_keywords' => ['pro tip', 'expert advice', 'industry tips'],
'slides' => null,
],
[
'slug' => 'pinterest_common_mistakes',
'category' => 'industry_tip',
'name' => 'Pin de errores comunes',
'description' => 'Lista de errores que el lector puede evitar.',
'content' => "[Número] errores de [tema] que evitar.\n\n{{brand_name}} los ve cada semana. Guarda el pin para no repetirlos.\n\nLos errores:\n1. [Error 1], haz esto en su lugar: [solución]\n2. [Error 2], haz esto en su lugar: [solución]\n3. [Error 3], haz esto en su lugar: [solución]\n\nLee el análisis completo → [link]",
'image_count' => 1,
'image_keywords' => ['common mistakes', 'tips', 'expert advice'],
'slides' => null,
],
[
'slug' => 'pinterest_industry_stat',
'category' => 'industry_tip',
'name' => 'Pin de estadística del sector',
'description' => 'Pin basado en dato que ancla un insight útil.',
'content' => "[Estadística con número]% de [público] [comportamiento].\nFuente: [fuente, año].\n\nQué significa para ti: [una frase sobre la implicación].\n\nTres formas en que los clientes de {{brand_name}} responden:\n- [Táctica 1]\n- [Táctica 2]\n- [Táctica 3]\n\nLee el reporte completo → [link]",
'image_count' => 1,
'image_keywords' => ['industry data', 'statistics', 'research'],
'slides' => null,
],
[
'slug' => 'pinterest_workshop',
'category' => 'event',
'name' => 'Pin de taller',
'description' => 'Pin para promocionar un taller presencial u online.',
'content' => "[Nombre del taller] con {{brand_name}}.\n\n[Fecha] · [hora] · [lugar u online].\n\nQué vas a aprender:\n- [Aprendizaje 1]\n- [Aprendizaje 2]\n- [Aprendizaje 3]\n\nPara quién es: [público].\nCupos: [número] limitados.\nPrecio: [monto].\n\nReserva tu lugar → [link]",
'image_count' => 1,
'image_keywords' => ['workshop', 'class', 'learning event'],
'slides' => null,
],
[
'slug' => 'pinterest_pop_up',
'category' => 'event',
'name' => 'Pin de tienda pop-up',
'description' => 'Atrae público a una tienda pop-up.',
'content' => "Tienda pop-up de {{brand_name}} en [ciudad].\n\n[Periodo] · [dirección] · [horario].\n\nQué vas a encontrar:\n- [Categoría 1]\n- [Categoría 2]\n- [Exclusivo en tienda]\n\n[Una frase sobre lo que hace que el día valga la pena.]\n\nMira cómo llegar y los detalles → [link]",
'image_count' => 1,
'image_keywords' => ['pop-up shop', 'event', 'in-person shopping'],
'slides' => null,
],
[
'slug' => 'pinterest_webinar',
'category' => 'event',
'name' => 'Pin de webinar',
'description' => 'Promociona un webinar gratuito o pago.',
'content' => "Webinar gratuito: [tema].\n\nPresentado por {{brand_name}} el [fecha] a las [hora, zona horaria].\n\nQué vamos a cubrir:\n- [Punto 1]\n- [Punto 2]\n- [Punto 3]\n\nPara quién es: [público].\nGrabación: enviada a todos los inscritos.\n\nReserva tu lugar → [link]",
'image_count' => 1,
'image_keywords' => ['webinar', 'online event', 'training'],
'slides' => null,
],
[
'slug' => 'pinterest_holiday_event',
'category' => 'event',
'name' => 'Pin de evento festivo',
'description' => 'Pin de evento o promoción con tema festivo.',
'content' => "Evento de [festividad] de {{brand_name}}.\n\n[Fecha] · [lugar u online].\n\nEn la agenda:\n- [Actividad 1]\n- [Actividad 2]\n- [Actividad 3]\n\nQué esperar: [una frase].\nConfirma asistencia antes del [fecha].\n\nAgenda completa y RSVP → [link]",
'image_count' => 1,
'image_keywords' => ['holiday event', 'seasonal', 'celebration'],
'slides' => null,
],
[
'slug' => 'pinterest_question_pin',
'category' => 'engagement',
'name' => 'Pin de pregunta',
'description' => 'Pin con pregunta que invita a comentar.',
'content' => "[Pregunta abierta para el público].\n\n{{brand_name}} tiene curiosidad. Deja tu respuesta en los comentarios.\n\nAlgunas pistas para pensar:\n- [Pista 1]\n- [Pista 2]\n- [Pista 3]\n\nVamos a compartir las respuestas más interesantes la próxima semana.\n\nÚnete a la conversación → [link]",
'image_count' => 1,
'image_keywords' => ['question', 'community', 'discussion'],
'slides' => null,
],
[
'slug' => 'pinterest_this_or_that',
'category' => 'engagement',
'name' => 'Pin de esto o aquello',
'description' => 'Pin de preferencia lado a lado.',
'content' => "Esto o aquello: [opción A] u [opción B].\n\n{{brand_name}} quiere saber de qué lado estás. No hay respuesta incorrecta.\n\nA favor de [opción A]: [una frase].\nA favor de [opción B]: [una frase].\n\nVota en los comentarios. Vamos a contar los votos.\n\nMás encuestas → [link]",
'image_count' => 1,
'image_keywords' => ['poll', 'this or that', 'preference'],
'slides' => null,
],
[
'slug' => 'pinterest_giveaway',
'category' => 'engagement',
'name' => 'Pin de sorteo',
'description' => 'Pin que anuncia un sorteo con reglas claras.',
'content' => "Sorteo de {{brand_name}}: gana [premio].\n\nUn ganador elegido el [fecha].\n\nCómo participar:\n1. Guarda este pin.\n2. Sigue a {{brand_name}} en Pinterest.\n3. Comenta con [pista].\n\nAbierto a: [región].\nValor: [monto].\n\nReglas completas → [link]",
'image_count' => 1,
'image_keywords' => ['giveaway', 'contest', 'prize'],
'slides' => null,
],
];

View file

@ -0,0 +1,322 @@
<?php
declare(strict_types=1);
return [
[
'slug' => 'threads_hot_take',
'category' => 'industry_tip',
'name' => 'Opinión polémica',
'description' => 'Un post corto y opinado pensado para generar respuestas.',
'content' => "Opinión impopular: [afirmación contraintuitiva sobre tu industria].\n\nPor qué pienso esto →\n\n[Razonamiento breve en 1 o 2 oraciones.]\n\n¿Estoy equivocado?",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_quick_tip',
'category' => 'educational',
'name' => 'Tip rápido',
'description' => 'Un tip accionable, en tono corto y amigable.',
'content' => "Tip rápido de {{brand_name}}:\n\n[Un tip único, específico y accionable.]\n\nSuena simple. Lo cambia todo.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_question',
'category' => 'engagement',
'name' => 'Pregunta abierta',
'description' => 'Hacele una pregunta a la comunidad para mover conversación.',
'content' => "Pregunta sincera para la comunidad de {{brand_name}}:\n\n[Pregunta, abierta y suficientemente específica para responder.]\n\nNo hay respuestas equivocadas. Tengo curiosidad por leer las tuyas.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// PRODUCT LAUNCH
[
'slug' => 'threads_product_launch_soft',
'category' => 'product_launch',
'name' => 'Lanzamiento tranqui',
'description' => 'Anuncio casual y discreto de algo nuevo.',
'content' => "ok bueno. lanzamos [nombre del producto] hoy.\n\nllevo trabajando en esto [duración] y medio que no puedo creer que esté en vivo.\n\n[una cosa específica que hace y de la que estás orgulloso].\n\nsi lo probás, contame qué se rompe.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_product_launch_story',
'category' => 'product_launch',
'name' => 'Por qué lo construimos',
'description' => 'Historia personal detrás del producto o feature nuevo.',
'content' => "empecé a construir [nombre del producto] porque [frustración personal específica].\n\npensé que iba a llevar un fin de semana. llevó [tiempo real].\n\nestá en vivo ahora en {{brand_name}}. honestamente sigo sorprendido de que funcione.\n\nme encantaría escuchar qué pensás después de probarlo.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_product_launch_feature',
'category' => 'product_launch',
'name' => 'Feature nuevo',
'description' => 'Anuncia un solo feature dentro de un producto existente.',
'content' => "cosa chica pero estoy raramente entusiasmado con esto.\n\n{{brand_name}} ahora [hace esta cosa específica].\n\nel motivo: la gente seguía pidiendo [la necesidad de fondo]. así que lo hicimos.\n\nestá en vivo. probalo y contame si es realmente útil o solo una cosa más ahora.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// PROMOTION
[
'slug' => 'threads_promo_discount',
'category' => 'promotion',
'name' => 'Descuento casual',
'description' => 'Forma relajada de mencionar una promo o descuento.',
'content' => "tenemos [monto de descuento] off en [producto o plan] esta semana en {{brand_name}}.\n\nno voy a hacer toda la cosa del contador. solo me pareció mencionarlo una vez y dejar que la gente decida.\n\ncódigo: [código]. termina [fecha].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_promo_bundle',
'category' => 'promotion',
'name' => 'Combo',
'description' => 'Promociona un combo en tono relajado.',
'content' => "combiné [item uno] e [item dos] juntos porque la gente igual los compraba en el mismo pedido.\n\nel par sale [precio] en {{brand_name}}, que son como [ahorro] menos que comprarlos por separado.\n\neso es. ese es el post.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_promo_last_chance',
'category' => 'promotion',
'name' => 'Último aviso',
'description' => 'Empujoncito amigable de que una oferta termina.',
'content' => "aviso amigable: [nombre de la oferta] termina [fecha o hora].\n\nno trato de ser pesado. algunos me pidieron que les recordara, así que considerá esto el recordatorio.\n\nlink en bio si lo querés. cero rencor si no.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// EDUCATIONAL
[
'slug' => 'threads_edu_mistake',
'category' => 'educational',
'name' => 'Error que cometí',
'description' => 'Enseñar compartiendo un error personal.',
'content' => "cometí el mismo error [número] veces antes de darme cuenta:\n\n[el error en una oración].\n\nla solución es [la solución real en palabras simples]. nada elegante. solo tuve que dejar de hacer la cosa.\n\nposteo por si estás trabado en el mismo loop.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_edu_misconception',
'category' => 'educational',
'name' => 'Mito común',
'description' => 'Corrige una creencia común pero equivocada.',
'content' => "la gente me sigue diciendo [creencia común en tu rubro].\n\nasí no funciona.\n\n[lo que pasa de verdad, en palabras simples].\n\npuede ser obvio para algunos. aparentemente no para la mayoría de los que me escribieron la semana pasada.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_edu_resource',
'category' => 'educational',
'name' => 'Recurso recomendado',
'description' => 'Recomienda un recurso útil con contexto personal.',
'content' => "si estás tratando de aprender [tema], dejá de mirar videos de 4 horas en youtube y leé [recurso específico].\n\nlo postergué meses porque el título es aburrido. es la única cosa que realmente me hizo clic.\n\nesa es la recomendación.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_edu_step_breakdown',
'category' => 'educational',
'name' => 'Cómo hacerlo rápido',
'description' => 'Mini paso a paso en tono conversacional.',
'content' => "el tema de [tarea] en 4 líneas para los que siguen preguntando:\n\n1. [paso uno]\n2. [paso dos]\n3. [paso tres]\n4. [paso cuatro]\n\nese es todo el proceso. no necesitás un curso para esto.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// BEHIND THE SCENES
[
'slug' => 'threads_bts_morning',
'category' => 'behind_the_scenes',
'name' => 'Rutina de mañana',
'description' => 'Vistazo casual a cómo arranca un día de trabajo.',
'content' => "hoy en {{brand_name}}:\n\n- café\n- miré [problema específico] por una hora\n- me di cuenta que el bug estaba en la línea [número]\n- lo arreglé en 4 minutos\n\nla proporción de pensar versus hacer en este trabajo está genuinamente maldita.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_bts_decision',
'category' => 'behind_the_scenes',
'name' => 'Decisión que tomamos',
'description' => 'Comparte una decisión interna y el razonamiento.',
'content' => "decidimos [decisión específica] esta semana.\n\nla otra opción era [alternativa]. medio equipo quería esa. medio que yo sigo queriendo.\n\npero [el motivo real por el que ganó esta decisión].\n\npreguntame en 3 meses si fue la decisión correcta.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_bts_messy_progress',
'category' => 'behind_the_scenes',
'name' => 'Avance desprolijo',
'description' => 'Update honesto a mitad de proyecto.',
'content' => "estado actual de [nombre del proyecto]:\n\n- [porcentaje] hecho\n- [cosa específica que está funcionando]\n- [cosa específica que no está funcionando]\n- [número] pestañas abiertas que tengo miedo de cerrar\n\nlo lanzo cuando deje de hacerme pasar vergüenza.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_bts_team_moment',
'category' => 'behind_the_scenes',
'name' => 'Momento del equipo',
'description' => 'Pequeño momento humano del equipo.',
'content' => "[nombre de alguien del equipo] mandó un mensaje en slack que decía \"[cita corta graciosa o ingeniosa]\" y ahora no podemos parar de citarla.\n\nconstruir {{brand_name}} con esta gente es la mitad del motivo por el que sigo gustándome el trabajo.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// TESTIMONIAL
[
'slug' => 'threads_testimonial_quote',
'category' => 'testimonial',
'name' => 'Frase de cliente',
'description' => 'Comparte una frase real de un cliente con contexto liviano.',
'content' => "recibí este mail de [primer nombre o iniciales] ayer:\n\n\"[cita directa del cliente, 1 o 2 oraciones]\"\n\nlo leí dos veces. esta es la parte del trabajo que no aparece en las métricas.\n\ngracias por usar {{brand_name}}. de verdad.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_testimonial_outcome',
'category' => 'testimonial',
'name' => 'Resultado de cliente',
'description' => 'Habla de un resultado real de un cliente sin alardear.',
'content' => "[primer nombre del cliente] me dijo ayer que [resultado específico] después de usar {{brand_name}} por [período de tiempo].\n\nno le pedí que lo compartiera. solo mandó la captura y dijo \"pensé que querrías ver esto.\"\n\nsí. quería.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_testimonial_unexpected',
'category' => 'testimonial',
'name' => 'Uso inesperado',
'description' => 'Resalta una forma sorprendente de usar el producto.',
'content' => "no me lo esperaba.\n\nalguien usando {{brand_name}} para [uso inesperado]. no era para lo que lo construimos. aparentemente funciona.\n\nparte favorita de lanzar cosas es enterarse qué hace la gente con ellas.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// INDUSTRY TIP
[
'slug' => 'threads_industry_observation',
'category' => 'industry_tip',
'name' => 'Observación del rubro',
'description' => 'Comparte un patrón que venís notando en tu campo.',
'content' => "cosa que vengo notando en [industria]:\n\n[observación específica en una oración].\n\npodría ser un cambio real. podría ser sesgo de selección de con quién hablo. contame si lo estás viendo también.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_industry_lesson',
'category' => 'industry_tip',
'name' => 'Lección de la experiencia',
'description' => 'Una lección difícilmente aprendida, sin relleno.',
'content' => "[número] años en [industria] y la lección que más me costó creer:\n\n[la lección en una oración].\n\ntodavía me pesco ignorándola. después algo se rompe. después me acuerdo.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_industry_pushback',
'category' => 'industry_tip',
'name' => 'Contra el saber común',
'description' => 'Discrepa educadamente con un consejo común.',
'content' => "el consejo estándar en [industria] es [consejo común].\n\nvengo haciendo lo opuesto desde hace [período de tiempo]. funciona mejor para mí, al menos.\n\n[motivo breve].\n\nno digo que todos deberían. solo que la regla no es una regla.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_industry_prediction',
'category' => 'industry_tip',
'name' => 'Predicción tranqui',
'description' => 'Hace una predicción sin pavonearse.',
'content' => "predicción chica:\n\nen [horizonte de tiempo], [cambio específico en tu industria] va a ser normal.\n\npuedo estar totalmente equivocado. guardo esto para volver y reírme de mí mismo después.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// EVENT
[
'slug' => 'threads_event_announcement',
'category' => 'event',
'name' => 'Anuncio de evento',
'description' => 'Anuncia casualmente un evento próximo.',
'content' => "{{brand_name}} va a hacer [nombre del evento] el [fecha].\n\n[una o dos oraciones sobre qué es realmente y a quién le interesaría].\n\n[lugar o link]. avisale a un amigo si parece su tipo de cosa.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_event_recap',
'category' => 'event',
'name' => 'Resumen de evento',
'description' => 'Resumen honesto después de un evento.',
'content' => "volví de [nombre del evento].\n\nla mejor parte fue [momento o conversación específica].\n\nla parte más rara fue [observación honesta].\n\nsi estuviste y no llegamos a hablar, escribime. siempre hay más para decir cuando termina el panel.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_event_invite',
'category' => 'event',
'name' => 'Invitación personal',
'description' => 'Invitación directa que se siente personal.',
'content' => "voy a hacer un [tipo de evento] chico para {{brand_name}} el [fecha] y realmente quiero que estés.\n\nes [duración] y vamos a hablar de [tema específico].\n\nconfirmá en [link] si querés entrar. lo limito a [número] para que sea una conversación de verdad.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// ENGAGEMENT
[
'slug' => 'threads_engagement_recommendation',
'category' => 'engagement',
'name' => 'Pedido de recomendación',
'description' => 'Pedile recomendaciones a tu audiencia.',
'content' => "buscando recomendaciones:\n\n[cosa específica para la que necesitás recomendaciones].\n\nya probé [opción a] y [opción b]. necesito algo que [restricción específica].\n\nla mejor respuesta se gana mi gratitud eterna. ese es el premio.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_engagement_this_or_that',
'category' => 'engagement',
'name' => 'Esto o aquello',
'description' => 'Pregunta binaria rápida para mover respuestas.',
'content' => "[opción a] u [opción b].\n\nsin término medio. sin \"depende\". elegí una y contame por qué.\n\nestamos teniendo la versión {{brand_name}} de este debate en el chat del equipo y estamos profunda, profundamente divididos.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'threads_engagement_confession',
'category' => 'engagement',
'name' => 'Pequeña confesión',
'description' => 'Comparte algo chico y con el que la gente se identifica.',
'content' => "pequeña confesión.\n\ntodavía [costumbre algo vergonzosa relacionada a tu trabajo o vida].\n\ndecime que no soy el único. o decime que soy el único. de cualquier forma me gustaría saber.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
];

342
templates/es/x_post.php Normal file
View file

@ -0,0 +1,342 @@
<?php
declare(strict_types=1);
return [
[
'slug' => 'flash_sale',
'category' => 'promotion',
'name' => 'Oferta relámpago',
'description' => 'Post corto en X para una oferta relámpago con urgencia.',
'content' => "🔥 ¡Oferta relámpago en {{brand_name}}!\n\n[Descuento]% off en [producto/servicio], termina en 24 horas.\n\nSin código → [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'success_story',
'category' => 'testimonial',
'name' => 'Caso de éxito',
'description' => 'Formato breve de caso de éxito para X.',
'content' => "\"[Cita corta del cliente.]\"\n- @[handle]\n\nPor esto hacemos lo que hacemos en {{brand_name}}. 🙌",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'this_or_that_poll',
'category' => 'engagement',
'name' => 'Esto o aquello',
'description' => 'Genera engagement con una elección binaria simple.',
'content' => "Pregunta rápida para la comunidad de {{brand_name}}:\n\n¿[Opción A] o [Opción B]?\n\nResponde con tu elección y por qué 👇",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// product_launch
[
'slug' => 'shipped_today',
'category' => 'product_launch',
'name' => 'Lanzado hoy',
'description' => 'Anuncio casual de release con un cambio concreto.',
'content' => "Lanzado hoy: [feature].\n\nHace [cosa específica] para que dejes de [solución incómoda].\n\nYa está activo en {{brand_name}}.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'new_feature_one_liner',
'category' => 'product_launch',
'name' => 'Feature en una línea',
'description' => 'Pitch de una frase para una nueva feature.',
'content' => "{{brand_name}} ahora [hace cosa específica].\n\nSi has estado [haciendo solución dolorosa], pruébalo: [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'beta_invite',
'category' => 'product_launch',
'name' => 'Invitación al beta',
'description' => 'Llamada abierta para testers del beta.',
'content' => "Abrimos beta de [feature] esta semana.\n\nBuscamos [número] personas que [caso de uso].\n\nResponde si eres tú.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'finally_built_it',
'category' => 'product_launch',
'name' => 'Por fin lo hicimos',
'description' => 'Tono honesto de "tardamos pero salió".',
'content' => "Por fin construimos [feature]. La gente lo pedía desde [período].\n\nYa está activo en {{brand_name}} hoy. Perdón por la demora.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// promotion
[
'slug' => 'weekend_deal',
'category' => 'promotion',
'name' => 'Oferta de fin de semana',
'description' => 'Post de descuento solo en fin de semana.',
'content' => "Solo el fin de semana: [descuento] off en [producto] en {{brand_name}}.\n\nCódigo [CODE]. Termina domingo a medianoche. Eso es todo.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'free_shipping',
'category' => 'promotion',
'name' => 'Envío gratis',
'description' => 'Anuncio de ventana de envío gratis.',
'content' => "Envío gratis en pedidos de {{brand_name}} sobre $[monto] esta semana.\n\nSin código, sin trampas. Vuelve a lo normal el lunes.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'last_call',
'category' => 'promotion',
'name' => 'Última llamada',
'description' => 'Últimas horas de una oferta.',
'content' => "Última llamada. [Nombre de la oferta] termina hoy a las [hora].\n\nSi tienes {{brand_name}} en el carrito, es el precio más bajo del año: [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bundle_offer',
'category' => 'promotion',
'name' => 'Oferta combo',
'description' => 'Presenta un combo como oferta económica.',
'content' => "Nuevo combo en {{brand_name}}: [Producto A] + [Producto B] por [precio].\n\nSon [monto] menos que comprarlos por separado. Solo [cantidad] unidades.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// educational
[
'slug' => 'one_thing_we_learned',
'category' => 'educational',
'name' => 'Algo que aprendimos',
'description' => 'Comparte una lección concreta.',
'content' => "Algo que aprendimos en {{brand_name}} este mes:\n\n[Hallazgo]. Pensábamos [suposición vieja], pero [dato] probó lo contrario.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'common_mistake',
'category' => 'educational',
'name' => 'Error común',
'description' => 'Señala un error que comete la gente.',
'content' => "La mayoría se equivoca en [tema] porque [error común].\n\nLo que sí funciona: [contra-enfoque]. Lo probamos con [número] clientes.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'quick_tip',
'category' => 'educational',
'name' => 'Tip rápido',
'description' => 'Tip corto y accionable.',
'content' => "Tip rápido si usas {{brand_name}}:\n\n[Acción] antes de [paso]. Te ahorra unos [tiempo/resultado] a la mayoría.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'myth_vs_reality',
'category' => 'educational',
'name' => 'Mito vs realidad',
'description' => 'Derriba un mito del sector.',
'content' => "Mito: [creencia común sobre el tema].\n\nRealidad: [contra-dato con número]. Lo vemos en datos de {{brand_name}} cada semana.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// behind_the_scenes
[
'slug' => 'how_we_built_it',
'category' => 'behind_the_scenes',
'name' => 'Cómo lo construimos',
'description' => 'Vistazo casual detrás de cámaras.',
'content' => "Cómo construimos [feature] en {{brand_name}}:\n\nEmpezamos con [primer intento]. Se rompió. Cambiamos a [enfoque 2]. Eso fue lo que salió.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'team_at_work',
'category' => 'behind_the_scenes',
'name' => 'Equipo trabajando',
'description' => 'Foto de lo que el equipo está haciendo ahora.',
'content' => "Lo que el equipo de {{brand_name}} está haciendo ahora:\n\n[Persona/rol] debugueando [problema]. [Persona/rol] en [otro proyecto]. Nivel de café: alto.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'mistake_we_made',
'category' => 'behind_the_scenes',
'name' => 'Error que cometimos',
'description' => 'Postmortem honesto en un tweet.',
'content' => "La regamos en {{brand_name}} la semana pasada.\n\n[Qué se rompió]. Afectó a [número] clientes con [impacto]. Lo arreglamos [cómo]. Perdón a los afectados.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'office_moment',
'category' => 'behind_the_scenes',
'name' => 'Momento de oficina',
'description' => 'Escena pequeña y humana de oficina.',
'content' => "Momento aleatorio en la oficina de {{brand_name}}:\n\n[Escena, ej.: diseñador peleando con dev por 2px de border-radius]. Es así casi todos los días.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// testimonial
[
'slug' => 'customer_dm',
'category' => 'testimonial',
'name' => 'DM de cliente',
'description' => 'Comparte un mensaje real de cliente.',
'content' => "Me llegó este DM de un cliente de {{brand_name}} hoy:\n\n\"[Cita corta sobre lo que cambió para él].\"\n\nEs la parte del trabajo que no cansa.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'before_and_after',
'category' => 'testimonial',
'name' => 'Antes y después',
'description' => 'Números concretos de antes/después de un cliente.',
'content' => "[Cliente] antes de {{brand_name}}: [métrica].\n\n[Cliente] después de [período]: [nueva métrica].\n\nNada más cambió en su setup.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'one_line_review',
'category' => 'testimonial',
'name' => 'Reseña de una línea',
'description' => 'Frase corta de un cliente.',
'content' => "\"[Frase específica del cliente, máximo 12 palabras.]\"\n\n- [Cliente], [cargo] en [empresa]\n\nNo le pedimos que escribiera eso.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// industry_tip
[
'slug' => 'hot_take',
'category' => 'industry_tip',
'name' => 'Opinión fuerte',
'description' => 'Opinión con punto de vista sobre el sector.',
'content' => "Opinión fuerte: la mayoría en [sector] cree que [creencia común].\n\nDespués de [tiempo] con {{brand_name}}, pienso lo opuesto. [Razón].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'overrated_underrated',
'category' => 'industry_tip',
'name' => 'Sobrevalorado subvalorado',
'description' => 'Junta algo sobrevalorado y algo subvalorado.',
'content' => "Sobrevalorado en [sector]: [práctica común].\n\nSubvalorado: [práctica ignorada].\n\nDejamos la primera en {{brand_name}} hace un año.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'unpopular_opinion',
'category' => 'industry_tip',
'name' => 'Opinión impopular',
'description' => 'Comparte una observación contraria.',
'content' => "Opinión impopular: [afirmación contraria sobre el sector].\n\nLos clientes de {{brand_name}} lo prueban cada mes. Los datos no son sutiles.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'what_changed_my_mind',
'category' => 'industry_tip',
'name' => 'Lo que me hizo cambiar',
'description' => 'Momento honesto de cambiar de opinión.',
'content' => "Antes pensaba [creencia vieja sobre el sector].\n\nLuego pasó [evento/dato] en {{brand_name}}. Ahora creo [nueva visión]. Todavía ajustando.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// event
[
'slug' => 'event_announcement',
'category' => 'event',
'name' => 'Anuncio de evento',
'description' => 'Anuncio simple de evento.',
'content' => "{{brand_name}} organiza [nombre del evento] el [fecha] en [ciudad].\n\n[Tema]. Gratis, [capacidad] cupos. Regístrate: [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'event_recap',
'category' => 'event',
'name' => 'Recap del evento',
'description' => 'Resumen corto después de un evento.',
'content' => "[Número] personas en el [evento] de {{brand_name}} anoche.\n\nPregunta favorita: \"[pregunta real del público].\" La grabación sale el viernes.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'webinar_reminder',
'category' => 'event',
'name' => 'Recordatorio de webinar',
'description' => 'Recordatorio de que un webinar empieza pronto.',
'content' => "Recordatorio: webinar de {{brand_name}} sobre [tema] empieza en [tiempo].\n\n[Speaker] va a mostrar [cosa específica]. Última chance para registrarte: [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
// engagement
[
'slug' => 'open_question',
'category' => 'engagement',
'name' => 'Pregunta abierta',
'description' => 'Hazle una pregunta real al público.',
'content' => "Pregunta sincera para quien usa [herramienta/categoría]:\n\n¿Qué es lo único que aún no hace y te gustaría que hiciera?\n\nPregunto porque {{brand_name}} está trabajando en eso.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'fill_in_the_blank',
'category' => 'engagement',
'name' => 'Completa la frase',
'description' => 'Provocación ligera tipo completa la frase.',
'content' => "Completa:\n\nLo peor de [tarea/tema] es ______.\n\nLeo cada respuesta. Vamos a usarlas para planear el próximo trimestre de {{brand_name}}.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'show_us_your_setup',
'category' => 'engagement',
'name' => 'Muéstranos tu setup',
'description' => 'Pide a la gente que comparta algo visual.',
'content' => "Muéstranos tu [cosa, escritorio, dashboard, rutina semanal].\n\nVamos a destacar nuestros tres favoritos en la cuenta de {{brand_name}} la próxima semana. Sin filtro.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
];

View file

@ -0,0 +1,316 @@
<?php
declare(strict_types=1);
return [
[
'slug' => 'bluesky_now_live',
'category' => 'product_launch',
'name' => 'No ar',
'description' => 'Anuncie um lançamento no clima aberto e descentralizado do Bluesky.',
'content' => "No ar: [feature/produto] do {{brand_name}}.\n\nO que mudou: [resumo em uma linha].\n\nPra quem é: [quem se beneficia].\n\nLink → [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_thought',
'category' => 'industry_tip',
'name' => 'Pensamento curto',
'description' => 'Uma observação concisa que soa natural no Bluesky.',
'content' => "[Observação sobre seu setor, contada em uma ou duas frases.]\n\nSimples, mas vale dizer em voz alta.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_invite',
'category' => 'engagement',
'name' => 'Convite à comunidade',
'description' => 'Chame a comunidade pra um tema ou conversa.',
'content' => "Se você se importa com [tema], a gente quer ouvir você.\n\nO que tem rondado sua cabeça ultimamente?\n\n- time {{brand_name}}",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_changelog_drop',
'category' => 'product_launch',
'name' => 'Changelog novo',
'description' => 'Post de changelog direto pra um release.',
'content' => "v[versão] saiu.\n\n• [mudança 1]\n• [mudança 2]\n• [bug fix]\n\nSem migrations. Notas completas: [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_open_beta',
'category' => 'product_launch',
'name' => 'Beta aberto',
'description' => 'Convide usuários pra um beta público.',
'content' => "Beta aberto: [feature] tá no ar pra quem quiser testar.\n\nTem partes meio ásperas. É justamente o ponto. Bug reports são bem-vindos.\n\nInscreva-se: [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_api_release',
'category' => 'product_launch',
'name' => 'Release de API',
'description' => 'Anuncie uma nova API ou feature pra desenvolvedores.',
'content' => "Novo: [endpoint/SDK] do {{brand_name}}.\n\nDocs: [link]\nRepo de exemplo: [link]\n\nSe faltar algo nas docs, fala pra gente. A gente conserta mais rápido do que você espera.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_promo_discount',
'category' => 'promotion',
'name' => 'Janela de desconto',
'description' => 'Promo com prazo, dita de forma direta.',
'content' => "[X]% off em [plano/produto] até [data].\n\nSem cadastro de email. Sem popup. Só o código: [CÓDIGO]\n\n[link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_promo_lifetime',
'category' => 'promotion',
'name' => 'Lifetime deal',
'description' => 'Oferta lifetime/early-bird voltada pra builders.',
'content' => "Lifetime deal no {{brand_name}}: [preço] uma vez, sem mensalidade.\n\nLimitado a [número] vagas. Depois disso voltamos pro mensal.\n\nPegue uma: [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_promo_referral',
'category' => 'promotion',
'name' => 'Bônus por indicação',
'description' => 'Oferta de indicação direta.',
'content' => "Indique um amigo pro {{brand_name}}, vocês dois ganham [recompensa].\n\nSem níveis. Sem ranking. Só mande seu link: [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_edu_one_thing',
'category' => 'educational',
'name' => 'Uma coisa que aprendi',
'description' => 'Uma lição concreta, contada de forma simples.',
'content' => "Uma coisa que aprendi trabalhando com [tema]:\n\n[lição concreta, uma ou duas frases].\n\nÓbvio em retrospecto. Não era óbvio antes.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_edu_misconception',
'category' => 'educational',
'name' => 'Mito comum',
'description' => 'Corrija um mito difundido na sua área.',
'content' => "Crença comum: [mito sobre sua área].\n\nO que é verdade de fato: [correção].\n\nA diferença importa quando [cenário específico].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_edu_quick_how',
'category' => 'educational',
'name' => 'Tutorial rápido',
'description' => 'Tutorial curto sobre uma tarefa específica.',
'content' => "Como [tarefa específica] no [ferramenta]:\n\n1. [passo]\n2. [passo]\n3. [passo]\n\nÉ isso. Sem config escondida.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_edu_tradeoff',
'category' => 'educational',
'name' => 'Explicando um tradeoff',
'description' => 'Mostre um tradeoff real do seu domínio.',
'content' => "[Opção A] vs [Opção B] é basicamente um tradeoff entre [coisa 1] e [coisa 2].\n\nSe você se importa mais com [coisa 1], escolhe A. Se [coisa 2], escolhe B. A maioria dos times escolhe A e se arrepende depois.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_bts_stack',
'category' => 'behind_the_scenes',
'name' => 'Nossa stack',
'description' => 'Nota honesta sobre a stack vinda de dentro do time.',
'content' => "Nossa stack no {{brand_name}}: [tech 1], [tech 2], [tech 3].\n\nEscolhemos [tech 1] por [motivo]. A gente se arrepende de ter escolhido [tech] por [motivo]. Provavelmente trocamos no próximo trimestre.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_bts_postmortem',
'category' => 'behind_the_scenes',
'name' => 'Mini postmortem',
'description' => 'Nota curta e transparente sobre um incidente.',
'content' => "[Serviço/feature] ficou fora do ar por [duração] hoje.\n\nCausa: [explicação simples].\nFix: [o que fizemos].\n\nAdicionamos [proteção] pra que a mesma coisa não aconteça do mesmo jeito de novo.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_bts_decision',
'category' => 'behind_the_scenes',
'name' => 'Por que escolhemos X',
'description' => 'Explique uma decisão recente de design ou produto.',
'content' => "Por que escolhemos [decisão] em vez de [alternativa]:\n\n[motivo em uma frase].\n\nNão é a escolha popular. Mas combina com como nossos usuários trabalham de verdade.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_bts_numbers',
'category' => 'behind_the_scenes',
'name' => 'Números que acompanhamos',
'description' => 'Compartilhe uma métrica real e o que ela significa.',
'content' => "Um número que a gente acompanha de verdade no {{brand_name}}: [métrica].\n\nMês passado foi [valor]. Na semana anterior, [valor].\n\nÉ a métrica que nos diz se [resultado] é real.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_testimonial_quote',
'category' => 'testimonial',
'name' => 'Citação de um usuário',
'description' => 'Citação curta de um usuário, sem enfeite.',
'content' => "De um usuário esta semana:\n\n\"[citação curta e específica sobre o produto].\"\n\n- [primeiro nome], [cargo]\n\nÉ esse tipo de feedback que mantém a gente construindo.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_testimonial_workflow',
'category' => 'testimonial',
'name' => 'Como um cliente usa',
'description' => 'História específica do workflow de um usuário.',
'content' => "[Cliente/time] usa o {{brand_name}} pra [tarefa específica].\n\nAntes: [jeito antigo].\nAgora: [jeito novo].\n\nNão é dramático. Só menos atrito todo dia.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_testimonial_result',
'category' => 'testimonial',
'name' => 'Resultado concreto',
'description' => 'Um resultado específico e mensurável de um cliente.',
'content' => "[Cliente] reduziu [tarefa] de [tempo antigo] pra [tempo novo] usando o {{brand_name}}.\n\nUma mudança de workflow. Sem novas contratações.\n\nEstudo completo: [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_industry_take',
'category' => 'industry_tip',
'name' => 'Opinião meio impopular',
'description' => 'Uma opinião real sobre algo do seu setor.',
'content' => "Opinião moderada: [opinião sobre seu setor].\n\nSei que é impopular. Já mudei de ideia sobre isso duas vezes. Por enquanto acho que se sustenta.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_industry_pattern',
'category' => 'industry_tip',
'name' => 'Um padrão que vejo sempre',
'description' => 'Padrão observado entre times ou projetos.',
'content' => "Um padrão que vejo sempre em [setor/cargo]:\n\n[padrão em uma frase].\n\nGeralmente funciona até [marco] e aí para de funcionar discretamente.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_industry_anti_advice',
'category' => 'industry_tip',
'name' => 'Conselho que eu pularia',
'description' => 'Anti-conselho: conselho comum que não se sustenta.',
'content' => "Conselho que se ouve muito: [conselho comum].\n\nNa prática isso desmorona quando [cenário]. A versão que funciona de verdade é [conselho revisado].",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_industry_link_share',
'category' => 'industry_tip',
'name' => 'Link com contexto',
'description' => 'Compartilhe um link com um motivo real pra ler.',
'content' => "Vale a leitura: [título do artigo/post].\n\nPor quê: [uma coisa específica que o texto acerta].\n\n[link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_event_announce',
'category' => 'event',
'name' => 'Anúncio de evento',
'description' => 'Anuncie um evento ou talk que vem aí.',
'content' => "[Nome do evento] em [data] às [hora/timezone].\n\nTema: [o que vamos cobrir].\nFormato: [talk / Q&A / demo].\n\nGratuito, sem cadastro: [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_event_speaking',
'category' => 'event',
'name' => 'Vou palestrar',
'description' => 'Avise que você vai palestrar em uma conferência.',
'content' => "Vou palestrar no [evento] em [data].\n\nTalk: [título ou tema da talk em palavras simples].\n\nSe você estiver por lá, dá um oi. Especialmente se você discordar da talk.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_event_recap',
'category' => 'event',
'name' => 'Recap do evento',
'description' => 'Recap curto depois de um evento ou meetup.',
'content' => "Recap rápido do [evento]:\n\n• [o que funcionou]\n• [o que nos surpreendeu]\n• [o que vamos fazer diferente da próxima vez]\n\nValeu a quem apareceu.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_event_office_hours',
'category' => 'event',
'name' => 'Office hours',
'description' => 'Convite pra office hours abertas ou AMA.',
'content' => "Office hours abertas nesta [dia] às [hora/timezone].\n\nTraga perguntas reais sobre [tema]. Prefiro responder as difíceis do que as fáceis.\n\nLink pra entrar: [link]",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_engagement_question',
'category' => 'engagement',
'name' => 'Pergunta real',
'description' => 'Uma pergunta genuína, não engagement bait.',
'content' => "Pergunta genuína pra quem trabalha com [tema]:\n\n[pergunta específica].\n\nNão é retórica. Tô travado nisso e curioso pra saber como os outros lidam.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_engagement_poll_lite',
'category' => 'engagement',
'name' => 'Dois lados',
'description' => 'Um ou/ou leve pra puxar respostas.',
'content' => "Dois lados sobre [tema]:\n\nA: [opção A]\nB: [opção B]\n\nQual você usa de verdade no dia a dia, e o que te fez escolher?",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
[
'slug' => 'bluesky_engagement_show_us',
'category' => 'engagement',
'name' => 'Mostra teu setup',
'description' => 'Convide usuários a mostrar o setup ou workflow deles.',
'content' => "Mostra teu [setup / workflow / config] pra [tarefa].\n\nResponda com um screenshot ou uma linha. A gente tá juntando bons padrões pra compartilhar de volta.",
'image_count' => 0,
'image_keywords' => null,
'slides' => null,
],
];

View file

@ -0,0 +1,322 @@
<?php
declare(strict_types=1);
return [
[
'slug' => 'facebook_special_offer',
'category' => 'promotion',
'name' => 'Oferta especial',
'description' => 'Divulgue uma oferta especial no Facebook com uma chamada clara para ação.',
'content' => "🎉 Oferta especial da {{brand_name}}.\n\n[Resumo da oferta], válida só até [data].\n\nClique no link para garantir a sua: [link]\n\nFicou com alguma dúvida? Manda nos comentários, a gente lê todas.",
'image_count' => 1,
'image_keywords' => ['offer', 'sale', 'promotion'],
'slides' => null,
],
[
'slug' => 'facebook_community_story',
'category' => 'behind_the_scenes',
'name' => 'História da comunidade',
'description' => 'Compartilhe a história de um cliente ou momento da equipe para criar conexão.',
'content' => "Conheça [nome].\n\n[História curta, 2 a 4 frases, sobre como essa pessoa usa a {{brand_name}} ou o que ela traz para a nossa comunidade.]\n\nÉ por isso que a gente faz o que faz. ❤️",
'image_count' => 1,
'image_keywords' => ['people', 'story', 'community'],
'slides' => null,
],
[
'slug' => 'facebook_event_invite',
'category' => 'event',
'name' => 'Convite para evento',
'description' => 'Convide seus seguidores para um próximo evento ou webinar.',
'content' => "📅 Anota na agenda.\n\nA {{brand_name}} vai realizar [nome do evento] em [data] às [hora].\n\nVamos falar sobre:\n• [Tópico 1]\n• [Tópico 2]\n• [Tópico 3]\n\nA participação é gratuita. Garanta seu lugar → [link]",
'image_count' => 1,
'image_keywords' => ['event', 'calendar', 'invitation'],
'slides' => null,
],
// Product launch (4)
[
'slug' => 'facebook_new_product_reveal',
'category' => 'product_launch',
'name' => 'Revelação de novo produto',
'description' => 'Anuncie um produto totalmente novo para a sua comunidade no Facebook.',
'content' => "Depois de [número] meses de trabalho, finalmente a gente pode falar sobre isso.\n\nApresentamos [nome do produto], o(a) [descrição curta] que criamos porque [motivo]. Nosso time ouvia a mesma coisa das pessoas dessa comunidade: [pedido recorrente]. Então fizemos.\n\nA {{brand_name}} envia o primeiro lote em [data]. O link está no primeiro comentário.\n\nO que você quer saber sobre ele? Deixa sua pergunta aqui embaixo que a gente responde uma por uma essa semana.",
'image_count' => 1,
'image_keywords' => ['product', 'launch', 'unboxing'],
'slides' => null,
],
[
'slug' => 'facebook_product_restock',
'category' => 'product_launch',
'name' => 'Anúncio de reposição de produto',
'description' => 'Avise seus seguidores que um produto esgotado voltou ao estoque.',
'content' => "Voltou.\n\nO [nome do produto] esgotou em [período] da última vez, e muita gente ficou na lista de espera. Repusemos hoje de manhã com [quantidade] unidades.\n\nSe você perdeu antes, esse é o seu lembrete: [link]\n\nPara quem já tem um, o que você diria para alguém que está pensando em comprar?",
'image_count' => 1,
'image_keywords' => ['product', 'restock', 'shelf'],
'slides' => null,
],
[
'slug' => 'facebook_feature_release',
'category' => 'product_launch',
'name' => 'Lançamento de novo recurso',
'description' => 'Anuncie um novo recurso adicionado a um produto que já existe.',
'content' => "Atualização pequena, diferença grande.\n\nA {{brand_name}} acabou de liberar [nome do recurso]. Vocês pediram nos comentários mais vezes do que a gente conseguia contar, então aí está: [explicação em uma frase do que ele faz].\n\nJá está disponível para todo mundo a partir de hoje. Não precisa atualizar nada.\n\nSe você testar essa semana, conta o que achou. A gente já está anotando ideias para o próximo lançamento.",
'image_count' => 1,
'image_keywords' => ['feature', 'update', 'screen'],
'slides' => null,
],
[
'slug' => 'facebook_preorder_open',
'category' => 'product_launch',
'name' => 'Anúncio de pré-venda',
'description' => 'Abra a pré-venda de um produto que ainda vai ser lançado.',
'content' => "A pré-venda está aberta.\n\nO [nome do produto] começa a ser entregue em [data], e essa comunidade vai poder pedir antes. O preço de pré-venda é [preço] até [prazo], e tem só [quantidade] vagas no primeiro lote.\n\nO link está aqui: [link]\n\nSe você tem dúvida sobre [preocupação comum: entrega / tamanho / especificações], pergunta nos comentários. A gente fica por aqui a tarde toda.",
'image_count' => 1,
'image_keywords' => ['preorder', 'product', 'package'],
'slides' => null,
],
// Promotion (3)
[
'slug' => 'facebook_flash_sale',
'category' => 'promotion',
'name' => 'Alerta de promoção relâmpago',
'description' => 'Anuncie uma promoção relâmpago de curta duração com senso de urgência.',
'content' => "Promoção relâmpago, só hoje.\n\n[Desconto] em [produto/categoria] até meia-noite. Use o cupom [CÓDIGO] no checkout.\n\nEsse é o menor preço que vamos oferecer essa temporada, e só voltamos a fazer em [próxima data].\n\nLink no primeiro comentário. Marca um amigo que está de olho nisso.",
'image_count' => 1,
'image_keywords' => ['sale', 'discount', 'shopping'],
'slides' => null,
],
[
'slug' => 'facebook_holiday_promo',
'category' => 'promotion',
'name' => 'Promoção de feriado',
'description' => 'Faça uma promoção temática de feriado com tom amigável.',
'content' => "Feliz [nome do feriado] de todos nós da {{brand_name}}.\n\nPara dizer obrigado por fazer parte desse ano, estamos dando [desconto] em [produto/categoria] de [data inicial] até [data final]. Use o cupom [CÓDIGO].\n\nSeja lá o que você está comemorando essa semana, que seja bom. Conta nos comentários como você vai passar o feriado.",
'image_count' => 1,
'image_keywords' => ['holiday', 'celebration', 'gift'],
'slides' => null,
],
[
'slug' => 'facebook_bundle_deal',
'category' => 'promotion',
'name' => 'Promoção de combo',
'description' => 'Promova um combo de produtos com economia.',
'content' => "Dois favoritos nossos, melhores juntos.\n\n[Produto A] + [Produto B] agora viraram combo, e o combo te dá [valor] de economia em comparação com comprar separado. Juntamos os dois porque os clientes não paravam de pedir os dois no mesmo carrinho.\n\nGaranta o seu aqui: [link]\n\nSe você já tem um deles, o outro é a peça que faltava. Pode confiar.",
'image_count' => 1,
'image_keywords' => ['bundle', 'products', 'package'],
'slides' => null,
],
// Educational (4)
[
'slug' => 'facebook_how_to_guide',
'category' => 'educational',
'name' => 'Guia passo a passo',
'description' => 'Ensine seu público a fazer algo útil.',
'content' => "Como [tarefa] em menos de [tempo].\n\n1. [Passo 1 com um detalhe real, não uma instrução vaga]\n2. [Passo 2]\n3. [Passo 3]\n4. [Passo 4]\n\nA parte que a maioria pula é o [número do passo]. Se você só fizer uma coisa, faça essa.\n\nQual é a dúvida sobre [tema] que você sempre adia para pesquisar? Pergunta aqui embaixo que a gente responde na próxima semana.",
'image_count' => 1,
'image_keywords' => ['tutorial', 'guide', 'how to'],
'slides' => null,
],
[
'slug' => 'facebook_myth_buster',
'category' => 'educational',
'name' => 'Mito vs. verdade',
'description' => 'Desmonte um mito comum do seu setor.',
'content' => "Tem um mito sobre [tema] que não vai embora.\n\nO mito: [crença comum].\n\nO que acontece de verdade: [explicação correta, 2 a 3 frases com um exemplo ou número específico].\n\nA gente escuta isso há anos. Se você também acreditava, está em boa companhia, a maioria acreditava. Agora você sabe.\n\nQuais outros mitos do [setor] te tiram do sério?",
'image_count' => 1,
'image_keywords' => ['fact check', 'information', 'thinking'],
'slides' => null,
],
[
'slug' => 'facebook_quick_tip',
'category' => 'educational',
'name' => 'Dica rápida',
'description' => 'Compartilhe uma dica curta que seu público pode usar hoje.',
'content' => "Dica rápida que você pode usar hoje.\n\nSe você [situação comum], experimente [ação específica] em vez de [abordagem usual]. O motivo: [explicação em uma frase de por que funciona].\n\nA gente começou a fazer isso com [exemplo] e mudou a forma como a gente [resultado]. Mudança pequena, diferença real.\n\nTesta essa semana e conta como foi.",
'image_count' => 1,
'image_keywords' => ['tip', 'lightbulb', 'idea'],
'slides' => null,
],
[
'slug' => 'facebook_common_mistake',
'category' => 'educational',
'name' => 'Erro comum para evitar',
'description' => 'Ajude seus leitores a evitar um erro comum no seu campo.',
'content' => "O erro mais comum que a gente vê em [tema]: [erro específico].\n\nGeralmente acontece quando [contexto]. O resultado é [consequência], e quando você percebe, [prejuízo].\n\nO que fazer no lugar: [alternativa clara]. Leva [tempo/esforço] a mais no começo e te poupa [benefício] depois.\n\nSe você já fez isso, não está sozinho. A gente também já fez. Qual é um erro que você queria que alguém tivesse te avisado antes?",
'image_count' => 1,
'image_keywords' => ['mistake', 'warning', 'lesson'],
'slides' => null,
],
// Behind the scenes (4)
[
'slug' => 'facebook_team_intro',
'category' => 'behind_the_scenes',
'name' => 'Apresentação de membro do time',
'description' => 'Apresente um membro da equipe para a comunidade.',
'content' => "Diga oi para [nome].\n\n[Nome] é nosso(a) [cargo] e está com a {{brand_name}} há [tempo]. É por causa dele(a) que [coisa específica que essa pessoa cuida ou melhorou], e se você já mandou e-mail para o suporte, é bem provável que ele(a) tenha respondido.\n\nCuriosidade: [um detalhe humano, hobby, talento estranho, lanche favorito].\n\nManda um oi nos comentários para receber.",
'image_count' => 1,
'image_keywords' => ['team', 'portrait', 'workplace'],
'slides' => null,
],
[
'slug' => 'facebook_workspace_tour',
'category' => 'behind_the_scenes',
'name' => 'Tour pelo espaço de trabalho',
'description' => 'Mostre aos seguidores onde você trabalha ou cria.',
'content' => "Uma espiada no lugar onde o trabalho acontece.\n\nEsse é o(a) [nome da sala/espaço] da {{brand_name}}. [Um detalhe específico, a iluminação, a bagunça, o canto que todo mundo disputa]. A gente passa a maior parte do dia aqui, e dá para perceber.\n\n[Segundo detalhe, algo visível na foto que tem uma história por trás].\n\nE o seu espaço de trabalho, está como agora? Resposta honesta, com xícaras de café e tudo mais.",
'image_count' => 1,
'image_keywords' => ['workspace', 'office', 'studio'],
'slides' => null,
],
[
'slug' => 'facebook_making_of',
'category' => 'behind_the_scenes',
'name' => 'Bastidores do processo',
'description' => 'Mostre como um produto ou trabalho é feito.',
'content' => "Já se perguntou como o(a) [produto/serviço] é feito de verdade?\n\nComeça com [primeiro passo] e termina com [último passo]. No meio tem muito de [descrição honesta, teste, refazer, repensar]. A versão que você acaba comprando geralmente é a [número] tentativa.\n\nAqui vai um registro do lote dessa semana. O(a) [detalhe específico] é a parte que ninguém vê mas todo mundo nota quando está bem feita.\n\nDúvidas sobre o processo? Pode mandar.",
'image_count' => 1,
'image_keywords' => ['workshop', 'process', 'craft'],
'slides' => null,
],
[
'slug' => 'facebook_milestone_celebration',
'category' => 'behind_the_scenes',
'name' => 'Comemoração de marco',
'description' => 'Comemore um marco importante com a comunidade.',
'content' => "Hoje é [marco, aniversário, número de clientes, qualquer coisa real].\n\nA gente começou a {{brand_name}} há [tempo] com [detalhe honesto da origem, a mesa da cozinha, um cliente, um notebook emprestado]. O plano era simples e meio ingênuo: [objetivo original].\n\n[Marco] depois, a gente segue por aqui, principalmente por causa das pessoas dessa comunidade que continuaram aparecendo. Obrigado, de verdade.\n\nConta nos comentários, quando você nos descobriu pela primeira vez?",
'image_count' => 1,
'image_keywords' => ['celebration', 'milestone', 'anniversary'],
'slides' => null,
],
// Testimonial (3)
[
'slug' => 'facebook_customer_quote',
'category' => 'testimonial',
'name' => 'Depoimento de cliente',
'description' => 'Compartilhe um depoimento de cliente nas próprias palavras.',
'content' => "\"[Frase direta do cliente, mantenha específica, com a voz dele(a), com um resultado ou sentimento real.]\"\n\n- [Nome do cliente], [cidade ou função]\n\nA gente recebeu essa mensagem [tempo] atrás e perguntou se podia compartilhar. [Primeiro nome] disse sim. Somos gratos por palavras assim e por todo mundo que tira um minuto para mandar.\n\nSe a {{brand_name}} fez parte da sua história também, a gente adoraria ouvir nos comentários.",
'image_count' => 1,
'image_keywords' => ['testimonial', 'happy customer', 'review'],
'slides' => null,
],
[
'slug' => 'facebook_before_after_story',
'category' => 'testimonial',
'name' => 'História de antes e depois',
'description' => 'Conte uma história de transformação de cliente.',
'content' => "Antes: [situação do cliente quando encontrou a {{brand_name}}, descreva em 2 a 3 frases honestas].\n\nDepois: [o que mudou, com um resultado específico e prazo].\n\n[Nome do cliente] mandou essa atualização no mês passado, e é o tipo de coisa que faz todo mundo no escritório ficar quieto por um segundo. Não foi a gente que fez o trabalho, foi ele(a). A gente só ajudou onde dava.\n\nSe você está em dúvida sobre [hesitação comum], histórias assim podem ser o motivo para começar.",
'image_count' => 1,
'image_keywords' => ['transformation', 'progress', 'result'],
'slides' => null,
],
[
'slug' => 'facebook_review_highlight',
'category' => 'testimonial',
'name' => 'Destaque de avaliação',
'description' => 'Destaque uma avaliação recente com contexto.',
'content' => "Avaliação 5 estrelas de [nome do cliente] essa semana:\n\n\"[Tire uma frase real e específica da avaliação, não o elogio genérico, a parte com o detalhe de verdade.]\"\n\nA gente guarda avaliações assim e relê nos dias difíceis. Obrigado, [primeiro nome].\n\nSe você tem alguns minutos e a {{brand_name}} te ajudou, deixar uma avaliação aqui é a coisa mais gentil que você pode fazer pela gente: [link]",
'image_count' => 1,
'image_keywords' => ['review', 'stars', 'feedback'],
'slides' => null,
],
// Industry tip (3)
[
'slug' => 'facebook_industry_insight',
'category' => 'industry_tip',
'name' => 'Insight do setor',
'description' => 'Compartilhe um insight útil do seu setor.',
'content' => "Uma coisa que a gente percebeu trabalhando em [setor] esse ano:\n\n[Observação específica, uma mudança, um padrão, uma descoberta contraintuitiva. 2 a 3 frases com um número ou exemplo.]\n\nA gente não acha que isso vai voltar atrás tão cedo, e os negócios que se prepararem agora vão ter menos dificuldade do que os que esperarem.\n\nVocê está vendo a mesma coisa? Curioso para saber como tem sido a sua experiência.",
'image_count' => 1,
'image_keywords' => ['insight', 'industry', 'analysis'],
'slides' => null,
],
[
'slug' => 'facebook_pro_tip',
'category' => 'industry_tip',
'name' => 'Dica de quem já viveu',
'description' => 'Compartilhe uma dica aprendida na prática.',
'content' => "Uma dica de profissional que a gente aprendeu da maneira difícil:\n\nQuando você [cenário comum], sempre [ação específica]. A gente costumava pular esse passo porque parecia trabalho a mais, até que [história, o que deu errado].\n\nAgora é a primeira coisa que a gente faz, sempre. Leva [tempo] e evita [problema].\n\nQual dica você daria para alguém começando agora em [área]?",
'image_count' => 1,
'image_keywords' => ['expertise', 'professional', 'advice'],
'slides' => null,
],
[
'slug' => 'facebook_industry_trend',
'category' => 'industry_tip',
'name' => 'Tendência do setor explicada',
'description' => 'Explique uma tendência em linguagem simples.',
'content' => "Todo mundo em [setor] está falando de [tendência]. Aqui vai o que isso significa de verdade, em palavras simples.\n\n[Explicação em 2 a 3 frases, sem jargão, com um exemplo concreto.]\n\nSe vai dar no que prometem, é outra história. Nossa opinião: [opinião honesta, o que levar a sério, o que ignorar].\n\nE você, o que acha? Curioso para saber onde a comunidade está nessa.",
'image_count' => 1,
'image_keywords' => ['trend', 'industry', 'explainer'],
'slides' => null,
],
// Event (3)
[
'slug' => 'facebook_event_recap',
'category' => 'event',
'name' => 'Resumo do evento',
'description' => 'Compartilhe um resumo depois que o evento acabou.',
'content' => "[Nome do evento] acabou e a gente ainda está se recuperando.\n\n[Número] de vocês apareceram, fizeram boas perguntas e ficaram até tarde. Destaques: [momento 1], [momento 2] e a parte em que [coisa específica engraçada ou marcante].\n\nUm muito obrigado para todo mundo que veio. Se você perdeu, a gente gravou a sessão principal e o link está no primeiro comentário.\n\nQual foi seu momento preferido do dia? Marca alguém que você conheceu lá.",
'image_count' => 1,
'image_keywords' => ['event', 'recap', 'crowd'],
'slides' => null,
],
[
'slug' => 'facebook_event_countdown',
'category' => 'event',
'name' => 'Contagem regressiva para evento',
'description' => 'Crie expectativa conforme o evento se aproxima.',
'content' => "Faltam [número] dias para [nome do evento].\n\nSe você ainda não garantiu seu lugar, a hora é agora. Sobraram [número] vagas, e na última semana elas costumam acabar rápido.\n\nO que esperar em [data]: [um detalhe real], [outro detalhe real] e tempo para conversar de verdade com as pessoas, não só ficar olhando slides.\n\nGaranta seu ingresso aqui: [link]\n\nQuem vai? Comenta para a gente saber quem procurar.",
'image_count' => 1,
'image_keywords' => ['countdown', 'event', 'tickets'],
'slides' => null,
],
[
'slug' => 'facebook_workshop_announcement',
'category' => 'event',
'name' => 'Anúncio de workshop',
'description' => 'Anuncie um workshop prático.',
'content' => "Vamos fazer um workshop sobre [tema].\n\n[Data] às [hora]. Vagas limitadas a [número] pessoas porque é mão na massa, não webinar. Você sai de lá com [resultado específico, uma coisa pronta, uma configuração funcionando, um plano escrito].\n\nPara quem é: [público]. Para quem não é: [aviso honesto].\n\nDetalhes e inscrição: [link]\n\nDúvidas se faz sentido para você? Pergunta nos comentários.",
'image_count' => 1,
'image_keywords' => ['workshop', 'learning', 'hands on'],
'slides' => null,
],
// Engagement (3)
[
'slug' => 'facebook_question_prompt',
'category' => 'engagement',
'name' => 'Pergunta para a comunidade',
'description' => 'Faça uma pergunta reflexiva para a comunidade.',
'content' => "Pergunta sincera para a comunidade.\n\nQuando você [situação comum relacionada à {{brand_name}}], como você costuma [decisão específica]? A gente está perguntando porque vê o mesmo assunto aparecer nas DMs, e tem uma intuição de que a nossa resposta não é a única boa.\n\nNão tem resposta errada. A gente lê todos os comentários.",
'image_count' => 1,
'image_keywords' => ['question', 'conversation', 'people talking'],
'slides' => null,
],
[
'slug' => 'facebook_this_or_that',
'category' => 'engagement',
'name' => 'Enquete isso ou aquilo',
'description' => 'Faça um post divertido no estilo isso ou aquilo.',
'content' => "Resolve um debate que a gente tem tido a semana toda.\n\n[Opção A] ou [Opção B]?\n\nSem pensar muito. Primeira reação, nos comentários.\n\nPara constar, o time está dividido [número] a [número]. A gente conta o lado vencedor na sexta.",
'image_count' => 1,
'image_keywords' => ['choice', 'comparison', 'options'],
'slides' => null,
],
[
'slug' => 'facebook_fill_in_blank',
'category' => 'engagement',
'name' => 'Complete a frase',
'description' => 'Convide os seguidores a completar uma frase.',
'content' => "Complete a frase:\n\nUma coisa que eu queria ter sabido antes de [tema] é __________.\n\nA gente começa: [sua resposta honesta, com uma história real junto].\n\nAgora é sua vez. As melhores respostas que a gente recebe nesse tipo de pergunta acabam ajudando alguém que vai ler depois, então não segura.",
'image_count' => 1,
'image_keywords' => ['conversation', 'thinking', 'community'],
'slides' => null,
],
];

View file

@ -0,0 +1,326 @@
<?php
declare(strict_types=1);
return [
[
'slug' => 'fb_story_announcement',
'category' => 'product_launch',
'name' => 'Aviso rápido',
'description' => 'Chame atenção para uma novidade com um Story de 24h no Facebook.',
'content' => "Aviso da {{brand_name}}.\n\n[Destaque em uma linha]\n\nLink no perfil.",
'image_count' => 1,
'image_keywords' => ['announcement', 'launch'],
'slides' => null,
],
[
'slug' => 'fb_story_promo',
'category' => 'promotion',
'name' => 'Promo relâmpago',
'description' => 'Oferta por tempo limitado em formato Story.',
'content' => "Só hoje.\n\n[Desconto]% off na {{brand_name}}.\n\nToque para comprar.",
'image_count' => 1,
'image_keywords' => ['sale', 'discount', 'urgency'],
'slides' => null,
],
[
'slug' => 'fb_story_question',
'category' => 'engagement',
'name' => 'Pergunta rápida',
'description' => 'Pergunte algo aos seguidores para gerar respostas e reações.',
'content' => "Rapidinho.\n\n[Pergunta para o seu público]\n\nResponda este Story.",
'image_count' => 1,
'image_keywords' => ['question', 'engagement'],
'slides' => null,
],
[
'slug' => 'fb_story_new_drop',
'category' => 'product_launch',
'name' => 'Novidade no ar',
'description' => 'Apresente um produto novo com um toque visual.',
'content' => "Chegou.\n\n[Nome do produto] da {{brand_name}}.\n\nToque para ver.",
'image_count' => 1,
'image_keywords' => ['new product', 'unboxing'],
'slides' => null,
],
[
'slug' => 'fb_story_preorder',
'category' => 'product_launch',
'name' => 'Pré-venda aberta',
'description' => 'Abra a pré-venda com um Story curto.',
'content' => "Pré-venda aberta.\n\n[Produto] envia em [data].\n\nLink na bio.",
'image_count' => 1,
'image_keywords' => ['preorder', 'product'],
'slides' => null,
],
[
'slug' => 'fb_story_launch_day',
'category' => 'product_launch',
'name' => 'Dia do lançamento',
'description' => 'Marque o lançamento ao vivo com CTA de um toque.',
'content' => "Ao vivo agora.\n\n[Produto] saindo hoje.\n\nToque para garantir.",
'image_count' => 1,
'image_keywords' => ['launch', 'product reveal'],
'slides' => null,
],
[
'slug' => 'fb_story_back_in_stock',
'category' => 'product_launch',
'name' => 'Voltou ao estoque',
'description' => 'Avise os seguidores que um produto esgotado voltou.',
'content' => "Voltou ao estoque.\n\n[Produto] na {{brand_name}}.\n\nVai rápido. Toque pra ver.",
'image_count' => 1,
'image_keywords' => ['restock', 'available'],
'slides' => null,
],
[
'slug' => 'fb_story_bogo',
'category' => 'promotion',
'name' => 'Compre 1 leve 2',
'description' => 'Empurre uma oferta compre 1 leve 2 no Story.',
'content' => "Compre 1, leve 2.\n\nEsta semana na {{brand_name}}.\n\nToque para comprar.",
'image_count' => 1,
'image_keywords' => ['bogo', 'sale'],
'slides' => null,
],
[
'slug' => 'fb_story_free_shipping',
'category' => 'promotion',
'name' => 'Frete grátis',
'description' => 'Divulgue uma janela de frete grátis.',
'content' => "Frete grátis.\n\n48h só na {{brand_name}}.\n\nUse o código [CODE].",
'image_count' => 1,
'image_keywords' => ['shipping', 'delivery box'],
'slides' => null,
],
[
'slug' => 'fb_story_last_chance',
'category' => 'promotion',
'name' => 'Última chance',
'description' => 'Aviso final de desconto que está acabando.',
'content' => "Última chance.\n\n[Desconto]% off acaba hoje à noite.\n\nToque na {{brand_name}}.",
'image_count' => 1,
'image_keywords' => ['countdown', 'sale ending'],
'slides' => null,
],
[
'slug' => 'fb_story_coupon_drop',
'category' => 'promotion',
'name' => 'Cupom liberado',
'description' => 'Solte um código de cupom em um Story de 24h.',
'content' => "Código [CODE].\n\n[Desconto]% off na {{brand_name}}.\n\nSome em 24h.",
'image_count' => 1,
'image_keywords' => ['coupon', 'promo code'],
'slides' => null,
],
[
'slug' => 'fb_story_quick_tip',
'category' => 'educational',
'name' => 'Dica rápida',
'description' => 'Compartilhe uma dica útil.',
'content' => "Dica rápida.\n\n[Uma dica prática].\n\nSalve este Story.",
'image_count' => 1,
'image_keywords' => ['tip', 'advice'],
'slides' => null,
],
[
'slug' => 'fb_story_did_you_know',
'category' => 'educational',
'name' => 'Você sabia',
'description' => 'Surpreenda os seguidores com um fato rápido.',
'content' => "Você sabia?\n\n[Fato curioso].\n\nMais no blog da {{brand_name}}.",
'image_count' => 1,
'image_keywords' => ['fact', 'lightbulb'],
'slides' => null,
],
[
'slug' => 'fb_story_myth_buster',
'category' => 'educational',
'name' => 'Mito ou verdade',
'description' => 'Derrube um mito comum em uma única tacada.',
'content' => "Mito: [crença comum].\n\nVerdade: [a real].\n\nToque pra entender.",
'image_count' => 1,
'image_keywords' => ['myth', 'truth'],
'slides' => null,
],
[
'slug' => 'fb_story_one_minute_lesson',
'category' => 'educational',
'name' => 'Aula de 1 minuto',
'description' => 'Lição curta com CTA de toque.',
'content' => "Aula de 60 segundos.\n\n[Tema] da {{brand_name}}.\n\nToque para assistir.",
'image_count' => 1,
'image_keywords' => ['lesson', 'teaching'],
'slides' => null,
],
[
'slug' => 'fb_story_bts_workspace',
'category' => 'behind_the_scenes',
'name' => 'Bastidor do escritório',
'description' => 'Mostre o lugar onde tudo acontece.',
'content' => "Hoje na {{brand_name}}.\n\n[O que está rolando agora].\n\nToque para ver mais.",
'image_count' => 1,
'image_keywords' => ['workspace', 'office'],
'slides' => null,
],
[
'slug' => 'fb_story_bts_team',
'category' => 'behind_the_scenes',
'name' => 'Conheça o time',
'description' => 'Apresente um membro do time de forma rápida.',
'content' => "Conheça [nome].\n\n[Cargo na {{brand_name}}].\n\nToque para dar um oi.",
'image_count' => 1,
'image_keywords' => ['team', 'employee'],
'slides' => null,
],
[
'slug' => 'fb_story_bts_process',
'category' => 'behind_the_scenes',
'name' => 'Como é feito',
'description' => 'Espiada rápida de como algo é produzido.',
'content' => "Como [produto] é feito.\n\nEtapa [n] na {{brand_name}}.\n\nToque pro vídeo completo.",
'image_count' => 1,
'image_keywords' => ['production', 'process'],
'slides' => null,
],
[
'slug' => 'fb_story_bts_packing',
'category' => 'behind_the_scenes',
'name' => 'Embalando pedidos',
'description' => 'Mostre os pedidos saindo da casa.',
'content' => "Embalando pedidos.\n\n[Número] saindo hoje.\n\nObrigado pelo apoio.",
'image_count' => 1,
'image_keywords' => ['packing', 'shipping'],
'slides' => null,
],
[
'slug' => 'fb_story_customer_quote',
'category' => 'testimonial',
'name' => 'Citação de cliente',
'description' => 'Mostre uma frase curta de cliente.',
'content' => "\"[Frase do cliente].\"\n\n- [nome]\n\nToque para ler mais.",
'image_count' => 1,
'image_keywords' => ['quote', 'review'],
'slides' => null,
],
[
'slug' => 'fb_story_five_star',
'category' => 'testimonial',
'name' => 'Avaliação 5 estrelas',
'description' => 'Destaque uma avaliação 5 estrelas.',
'content' => "5 estrelas.\n\n\"[Avaliação curta]\", [nome]\n\nMais na {{brand_name}}.",
'image_count' => 1,
'image_keywords' => ['five stars', 'review'],
'slides' => null,
],
[
'slug' => 'fb_story_before_after',
'category' => 'testimonial',
'name' => 'Antes e depois',
'description' => 'Mostre um antes/depois com um único CTA.',
'content' => "Antes. Depois.\n\n[Nome do cliente] usando {{brand_name}}.\n\nToque pra ver a história.",
'image_count' => 1,
'image_keywords' => ['before after', 'transformation'],
'slides' => null,
],
[
'slug' => 'fb_story_industry_trend',
'category' => 'industry_tip',
'name' => 'Tendência do setor',
'description' => 'Solte uma sacada rápida de tendência.',
'content' => "Tendência.\n\n[Tendência do setor em uma linha].\n\nToque pra nossa visão.",
'image_count' => 1,
'image_keywords' => ['trend', 'industry'],
'slides' => null,
],
[
'slug' => 'fb_story_pro_hack',
'category' => 'industry_tip',
'name' => 'Truque pro',
'description' => 'Compartilhe um truque rápido de profissional.',
'content' => "Truque pro.\n\n[Macete em uma linha].\n\nMais dicas na {{brand_name}}.",
'image_count' => 1,
'image_keywords' => ['hack', 'shortcut'],
'slides' => null,
],
[
'slug' => 'fb_story_mistake_to_avoid',
'category' => 'industry_tip',
'name' => 'Erro a evitar',
'description' => 'Avise sobre um erro comum.',
'content' => "Pare de fazer isso.\n\n[Erro comum].\n\nToque pra solução.",
'image_count' => 1,
'image_keywords' => ['warning', 'mistake'],
'slides' => null,
],
[
'slug' => 'fb_story_event_save_date',
'category' => 'event',
'name' => 'Reserve a data',
'description' => 'Plante um save the date em um Story de 24h.',
'content' => "Reserve a data.\n\n[Evento] em [data].\n\nConfirme presença na bio.",
'image_count' => 1,
'image_keywords' => ['calendar', 'event'],
'slides' => null,
],
[
'slug' => 'fb_story_event_today',
'category' => 'event',
'name' => 'Evento hoje',
'description' => 'Lembrete de evento no mesmo dia.',
'content' => "Hoje.\n\n[Evento] às [hora].\n\nToque pelo link.",
'image_count' => 1,
'image_keywords' => ['event', 'live'],
'slides' => null,
],
[
'slug' => 'fb_story_live_starting',
'category' => 'event',
'name' => 'Indo ao vivo',
'description' => 'Leve os seguidores até a live.',
'content' => "Indo ao vivo.\n\n[Tema] em [minutos] minutos.\n\nToque pra entrar na {{brand_name}}.",
'image_count' => 1,
'image_keywords' => ['live stream', 'broadcast'],
'slides' => null,
],
[
'slug' => 'fb_story_event_recap',
'category' => 'event',
'name' => 'Resumo do evento',
'description' => 'Resumo rápido no dia seguinte.',
'content' => "Foi assim o [evento].\n\nValeu por vir.\n\nResumo completo na página.",
'image_count' => 1,
'image_keywords' => ['event recap', 'crowd'],
'slides' => null,
],
[
'slug' => 'fb_story_poll_this_or_that',
'category' => 'engagement',
'name' => 'Esta ou aquela',
'description' => 'Story estilo enquete com duas opções.',
'content' => "[Opção A] ou [Opção B]?\n\nResponda com sua escolha.\n\nLemos todas.",
'image_count' => 1,
'image_keywords' => ['poll', 'choice'],
'slides' => null,
],
[
'slug' => 'fb_story_dm_us',
'category' => 'engagement',
'name' => 'Manda DM',
'description' => 'Convide seguidores a mandar mensagem.',
'content' => "Manda DM.\n\n[Motivo pra falar com a {{brand_name}}].\n\nA gente responde rápido.",
'image_count' => 1,
'image_keywords' => ['message', 'chat'],
'slides' => null,
],
[
'slug' => 'fb_story_caption_this',
'category' => 'engagement',
'name' => 'Legenda essa',
'description' => 'Pedido de legenda em aberto.',
'content' => "Legenda essa.\n\n[Contexto da imagem].\n\nManda a sua melhor.",
'image_count' => 1,
'image_keywords' => ['fun', 'reaction'],
'slides' => null,
],
];

View file

@ -0,0 +1,523 @@
<?php
declare(strict_types=1);
return [
[
'slug' => 'feature_launch_carousel',
'category' => 'product_launch',
'name' => 'Lançamento de funcionalidade',
'description' => 'Anuncie uma nova funcionalidade do produto em um carrossel de 5 slides.',
'content' => 'A {{brand_name}} acabou de lançar algo que estamos animados pra mostrar. Arraste para ver o que tem de novo.',
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => 'O que tem de novo', 'body' => 'Uma olhada rápida na atualização mais recente.', 'image_keywords' => ['product', 'launch']],
['title' => 'Como funciona', 'body' => 'Três passos e você já está usando.', 'image_keywords' => ['workflow']],
['title' => 'Por que isso importa', 'body' => 'Mais rápido, mais simples, com menos cliques.', 'image_keywords' => ['speed']],
['title' => 'Pra quem é', 'body' => 'Feito para times que entregam.', 'image_keywords' => ['team']],
['title' => 'Experimente agora', 'body' => 'Disponível hoje. Link na bio.', 'image_keywords' => ['phone', 'app']],
],
],
[
'slug' => 'five_tips_carousel',
'category' => 'educational',
'name' => 'Carrossel de 5 dicas',
'description' => 'Compartilhe cinco dicas práticas em um carrossel para arrastar.',
'content' => '5 coisas que eu queria ter sabido antes sobre [tópico]. Salve pra ler depois. 👇',
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => 'Dica #1', 'body' => '[Primeira dica, seja específico e prático.]', 'image_keywords' => ['idea', 'lightbulb']],
['title' => 'Dica #2', 'body' => '[Segunda dica, use um exemplo real se puder.]', 'image_keywords' => ['notebook']],
['title' => 'Dica #3', 'body' => '[Terceira dica, seja curto.]', 'image_keywords' => ['focus']],
['title' => 'Dica #4', 'body' => '[Quarta dica, algo surpreendente ou que vai contra o senso comum.]', 'image_keywords' => ['surprise']],
['title' => 'Dica #5', 'body' => '[Quinta dica, termine forte com um aprendizado.]', 'image_keywords' => ['success']],
],
],
[
'slug' => 'process_reveal_carousel',
'category' => 'behind_the_scenes',
'name' => 'Revelação do processo',
'description' => 'Mostre aos seguidores como você cria seu produto ou serviço.',
'content' => 'Já se perguntou como [produto/serviço] é feito? Arraste para ver cada etapa. ✨',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'Tudo começa com pesquisa', 'body' => 'Todo projeto começa entendendo o problema a fundo.', 'image_keywords' => ['research', 'desk']],
['title' => 'Design e iteração', 'body' => 'A gente prototipa rápido e testa muito.', 'image_keywords' => ['design', 'sketch']],
['title' => 'Construindo de verdade', 'body' => 'Capricho e precisão em cada detalhe.', 'image_keywords' => ['craft', 'build']],
['title' => 'O resultado final', 'body' => 'Qualidade que você sente assim que usa.', 'image_keywords' => ['product', 'final']],
],
],
[
'slug' => 'quick_stat_carousel',
'category' => 'industry_tip',
'name' => 'Carrossel de estatísticas rápidas',
'description' => 'Apresente dados do setor em um carrossel visual.',
'content' => 'Os números de [setor] que todo profissional de marketing precisa acompanhar este ano. 📊',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'Dado #1', 'body' => '[X]% de [público] dizem [descoberta]. Fonte: [fonte]', 'image_keywords' => ['chart', 'data']],
['title' => 'Dado #2', 'body' => '[Y]% de aumento em [métrica] ano após ano.', 'image_keywords' => ['growth', 'graph']],
['title' => 'Dado #3', 'body' => 'Até [ano], [projeção].', 'image_keywords' => ['future', 'trend']],
['title' => 'O que isso significa pra você', 'body' => '[Conclusão prática com base nos dados acima.]', 'image_keywords' => ['action', 'plan']],
],
],
[
'slug' => 'event_recap_carousel',
'category' => 'event',
'name' => 'Resumo do evento',
'description' => 'Recapitule os destaques de um evento ou conferência recente.',
'content' => 'Acabamos de encerrar [Nome do Evento] e foi incrível. Veja os destaques. 🙌',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'Tudo começou com…', 'body' => '[Momento de abertura ou destaque da palestra principal.]', 'image_keywords' => ['conference', 'stage']],
['title' => 'A palestra que todo mundo comentou', 'body' => '[Insight principal da palestra que se destacou.]', 'image_keywords' => ['presentation', 'crowd']],
['title' => 'Conexão com a comunidade', 'body' => '[Destaque de networking ou momentos com participantes.]', 'image_keywords' => ['networking', 'people']],
['title' => 'Até a próxima', 'body' => 'Siga a {{brand_name}} para novidades sobre nosso próximo evento.', 'image_keywords' => ['celebration']],
],
],
[
'slug' => 'product_lineup_carousel',
'category' => 'product_launch',
'name' => 'Revelação da linha de produtos',
'description' => 'Revele uma linha completa de produtos, um item por slide.',
'content' => 'Fizemos [número] coisas novas. Aqui vai a linha completa da {{brand_name}}.',
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => 'conheça a linha', 'body' => '[Número] peças novas, pensadas em conjunto. Cada uma resolve um problema específico.', 'image_keywords' => ['products', 'lineup']],
['title' => 'peça um', 'body' => '[Nome do produto 1]. Ideal para [caso de uso].', 'image_keywords' => ['product', 'studio']],
['title' => 'peça dois', 'body' => '[Nome do produto 2]. Combina com a peça um se você quer [benefício].', 'image_keywords' => ['object', 'detail']],
['title' => 'peça três', 'body' => '[Nome do produto 3]. A que ficamos refazendo até ficar do jeito certo.', 'image_keywords' => ['craft', 'closeup']],
['title' => 'compre o lançamento', 'body' => 'Disponível em [data]. Link na bio.', 'image_keywords' => ['shop', 'phone']],
],
],
[
'slug' => 'before_after_launch_carousel',
'category' => 'product_launch',
'name' => 'Antes e depois do lançamento',
'description' => 'Mostre o upgrade da versão antiga para a nova.',
'content' => 'Mesma ideia, refeita. Veja o que mudou no novo [produto] da {{brand_name}}.',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'antes', 'body' => '[A versão antiga. O que ela fazia bem e onde deixava a desejar.]', 'image_keywords' => ['old', 'product']],
['title' => 'depois', 'body' => '[A nova versão. Uma frase sobre a maior mudança.]', 'image_keywords' => ['new', 'product']],
['title' => 'o que arrumamos', 'body' => '[Problema específico que os clientes contaram, e como resolvemos.]', 'image_keywords' => ['detail', 'redesign']],
['title' => 'já disponível', 'body' => 'Encontre na loja. Link na bio.', 'image_keywords' => ['store', 'phone']],
],
],
[
'slug' => 'spec_breakdown_carousel',
'category' => 'product_launch',
'name' => 'Carrossel de especificações',
'description' => 'Detalhe as especificações do produto em vários slides.',
'content' => 'A ficha técnica completa do [produto]. Tudo que tem dentro, em um carrossel.',
'image_count' => 6,
'image_keywords' => null,
'slides' => [
['title' => 'conheça [produto]', 'body' => 'Feito para [caso de uso]. Disponível em [data].', 'image_keywords' => ['product', 'reveal']],
['title' => 'materiais', 'body' => '[Detalhes dos materiais. De onde vem. Por que importa pro toque final.]', 'image_keywords' => ['materials', 'texture']],
['title' => 'dimensões', 'body' => '[Tamanho, peso, notas de caimento. Os números que as pessoas vão querer antes de comprar.]', 'image_keywords' => ['measurement', 'detail']],
['title' => 'como se comporta', 'body' => '[Número de desempenho principal. Bateria, autonomia, força de fixação, o que fizer sentido.]', 'image_keywords' => ['performance', 'test']],
['title' => 'o que vem na caixa', 'body' => '[Liste os itens: produto, acessórios, manual, etc.]', 'image_keywords' => ['unboxing', 'box']],
['title' => 'compre o seu', 'body' => 'Link na bio. Envio em [prazo].', 'image_keywords' => ['shipping', 'parcel']],
],
],
[
'slug' => 'flash_sale_carousel',
'category' => 'promotion',
'name' => 'Promoção relâmpago',
'description' => 'Promova uma oferta por tempo limitado em vários slides.',
'content' => '[Desconto]% de desconto nas próximas [horas] horas na {{brand_name}}. Leia todos os slides para não perder.',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'promoção relâmpago no ar', 'body' => '[Desconto]% off até [data e hora final]. Sem código.', 'image_keywords' => ['sale', 'tag']],
['title' => 'o que está incluso', 'body' => '[Categorias em promoção, exceções se houver. Seja honesto sobre o que não entra.]', 'image_keywords' => ['products', 'shop']],
['title' => 'os mais queridos', 'body' => '[Dois ou três campeões de venda que as pessoas pegam primeiro quando tem promoção.]', 'image_keywords' => ['favorites', 'shelf']],
['title' => 'compre antes que acabe', 'body' => 'Link na bio. Quando o estoque acabar, acabou.', 'image_keywords' => ['phone', 'cart']],
],
],
[
'slug' => 'bundle_deal_carousel',
'category' => 'promotion',
'name' => 'Carrossel de combo',
'description' => 'Explique uma oferta de combo slide por slide.',
'content' => 'Três coisas, um preço. Economize [valor] comprando juntas na {{brand_name}}.',
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => 'o combo', 'body' => '[Descrição rápida do que tem no combo e o total que se economiza.]', 'image_keywords' => ['bundle', 'box']],
['title' => 'item um', 'body' => '[Primeiro item do combo e o que ele faz sozinho.]', 'image_keywords' => ['product', 'one']],
['title' => 'item dois', 'body' => '[Segundo item e por que combina com o primeiro.]', 'image_keywords' => ['product', 'two']],
['title' => 'item três', 'body' => '[Terceiro item. O que amarra o combo.]', 'image_keywords' => ['product', 'three']],
['title' => 'leve o combo', 'body' => 'Economize [valor]. Disponível enquanto durar o estoque.', 'image_keywords' => ['bag', 'shopping']],
],
],
[
'slug' => 'first_order_discount_carousel',
'category' => 'promotion',
'name' => 'Desconto na primeira compra',
'description' => 'Receba novos clientes com um desconto na primeira compra.',
'content' => 'Novo por aqui? Use o código [CÓDIGO] para [desconto]% off na sua primeira compra na {{brand_name}}.',
'image_count' => 3,
'image_keywords' => null,
'slides' => [
['title' => 'oferta de boas-vindas', 'body' => '[Desconto]% off na primeira compra. Código: [CÓDIGO]. Válido por [duração].', 'image_keywords' => ['welcome', 'gift']],
['title' => 'por onde as pessoas começam', 'body' => '[Um ou dois produtos que são bons pontos de partida pra novos clientes.]', 'image_keywords' => ['bestseller', 'product']],
['title' => 'como usar', 'body' => 'Adicione ao carrinho, cole [CÓDIGO] no checkout. Link na bio.', 'image_keywords' => ['checkout', 'phone']],
],
],
[
'slug' => 'free_shipping_carousel',
'category' => 'promotion',
'name' => 'Final de semana com frete grátis',
'description' => 'Promova um período limitado de frete grátis.',
'content' => 'Frete grátis na {{brand_name}} só neste final de semana. Sem valor mínimo.',
'image_count' => 3,
'image_keywords' => null,
'slides' => [
['title' => 'final de semana com frete grátis', 'body' => 'De [sexta] a [domingo]. Sem código, sem pedido mínimo.', 'image_keywords' => ['shipping', 'box']],
['title' => 'pra onde enviamos', 'body' => '[Regiões ou países incluídos. Deixe claro qualquer exceção.]', 'image_keywords' => ['map', 'globe']],
['title' => 'aproveite o final de semana', 'body' => 'Toque no link na bio antes da meia-noite de [domingo] [fuso horário].', 'image_keywords' => ['cart', 'phone']],
],
],
[
'slug' => 'beginner_guide_carousel',
'category' => 'educational',
'name' => 'Carrossel guia para iniciantes',
'description' => 'Ensine um tópico do zero até o primeiro resultado prático.',
'content' => '[Tópico] para quem está começando do zero. Salve pra ler depois. 👇',
'image_count' => 6,
'image_keywords' => null,
'slides' => [
['title' => 'comece por aqui', 'body' => 'Se [tópico] parece muito, esta é a versão que me ajudou quando eu era iniciante.', 'image_keywords' => ['beginner', 'notes']],
['title' => 'o que é, na real', 'body' => '[Definição simples. Sem jargão. Uma frase basta.]', 'image_keywords' => ['concept', 'sketch']],
['title' => 'por que importa', 'body' => '[O motivo concreto pelo qual um iniciante se daria o trabalho de aprender isso.]', 'image_keywords' => ['question', 'curious']],
['title' => 'primeira coisa pra tentar', 'body' => '[Uma ação pequena e específica que dá pra fazer em menos de 10 minutos.]', 'image_keywords' => ['hands', 'desk']],
['title' => 'erro comum', 'body' => '[A armadilha em que a maioria dos iniciantes cai. Seja específico.]', 'image_keywords' => ['mistake', 'fix']],
['title' => 'pra onde ir depois', 'body' => '[Um livro, canal ou recurso da {{brand_name}} pro próximo passo.]', 'image_keywords' => ['library', 'resource']],
],
],
[
'slug' => 'common_mistakes_carousel',
'category' => 'educational',
'name' => 'Erros comuns',
'description' => 'Mostre erros comuns e como corrigi-los.',
'content' => '5 erros que eu vejo o tempo todo com [tópico]. O número 3 eu tive que aprender da pior forma.',
'image_count' => 6,
'image_keywords' => null,
'slides' => [
['title' => 'os erros', 'body' => 'Cinco coisas que as pessoas fazem errado com [tópico], e o que fazer no lugar.', 'image_keywords' => ['mistake', 'pen']],
['title' => 'erro 1', 'body' => '[Primeiro erro. Depois a correção em uma frase.]', 'image_keywords' => ['error', 'paper']],
['title' => 'erro 2', 'body' => '[Segundo erro e a correção.]', 'image_keywords' => ['confused', 'desk']],
['title' => 'erro 3', 'body' => '[Terceiro erro. O que pega as pessoas de surpresa.]', 'image_keywords' => ['surprised', 'thought']],
['title' => 'erro 4', 'body' => '[Quarto erro e a correção.]', 'image_keywords' => ['process', 'workspace']],
['title' => 'erro 5', 'body' => '[Erro final. Termine com o que você faria no lugar.]', 'image_keywords' => ['solution', 'check']],
],
],
[
'slug' => 'glossary_carousel',
'category' => 'educational',
'name' => 'Carrossel glossário',
'description' => 'Defina cinco termos do seu setor em linguagem simples.',
'content' => '5 termos de [setor] explicados sem o jargão. Salve pra ler depois.',
'image_count' => 6,
'image_keywords' => null,
'slides' => [
['title' => 'jargão decifrado', 'body' => 'Cinco palavras de [setor] que as pessoas usam como se todo mundo já soubesse.', 'image_keywords' => ['dictionary', 'book']],
['title' => '[termo 1]', 'body' => '[Definição simples. Uma frase de exemplo.]', 'image_keywords' => ['letters', 'text']],
['title' => '[termo 2]', 'body' => '[Definição simples. Uma frase de exemplo.]', 'image_keywords' => ['letters', 'paper']],
['title' => '[termo 3]', 'body' => '[Definição simples. Uma frase de exemplo.]', 'image_keywords' => ['note', 'pen']],
['title' => '[termo 4]', 'body' => '[Definição simples. Uma frase de exemplo.]', 'image_keywords' => ['definition', 'page']],
['title' => '[termo 5]', 'body' => '[Definição simples. Uma frase de exemplo.]', 'image_keywords' => ['glossary', 'open book']],
],
],
[
'slug' => 'step_by_step_tutorial_carousel',
'category' => 'educational',
'name' => 'Tutorial passo a passo',
'description' => 'Mostre um pequeno tutorial em passos claros.',
'content' => 'Como [tarefa] em [número] passos. Salve pra ter na próxima vez.',
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => 'o que você vai precisar', 'body' => '[Liste as ferramentas ou materiais. Seja breve.]', 'image_keywords' => ['tools', 'supplies']],
['title' => 'passo 1', 'body' => '[Primeiro passo. Ação específica, não um objetivo.]', 'image_keywords' => ['hands', 'work']],
['title' => 'passo 2', 'body' => '[Segundo passo. Como deve estar antes de seguir adiante.]', 'image_keywords' => ['progress', 'desk']],
['title' => 'passo 3', 'body' => '[Terceiro passo. Cite o erro mais comum aqui.]', 'image_keywords' => ['focus', 'detail']],
['title' => 'pronto', 'body' => '[Como deve ficar o resultado final. Uma ideia de foto.]', 'image_keywords' => ['finished', 'result']],
],
],
[
'slug' => 'team_intro_carousel',
'category' => 'behind_the_scenes',
'name' => 'Conheça o time',
'description' => 'Apresente os membros do time, um slide por vez.',
'content' => 'Os rostos por trás da {{brand_name}}. Arraste pra conhecer quem faz tudo acontecer.',
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => 'o time', 'body' => 'Somos [número] pessoas em [localidades]. Aqui está quem faz o quê.', 'image_keywords' => ['team', 'office']],
['title' => '[nome 1]', 'body' => '[Cargo. Uma coisa que essa pessoa toca e uma que gosta de fazer fora do trabalho.]', 'image_keywords' => ['portrait', 'work']],
['title' => '[nome 2]', 'body' => '[Cargo. Um detalhe que mostra a personalidade, não só o cargo.]', 'image_keywords' => ['portrait', 'desk']],
['title' => '[nome 3]', 'body' => '[Cargo. Algo específico que ela fez este mês.]', 'image_keywords' => ['portrait', 'studio']],
['title' => 'manda um oi', 'body' => 'Direct aberto. A gente responde em pessoa.', 'image_keywords' => ['phone', 'chat']],
],
],
[
'slug' => 'workspace_tour_carousel',
'category' => 'behind_the_scenes',
'name' => 'Tour pelo espaço',
'description' => 'Faça um tour pelo seu estúdio, cozinha ou escritório em vários slides.',
'content' => 'Um tour por onde a {{brand_name}} é feita de verdade. Menos arrumado do que você imagina.',
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => 'onde a coisa acontece', 'body' => '[Local, tamanho, que tipo de espaço é, em uma frase.]', 'image_keywords' => ['studio', 'workshop']],
['title' => 'a bancada de trabalho', 'body' => '[O que vive na bancada ou mesa principal na maioria dos dias.]', 'image_keywords' => ['workbench', 'tools']],
['title' => 'o canto que ninguém vê', 'body' => '[Detalhe honesto: uma estante bagunçada, uma parede de post-its, a estação de café.]', 'image_keywords' => ['corner', 'mess']],
['title' => 'o lugar favorito', 'body' => '[A cadeira, a janela, a luz que deixa o dia melhor.]', 'image_keywords' => ['light', 'window']],
['title' => 'volte logo', 'body' => 'Mais espiadinhas vindo. Siga a {{brand_name}} pra próxima.', 'image_keywords' => ['camera', 'door']],
],
],
[
'slug' => 'a_day_in_the_life_carousel',
'category' => 'behind_the_scenes',
'name' => 'Um dia na rotina',
'description' => 'Mostre um dia de trabalho, da manhã à noite.',
'content' => 'Um dia de verdade na {{brand_name}}, hora por hora. Sem montagem.',
'image_count' => 6,
'image_keywords' => null,
'slides' => [
['title' => '7h30', 'body' => '[Como o dia realmente começa. Café, caminhada, e-mails, o que for.]', 'image_keywords' => ['morning', 'coffee']],
['title' => '9h', 'body' => '[Primeira coisa na agenda de trabalho. Seja específico sobre o que é feito.]', 'image_keywords' => ['desk', 'laptop']],
['title' => '12h30', 'body' => '[Almoço. Onde, com quem, ou sozinho ouvindo podcast.]', 'image_keywords' => ['lunch', 'food']],
['title' => '14h', 'body' => '[Bloco da tarde. A coisa que exige mais foco no dia.]', 'image_keywords' => ['focus', 'work']],
['title' => '17h30', 'body' => '[Encerrando. Qual costuma ser a última tarefa antes de desligar.]', 'image_keywords' => ['evening', 'office']],
['title' => 'fora do horário', 'body' => '[Como o dia termina. Corrida, jantar, filhos, leitura, o que for verdade.]', 'image_keywords' => ['sunset', 'home']],
],
],
[
'slug' => 'mistakes_we_made_carousel',
'category' => 'behind_the_scenes',
'name' => 'Erros que cometemos',
'description' => 'Compartilhe três erros reais e o que aprendeu com eles.',
'content' => '3 coisas que a gente errou este ano na {{brand_name}}. Compartilho porque esconder seria estranho.',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'por que postar isso', 'body' => 'Vitórias recebem bastante atenção. Os erros são onde costumam estar as lições.', 'image_keywords' => ['notebook', 'writing']],
['title' => 'erro 1', 'body' => '[O que tentamos. Por que não deu certo. O que fizemos depois.]', 'image_keywords' => ['error', 'desk']],
['title' => 'erro 2', 'body' => '[O segundo. Seja honesto sobre o custo, em dinheiro ou tempo.]', 'image_keywords' => ['budget', 'paper']],
['title' => 'erro 3 + o que vem agora', 'body' => '[Terceiro erro e uma coisa que está mudando por causa dele.]', 'image_keywords' => ['plan', 'reset']],
],
],
[
'slug' => 'customer_story_carousel',
'category' => 'testimonial',
'name' => 'História de cliente',
'description' => 'Conte uma única história de cliente ao longo dos slides.',
'content' => 'Uma história de um dos clientes da {{brand_name}}. Postado com a permissão dele.',
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => 'conheça [nome]', 'body' => '[Nome, o que faz, onde mora. Duas frases curtas.]', 'image_keywords' => ['portrait', 'person']],
['title' => 'o problema', 'body' => '[A situação antes de usar a {{brand_name}}. Específica, não abstrata.]', 'image_keywords' => ['problem', 'thinking']],
['title' => 'o que ele tentou', 'body' => '[Como encontrou a {{brand_name}} e como foi o primeiro uso.]', 'image_keywords' => ['discover', 'try']],
['title' => 'o que mudou', 'body' => '[O resultado. Um número se você tiver, uma história se não tiver.]', 'image_keywords' => ['result', 'change']],
['title' => 'nas palavras dele', 'body' => '"[Citação direta do cliente. Curta e real.]"', 'image_keywords' => ['quote', 'speech']],
],
],
[
'slug' => 'three_reviews_carousel',
'category' => 'testimonial',
'name' => 'Carrossel com três avaliações',
'description' => 'Junte três avaliações reais em um carrossel.',
'content' => 'Três avaliações de clientes reais este mês na {{brand_name}}.',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'o que as pessoas estão dizendo', 'body' => 'Três citações sem editar deste mês. Nomes completos preservados quando solicitado.', 'image_keywords' => ['stars', 'review']],
['title' => 'avaliação 1', 'body' => '"[Citação direta do cliente.]", [primeiro nome, localidade]', 'image_keywords' => ['speech', 'quote']],
['title' => 'avaliação 2', 'body' => '"[Citação direta do cliente.]", [primeiro nome, localidade]', 'image_keywords' => ['feedback', 'note']],
['title' => 'avaliação 3', 'body' => '"[Citação direta do cliente.]", [primeiro nome, localidade]', 'image_keywords' => ['testimonial', 'paper']],
],
],
[
'slug' => 'before_after_results_carousel',
'category' => 'testimonial',
'name' => 'Resultados antes e depois',
'description' => 'Mostre um resultado de cliente em slides de antes e depois.',
'content' => 'Um resultado real de um cliente usando [produto/serviço] na {{brand_name}}. Mesma pessoa, [período] de diferença.',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'o ponto de partida', 'body' => '[Onde estava no começo. A versão honesta, não a polida.]', 'image_keywords' => ['before', 'start']],
['title' => 'o que ele fez', 'body' => '[O que usou e com que frequência. Seja específico sobre a rotina.]', 'image_keywords' => ['process', 'routine']],
['title' => 'o resultado', 'body' => '[Onde está agora. Números se for relevante, foto se for visual.]', 'image_keywords' => ['after', 'result']],
['title' => 'nas palavras dele', 'body' => '"[Uma citação curta sobre o que mais surpreendeu.]"', 'image_keywords' => ['quote', 'smile']],
],
],
[
'slug' => 'industry_myth_busting_carousel',
'category' => 'industry_tip',
'name' => 'Derrubando mitos do setor',
'description' => 'Derrube três mitos sobre o seu setor.',
'content' => '3 coisas que as pessoas ainda acreditam sobre [setor] e que não são verdade.',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'mitos, desmontados', 'body' => 'Três crenças sobre [setor] que se repetem em todo lugar e ainda erram a mão.', 'image_keywords' => ['question', 'thinking']],
['title' => 'mito 1', 'body' => 'Mito: [crença comum]. Verdade: [como é de fato, com um detalhe].', 'image_keywords' => ['truth', 'note']],
['title' => 'mito 2', 'body' => 'Mito: [crença comum]. Verdade: [a correção em uma frase].', 'image_keywords' => ['fact', 'paper']],
['title' => 'mito 3', 'body' => 'Mito: [crença comum]. Verdade: [a correção]. O porquê está nos comentários.', 'image_keywords' => ['comment', 'phone']],
],
],
[
'slug' => 'industry_trend_carousel',
'category' => 'industry_tip',
'name' => 'Carrossel de tendência do setor',
'description' => 'Apresente uma tendência que está moldando o setor este ano.',
'content' => 'O que está realmente se mexendo em [setor] este ano, em linguagem simples.',
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => 'a tendência', 'body' => '[Nomeie a tendência em palavras simples. Uma frase sobre o que é.]', 'image_keywords' => ['trend', 'graph']],
['title' => 'por que agora', 'body' => '[A causa específica. Uma regulação, uma mudança técnica, uma mudança de comportamento.]', 'image_keywords' => ['cause', 'news']],
['title' => 'quem sente primeiro', 'body' => '[O público ou tipo de empresa que sente antes dos outros.]', 'image_keywords' => ['audience', 'people']],
['title' => 'o que fazer', 'body' => '[Uma coisa concreta pra testar neste trimestre, não um princípio vago.]', 'image_keywords' => ['action', 'plan']],
['title' => 'um número pra acompanhar', 'body' => '[Uma métrica específica, com fonte.]', 'image_keywords' => ['metric', 'data']],
],
],
[
'slug' => 'pro_tip_carousel',
'category' => 'industry_tip',
'name' => 'Carrossel de dica de profissional',
'description' => 'Compartilhe uma única dica de profissional com contexto e passos.',
'content' => 'Uma coisa que eu diria pra mim mesmo mais novo sobre [tópico]. Salve se ajudar.',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'a dica', 'body' => '[A versão de uma frase. Curta o suficiente pra lembrar.]', 'image_keywords' => ['tip', 'note']],
['title' => 'por que funciona', 'body' => '[O motivo. Use um exemplo pequeno, não uma afirmação grande.]', 'image_keywords' => ['idea', 'thought']],
['title' => 'como usar', 'body' => '[Os passos. No máximo três. Específicos.]', 'image_keywords' => ['steps', 'list']],
['title' => 'uma coisa pra evitar', 'body' => '[O erro que as pessoas cometem ao aplicar essa dica.]', 'image_keywords' => ['warning', 'caution']],
],
],
[
'slug' => 'event_announcement_carousel',
'category' => 'event',
'name' => 'Anúncio de evento',
'description' => 'Anuncie um evento próximo com os detalhes principais.',
'content' => 'Vamos sediar [Nome do Evento] em [data]. Tudo que você precisa saber está nos slides.',
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => '[nome do evento]', 'body' => '[Data, local ou online, pra quem é, em uma linha.]', 'image_keywords' => ['event', 'invite']],
['title' => 'o que está programado', 'body' => '[A agenda em tópicos diretos, sem marketing.]', 'image_keywords' => ['agenda', 'schedule']],
['title' => 'quem vai falar', 'body' => '[Nomes e bios em uma linha. No máximo três.]', 'image_keywords' => ['speakers', 'panel']],
['title' => 'como participar', 'body' => '[Gratuito ou pago, link, prazo se houver. Seja específico.]', 'image_keywords' => ['ticket', 'register']],
['title' => 'garanta seu lugar', 'body' => '[Lembrete final + chamada pro link na bio.]', 'image_keywords' => ['phone', 'tap']],
],
],
[
'slug' => 'event_speakers_carousel',
'category' => 'event',
'name' => 'Revelação dos palestrantes',
'description' => 'Revele os palestrantes, um por slide.',
'content' => 'Palestrantes do [Nome do Evento]. Os ingressos estão abertos na {{brand_name}}.',
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => 'palestrantes revelados', 'body' => 'O lineup do [Nome do Evento] em [data]. Arraste pra conhecer.', 'image_keywords' => ['lineup', 'stage']],
['title' => '[palestrante 1]', 'body' => '[Nome, cargo. A coisa principal sobre a qual vai falar.]', 'image_keywords' => ['portrait', 'speaker']],
['title' => '[palestrante 2]', 'body' => '[Nome, cargo. O tema da palestra em uma linha.]', 'image_keywords' => ['portrait', 'mic']],
['title' => '[palestrante 3]', 'body' => '[Nome, cargo. O que os participantes vão levar.]', 'image_keywords' => ['portrait', 'panel']],
['title' => 'ingressos na bio', 'body' => '[Data, local, link de inscrição.]', 'image_keywords' => ['ticket', 'register']],
],
],
[
'slug' => 'workshop_invitation_carousel',
'category' => 'event',
'name' => 'Convite para workshop',
'description' => 'Convide as pessoas para um workshop prático.',
'content' => 'Workshop prático na {{brand_name}} em [data]. Vagas limitadas. Veja o que tem dentro.',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'workshop em [data]', 'body' => '[Tema em uma linha. Online ou presencial, com local e horário.]', 'image_keywords' => ['workshop', 'class']],
['title' => 'o que você vai fazer', 'body' => '[Três atividades concretas. Use verbos, não adjetivos.]', 'image_keywords' => ['hands', 'making']],
['title' => 'o que você vai levar', 'body' => '[O resultado: uma coisa pronta, um rascunho, uma decisão, um plano.]', 'image_keywords' => ['notebook', 'result']],
['title' => 'reserve sua vaga', 'body' => '[Vagas restantes, preço se houver, link na bio.]', 'image_keywords' => ['chair', 'register']],
],
],
[
'slug' => 'this_or_that_carousel',
'category' => 'engagement',
'name' => 'Esse ou aquele',
'description' => 'Faça aos seguidores uma série de perguntas de escolha.',
'content' => 'Esse ou aquele, edição [tópico]. Conta nos comentários quais você escolhe.',
'image_count' => 5,
'image_keywords' => null,
'slides' => [
['title' => 'escolha um', 'body' => 'Cinco escolhas rápidas. Comente as respostas em ordem.', 'image_keywords' => ['choice', 'fork']],
['title' => '[opção a] ou [opção b]', 'body' => '[Contexto rápido se precisar.]', 'image_keywords' => ['split', 'options']],
['title' => '[opção c] ou [opção d]', 'body' => '[Contexto rápido se precisar.]', 'image_keywords' => ['versus', 'choice']],
['title' => '[opção e] ou [opção f]', 'body' => '[Contexto rápido se precisar.]', 'image_keywords' => ['compare', 'pick']],
['title' => 'sua vez', 'body' => 'Deixa as respostas aí embaixo. Eu leio cada comentário.', 'image_keywords' => ['comment', 'phone']],
],
],
[
'slug' => 'unpopular_opinion_carousel',
'category' => 'engagement',
'name' => 'Opinião impopular',
'description' => 'Compartilhe uma opinião real e convide à discordância.',
'content' => 'Uma opinião impopular sobre [tópico]. Me conta nos comentários onde estou errado.',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'opinião impopular', 'body' => '[A opinião em uma frase curta e clara.]', 'image_keywords' => ['opinion', 'speech']],
['title' => 'por que penso assim', 'body' => '[O motivo. Uma história pequena ou um número, não só sentimentos.]', 'image_keywords' => ['reason', 'thinking']],
['title' => 'onde posso estar errado', 'body' => '[Honesto sobre a parte mais fraca do argumento.]', 'image_keywords' => ['doubt', 'question']],
['title' => 'me conta', 'body' => 'Concorda, discorda, está em cima do muro, deixa nos comentários.', 'image_keywords' => ['comment', 'discussion']],
],
],
[
'slug' => 'fill_in_the_blank_carousel',
'category' => 'engagement',
'name' => 'Complete a frase',
'description' => 'Provoque os seguidores com três frases para completar.',
'content' => 'Complete as frases. Quero ler as suas respostas.',
'image_count' => 4,
'image_keywords' => null,
'slides' => [
['title' => 'complete as frases', 'body' => 'Três provocações rápidas sobre [tópico]. Comente as respostas em ordem.', 'image_keywords' => ['blank', 'pen']],
['title' => 'frase 1', 'body' => 'A melhor [coisa] que eu [verbo] este ano foi ____.', 'image_keywords' => ['idea', 'thought']],
['title' => 'frase 2', 'body' => 'O que eu quero fazer mais em [tópico] é ____.', 'image_keywords' => ['plan', 'goal']],
['title' => 'frase 3', 'body' => 'Uma pessoa que me ensinou sobre [tópico] foi ____.', 'image_keywords' => ['mentor', 'people']],
],
],
[
'slug' => 'q_and_a_carousel',
'category' => 'engagement',
'name' => 'Carrossel de perguntas e respostas',
'description' => 'Responda cinco perguntas reais do seu público.',
'content' => 'Você perguntou, eu respondi. Cinco perguntas reais que chegaram no direct.',
'image_count' => 6,
'image_keywords' => null,
'slides' => [
['title' => 'perguntas respondidas', 'body' => 'Peguei cinco desta semana. Anonimizei onde precisei.', 'image_keywords' => ['questions', 'mail']],
['title' => 'p1', 'body' => 'P: [pergunta parafraseada]. R: [resposta em uma ou duas frases].', 'image_keywords' => ['answer', 'note']],
['title' => 'p2', 'body' => 'P: [pergunta parafraseada]. R: [resposta].', 'image_keywords' => ['reply', 'speech']],
['title' => 'p3', 'body' => 'P: [pergunta parafraseada]. R: [resposta].', 'image_keywords' => ['question', 'mark']],
['title' => 'p4', 'body' => 'P: [pergunta parafraseada]. R: [resposta].', 'image_keywords' => ['chat', 'bubble']],
['title' => 'p5', 'body' => 'P: [pergunta parafraseada]. R: [resposta]. Manda mais nos comentários.', 'image_keywords' => ['comments', 'phone']],
],
],
];

Some files were not shown because too many files have changed in this diff Show more