#!/usr/bin/env python3 """Generate YouTube operations articles and deploy to both WordPress sites.""" from __future__ import annotations import io import json import textwrap from pathlib import Path import paramiko HOST = "107.173.30.245" PASS = "Xiao4669805" ROOT = Path(__file__).resolve().parent def article(intro: str, sections: list[tuple[str, list[str]]]) -> str: parts = [f"

{intro}

"] for h2, paras in sections: parts.append(f"

{h2}

") for p in paras: parts.append(f"

{p}

") return "\n".join(parts) def sec(title: str, *paras: str) -> tuple[str, list[str]]: return title, list(paras) # --- nomadro.com: 38 posts (slug -> title, html) --- NOMADRO_COM: dict[str, tuple[str, str]] = {} def _add_com(slug: str, title: str, html: str) -> None: NOMADRO_COM[slug] = (title, html) _add_com( "what-is-a-digital-nomad", "What Is YouTube Channel Operations?", article( "YouTube channel operations is the day-to-day work of running a channel like a small media business: planning topics, filming, editing, publishing, analyzing performance, and improving the next cycle. It is not the same as being on camera once a week and hoping the algorithm notices.", [ sec( "What operators actually do", "Operators maintain a content calendar, track which videos earn watch time, respond to comments with a system, and fix problems like late uploads or broken end screens before they become habits. The job is repeatable process, not inspiration.", "If you cannot describe your weekly pipeline in five steps, you are creating content but not operating a channel.", ), sec( "Core responsibilities", "Topic research and validation, script or outline preparation, production scheduling, upload metadata (title, description, tags, chapters), thumbnail selection, community management, and monthly review of retention and traffic sources.", ), sec( "Who needs an operations mindset", "Solo creators hit a ceiling when editing, admin, and strategy compete for the same afternoon. Small teams fail when nobody owns the calendar. Treating YouTube as operations makes growth measurable instead of mystical.", ), ], ), ) _add_com( "how-to-start-remote-work", "How to Start a YouTube Channel While Working Full-Time", article( "Starting YouTube alongside a job is viable if you design for limited hours. The mistake is copying full-time creators' upload frequency. Your constraint is energy and time, not ambition.", [ sec( "Start with one repeatable format", "Pick a format you can produce in 90 minutes of filming and 2–3 hours of editing: screen tutorials, desk reviews, or talking-head explainers. Avoid travel vlogs and complex B-roll until the pipeline works.", ), sec( "Batch on weekends", "Record two videos in one session. Edit one midweek, one on the weekend. Publish on fixed days so subscribers and the algorithm see consistency even at low volume.", ), sec( "Protect your employer boundary", "Do not use company equipment, confidential topics, or work hours. Build on evenings. Disclose side projects if your employment contract requires it.", ), sec( "When to reconsider full-time", "Only when revenue and savings cover 6–12 months of expenses and your upload pipeline survives a busy month at work without disappearing for three weeks.", ), ], ), ) _add_com( "geo-arbitrage-basics", "YouTube Monetization Explained: AdSense, RPM, and CPM", article( "YouTube pays most creators through Google AdSense on eligible videos. Understanding RPM (revenue per mille) and CPM (cost per mille) helps you interpret earnings and diagnose weak videos.", [ sec( "CPM vs RPM", "CPM is what advertisers pay per thousand ad impressions. RPM is what you earn per thousand views after YouTube's share and factors like ad blockers. RPM is the number in YouTube Analytics that matches your deposit.", ), sec( "What moves RPM", "Audience geography, season (Q4 is often higher), video length (more mid-rolls on 8+ minute videos), niche (finance and business often beat generic vlogs), and brand safety of content.", ), sec( "Beyond AdSense", "Affiliate links, sponsorships, memberships, and digital products usually outgrow ad revenue for established channels. AdSense is the baseline, not the ceiling.", ), sec( "Operational habit", "Export monthly RPM by video. Kill formats that consistently underperform on watch time and RPM unless they strategically feed a product funnel.", ), ], ), ) _add_com( "packing-list-long-stay", "Essential Gear Checklist for YouTube Creators", article( "Gear should match your format, not your wish list. Buy to remove a specific bottleneck: bad audio, shaky footage, or slow editing.", [ sec( "Non-negotiables", "External microphone (lav or USB condenser), stable lighting (key light or window + reflector), tripod or mount, and backup SD cards or storage.", ), sec( "Camera choice", "Modern phones are enough for talking-head and B-roll. Dedicated cameras matter for low light, lens choice, or client-grade image. Upgrade when you know which spec you need.", ), sec( "Editing machine", "Prioritize RAM and SSD over GPU for 1080p workflows. Proxy editing helps laptops handle 4K until you truly need full-res timelines.", ), sec( "Avoid gear churn", "One upgrade per quarter. Test each purchase against a metric: less re-recording, faster export, or clearer audio on headphones.", ), ], ), ) _add_com( "coworking-vs-home", "Home Studio vs Rented Studio for YouTube Production", article( "Home studios win on cost and speed; rented studios win on sound control and set variety. Most new channels should master home first.", [ sec( "Home advantages", "Zero commute, always available, easy reshoots. Treat a corner with consistent background, acoustic softening (rug, curtains), and controlled light as your set.", ), sec( "When to rent", "Interview episodes, product demos needing space, or when apartment noise makes every take unusable. Book half-days and arrive with shot lists to maximize time.", ), sec( "Hybrid model", "Film A-roll at home, rent for quarterly 'anchor' videos. Keeps brand consistency without monthly studio rent.", ), ], ), ) _add_com( "internet-checklist", "Internet and Upload Requirements for YouTube Creators", article( "Upload failures waste editing time. Operators treat connectivity like production equipment: tested, backed up, and logged.", [ sec( "Minimum targets", "Stable 20 Mbps upload for 1080p; 50+ Mbps comfortable for 4K. Use wired Ethernet for large uploads when possible.", ), sec( "Before you upload", "Verify file integrity, export a backup copy, and upload during off-peak hours if your ISP throttles evenings. YouTube Studio allows scheduling while processing.", ), sec( "Backup connectivity", "Phone hotspot with enough data for a re-upload if home internet drops. Name files with date and version to avoid uploading the wrong export.", ), ], ), ) _add_com( "time-zone-collaboration", "Best Upload Times and Global Audience Scheduling on YouTube", article( "YouTube is global; your audience is not evenly distributed. Operators align publish times with when core viewers are awake, not when editing finishes.", [ sec( "Find your peak", "In YouTube Analytics → Audience, note 'When your viewers are on YouTube.' Schedule premieres and Community posts around those windows.", ), sec( "Time zones", "If 60% of watch time is US Eastern, a 12:00 ET publish often beats midnight local time in Asia. Test two slots for four weeks and compare first-24-hour velocity.", ), sec( "Consistency beats perfection", "Same day each week trains subscribers. Use scheduled publish so late edits do not push you to random times.", ), ], ), ) _add_com( "building-online-income", "Multiple Income Streams for YouTube Channel Operators", article( "Relying only on AdSense makes every algorithm change feel existential. Operators build a stack where ads are one line item.", [ sec( "Common stack", "AdSense, affiliate descriptions, sponsored integrations, digital products (templates, courses), and services (consulting, done-for-you edits).", ), sec( "Sequence matters", "Prove watch time and trust with free value first. Add affiliates aligned with tools you already use. Pursue sponsors when median views support a media kit.", ), sec( "Track by source", "Spreadsheet: video URL, AdSense estimate, affiliate clicks, sponsor fee. Monthly review shows which topics monetize beyond views.", ), ], ), ) _add_com( "city-research-framework", "How to Validate a YouTube Niche Before You Commit", article( "Niche validation prevents six months of videos nobody searches for. Research before you buy a second camera.", [ sec( "Search demand", "Use YouTube search suggestions and tools like Google Trends. Look for questions with recent uploads under 100k subs ranking on page one.", ), sec( "Supply gap", "Watch top results: are they outdated, too long, or missing steps? Your angle is clearer structure, updated tools, or a specific audience (beginners, small business).", ), sec( "Sustainability test", "List 30 video ideas before filming. If you stall at eight, the niche may be too narrow or boring to you.", ), ], ), ) _add_com( "live-streaming-toolkit", "YouTube Live Setup: Tools, Settings, and Workflow", article( "YouTube Live rewards preparation. Live streams build community; they also expose unprepared operators immediately.", [ sec( "Encoder choice", "Stream from YouTube Studio (webcam), OBS, or Streamlabs for overlays and scenes. Test a private unlisted stream first.", ), sec( "Checklist", "Bitrate matched to upload speed, redundant audio source, moderators assigned, title/thumbnail ready, VOD highlight plan post-stream.", ), sec( "Repurpose", "Export the archive, cut chapters for long-form upload, clip Shorts from peaks. One live should feed three assets.", ), ], ), ) _add_com( "banking-and-payments", "YouTube Payments, AdSense Payouts, and Tax Basics", article( "Money from YouTube flows through AdSense thresholds and tax forms. Operators separate creator income from personal spending early.", [ sec( "AdSense mechanics", "Link AdSense to your channel, complete tax info (W-9 or W-8BEN), and set payment threshold. Payments lag earnings by a month or more.", ), sec( "Business structure", "Many creators use a dedicated business account once income is regular. Consult a tax professional for your country.", ), sec( "Recordkeeping", "Save invoices for gear, software, and contractors. Export AdSense reports monthly. Clean records simplify sponsorship negotiations and audits.", ), ], ), ) _add_com( "routines-that-travel", "A Sustainable Weekly Workflow for YouTube Operators", article( "Channels die from random effort, not bad ideas. A weekly operating rhythm beats motivational bursts.", [ sec( "Sample week", "Monday: analytics review and topic pick. Tuesday–Wednesday: script and film. Thursday: edit. Friday: thumbnail, metadata, schedule. Weekend: community replies and Shorts clip.", ), sec( "Capacity planning", "If editing always slips, reduce publish frequency before quality collapses. One strong video beats three rushed ones.", ), sec( "Quarterly reset", "Every 90 days, drop a format that underperformed on retention. Double down on one winner with a mini-series.", ), ], ), ) # batch2 + batch3 slugs _more_com = { "first-digital-nomad-destination": ( "Choosing Your First YouTube Content Format", article( "Your first format should be easy to repeat and easy to search. Formats beat genres: '5-minute tool tutorials' beats 'tech channel' for operational clarity.", [ sec("Good first formats", "Screen capture tutorials, listicles with voiceover, desk explainers with slides, or reaction-free how-to demos."), sec("Bad first formats", "Daily vlogs, cinematic travel, or heavily scripted sketches requiring actors and locations."), sec("Commit for ten episodes", "Evaluate retention after ten uploads of the same format. Switching formats every video hides what actually works."), ], ), ), "work-ready-housing-abroad": ( "Setting Up a Filming Space for YouTube at Home", article( "A dedicated filming zone reduces setup friction. Even a 2×2 meter corner works if background, light, and sound stay consistent.", [ sec("Background", "Bookshelf, plain wall, or curtain. Avoid windows behind you. Keep branding subtle and stable."), sec("Sound", "Soft furnishings reduce echo. Turn off HVAC during takes. Mic close to mouth beats fixing room noise in post."), sec("Storage", "Labeled bins for lights, mics, and cables. Five-minute setup means you film on schedule."), ], ), ), "visa-stay-planning-for-nomads": ( "YouTube Content Planning: Quarterly Calendars That Work", article( "Quarterly planning balances flexibility with accountability. Plan themes, not every title, for the next thirteen weeks.", [ sec("Structure", "Month 1: foundation tutorials. Month 2: case studies. Month 3: tool comparisons or trends. Leave one slot per month for timely news."), sec("Buffer", "Keep two finished videos in reserve for sick weeks or travel."), sec("Review", "End each quarter: top three videos by watch time become next quarter's sequel topics."), ], ), ), "avoid-travel-scams-remote-work": ( "Avoiding Copyright and Community Guidelines Strikes on YouTube", article( "Strikes can demonetize or terminate channels. Operators treat music, clips, and thumbnails as legal inputs, not afterthoughts.", [ sec("Copyright", "Use licensed music (YouTube Audio Library, paid libraries). Never assume 'fair use' without understanding your jurisdiction and risk."), sec("Reused content", "Commentary must add substantial value. Uploading raw clips, TV segments, or repetitive Shorts triggers reused content flags."), sec("Process", "Pre-publish checklist: music source logged, B-roll rights confirmed, sponsor disclosures in description."), ], ), ), "productivity-in-hotels-and-cafes": ( "Batch Filming and Editing Workflows for YouTube", article( "Batching amortizes setup cost. Film multiple videos in one session, edit in another block, publish on a calendar.", [ sec("Film day", "Same clothes in blocks, shared B-roll, teleprompter or bullet outline on one doc."), sec("Edit day", "Template project with intro, color preset, and export settings saved. Duplicate timeline per video."), sec("Metrics", "Track hours per published minute. If edit time doubles, simplify format before hiring."), ], ), ), "health-insurance-basics-for-nomads": ( "Burnout Prevention for Full-Time YouTube Operators", article( "Creator burnout is operational failure: no buffers, no boundaries, metrics as mood. Prevention is scheduling and scope control.", [ sec("Symptoms", "Dreading filming, refreshing Analytics hourly, skipping breaks, irritability in comments."), sec("Fixes", "Fixed off days, no Analytics on weekends, reduce live community obligations, delegate editing early."), sec("Sustainable pace", "Choose a publish rate you can hold for a year, not a month."), ], ), ), "jet-lag-sleep-for-remote-workers": ( "Consistent Publishing When Your Schedule Is Unpredictable", article( "Life disrupts calendars. Operators use buffers and flexible formats to stay consistent without live-streaming stress daily.", [ sec("Buffers", "Two edited videos ready. Shorts cut from long-form fill gaps."), sec("Evergreen priority", "When busy, publish tutorials over trend-chasing topics that expire in a week."), sec("Communicate", "Brief Community post if you skip a week once per year—honesty beats silence."), ], ), ), "tax-residency-awareness-for-nomads": ( "Tax Considerations for YouTube Creator Income", article( "Creator income may include ads, sponsors, affiliates, and product sales—each with reporting rules where you live.", [ sec("Basics", "Track gross income by source. Separate business expenses. Many countries treat creators as self-employed."), sec("Cross-border", "Sponsor payments from abroad may need specific forms. AdSense is often US-sourced; W-8BEN affects withholding."), sec("Professional help", "This article is educational, not tax advice. Consult a qualified accountant when revenue becomes material."), ], ), ), "solo-travel-safety-checklist": ( "Solo Creator Safety: Managing Public Exposure on YouTube", article( "Public video increases visibility. Operators separate personal address from channel identity and moderate harassment systematically.", [ sec("Privacy", "Use a PO box or business address for sponsor mail. Avoid showing mail, license plates, or school names."), sec("Comments", "Block repeat harassers, hold potentially abusive comments for review, document threats."), sec("Collaborations", "Verify guests and brands. Contracts for sponsored work protect both parties."), ], ), ), "cost-of-living-tracking-method": ( "Tracking YouTube Channel Costs and ROI", article( "Channels are small businesses. Track spend against outcomes or you will not know if a tool or editor pays off.", [ sec("Categories", "Software, gear depreciation, contractors, music licenses, ads (if any), travel for shoots."), sec("Revenue side", "AdSense, sponsors, affiliates, products—monthly totals."), sec("Decision rule", "Any expense over 5% of monthly revenue should have a KPI: hours saved, views gained, or conversion lift."), ], ), ), "evaluate-coworking-memberships": ( "Evaluating SaaS Tools for YouTube Channel Operations", article( "Tool sprawl kills margin. Audit subscriptions quarterly: thumbnail apps, SEO tools, music, project management, link-in-bio.", [ sec("Keep if", "Used weekly and replaces measurable hours or increases CTR/retention with data."), sec("Cut if", "Duplicate features (three editing apps) or unused since last billing cycle."), sec("Trial discipline", "One new tool at a time for 30 days with a written success criterion."), ], ), ), "networking-without-burnout": ( "Collaborations and Networking for YouTube Creators", article( "Collabs grow reach when audiences overlap and both sides deliver value—not when you chase bigger channels randomly.", [ sec("Target peers", "Similar subscriber scale ±50%, complementary niche. Propose specific video concepts, not vague 'collab sometime'."), sec("Prep", "Shared outline, split filming duties, cross-promote with pinned comments and end screens."), sec("Limits", "One collab per month max while solo pipeline is fragile."), ], ), ), "backup-and-data-recovery-abroad": ( "Backup Strategy for YouTube Raw Footage and Project Files", article( "One drive failure should not delete a month of work. 3-2-1 backup: three copies, two media types, one offsite.", [ sec("Workflow", "Copy cards to working SSD immediately. Nightly clone to NAS or cloud. Archive finished projects monthly."), sec("Naming", "Date_topic_camera_take. Avoid 'final_FINAL2'.", ), sec("Test restores", "Quarterly restore one old project to verify backups are not corrupted."), ], ), ), "seasonal-destination-strategy": ( "Seasonal Content Strategy for YouTube Channels", article( "Seasonality affects CPM and search intent. Operators plan holiday, back-to-school, and tax-season videos months ahead.", [ sec("Calendar", "Mark industry peaks for your niche. Finance in January, crafts in November, fitness in New Year."), sec("Lead time", "Publish seasonal videos 4–6 weeks before the peak so indexing catches search volume."), sec("Evergreen mix", "70% evergreen, 30% seasonal keeps revenue stable year-round."), ], ), ), "client-communication-templates": ( "Email Templates for YouTube Brand Deals and Sponsorships", article( "Professional outreach increases sponsor close rates. Templates save time without sounding robotic.", [ sec("Inbound reply", "Thank them, ask campaign goals, timeline, deliverables, exclusivity, and budget range before agreeing."), sec("Media kit", "Attach median views (30 days), audience geography, past brand examples, and rates for integrated vs dedicated."), sec("Contract points", "Usage rights, edit approval rounds, payment terms (50% upfront common), FTC/ASA disclosure requirements."), ], ), ), "personal-knowledge-base-for-travel": ( "Building a Creator Knowledge Base for YouTube Operations", article( "Scattered notes become mistakes on upload day. A single knowledge base holds SOPs, links, and lessons learned.", [ sec("Sections", "Upload checklist, sponsor policies, brand voice, thumbnail winners, B-roll locations, editor brief template."), sec("Tooling", "Notion, Obsidian, or a shared Google Drive folder—pick one and enforce it."), sec("Maintenance", "Ten minutes after each upload: log one thing that broke and how you fixed it."), ], ), ), "nomad-banking-and-money-setup": ( "Banking Setup for YouTube Creator Businesses", article( "Separate accounts simplify tax time and sponsor payments. Operators route all channel money through business banking when revenue is regular.", [ sec("Basics", "Business checking, business PayPal or Stripe if selling products, AdSense linked to the same entity name on tax forms."), sec("International", "Wise or similar for foreign sponsor wires with lower fees than traditional banks."), sec("Reserves", "Hold 3–6 months of operating expenses before increasing personal draw."), ], ), ), "remote-job-cv-tips": ( "How to Write a YouTube Channel Description That Converts", article( "Your channel description is a landing page for search and new subscribers. Front-load keywords and a clear value promise.", [ sec("First 150 characters", "Who you help and what they get. Example: 'Practical YouTube operations guides for small channels—upload workflows, analytics, and monetization.'"), sec("Links", "One primary CTA (newsletter or product), social links, upload schedule."), sec("Refresh", "Update quarterly when niche focus shifts."), ], ), ), "food-budget-for-digital-nomads": ( "Budgeting for YouTube Production Costs", article( "Production budgets prevent surprise credit card bills. Allocate monthly caps for gear, software, freelancers, and stock assets.", [ sec("Starter budget", "Many solo channels run under $100/month software plus amortized gear. Add $200–500 per sponsored-quality shoot day if renting."), sec("Scale triggers", "Hire editing when your hourly opportunity cost exceeds editor rate and backlog exceeds two weeks."), ], ), ), "phone-data-plan-for-nomads": ( "Mobile Filming and Upload Options for YouTube on the Go", article( "Phones enable B-roll and emergency uploads. Operators configure mobile workflows before travel, not at the airport.", [ sec("Capture", "4K24 or 1080p60 depending on storage. External mic adapter or wireless lav for interviews."), sec("Upload", "YouTube app for Shorts and quick checks; full uploads via laptop when possible to verify metadata."), sec("Data", "Know your hotspot limits. Upload overnight on hotel Wi‑Fi with file verification."), ], ), ), "how-to-choose-your-next-nomad-city": ( "How to Pivot Your YouTube Niche Without Losing Subscribers", article( "Pivots work as bridges, not hard resets. Introduce new topics as series while honoring existing subscribers with occasional legacy-format videos.", [ sec("Bridge content", "Connect old and new niche in titles: 'What [old topic] taught me about [new topic].'"), sec("Measure churn", "Watch unsubscribe spikes after pivot videos. Adjust pace if retention collapses."), sec("Timeline", "90-day transition with weekly uploads beats one announcement video then silence."), ], ), ), "slow-travel-vs-fast-movement": ( "Quality vs Quantity: Publishing Pace for YouTube Growth", article( "More uploads help only if retention holds. Operators find minimum effective dose: the slowest pace that still grows watch time.", [ sec("Test", "Compare weekly vs biweekly for eight weeks on similar topics. If biweekly wins on average view duration, slow down."), sec("Shorts", "Shorts can supplement but should not replace long-form strategy if AdSense and sponsors are goals."), ], ), ), "freelance-writing-craft-for-clients": ( "Writing Scripts That Hold Attention on YouTube", article( "Retention is written in the first 30 seconds. Scripts front-load payoff and pattern interrupts, not lengthy intros.", [ sec("Hook structure", "Promise outcome, show proof or stakes, preview roadmap. Cut 'hey guys welcome back' unless it adds value."), sec("Pattern interrupts", "B-roll, zoom cuts, on-screen text every 20–40 seconds in tutorials."), sec("Outlines", "One bullet per minute of video. Read aloud—if you stumble, simplify sentences."), ], ), ), "video-call-professionalism-remote-workers": ( "On-Camera Presence for YouTube Creators", article( "Presence is trainable: eye line, pace, and energy consistent with content type. Tutorial viewers want clarity; entertainment wants variation.", [ sec("Eye line", "Look at lens for key points, not only the monitor. Mark lens with tape dot if needed."), sec("Pace", "Pause after dense steps. Cut silence in edit rather than rushing on camera."), sec("Review", "Watch one take muted—body language should match message without audio."), ], ), ), "remote-work-life-boundaries": ( "Work-Life Boundaries When YouTube Is Your Business", article( "Home-based YouTube blurs work and life. Boundaries are calendar blocks and physical cues, not willpower.", [ sec("Time blocks", "Filming, editing, admin, and off time on separate calendar colors. No Analytics in off blocks."), sec("Space", "Pack down gear after sessions so the room is not a permanent studio stress trigger."), ], ), ), "how-to-set-your-freelance-rate": ( "Pricing Sponsorships and Services as a YouTube Creator", article( "Rates combine reach, niche, and deliverables. Underpricing trains brands to expect cheap integrations.", [ sec("Baseline formula", "Many use CPM-style math on guaranteed views plus production cost. Adjust up for finance/B2B niches."), sec("Packages", "Dedicated video, 60s integration, Shorts bundle, usage rights limited to 12 months unless paid extra."), sec("Raise annually", "Increase 15–25% when median views grow or you add case studies."), ], ), ), } for slug, (title, html) in _more_com.items(): NOMADRO_COM[slug] = (title, html) # --- nomadro.live: 20 posts --- NOMADRO_LIVE: dict[str, tuple[str, str]] = {} _live = { "what-is-a-live-monitoring-toolkit": ( "What Is YouTube Analytics and Why Operators Need It", article( "YouTube Analytics is your control panel for watch time, traffic sources, and audience behavior. Operators review it weekly with questions, not vanity metrics.", [ sec("Key reports", "Overview, Reach, Engagement, Audience. Watch average view duration and CTR together—high CTR with low retention means misleading packaging."), sec("Operator habit", "Export top 10 videos monthly. Tag each with topic and format. Patterns emerge faster than gut feeling."), ], ), ), "how-to-track-live-gifts": ( "Tracking YouTube Revenue Metrics That Actually Matter", article( "Revenue follows watch time and advertiser demand. Track RPM by video, sponsor pipeline, and affiliate clicks in one sheet.", [ sec("Weekly", "Estimated revenue, views, subs net, top traffic source."), sec("Monthly", "Revenue by source, expense total, effective hourly rate after production time logged."), ], ), ), "multi-channel-live-monitoring": ( "Managing Multiple YouTube Channels Without Chaos", article( "Multi-channel operators use separate brand accounts, calendars, and asset folders. Shared editors need per-channel SOPs.", [ sec("Structure", "One Google Drive root per channel. Color-coded calendar. Never cross-post identical metadata."), sec("Team", "Assign one owner per channel for analytics review even if editing is shared."), ], ), ), "webhook-automation-for-lives": ( "Automating YouTube Workflows with Zapier and APIs", article( "Automation handles repetitive ops: new video published → Discord ping, spreadsheet row, email draft to newsletter tool.", [ sec("Start small", "RSS or YouTube publish trigger to one destination. Verify for two weeks before adding complexity."), sec("API note", "YouTube Data API quotas apply. Use official integrations where possible."), ], ), ), "desktop-vs-android-live-monitoring": ( "Desktop vs Mobile YouTube Studio for Daily Operations", article( "Desktop Studio handles metadata, analytics depth, and comments at scale. Mobile suits quick replies and Shorts uploads.", [ sec("Desktop wins", "Bulk translation, A/B thumbnail tests (where available), detailed analytics export."), sec("Mobile wins", "Community posts on the go, comment hearts, live stream monitoring alerts."), ], ), ), "creator-ops-dashboard": ( "Building a YouTube Operations Dashboard", article( "Combine YouTube Analytics exports with a spreadsheet or Notion dashboard: subs, views, watch hours, revenue, pipeline status.", [ sec("Tiles", "7-day views vs average, videos in production, sponsor deals open, next publish date."), sec("Avoid", "Checking dashboard more than once daily unless live streaming."), ], ), ), "chat-moderation-workflow": ( "Community Management Workflows for YouTube Comments", article( "Comments drive algorithm signals and loyalty. Operators batch replies, pin useful questions, and filter spam without arguing.", [ sec("Daily block", "20 minutes post-publish and 24 hours later. Heart substantive comments, answer FAQs, hide spam links."), sec("Moderation", "Hold potentially toxic comments for review during controversial videos."), ], ), ), "reading-viewer-trend-charts": ( "How to Read YouTube Analytics Charts Like an Operator", article( "The audience retention graph tells you where scripts fail. Traffic sources tell you where packaging works.", [ sec("Retention cliffs", "Drop at 0:30 = weak hook. Mid-video cliff = section too long—cut or add pattern interrupt."), sec("Traffic", "Browse features rising = packaging working. Suggested falling = need stronger session depth."), ], ), ), "live-session-archives": ( "Archiving YouTube Projects, Assets, and Performance Data", article( "Archive project files and export analytics snapshots per video. Future you needs proof of what worked.", [ sec("Per video folder", "Project file, export, thumbnail PSD, title/description txt, analytics screenshot at 30 days."), sec("Retention policy", "Raw footage 90 days unless evergreen; exports and metadata indefinitely."), ], ), ), "overnight-live-coverage": ( "Scheduling and Monitoring Overnight YouTube Premieres", article( "Premieres simulate live engagement on a schedule. Operators test player links, chat moderation, and timezone alignment before bed.", [ sec("Checklist", "Premiere time set to audience peak, moderators assigned, social posts scheduled, backup upload verified."), ], ), ), "notification-design-for-lives": ( "Notification Strategy for YouTube Uploads and Live Events", article( "Subscribers see only a fraction of uploads. Combine Community posts, email list, and social clips in the first hour.", [ sec("First hour", "Publish, Community post with hook question, pin comment, share Short teaser elsewhere if policy allows."), ], ), ), "rest-api-live-event-tooling": ( "YouTube Data API Basics for Channel Operators", article( "The Data API enables custom dashboards and tools. Quota limits require efficient queries—cache results, poll sparingly.", [ sec("Use cases", "Pull daily stats to BigQuery, monitor comment keywords, sync upload log to internal wiki."), sec("Auth", "OAuth for your channel; never embed API keys in client-side code."), ], ), ), "reducing-false-alerts": ( "Avoiding Metric Obsession: Focus Metrics for YouTube Ops", article( "Not every dip is catastrophe. Operators watch 28-day rolling averages for views and watch time, not hour-by-hour noise.", [ sec("Alert worthy", "Sudden 50%+ drop in impressions for 7 days, copyright claim on monetized video, AdSense disable warning."), sec("Ignore", "Single video 10% below average unless pattern repeats three times."), ], ), ), "live-session-runbook": ( "A One-Page Runbook for YouTube Live Broadcasts", article( "Runbook: pre-stream test, encoder settings, moderator roles, emergency fallback to premiere, post-stream VOD checklist.", [ sec("Pre-live", "Private test stream 30 min prior. Confirm chat slow mode and blocked words list."), sec("Post-live", "End screen template ready on VOD, chapters marked, highlight clip within 24h."), ], ), ), "creator-tooling-checklist": ( "YouTube Creator Tooling Checklist for 2026", article( "Minimum stack: edit software, thumbnail tool, licensed music source, cloud backup, YouTube Studio, password manager for brand accounts.", [ sec("Optional", "SEO research tool, transcript service, project management, link tracker for sponsors."), sec("Review", "Delete one redundant tool each quarter."), ], ), ), "engagement-beyond-viewer-count": ( "Engagement Metrics Beyond Views on YouTube", article( "Watch time hours, returning viewers, and playlist completion predict monetization better than raw view spikes.", [ sec("Track", "Average percentage viewed, subscribers gained per video, comments per 1k views."), ], ), ), "handling-live-disconnects": ( "Recovering from Failed YouTube Uploads and Live Streams", article( "Upload failures: verify file codec (H.264/AAC common), reduce bitrate, re-export. Live disconnects: keep local recording always in OBS.", [ sec("After outage", "Upload VOD with explanation in description. Community post transparency builds trust."), ], ), ), "privacy-for-live-logs": ( "Privacy and Data Handling for YouTube Creator Teams", article( "Editor and VA access requires least privilege. Brand account roles, not personal password sharing.", [ sec("Roles", "Manager vs editor vs viewer in YouTube permissions. Revoke access same day someone leaves."), ], ), ), "hardware-for-always-on-monitoring": ( "Hardware for Reliable YouTube Production Pipelines", article( "Reliable capture beats exotic cameras. UPS for desktop, NAS for backup, calibrated monitor optional for color-critical work.", [ sec("Priority order", "Audio → storage → CPU/RAM → camera."), ], ), ), "onboarding-live-operators": ( "Onboarding a Team Member to Run a YouTube Channel", article( "Day 1: brand guidelines, upload SOP, analytics tour. Week 1: shadow publish. Week 2: supervised solo publish with checklist sign-off.", [ sec("Documentation", "Loom walkthrough of Studio, folder structure, sponsor disclosure rules."), ], ), ), } for slug, (title, html) in _live.items(): NOMADRO_LIVE[slug] = (title, html) ABOUT_COM = """

Nomadro is an English-language publication focused on YouTube channel operations: planning, production, analytics, monetization, and team workflows for creators who treat YouTube as a business.

We publish practical guides—not hype. Topics include upload pipelines, AdSense and sponsorship basics, scripting for retention, thumbnails and metadata, community management, and sustainable publishing schedules.

Editorial standards

Contact

Content by Nomadro Editorial. Email hello@nomadro.com.

We may display advertisements including Google AdSense to support the site.

""" ABOUT_LIVE = """

Nomadro Live publishes English guides on operating YouTube channels: analytics, live workflows, automation, community ops, and production reliability.

Chinese-speaking visitors may still access our product pages. This English blog is the editorial home for YouTube operators and small creator teams.

Editorial standards

Contact: hello@nomadro.live

""" def write_local_files() -> None: com_dir = ROOT / "wordpress" / "content" / "posts" / "youtube-ops" live_dir = ROOT / "nomadro-live" / "wordpress" / "content" / "posts" / "youtube-ops" com_dir.mkdir(parents=True, exist_ok=True) live_dir.mkdir(parents=True, exist_ok=True) manifest = {"nomadro.com": {}, "nomadro.live": {}} for slug, (title, html) in NOMADRO_COM.items(): fname = f"{slug}.html" (com_dir / fname).write_text(html + "\n", encoding="utf-8", newline="\n") manifest["nomadro.com"][slug] = {"title": title, "file": fname} for slug, (title, html) in NOMADRO_LIVE.items(): fname = f"{slug}.html" (live_dir / fname).write_text(html + "\n", encoding="utf-8", newline="\n") manifest["nomadro.live"][slug] = {"title": title, "file": fname} (ROOT / "wordpress" / "content" / "about.html").write_text(ABOUT_COM + "\n", encoding="utf-8", newline="\n") (ROOT / "nomadro-live" / "wordpress" / "content" / "about.html").write_text(ABOUT_LIVE + "\n", encoding="utf-8", newline="\n") (ROOT / "nomadro-live" / "_youtube_manifest.json").write_text(json.dumps(manifest, indent=2), encoding="utf-8") print(f"Wrote {len(NOMADRO_COM)} com + {len(NOMADRO_LIVE)} live articles locally") def deploy_site(ssh, compose_dir: str, posts: dict[str, tuple[str, str]], tagline: str, about_html: str) -> None: sftp = ssh.open_sftp() sftp.putfo(io.BytesIO(about_html.encode("utf-8")), f"{compose_dir}/content/about.html") # Build PHP updater payload = [] for slug, (title, html) in posts.items(): payload.append({"slug": slug, "title": title, "content": html}) data_json = json.dumps(payload, ensure_ascii=False) php = f""" $item['slug'], 'post_type' => 'post', 'post_status' => 'any', 'numberposts' => 1, ]); if (!$posts) {{ echo "MISSING:{{$item['slug']}}\\n"; continue; }} $id = wp_update_post([ 'ID' => $posts[0]->ID, 'post_title' => $item['title'], 'post_content' => $item['content'], 'post_status' => 'publish', ], true); if (is_wp_error($id)) {{ echo "ERR:{{$item['slug']}} {{$id->get_error_message()}}\\n"; }} else {{ echo "OK:{{$item['slug']}}\\n"; $updated++; }} }} $about = get_page_by_path('about'); if ($about) {{ wp_update_post(['ID' => $about->ID, 'post_content' => <<<'HTML' {about_html} HTML]); echo "OK:about\\n"; }} update_option('blogdescription', {json.dumps(tagline)}); echo "DONE:$updated\\n"; """ host_php = "/tmp/update_youtube_ops.php" sftp.putfo(io.BytesIO(php.encode("utf-8")), host_php) sftp.close() container = "nomadro-wp-wordpress-1" if "nomadro-wp" in compose_dir and "live" not in compose_dir else "nomadro-live-wp-wordpress-1" cmd = ( f"docker cp {host_php} {container}:/tmp/update_youtube_ops.php && " f"docker exec {container} php /tmp/update_youtube_ops.php && " f"docker exec {container} rm -f /tmp/update_youtube_ops.php && rm -f {host_php}" ) _, stdout, stderr = ssh.exec_command(cmd, timeout=300) out = stdout.read().decode("utf-8", "replace") + stderr.read().decode("utf-8", "replace") print(out[-3000:]) def main() -> None: write_local_files() ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(HOST, username="root", password=PASS, timeout=30, allow_agent=False, look_for_keys=False) print("\n=== nomadro.com ===") deploy_site( ssh, "/var/www/nomadro-wp", NOMADRO_COM, "Practical YouTube channel operations—production, analytics, and monetization guides", ABOUT_COM, ) print("\n=== nomadro.live ===") deploy_site( ssh, "/var/www/nomadro-live-wp", NOMADRO_LIVE, "YouTube operations guides—analytics, live workflows, and creator team playbooks", ABOUT_LIVE, ) # Update mu-plugin org descriptions (optional quick sed via wp option already done) verify = [ "curl -s -A 'Mozilla/5.0' -H 'Cookie: nomadro_route=en' https://nomadro.com/ | tr '\\n' ' ' | grep -oE '[^<]+' | head -1", "curl -s -A 'Mozilla/5.0' -H 'Cookie: nomadrolive_route=en' https://nomadro.live/what-is-a-live-monitoring-toolkit/ | tr '\\n' ' ' | grep -oE '[^<]+' | head -1", "cd /var/www/nomadro-wp && docker compose --profile tools run --rm -T wpcli post list --post_type=post --post_status=publish --format=count 2>/dev/null | tail -1", "cd /var/www/nomadro-live-wp && docker compose --profile tools run --rm -T wpcli post list --post_type=post --post_status=publish --format=count 2>/dev/null | tail -1", ] print("\n=== verify ===") for cmd in verify: _, o, e = ssh.exec_command(cmd, timeout=120) print((o.read() + e.read()).decode("utf-8", "replace").strip()[:200]) ssh.close() if __name__ == "__main__": main()