وبلاگ یک دمو بود، نه یک برند

وبلاگ ۶ ماه بود که وجود داشت. صفحه اصلی درست رندر می‌شد. صفحه درباره می‌گفت این یک دموی تم Jekyll است. پست‌ها متن placeholder بودن.

دلیلش: وبلاگ رو به‌عنوان دمو ساختم، نه به‌عنوان برند. تم شیک بود. محتوا خالی بود. هیچ‌وقت وبلاگ رو به خزانه وصل نکردم. هیچ‌وقت وبلاگ رو به رزومه وصل نکردم. هیچ‌وقت اسکریپت انتشار ننوشتم. وبلاگ یک فولدر روی سرور بود. خزانه یک فولدر روی لپ‌تاپ من بود. این دو فولدر از وجود هم خبر نداشتن.

این عدم تقارن خجالت‌آور بود. خزانه ۱۲۶ فایل مارک‌داون داشت، ۱۰ صفحه استراتژی، ۳۰ صفحه مفهوم، ۸ صفحه موجودیت، ۱ تحلیل کرپوس. وبلاگ ۱ صفحه داشت که می‌گفت دمو. مغز پر بود. دهان خالی.

خزانه

فایل‌های مارک‌داون

۱۰ صفحه استراتژی، ۳۰ صفحه مفهوم، ۸ صفحه موجودیت، ۱ تحلیل کرپوس. مغز پر بود. دهان خالی.

وبلاگ

۱ صفحه دمو

می‌گفت این یک دموی تم Jekyll است. عدم تقارن خجالت‌آور بود. راه‌حل، لایه انتشاره.

راه‌حل، لایه انتشاره. لایه انتشار یک اسکریپته که درفت خزانه رو می‌گیره، به فرمت Jekyll تبدیلش می‌کنه، کامیت می‌کنه و به GitHub Pages پوش می‌کنه. یک کامند. یک URL. یک پست منتشرشده.


حالت CLI، Ruby خراب، یک ترمینال

جلسه‌ای که این بازسازی رو تولید کرد یک جلسه CLI بود.

بدون GUI

فقط CLI

نمی‌شد Obsidian اجرا کرد. نمی‌شد پیش‌نمایش سایت دید. نمی‌شد توی یک CMS دکمه انتشار رو زد. مرحله انتشار باید یک کامند bash می‌بود.

بدون بیلد محلی Jekyll

Ruby خراب

Ruby سیستم نسخه ۲.۶ بود. Gemfile.lock به bundler 4.0.12 نیاز داشت. bundle exec jekyll build قبل از شروع به خطا خورد.

بدون اسکرین‌شات GUI

Headless شکست خورد

هم screencapture و هم chrome --headless شکست خوردن. مرحله انتشار باید بدون اونا کار می‌کرد.

یک شل

قابل تست در ترمینال

اسکریپت یک مسیر فایل می‌گیره. یک URL زنده تحویل می‌ده. کل ماجرا در ترمینال قابل تست‌ست.


پایپلاین ۴ فایلی

خزانه ← صف ← اسکریپت ← URL زنده. کل ماجرا همینه.

content/queue/<draft>.md       (vault side, status: ready-to-publish)
scripts/parse-frontmatter.py  (YAML → bash, helper)
scripts/publish-blog.sh       (the pipeline: transform + copy + commit + push)
~/ShayanSpiel.github.io/      (GH Pages side, _posts/, auto-builds on push)
01

کاربر درفت می‌نویسه توی content/queue/<date>-<slug>.md. درفت در frontmatter استیت status: ready-to-publish داره.

02

کاربر یک کامند اجرا می‌کنه bash scripts/publish-blog.sh <draft-path> —yes. از اینجا به بعد با اسکریپته.

03

اسکریپت frontmatter رو تبدیل می‌کنه فیلدهای Jekyll رو اضافه می‌کنه (layout, date, author). فیلدهای خزانه رو حذف می‌کنه (status, standalone_test, pillar). وایت‌لیست، نه بلاک‌لیست. قرارداد پایدار.

04

اسکریپت اسکرین‌شات‌ها رو کپی می‌کنه بدنه رو برای ارجاع تصویر اسکن می‌کنه. مسیرها رو حل می‌کنه. به assets/uploads/<date>-<slug>/ کپی می‌کنه. مسیرها رو توی پست بازنویسی می‌کنه.

05

اسکریپت کامیت و پوش می‌کنه پست جدید و آپلودها رو stage می‌کنه. با یک پیام معنادار کامیت می‌کنه. به origin main پوش می‌کنه. GitHub Pages دوباره بیلد می‌کنه. پست حدود ۳۰ ثانیه بعد زنده‌ست.

کل جریان یک کامنده. کاربر کامند رو اجرا می‌کنه، می‌ره و پست زنده‌ست. اسکریپت همون لایه انتشاره.


نتیجه

بازسازی در ۴ ساعت ۴ تا خروجی تحویل داد. سلسله‌مراتب برند حالا یکدست و هماهنگه.

۱

بازنویسی صفحه اصلی

index.md حالا هیرو داره، ۵ پست آخر، بخش «در حال انتشار» و بخش «این سایت چیه». دیگه خبری از محتوای دمو نیست.

۱

بازنویسی صفحه درباره

about.md حالا قوس داستان برند شخصی، ۵ آفر با جزئیات و اطلاعات تماس داره. دیگه خبری از دمو نیست.

۲

پست‌های ستونی

این پست + پست قبلی درباره معماری مغز دوم. هر دو در همون شب منتشر شدن.

۱۵

اسکرین‌شات

۷ تا برای ستون اول، ۸ تا برای این ستون. همه PNGهای 1600x1600. همه توی assets/uploads/.

۴ ساعت

زمان کل

از دموی خالی تا وبلاگ برند. بدون GUI. بدون بیلد محلی Jekyll. یک کامند برای هر پست.

۳۰ ثانیه

زمان تا زنده شدن

از git push تا URL زنده. GitHub Pages بیلد می‌کنه. پست عمومی می‌شه.

سلسله‌مراتب برند حالا یکدست و هماهنگه. صفحه درباره وبلاگ، صفحه ویکی shayanspiel رو بازتاب می‌ده. هر سطح به یک آدم اشاره می‌کنه.


انتشار بخشیه که هیچ‌کس یادت نمی‌ده

بیشتر توصیه‌های وبلاگ درباره نوشتنه. بیشتر توصیه‌های موتور محتوا درباره درفت‌ست. هیچ‌کس درباره مرحله انتشار حرف نمی‌زنه.

مرحله انتشار لایه‌ایه بین «درفت دارم» و «درفت زنده‌ست». مرحله انتشار همون اصطکاکه. مرحله انتشار همون جاییه که باعث می‌شه آدم‌ها پست نذارن. راه‌حل یک اسکریپته. اسکریپت یک مسیر فایل می‌گیره. بقیه‌ش با اسکریپته.

بدون اسکریپت

۱۰ دقیقه کلیک

وارد CMS شو. frontmatter رو فرمت کن. اسکرین‌شات‌ها رو توی فولدر درست کپی کن. ایندکس رو به‌روزرسانی کن. کامیت کن. پوش کن. تکرار کن. ۱۰ دقیقه. هر. تک. بار.

با اسکریپت

یک کامند

اسکریپت درفت رو می‌خونه. frontmatter رو تبدیل می‌کنه. اسکرین‌شات‌ها رو کپی می‌کنه. کامیت رو stage می‌کنه. پوش می‌کنه. پست در ۳۰ ثانیه زنده‌ست. کاربر می‌ره دنبال کارش.

اگه نتونی منتشر کنی، پست نمی‌ذاری. اگه مرحله انتشار ۱۰ دقیقه کلیک باشه، نتونی منتشر کنی. اون ۱۰ دقیقه همون اصطکاکه. اصطکاک همون دلیله که پست نمی‌ذاری. اسکریپت کشنده اصطکاکه.


اگه خزانه داری، اسکریپت رو بساز

اسکریپت ۴ ساعته. اسکریپت لایه انتشار زیرساخت Session-as-Content است.

۴

فایل

کل پایپلاین ۴ فایله. درفت خزانه، هلپر YAML، اسکریپت انتشار، مقصد GH Pages. هیچ‌چیز دیگه‌ای.

۴ ساعت

زمان ساخت

نوشتن اسکریپت ۴ ساعت طول کشید. برای هر پست ۱۰ دقیقه صرفه‌جویی می‌کنه. بعد از ۲۴ پست به نقطه سربه‌سر می‌رسی. اسکریپت همون اهرمه.

۲

پست در یک شب

اولین شبی که از اسکریپت استفاده کردم: ۲ پست منتشر شد. پایپلاین سرتاسری کار می‌کنه. خزانه حالا به سایت زنده وصله.


اگه نتونی منتشر کنی، پست نمی‌ذاری. اسکریپت کشنده اصطکاکه.

۴ فایل. ۴ ساعت. یک کامند. خزانه حالا به وبلاگ وصله. ریپوی Spiel OS رو کلون کن. لایه انتشار رو بساز. همون شب منتشر کن.

کلون کردن ریپوی SpielOS