<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jae</title>
    <description>The latest articles on DEV Community by Jae (@jae_6cd32f266739b96c4f751).</description>
    <link>https://dev.to/jae_6cd32f266739b96c4f751</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3962126%2F38a9666e-8462-4d06-b16a-b8191eac0ae1.png</url>
      <title>DEV Community: Jae</title>
      <link>https://dev.to/jae_6cd32f266739b96c4f751</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jae_6cd32f266739b96c4f751"/>
    <language>en</language>
    <item>
      <title>How to Get Your Resume Past ATS (and In Front of Humans)</title>
      <dc:creator>Jae</dc:creator>
      <pubDate>Mon, 15 Jun 2026 10:00:04 +0000</pubDate>
      <link>https://dev.to/jae_6cd32f266739b96c4f751/how-to-get-your-resume-past-ats-and-in-front-of-humans-4k16</link>
      <guid>https://dev.to/jae_6cd32f266739b96c4f751/how-to-get-your-resume-past-ats-and-in-front-of-humans-4k16</guid>
      <description>&lt;p&gt;Most resumes never reach a recruiter. They're filtered out by Applicant Tracking Systems—software that scans, parses, and ranks applications before any human sees them. If you've been sending out resumes into the void, this is probably why.&lt;/p&gt;

&lt;p&gt;The good news: ATS systems are predictable. Once you understand how they work, you can structure your application to pass the filters and land in front of the people who actually make hiring decisions.&lt;/p&gt;

&lt;h2&gt;What ATS Actually Does (and Why Your Resume Gets Rejected)&lt;/h2&gt;

&lt;p&gt;An ATS doesn't read your resume the way a person does. It parses the document into fields—name, contact info, work history, skills—and scores it based on keyword matches, formatting compatibility, and completeness.&lt;/p&gt;

&lt;p&gt;Most rejections happen because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The ATS can't parse your fancy formatting (tables, text boxes, headers, images)&lt;/li&gt;
&lt;li&gt;Your resume lacks keywords from the job description&lt;/li&gt;
&lt;li&gt;Your job titles or skills don't align with what the system is searching for&lt;/li&gt;
&lt;li&gt;You used inconsistent date formats or uncommon section headings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are fixable problems. You don't need to game the system—you just need to speak its language.&lt;/p&gt;

&lt;h2&gt;Step 1: Use a Clean, ATS-Friendly Format&lt;/h2&gt;

&lt;p&gt;Stick to a simple layout. Use standard fonts like Arial, Calibri, or Times New Roman. Avoid headers and footers (ATS often can't read them). Don't use tables, text boxes, images, or graphics. Use standard section headings like "Work Experience," "Education," and "Skills."&lt;/p&gt;

&lt;p&gt;Save your resume as a .docx file unless the job posting specifically asks for a PDF. Some older ATS platforms struggle with PDFs, though most modern ones handle them fine. When in doubt, .docx is safer.&lt;/p&gt;

&lt;p&gt;Use consistent date formatting throughout (e.g., "January 2020 – March 2023" or "01/2020 – 03/2023"). The system needs to understand your timeline without ambiguity.&lt;/p&gt;

&lt;h2&gt;Step 2: Mirror the Job Description (Without Lying)&lt;/h2&gt;

&lt;p&gt;Read the job posting carefully. Identify the exact phrases they use for required skills, tools, and qualifications. If the posting says "project management," use "project management"—not "managed projects" or "PM experience." ATS keyword matching is often literal.&lt;/p&gt;

&lt;p&gt;Look for patterns in multiple job postings for the same role. If five companies all list "stakeholder communication" or "cross-functional collaboration," those phrases should appear somewhere in your resume if you've done that work.&lt;/p&gt;

&lt;p&gt;This isn't about keyword stuffing. It's about translating your actual experience into the language the employer (and their ATS) is looking for. If you led a team, say so in the same terms they use. If you've used a specific tool they mention, name it explicitly.&lt;/p&gt;

&lt;h2&gt;Step 3: Tailor Every Application&lt;/h2&gt;

&lt;p&gt;Sending the same resume to every job is the fastest way to stay in the rejection pile. Each company configures their ATS differently, and each role has different keyword priorities.&lt;/p&gt;

&lt;p&gt;For every application, create a version of your resume that prioritizes the experience and skills most relevant to that specific job. Reorder bullet points. Adjust your summary. Emphasize the projects that align with what they're hiring for.&lt;/p&gt;

&lt;p&gt;Yes, this takes time. That's the point. A tailored resume that gets through the ATS and resonates with a recruiter is worth more than ten generic ones that get auto-rejected.&lt;/p&gt;

&lt;h2&gt;Step 4: Include a Skills Section with Exact Matches&lt;/h2&gt;

&lt;p&gt;Create a dedicated "Skills" section near the top of your resume. List technical skills, tools, certifications, and methodologies that match the job description. Use the exact terms from the posting.&lt;/p&gt;

&lt;p&gt;This section is low-hanging fruit for ATS scanning. If the system is searching for "SQL," "Salesforce," or "Agile," and you have those skills, list them clearly. Don't bury them in paragraph text where the parser might miss them.&lt;/p&gt;

&lt;h2&gt;Step 5: Write for Humans, Too&lt;/h2&gt;

&lt;p&gt;Once your resume passes the ATS, a recruiter will spend about six seconds skimming it. Make those seconds count.&lt;/p&gt;

&lt;p&gt;Use bullet points that start with action verbs. Quantify results wherever possible: "Reduced onboarding time by 30%" beats "Improved onboarding process." Be specific about what you did, how you did it, and what the outcome was.&lt;/p&gt;

&lt;p&gt;Your resume needs to satisfy the robot and impress the human. Don't optimize so hard for ATS that your resume becomes a lifeless keyword list. Clarity and accomplishments still matter.&lt;/p&gt;

&lt;h2&gt;The Manual Process Works—But It's Tedious&lt;/h2&gt;

&lt;p&gt;Everything above works. I've used this approach to help dozens of people get interviews at companies where they were previously ghosted. The problem is that tailoring a resume, cover letter, and LinkedIn profile for every job takes hours.&lt;/p&gt;

&lt;p&gt;If you're applying to ten jobs, that's a week of work. If you're applying to fifty, it's unsustainable.&lt;/p&gt;

&lt;p&gt;That's why I built &lt;a href="https://koinster7.gumroad.com/l/offerpilot" rel="noopener noreferrer"&gt;OfferPilot&lt;/a&gt;—a one-time-purchase toolkit that includes an ATS playbook, proven resume frameworks, cover letter templates, interview answer banks, LinkedIn optimization guides, and an AI tool that tailors a complete application package to any job description. You own it; no subscription. It automates the tedious parts so you can focus on preparing for interviews instead of reformatting bullet points.&lt;/p&gt;

&lt;p&gt;Whether you do this manually or use a tool, the strategy is the same: understand what ATS is looking for, speak its language, and make it easy for recruiters to see why you're the right fit.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>indiehackers</category>
      <category>python</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How I Track 7 Income Streams in One Notion Dashboard</title>
      <dc:creator>Jae</dc:creator>
      <pubDate>Mon, 15 Jun 2026 10:00:03 +0000</pubDate>
      <link>https://dev.to/jae_6cd32f266739b96c4f751/how-i-track-7-income-streams-in-one-notion-dashboard-3425</link>
      <guid>https://dev.to/jae_6cd32f266739b96c4f751/how-i-track-7-income-streams-in-one-notion-dashboard-3425</guid>
      <description>&lt;p&gt;When you're juggling multiple income sources—YouTube ad revenue, book sales, Etsy orders, stock trades, blog work, affiliate commissions, and API subscriptions—it's easy to lose track of what's working. I needed one place to see everything at a glance, so I built a simple Notion dashboard that logs all seven streams and calculates monthly totals automatically.&lt;/p&gt;

&lt;p&gt;Here's exactly how I set it up, step by step, so you can do the same.&lt;/p&gt;

&lt;h2&gt;Why Separate Spreadsheets Don't Work&lt;/h2&gt;

&lt;p&gt;I used to keep a Google Sheet for each income source. YouTube had its own tab, KDP had another, and my trading journal lived in a different file entirely. Every month I'd open five or six documents, copy numbers into a master sheet, and try to remember which cell formulas I'd broken last time.&lt;/p&gt;

&lt;p&gt;The problem wasn't the spreadsheets themselves—it was the friction. When it takes ten minutes to log a $40 affiliate sale, you stop logging. When you can't see your progress toward a monthly goal without switching tabs, you stop checking. A single dashboard fixes both issues.&lt;/p&gt;

&lt;h2&gt;The Core Structure: One Database, Seven Views&lt;/h2&gt;

&lt;p&gt;In Notion, I created a single database called "Income Log." Each row is one transaction, and each transaction has a few key properties:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Date:&lt;/strong&gt; When the money came in (or when the platform reported it)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; A dropdown with seven options—YouTube, KDP, Etsy, Trading, Blog, Affiliate, API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amount:&lt;/strong&gt; The dollar figure, entered as a number&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notes:&lt;/strong&gt; Optional—what the sale was for, which video earned the ad revenue, or which affiliate link converted&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it. No complicated formulas yet, just raw entries. I log income as it happens, even if it's $3 from a Kindle sale. The goal is to build a complete picture over time.&lt;/p&gt;

&lt;h2&gt;Filtering by Source and Month&lt;/h2&gt;

&lt;p&gt;Notion lets you create multiple views of the same database. I made seven filtered views—one for each income stream—so I can click "YouTube" and see only those entries. I also added a date filter for "this month" on each view, which makes it easy to see how much I've earned from YouTube in March, for example.&lt;/p&gt;

&lt;p&gt;To set this up, duplicate your main database view, rename it to the income source, then add two filters: "Source is YouTube" and "Date is this month." Repeat for each of the seven streams.&lt;/p&gt;

&lt;h2&gt;Auto-Calculating Monthly Totals&lt;/h2&gt;

&lt;p&gt;At the bottom of each filtered view, I turned on the "Calculate" option for the Amount column and set it to "Sum." Now Notion adds up all the rows automatically. When I log a new YouTube payment, the total updates instantly. No manual formulas, no copy-pasting.&lt;/p&gt;

&lt;p&gt;I also created an eighth view called "All Income This Month" with just the date filter. This shows every transaction across all seven sources, with a grand total at the bottom. It's the number I check most often.&lt;/p&gt;

&lt;h2&gt;Tracking Monthly Goals&lt;/h2&gt;

&lt;p&gt;I wanted to see progress toward a monthly target without doing mental math. Here's the simplest way I found: add a formula property called "Goal Progress."&lt;/p&gt;

&lt;p&gt;First, I set a target—let's say $3,000 per month. In the formula, I wrote something like this: &lt;code&gt;prop("Amount") / 3000 * 100&lt;/code&gt;. This calculates what percentage of the goal each transaction represents. Then I turned on the "Sum" calculation for that column, and now the total shows my overall progress as a percentage.&lt;/p&gt;

&lt;p&gt;If you want separate goals per income source, duplicate the formula and adjust the denominator. For example, if your YouTube goal is $500, use &lt;code&gt;prop("Amount") / 500 * 100&lt;/code&gt; in the YouTube-only view.&lt;/p&gt;

&lt;h2&gt;What to Log and When&lt;/h2&gt;

&lt;p&gt;I log income when it's confirmed, not when I expect it. For YouTube and KDP, that means waiting for the monthly payment report. For Etsy and Gumroad, I log orders when they clear. For trading (which I track for educational purposes only), I log realized gains or losses after I close a position, not while it's open.&lt;/p&gt;

&lt;p&gt;Affiliate commissions are tricky because some networks pay 30 or 60 days after the sale. I log them when the commission is approved, not when I eventually get paid. That way, the dashboard reflects what I've actually earned in a given month, even if the cash hits my bank account later.&lt;/p&gt;

&lt;h2&gt;Reviewing the Data Every Week&lt;/h2&gt;

&lt;p&gt;Once a week, I open the "All Income This Month" view and scan the list. I look for patterns—did one blog post drive a spike in affiliate clicks? Did a specific Etsy product sell more after I updated the photos? The dashboard doesn't answer these questions automatically, but it makes the data easy to spot.&lt;/p&gt;

&lt;p&gt;I also compare the current month's total to the same month last year. Notion doesn't do this natively, but I keep a simple archive view filtered by "Date is last year, same month" and glance at the sum. If I'm up 20%, I know something's working. If I'm flat, I know I need to try something new.&lt;/p&gt;

&lt;h2&gt;A Faster Option If You Don't Want to Build It&lt;/h2&gt;

&lt;p&gt;Setting this up manually takes about an hour—longer if you're new to Notion or want to customize the formulas. If you'd rather skip the setup, I built a template called &lt;a href="https://koinster7.gumroad.com/l/notion" rel="noopener noreferrer"&gt;Passive Income OS (Notion)&lt;/a&gt; that includes the income tracker, goal calculators, and a few other modules for managing projects and content. It automates the tedious parts so you can start logging right away.&lt;/p&gt;

&lt;p&gt;Either way, the core idea is the same: one database, consistent logging, and a view that shows you the total without extra work. The tool matters less than the habit of actually tracking what comes in.&lt;/p&gt;

&lt;h2&gt;Final Thought&lt;/h2&gt;

&lt;p&gt;Tracking income across multiple streams isn't about celebrating big numbers—it's about knowing what's worth your time. When you can see all seven sources in one place, you stop guessing and start making decisions based on what's actually working.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>indiehackers</category>
      <category>python</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Scope Creep Is a Paperwork Problem (Fix It With a Real SOW)</title>
      <dc:creator>Jae</dc:creator>
      <pubDate>Fri, 12 Jun 2026 10:00:03 +0000</pubDate>
      <link>https://dev.to/jae_6cd32f266739b96c4f751/scope-creep-is-a-paperwork-problem-fix-it-with-a-real-sow-40ca</link>
      <guid>https://dev.to/jae_6cd32f266739b96c4f751/scope-creep-is-a-paperwork-problem-fix-it-with-a-real-sow-40ca</guid>
      <description>&lt;p&gt;You land the project, shake hands (virtually), and start building. Two weeks later, the client asks for "just one more feature" that wasn't in the original email. Then another. By month three, you're working twice the hours for the same flat fee, resenting every Slack notification. This isn't a client problem—it's a documentation problem. You never defined the edges of the work, so there are no edges to defend.&lt;/p&gt;

&lt;p&gt;A proper Statement of Work (SOW) is your boundary. It's the document both parties sign before any code gets written or any design file opens. It lists exactly what you'll deliver, what you won't, when payment happens, and how changes get handled. It sounds boring because it is. It's also the difference between a profitable project and a three-month unpaid overtime shift.&lt;/p&gt;

&lt;h2&gt;What Belongs in a Real SOW&lt;/h2&gt;

&lt;p&gt;Start with the project summary: two or three sentences that describe the goal in plain language. This isn't marketing copy—it's a shared understanding. "Build a five-page marketing site with contact form and CMS integration" is enough. Skip the fluff.&lt;/p&gt;

&lt;p&gt;Next, list your deliverables with acceptance criteria. A deliverable without criteria is an invitation to endless revisions. Instead of "Homepage design," write "Homepage design (desktop and mobile) delivered as Figma file; two rounds of revisions included." Instead of "API integration," write "API integration with Stripe; tested in staging environment; handles subscription creation and cancellation." The criteria tell you both when you're done.&lt;/p&gt;

&lt;p&gt;Then comes the out-of-scope section, and this is where most freelancers get squeamish. You worry that listing exclusions will scare the client off. It won't. It clarifies. Write down the things that sound adjacent but aren't included: "Email marketing setup, third-party plugin customization, and ongoing hosting management are not included in this scope." When the client asks for one of those things later, you point to this section and send a change order. No argument, no guilt.&lt;/p&gt;

&lt;h2&gt;Milestone Payments and Change Control&lt;/h2&gt;

&lt;p&gt;Break the project into phases and tie payment to each milestone. A simple three-part split works for most projects: one-third upfront, one-third at midpoint review, one-third on final delivery. The milestone descriptions should match your deliverables. "Payment 2 due upon approval of homepage and two interior page designs" is clear. "Payment 2 due mid-project" is not.&lt;/p&gt;

&lt;p&gt;Include a change-control clause. This is the paragraph that says changes are welcome, but they require a written change order and may affect timeline and cost. Use plain language: "Any modification to the deliverables listed above must be requested in writing. We'll provide a written estimate of time and cost, and work will begin once the change order is approved." This isn't hostile. It's professional. It saves relationships because it prevents the slow-building resentment that comes from unacknowledged extra work.&lt;/p&gt;

&lt;h2&gt;The Change Order Template You'll Actually Use&lt;/h2&gt;

&lt;p&gt;A change order is a mini-SOW. It references the original agreement, describes the requested change, lists the new deliverable, states the additional cost and time required, and includes a signature line. Keep a template ready so you can fill it out in five minutes when a request comes in.&lt;/p&gt;

&lt;p&gt;Your template should include these sections:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Original project title and date&lt;/strong&gt; – ties it back to the SOW&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Requested change&lt;/strong&gt; – one or two sentences describing what the client asked for&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New deliverable&lt;/strong&gt; – what you'll produce, with acceptance criteria&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Additional cost&lt;/strong&gt; – fixed fee or hourly estimate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Revised timeline&lt;/strong&gt; – new delivery date for this piece and any affected milestones&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Approval signature and date&lt;/strong&gt; – makes it binding&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Send it as a PDF. Get it signed before you start the extra work. Every single time.&lt;/p&gt;

&lt;h2&gt;Writing the SOW From a Messy Brief&lt;/h2&gt;

&lt;p&gt;Most client briefs are vague. "We need a new website that feels modern and converts better." Your job is to turn that into specifics. Ask questions: How many pages? What integrations? Who's writing the copy? What does success look like? What's explicitly not included?&lt;/p&gt;

&lt;p&gt;Take their answers and draft the SOW in a shared doc. Walk through it together on a call. This is where you catch mismatches in expectations before they become scope creep. When they say "Oh, I assumed you'd also handle the email setup," you either add it as a deliverable with a cost, or you add it to the out-of-scope list. Either way, it's documented.&lt;/p&gt;

&lt;p&gt;Save the signed SOW and reference it throughout the project. When a new request comes in, check it against the deliverables. If it's not there, it's a change order. You're not being difficult—you're honoring the agreement you both made.&lt;/p&gt;

&lt;h2&gt;A Tool That Does the Tedious Part&lt;/h2&gt;

&lt;p&gt;Writing SOWs from scratch gets old fast, especially if you're juggling multiple clients. The structure is always the same; only the details change. If you want to skip the manual template-wrangling, &lt;a href="https://stackflowstudio.etsy.com/listing/4519586341" rel="noopener noreferrer"&gt;ScopeShield&lt;/a&gt; generates a complete SOW and change order template from a short project brief. You paste in the client's request, and it drafts the deliverables with acceptance criteria, the out-of-scope list, milestone payment terms, and change-control language. It outputs Markdown and Word files and runs locally using your own API key, so nothing leaves your machine. It's built for freelancers who are tired of watching scope quietly grow.&lt;/p&gt;

&lt;p&gt;Whether you use a tool or a Google Doc template, the point is the same: document the boundaries before you start the work, and enforce them with paperwork when things change.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>indiehackers</category>
      <category>python</category>
      <category>productivity</category>
    </item>
    <item>
      <title>A Realistic Faceless YouTube Shorts Workflow for Busy Makers</title>
      <dc:creator>Jae</dc:creator>
      <pubDate>Fri, 05 Jun 2026 10:00:04 +0000</pubDate>
      <link>https://dev.to/jae_6cd32f266739b96c4f751/a-realistic-faceless-youtube-shorts-workflow-for-busy-makers-4ljf</link>
      <guid>https://dev.to/jae_6cd32f266739b96c4f751/a-realistic-faceless-youtube-shorts-workflow-for-busy-makers-4ljf</guid>
      <description>&lt;p&gt;You're building a product, writing docs, answering support tickets. You know YouTube Shorts could be a solid content channel, but recording yourself on camera every day isn't realistic. Here's how to build a faceless Shorts workflow that runs on autopilot once you set it up.&lt;/p&gt;

&lt;h2&gt;Why Faceless Shorts Make Sense for Makers&lt;/h2&gt;

&lt;p&gt;Faceless content works when you're teaching concepts, sharing tips, or breaking down processes. Think text overlays on stock footage, voiceover tutorials, or animated explainers. No lighting setup, no makeup, no camera anxiety.&lt;/p&gt;

&lt;p&gt;The format suits educational content especially well. If you're in dev tools, productivity, design, or any niche where the idea matters more than your face, this approach lets you publish regularly without the friction of traditional video production.&lt;/p&gt;

&lt;h2&gt;The Manual Workflow (Do This First)&lt;/h2&gt;

&lt;p&gt;Before automating anything, run through the process manually a few times. You'll learn what works and what doesn't, and you'll avoid automating a broken workflow.&lt;/p&gt;

&lt;p&gt;Here's the basic loop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Write the script.&lt;/strong&gt; 150–200 words, structured for a 45–60 second video. One clear idea per Short. No fluff.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generate voiceover.&lt;/strong&gt; Use a text-to-speech service like ElevenLabs, Google Cloud TTS, or AWS Polly. Export as MP3.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create visuals.&lt;/strong&gt; Record your screen, use stock footage (Pexels, Pixabay), or generate simple animations with tools like Remotion or FFmpeg.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edit the video.&lt;/strong&gt; Combine audio and visuals. Export as 1080×1920 (vertical). Keep it under 60 seconds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upload manually.&lt;/strong&gt; Go to YouTube Studio, upload the video, write a title and description, add hashtags, publish as a Short.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do this five times. You'll notice patterns. Maybe your scripts are too long, or your visuals don't match the pacing. Refine your template before you think about automation.&lt;/p&gt;

&lt;h2&gt;Building the Automated Pipeline&lt;/h2&gt;

&lt;p&gt;Once you've nailed the manual process, you can script the repetitive parts. Here's what a Python-based workflow looks like.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Script generation:&lt;/strong&gt; Use OpenAI's API or Anthropic's Claude to generate Short scripts based on a topic list or RSS feed. Prompt engineering matters here. Give the model examples of your best-performing scripts so it matches your style and length.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Text-to-speech:&lt;/strong&gt; Call a TTS API programmatically. ElevenLabs has a Python SDK. Google Cloud TTS is cheap and reliable. Pass in your script, get back an audio file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Video rendering:&lt;/strong&gt; This is the trickiest part. You can use FFmpeg to overlay text on a background video or image, sync it with the audio, and export a vertical MP4. If you want more control, Remotion lets you write React components that render as video, but it's heavier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Uploading via the YouTube API:&lt;/strong&gt; YouTube's Data API v3 lets you upload videos programmatically. You'll need to set up OAuth 2.0, get credentials, and handle token refresh. The endpoint is &lt;code&gt;videos.insert&lt;/code&gt;. You can set the title, description, tags, and category in the same request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scheduling:&lt;/strong&gt; Run the whole script on a cron job (Linux/Mac) or Task Scheduler (Windows). Or deploy it to a cloud function that triggers daily. You're not publishing spam—you're publishing one thoughtful Short per day based on a topic queue you've preloaded.&lt;/p&gt;

&lt;h2&gt;What This Workflow Actually Requires&lt;/h2&gt;

&lt;p&gt;Be realistic about what you're signing up for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Initial setup takes a weekend if you're comfortable with Python and APIs. Longer if you're learning as you go.&lt;/li&gt;
&lt;li&gt;You'll spend time upfront creating a list of topics, tuning prompts, and testing output quality.&lt;/li&gt;
&lt;li&gt;The system won't "go viral" on its own. It's a consistency engine, not a magic wand.&lt;/li&gt;
&lt;li&gt;You'll still need to monitor the channel, reply to comments, and tweak the content strategy based on what resonates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal isn't to check out completely. It's to remove the daily friction so you can focus on product work while still showing up consistently on YouTube.&lt;/p&gt;

&lt;h2&gt;When to Automate (and When Not To)&lt;/h2&gt;

&lt;p&gt;Automate when you've validated that regular Shorts publishing fits your strategy and you've published at least 10–20 manually with consistent quality. Don't automate if you're still experimenting with format, tone, or topic. You'll just scale mediocrity.&lt;/p&gt;

&lt;p&gt;Also, be honest about whether you'll maintain the system. If you hate ops work and don't want to babysit cron jobs or debug API rate limits, automation might create more stress than it solves.&lt;/p&gt;

&lt;h2&gt;An Off-the-Shelf Option&lt;/h2&gt;

&lt;p&gt;If you want the workflow without building it from scratch, I've packaged the pipeline I use into a tool called &lt;a href="https://koinster7.gumroad.com/l/youtube-shorts" rel="noopener noreferrer"&gt;YouTube Shorts Automation&lt;/a&gt;. It handles script generation, TTS, rendering, and scheduled uploads via the YouTube API. You provide a topic list and let it run.&lt;/p&gt;

&lt;p&gt;It's not for everyone—especially if you want deep customization or already have a Python setup you prefer. But if you'd rather skip the boilerplate and start publishing this week, it's a shortcut.&lt;/p&gt;

&lt;h2&gt;Final Thought&lt;/h2&gt;

&lt;p&gt;Faceless Shorts won't replace your core marketing, but they're a low-effort way to stay visible and teach concepts that matter to your audience. Build the workflow that fits your time, not someone else's ideal.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>indiehackers</category>
      <category>python</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to Auto-Publish to Blogger with AI and API</title>
      <dc:creator>Jae</dc:creator>
      <pubDate>Wed, 03 Jun 2026 10:00:03 +0000</pubDate>
      <link>https://dev.to/jae_6cd32f266739b96c4f751/how-to-auto-publish-to-blogger-with-ai-and-api-2dn7</link>
      <guid>https://dev.to/jae_6cd32f266739b96c4f751/how-to-auto-publish-to-blogger-with-ai-and-api-2dn7</guid>
      <description>&lt;p&gt;Many creators overlook Blogger in favor of modern headless CMS options or self-hosted WordPress sites, but it remains a highly stable, completely free hosting option backed by Google. If you want to manage content pipelines without running into server fees or complex database maintenance, Blogger is a surprisingly powerful choice when paired with its official API. By combining automated AI content drafting, structural ad code injection, and a cron scheduler, you can build a highly resilient automated publishing system.&lt;/p&gt;
&lt;h2&gt;The Core Technical Hurdles&lt;/h2&gt;
&lt;p&gt;Building an automation pipeline like this yourself requires solving three specific technical challenges. First, standard LLM outputs are typically formatted in Markdown, but Blogger requires clean, nested HTML to render correctly within its templates. Second, you cannot simply paste ad unit scripts at the absolute top or bottom of an article; they must be programmatically injected into natural breaks within the text. Finally, you must manage Google's OAuth2 authentication flow to allow your publishing script to post securely on your behalf without manual intervention.&lt;/p&gt;
&lt;h2&gt;How to Structure and Inject Ad Code Programmatically&lt;/h2&gt;
&lt;p&gt;To keep your articles readable, you should never ask the AI to write or insert your ad code directly. Large language models often hallucinate script tags, break HTML attributes, or place ads in awkward spots that ruin user experience. Instead, separate your content generation from your ad layout engine.&lt;/p&gt;
&lt;p&gt;The cleanest approach is to generate your post content as raw HTML first, then parse that HTML using a library like Cheerio in Node.js or BeautifulSoup in Python. You can search for paragraph tags and insert your custom ad unit wrappers after specific blocks. For example, programmatically finding the second and fifth closing paragraph tags and splicing your AdSense code right after them creates a balanced layout that respects the flow of the text.&lt;/p&gt;
&lt;h2&gt;Interfacing with the Google Blogger API&lt;/h2&gt;
&lt;p&gt;To publish your finished posts, you will need to communicate directly with the Blogger API v3. This requires configuring a developer project inside the Google Cloud Console.&lt;/p&gt;
&lt;p&gt;To set up your API access manually, follow these steps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go to the Google Cloud Console, create a new project, and enable the Blogger API v3.&lt;/li&gt;
&lt;li&gt;Configure your OAuth consent screen, selecting the "External" user type if you are publishing to your own personal blogs.&lt;/li&gt;
&lt;li&gt;Create credentials for an OAuth 2.0 Client ID, downloading the JSON file containing your Client ID and Client Secret.&lt;/li&gt;
&lt;li&gt;Write a quick one-time authentication script to authorize your app and capture the vital refresh token. Unlike short-lived access tokens, a refresh token allows your publishing script to run indefinitely on a schedule.&lt;/li&gt;
&lt;li&gt;Build your publishing payload, ensuring your HTML content is safely escaped as a string before sending it via a POST request to the Blogger endpoints.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Building the Scheduler&lt;/h2&gt;
&lt;p&gt;Once your scripts can generate HTML, inject the ad code, and authenticate with Google, you need a way to run them automatically on a repeating schedule.&lt;/p&gt;
&lt;p&gt;A simple VPS running a Linux cron job is often the most reliable setup. You can write a shell script that pulls a new topic from a pre-defined list, sends it to your content generator, runs the ad injector, and posts it directly to your Blogger account. If you prefer serverless infrastructure, you can set up a scheduled cloud function or a GitHub Actions workflow that triggers at set times throughout the week.&lt;/p&gt;
&lt;h2&gt;Simplifying Your Workflow&lt;/h2&gt;
&lt;p&gt;While building this entire infrastructure from scratch is an excellent learning experience, managing OAuth token refreshes, handling API rate limits, and debugging broken HTML parsers can take hours of development time. If you want to skip the custom coding and deploy an already-built system, you can use &lt;a href="https://koinster7.gumroad.com/l/blogspot" rel="noopener noreferrer"&gt;Blogspot AdSense Automation&lt;/a&gt;. This tool connects securely to your Blogger account, handles the generation of structured HTML content, and cleanly places your AdSense code blocks into optimal structural layouts automatically.&lt;/p&gt;
&lt;h2&gt;Moving Forward&lt;/h2&gt;
&lt;p&gt;Setting up a robust, automated publishing pipeline requires some initial technical setup, but once your backend is configured properly, it runs reliably in the background without requiring daily maintenance.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>indiehackers</category>
      <category>python</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to Turn One Podcast Episode into 5 Content Assets</title>
      <dc:creator>Jae</dc:creator>
      <pubDate>Mon, 01 Jun 2026 10:00:02 +0000</pubDate>
      <link>https://dev.to/jae_6cd32f266739b96c4f751/how-to-turn-one-podcast-episode-into-5-content-assets-243</link>
      <guid>https://dev.to/jae_6cd32f266739b96c4f751/how-to-turn-one-podcast-episode-into-5-content-assets-243</guid>
      <description>&lt;p&gt;Recording a great conversation or a solo audio episode is highly satisfying, but the post-production distribution loop is where most solo founders and creators quietly give up. Spending three to four hours transcribing, formatting show notes, extracting timestamps, and drafting social posts is exhausting when you are also trying to run a business. Here is a realistic, step-by-step workflow to repurpose your audio efficiently without losing your sanity.&lt;/p&gt;

&lt;h2&gt;The Core Assets You Actually Need&lt;/h2&gt;

&lt;p&gt;Before looking at the process, it helps to simplify the deliverables. You do not need twenty different vertical video clips and a dozen blog post variants to make your episode useful outside of the audio player. For a clean, professional distribution loop, focus on these four core assets:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
&lt;strong&gt;Structured show notes:&lt;/strong&gt; A brief summary and 3-5 key bulleted takeaways.&lt;/li&gt;
  &lt;li&gt;
&lt;strong&gt;Chapter timestamps:&lt;/strong&gt; Essential for player navigation, accessibility, and quick skimming.&lt;/li&gt;
  &lt;li&gt;
&lt;strong&gt;Text-based social snippets:&lt;/strong&gt; Two or three short posts highlighting key concepts or debates.&lt;/li&gt;
  &lt;li&gt;
&lt;strong&gt;Clean quote cards:&lt;/strong&gt; One or two highly specific text quotes formatted for visual feeds.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By focusing only on these high-leverage assets, you protect your energy and avoid the trap of creating noise for the sake of volume.&lt;/p&gt;

&lt;h2&gt;The Step-by-Step Manual Workflow&lt;/h2&gt;

&lt;p&gt;If you have more time than budget, executing this process manually teaches you exactly what makes a good asset. Here is how to do it systematically:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
&lt;strong&gt;1. Generate a raw transcript:&lt;/strong&gt; Do not pay for expensive transcription services if you are just starting out. Use a local installation of OpenAI's Whisper (via a GUI wrapper like MacWhisper or via the command line with Whisper.cpp) to generate a free, highly accurate text transcript of your WAV or MP3 file.&lt;/li&gt;
  &lt;li&gt;
&lt;strong&gt;2. Scan for natural transitions:&lt;/strong&gt; Open your transcript alongside an audio player. Scroll through the text to find major topic shifts. Note the exact timestamp where the conversation pivots (e.g., [04:12] - Why We Built in Public). Aim for five to eight chapters per 30-minute episode.&lt;/li&gt;
  &lt;li&gt;
&lt;strong&gt;3. Draft the show notes:&lt;/strong&gt; Write a three-sentence introduction that explains who the guest is and what core problem you solved in the episode. Underneath, list three key takeaways. Ensure these takeaways are written as standalone lessons so a reader learns something even if they never click play.&lt;/li&gt;
  &lt;li&gt;
&lt;strong&gt;4. Extract standout quotes:&lt;/strong&gt; Read through the transcript to locate moments of high clarity—where you or your guest stated something concise, contrarian, or highly practical. Copy these out into a separate document.&lt;/li&gt;
  &lt;li&gt;
&lt;strong&gt;5. Structure your social posts:&lt;/strong&gt; Take your extracted quotes or key takeaways and reformat them into short-form text updates. Write a hook sentence at the top, add the core insight in the middle, and place a link to the episode at the bottom.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Where the Manual Process Breaks Down&lt;/h2&gt;

&lt;p&gt;While the manual method costs nothing but your time, the friction accumulates quickly. Copying and pasting raw, thousands-of-words-long transcripts into generic AI web interfaces often results in generic, overly hyped summaries that sound like a marketing robot wrote them. You can easily spend thirty minutes editing the clinical, artificial tone out of your own show notes.&lt;/p&gt;

&lt;p&gt;Additionally, manually matching timestamps to transcript blocks is a tedious exercise in clicking back and forth on a media player timeline. When you are a solo operator, spending two to three hours on administrative copy-pasting for every single episode is time stolen from writing code, talking to users, or designing new features.&lt;/p&gt;

&lt;h2&gt;Streamlining and Automating the Grind&lt;/h2&gt;

&lt;p&gt;To make this sustainable over the long haul, you need a repeatable system. You can build this yourself by saving a dedicated system prompt in a text file that instructs your LLM of choice to output clean Markdown, exclude generic buzzwords, and structure chapters using a specific time-code format.&lt;/p&gt;

&lt;p&gt;If you prefer a pre-built system that handles this translation from raw audio to polished markdown assets without the constant prompt-tweak-copy-paste dance, you can use &lt;a href="https://koinster7.gumroad.com/l/podforge" rel="noopener noreferrer"&gt;PodForge Kit&lt;/a&gt;. It is a structured framework designed to parse your raw transcripts and output clean show notes, accurate chapters, and structured social snippets in one go. It cuts out the tedious manual prompt engineering so you can focus on the creative work rather than the file organization.&lt;/p&gt;

&lt;p&gt;Focus on keeping your production process simple and sustainable, because consistency is what ultimately keeps an indie project alive.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>indiehackers</category>
      <category>python</category>
      <category>productivity</category>
    </item>
    <item>
      <title>A Realistic Faceless YouTube Shorts Workflow for Solo Founders</title>
      <dc:creator>Jae</dc:creator>
      <pubDate>Mon, 01 Jun 2026 07:16:05 +0000</pubDate>
      <link>https://dev.to/jae_6cd32f266739b96c4f751/a-realistic-faceless-youtube-shorts-workflow-for-solo-founders-2l7n</link>
      <guid>https://dev.to/jae_6cd32f266739b96c4f751/a-realistic-faceless-youtube-shorts-workflow-for-solo-founders-2l7n</guid>
      <description>&lt;p&gt;We have all seen the social media threads claiming you can build a faceless YouTube empire in three clicks using AI. The reality of building a content pipeline as a busy solo founder is much more mundane. It requires reliable code, strict file formatting, and consistent execution. If you want to build a sustainable pipeline that you can actually maintain alongside your day job or main SaaS project, you need a workflow built on robust engineering, not hype.&lt;/p&gt;

&lt;h2&gt;The Core Architecture of a Faceless Short&lt;/h2&gt;

&lt;p&gt;To make video creation repeatable, you must treat your videos like software components. Instead of opening a heavy video editing GUI every time you want to post, break a short down into its raw programmatic assets: a plain text script, an MP3 voiceover, a vertical background video loop, background music, and a SRT or JSON subtitle file. By separating these layers, you can automate the rendering and uploading stages entirely.&lt;/p&gt;

&lt;h2&gt;Step 1: Scripting and Natural TTS Generation&lt;/h2&gt;

&lt;p&gt;A good short is dense and fast-paced. Because viewers can swipe away instantly, your script needs to deliver value within the first three seconds and wrap up within 30 to 50 seconds. Aim for a script length of 100 to 140 words.&lt;/p&gt;

&lt;p&gt;To turn this text into high-quality audio programmatically, you can use modern text-to-speech (TTS) APIs. While there are free options, paid APIs like OpenAI's TTS engine (specifically the &lt;code&gt;tts-1&lt;/code&gt; model) or ElevenLabs offer highly natural inflections. Here is how to execute this step cleanly:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
&lt;strong&gt;Draft for the ear:&lt;/strong&gt; Write short sentences. Avoid complex punctuation that can cause the synthetic voice to stutter or pause awkwardly.&lt;/li&gt;
  &lt;li&gt;
&lt;strong&gt;Generate the audio file:&lt;/strong&gt; Send a POST request to your chosen TTS API. Save the output as a high-bitrate MP3 or WAV file.&lt;/li&gt;
  &lt;li&gt;
&lt;strong&gt;Extract word-level timestamps:&lt;/strong&gt; If you want to animate your subtitles word-by-word, request token or word-level timestamps from your API provider to generate a structured JSON file of timings.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Step 2: Programmatic Video Rendering with FFmpeg&lt;/h2&gt;

&lt;p&gt;Once you have your voiceover, you need to combine it with visual assets. Doing this programmatically requires FFmpeg, a command-line utility for processing multimedia files. Your target video format must be vertical: 1080x1920 pixels (a 9:16 aspect ratio), encoded in H.264 video and AAC audio.&lt;/p&gt;

&lt;p&gt;Instead of manually cropping landscape videos, collect a folder of high-quality vertical background footage (such as abstract textures, coding loops, or minimal nature shots). You can use a bash script or a Python wrapper to run an FFmpeg command that overlays the components:&lt;/p&gt;

&lt;p&gt;Your command will take the background video, loop it to match the duration of your audio file, overlay your generated voiceover, optionally add a quiet background music track, and burn the subtitles directly onto the video using the &lt;code&gt;subtitles&lt;/code&gt; filter. Running this via a script allows you to render a finished video in a matter of seconds, bypassing the rendering queues of traditional video editors.&lt;/p&gt;

&lt;h2&gt;Step 3: Scheduling Uploads via the YouTube API&lt;/h2&gt;

&lt;p&gt;Manually uploading videos every day is a quick path to burnout. The YouTube Data API v3 allows you to upload and schedule your videos programmatically. To set this up, you need to navigate to the Google Cloud Console, create a project, and enable the YouTube Data API v3. From there, generate your OAuth 2.0 credentials and download your client secrets JSON file.&lt;/p&gt;

&lt;p&gt;When writing your upload script, keep these technical limitations and practices in mind:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
&lt;strong&gt;The API Quota Limit:&lt;/strong&gt; Google limits projects to a default of 10,000 quota units per day. A single video upload costs roughly 1,600 units. This means you can comfortably upload up to six videos a day on the free tier before needing to request a quota increase.&lt;/li&gt;
  &lt;li&gt;
&lt;strong&gt;Setting Metadata:&lt;/strong&gt; Define your title, description, tags, and category programmatically in your API request payload. Keep titles concise and relevant.&lt;/li&gt;
  &lt;li&gt;
&lt;strong&gt;Using the Scheduled Status:&lt;/strong&gt; In your API request, set the &lt;code&gt;privacyStatus&lt;/code&gt; to &lt;code&gt;private&lt;/code&gt; inside the &lt;code&gt;status&lt;/code&gt; resource, and specify a &lt;code&gt;publishAt&lt;/code&gt; timestamp in ISO 8601 format (e.g., &lt;code&gt;2026-03-30T15:00:00Z&lt;/code&gt;). This schedules the video to go public automatically at your chosen time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;The Hard Truth About Platform Rules&lt;/h2&gt;

&lt;p&gt;While automation handles the manual labor, it does not guarantee channel growth or platform approval. YouTube has strict rules regarding "reused content" and low-effort channels. If you simply run automated scripts to scrape Wikipedia articles, feed them to a robotic voice, and pair them with generic stock footage, your channel will likely fail to build an audience and will struggle to get accepted into the YouTube Partner Program.&lt;/p&gt;

&lt;p&gt;Use automation to streamline your technical pipeline—the rendering, the file management, and the API uploads. Do not use it to replace original scripting, research, and creative curation. Your content must still offer genuine value, humor, or educational depth to capture and hold human attention.&lt;/p&gt;

&lt;h2&gt;Streamlining Your Workflow&lt;/h2&gt;

&lt;p&gt;Building this entire pipeline yourself from scratch is a fantastic developer project, but it requires several weekends of writing API integrations, debugging complex FFmpeg rendering commands, and wrestling with Google's OAuth2 authentication flow. If your primary goal is to get your content out there rather than writing boilerplate integration code, you can use pre-built starter templates.&lt;/p&gt;

&lt;p&gt;If you want to bypass the setup phase and get a production-ready system right away, you can use &lt;a href="https://koinster7.gumroad.com/l/youtube-shorts" rel="noopener noreferrer"&gt;YouTube Shorts Automation&lt;/a&gt;. It is a clean, developer-focused codebase that handles the script-to-video rendering and API scheduling for you, letting you focus entirely on writing great scripts and managing your brand.&lt;/p&gt;

&lt;p&gt;Building a sustainable channel is a marathon of consistency, so focus on setting up a clean workflow that you can comfortably run for months without burning out.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>indiehackers</category>
      <category>python</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
