دنیای نرمافزار آزاد، به فارسی
اخبار · معرفی · آموزش · رویدادها
tuxly.ir · خوراک RSS · هویت بصری
فارسی · English
تاکسلی خانهٔ فارسی نرمافزار آزاد و متنباز است: خبرهای گنو/لینوکس و پروژههای آزاد، معرفی توزیعها و میزکارها، آموزش، و تقویم رویدادهای اجتماع.
کد و محتوا هر دو در همین مخزناند و هر دو آزادند.
git clone https://github.com/goudarz/tuxly.git
cd tuxly
npm install # نصب وابستگی و موارد مورد نیاز
npm run dev # http://localhost:4321نیازمندی: Node 24 یا بالاتر. اگر nvm دارید، nvm use نسخهٔ درست را از
.nvmrc برمیدارد.
بعد از اولین نصب، یک بار این را اجرا کنید تا شمارهٔ نسخهٔ توزیعها پر شود:
npm run update:versions| دستور | کار |
|---|---|
npm run dev |
سرور توسعه |
npm run build |
تصویر OG + بیلد ایستا + ایندکس جستوجو + کپی آن به public/ |
npm run preview |
پیشنمایش خروجی بیلد |
npm run check |
اعتبارسنجی اسکیمای محتوا و تایپها |
npm run info |
نمایش وضعیت پروژه و همهٔ دستورها |
npm run update:versions |
بهروزرسانی نسخهها از ویکیداده و endoflife.date |
npm run update:versions -- --verbose |
همان، با جزئیات کامل خطا |
npm run brand:anniversary |
پوستر سالگرد |
npm run brand:mascots |
بازتولید ماسکاتها |
npm run brand:banner |
بنر ریدمی |
npm run brand:social |
تصویر پیشنمایش گیتهاب |
npm run brand:social-kit |
آواتار و بنر شبکههای اجتماعی |
npm run fonts:subset |
کوچک کردن قلمها به نویسههای مورد استفاده |
content/ محتوا — مارکداون، جدا از کد
posts/ مطالب
entities/ توزیعها، میزکارها، پنجرهگردانها، پروژهها، اجتماعها
events/ رویدادها
authors/ نویسندگان
glossary/terms.json واژهنامهٔ فنی
src/
assets/ تصویرها — در بیلد بهینه میشوند
components/ کامپوننتها
layouts/ چیدمان صفحهها
lib/ کمکیها — فارسی، schema، خوراک، ارائهدهندگان
integrations/ افزونههای بیلد — پیوند بیرونی، Pagefind در dev
pages/ مسیرها
public/brand/ لوگو، ماسکات، تصویرهای شبکههای اجتماعی
scripts/ بنر، بهروزرسانی نسخه، تولید تصویر و قلم
پوشهٔ
pipeline/— جمعآوری و بازبینی اخبار — فعلاً منتشر نشده در حال توسعه میباشد و محلی نگه داشته میشود.
فایل تازه در content/posts/ بسازید. از _template.md کپی بگیرید — همهٔ
فیلدها با توضیح آنجاست.
اسکیما در src/content.config.ts سختگیر است و بیلد را میشکند اگر:
- مطلبی
sourceدارد ولیsourceUrlیاcontextندارد originStatusرویdraft-reviewباشد ولیdraft: falseoriginStatusرویreviewedباشد ولیreviewedByخالی- تصویر شاخص بدون
coverAltباشد
این عمدی است. خطای بیلد بهتر از صفحهٔ منتشرشدهٔ ناقص است.
صفحهٔ ارائهدهندگان خودکار ساخته میشود. نامی که در performers یک رویداد
بنویسید کافی است؛ /speakers/<نام> خودش میآید. فایل جدا برای هر نفر یعنی
هر رویداد با نام تازه اول باید فایل بسازد وگرنه بیلد میشکند — و همین
اصطکاک باعث میشود در عمل کسی ارائهدهندهها را ثبت نکند. هویت از
slugify میآید که فارسی را اول نرمال میکند، پس «سینا بیمثل» و
«سینا بی مثل» یک نفرند.
جستوجو در حالت dev هم کار میکند — ولی فقط بعد از یک بیلد. ایندکس را
Pagefind در dist/ میسازد، پس npm run build در پایان آن را داخل
public/pagefind/ کپی میکند (این پوشه در .gitignore است).
دو مانع سر راه بود و هر دو حل شدهاند: astro dev فقط public/ را سرو
میکند نه dist/ را، و Vite هم حاضر نیست فایل .js داخل public/ را به
عنوان ماژول تحویل بدهد و خطای ۵۰۰ میداد. افزونهٔ
src/integrations/pagefind-dev.mjs مسیر /pagefind/ را پیش از میانافزار
transform ویت تحویل میدهد. فقط در حالت توسعه؛ در پروداکشن این فایلها
دارایی ایستای معمولیاند.
نقشهٔ سایت یک مسیر است، نه یک مرحلهٔ پس از بیلد. /sitemap.xml را
src/pages/sitemap.xml.ts مستقیم از کالکشنهای محتوا میسازد. مرحلهای که
بعد از بیلد اجرا شود میتواند از قلم بیفتد؛ یک route نمیتواند. هر URL
lastmod واقعی از خود محتوا میگیرد، نه زمان بیلد.
نسخهها دستی وارد نمیشوند. شمارهٔ نسخهٔ سی توزیع اگر دستی نوشته شود، ظرف
چند ماه بخش بزرگیاش غلط میشود — چون بهروز نگه داشتنشان دستی، کاری است
که در عمل انجام نمیشود. scripts/update-versions.mjs هفتگی از
endoflife.date و ویکیداده میگیرد. اگر دادهای نبود، فیلد خالی میماند و
صفحه «در حال بررسی» نشان میدهد — بهتر از حدس زدن.
تکمخزن، بدون submodule. کد و محتوا یکجا. دو پروانه: کد
AGPL-3.0-or-later، محتوا CC BY-SA 4.0 (در content/LICENSE). submodule یعنی هر کلون بدون
--recursive میشکند و هر تغییر دو PR میخواهد(به خاطر شرایط پایدار نبودن اینترنت داخل کشور این تصمیم گرفته شد).
تصاویر داخل مخزن، در src/assets/. در بیلد خودکار به AVIF و WebP و چند
اندازه تبدیل میشوند. نه سرویس خارجی، نه چالشهای محدودیتهای که ممکنه پیش بیاید.
اسکرول بینهایت روی صفحهبندی واقعی سوار است. لینکهای /news/2 در HTML
هستند چون خزندهٔ موتورهای جستوجو اسکرول نمیکند. جاوااسکریپت دو صفحه را خودکار میآورد و
بعد دکمه نشان میدهد، وگرنه کاربر هیچوقت به فوتر نمیرسد.
| فایل | موضوع |
|---|---|
docs/DEPLOY.md |
استقرار روی GitHub Pages و دامنهٔ اختصاصی |
docs/VERSIONS.md |
اگر نسخه خودکار گرفته نشد چه کنیم |
docs/COMMITS.md |
قرارداد پیام کامیت |
NOTICE.md |
خلاصهٔ پروانهها به زبان ساده |
CODE_OF_CONDUCT.md |
منشور رفتاری اجتماع |
| بخش | پروانه |
|---|---|
| کد | AGPL-3.0-or-later |
| محتوا | CC BY-SA 4.0 |
| نشان و لوگوتایپ | علامت تجاری — قواعد |
| وزیرمتن و Space Grotesk | SIL OFL 1.1 |
مطالبی که از منابع دیگر میآیند، پروانهٔ خودشان را نگه میدارند و پایین هر صفحه ذکر میشود.
AGPL یعنی: استفاده، تغییر و بازنشر آزاد است — به شرط اینکه سورس نسخهٔ خودتان را منتشر کنید (حتی اگر فقط روی سرور اجرایش میکنید) و به مخزن اصلی لینک بدهید. خلاصهٔ ساده در NOTICE.md.