🔒 Admin Access

🇮🇳 IndianInSaudiArabia — Admin Dashboard

Single source of truth for all workflows, automations, and configurations. Last updated: July 2026.

📊 Site Overview

156+
Published Articles
EN + HI
Bilingual (English + Hindi)

Tech Stack

LayerTechnology
FrameworkAstro v6 + Tailwind CSS v4
HostingVercel (auto-deploy from GitHub push)
OG ImagesSatori (SVG→PNG) + Lucide icons
Search IndexPagefind (static)
AI Modelzyloo/claude-sonnet-4-6 via Naraya Router
Repogithub.com/Anshad2u/indianinsaudiarabia (master)
Working Dir/home/anshad/projects/indianinsaudiarabia

📝 Content Pipeline

How Articles Are Created

1Research — Search priority: lifeinsaudiarabia.net → ksaexpats.com → saudi-expatriates.com. Cross-check official sources (gov.sa, SPA, ministry sites). Arabic Brave + ddgs for Arabic sources.
2Verify — Every claim checked against 2+ sources. License scope clarified honestly (e.g., PTSP ≠ banking license). If unsure, say so.
3Write EN — Non-robot tone, like an experienced friend. No YouTube references. SNB Neo affiliate link where relevant (snb-neo.onelink.me/vJWt/4l9iurx9).
4Write HI — Hindi version in src/data/post/hi/. Must have lang: "hi" in frontmatter (critical for i18n separation).
5OG Image — Run node generate_og.mjs <slug>. Lucide outline icons, light pastel bg, centred layout.
6Interlink — Add Related section, retro-link from existing hub guides. Use blog-index.json to find connections.
7Build + Pushnpm run buildgit push → Vercel auto-deploys.

Critical Rules

🎨 OG Image System

Design: Light Background + Lucide Outline Icons

Light pastel bg per category, 200px lucide outline icon (stroke-based), centred title, category pill, subtitle, 3 tag pills.

node generate_og.mjs          # all articles
node generate_og.mjs <slug>    # single article

Category → Visual Mapping

CategoryBGAccentIcon
banking-money#eef2ff#3b5998banknote
absher-digital / absher#e0f7fa#00838fshield
iqama-residency#f3e5f5#6a1b9aid-card
visa-family-visit#fff3e0#e65100ticket
driving-traffic#e8f5e9#2e7d32car
jobs-employment#eceff1#37474fbriefcase
hajj-umrah#e3f2fd#1565c0moon
documents-embassy#ede7f6#4527a0book-open
healthcare#ffebee#b71c1cstethoscope
news#e3f2fd#1565c0newspaper

Icons from lucide npm package — stroke-based, NOT filled. fill="none" stroke="${color}"

🐦 Twitter Signal Pipeline

Architecture

Twitter → collect_signals.py → gemini_triage → telegram_queue → YOUR APPROVAL → saudi-poster-converter

Topic-driven, curated accounts ONLY, keyword-filtered. Manual approval via Telegram bot. No auto-post.

12 User Topics

#TopicKeywordsNeed Image?
1CareAljawazat useful updatesأبشر, خدمة, إصدار, تجديدoptional
2Family visit visa news + MOIFamily Visit, تأشيرة زيارة, MOIyes
3Absher proceduresAbsher, أبشر, iqama, إقامةyes
4eMAR traffic imagesمرور, traffic, fine, مخالفةyes
5Saudi/India airlines offersairline, flight, ticket, عرضtext+image
6SPA + imagesSPA, وكالة, officialyes
7CBSE exams NRICBSE, exam, NRI, schoolyes
8Eid holidays officialEid, عيد, holiday, إجازةyes
9Muharram/Islamic eventsharamaininfo, Muharram, Islamicyes
10Hajj/Umrah updatesHajj, Umrah, حج, عمرة, Nusukyes
11Iqama newsiqama, إقامة, residencyyes
12Other popular KSA accountsgeneral KSA, expat lifeoptional

Curated Accounts (24+)

AccountCategoryLanguage
@AlJawazatKSAPassportsArabic
@CareAljawazatPassport SupportArabic
@AbsherDigital ServicesArabic
@eMAR_ksaTrafficArabic
@KSAmofaENForeign AffairsEnglish
@SaudiGazetteNewsEnglish
@Okaz_onlineNewsArabic
@HaramainInfoIslamicEnglish
@MOISaudiArabiaInterior MinistryArabic
...and more

How Collection Works

1Pull tweetstwitter user-posts <account> -n 5 --json via twitter_client.py
2Filter by topic — Match tweet text against TOPICS keywords in collect_signals.py
3Triage — Gemini vision (or manual) judges quality + relevance
4Queue to Telegram — Photo/text + topic label + ✅/❌ buttons
5Your approval — Approved items go to saudi-poster-converter for poster creation
# Files:
twitter-poster-signals/
  collect_signals.py   # main orchestrator
  twitter_client.py    # twitter CLI wrapper
  gemini_triage.py     # vision quality check
  telegram_queue.py    # approval bot
  learn_accounts.py    # account discovery
  account_map.json     # learned account data

Twitter Auth

Cookies in twitter-poster-signals/.env: TWITTER_AUTH_TOKEN + TWITTER_CT0. Re-login when cookies expire (every ~2 weeks).

⏰ Cron Jobs

NameScheduleScriptStatus
twitter-poster-signals06:00 UTC daily (09:00 KSA)twitter_poster_signals.shActive
Daily News CollectionWas dailyHermes cron c1aa260dDisabled

🔍 Research Workflow

Search Priority

PrioritySourceUse For
1stlifeinsaudiarabia.netExpat guides, procedures
2ndksaexpats.comStep-by-step guides
3rdsaudi-expatriates.comNews, updates
Officialgov.sa, SPA, ministry sitesFact verification
ArabicBrave Arabic, ddgsArabic source verification

Verification Rules

🔗 Interlinking Strategy

How It Works

1blog_index.py generates blog-index.json — memory of all 156+ posts
2When writing new article, search blog-index for related posts
3Add "Related" section at bottom of new article linking to existing guides
4Retroactively add links FROM existing articles TO the new article
# Hub guides that link to many sub-articles:
absher-complete-guide    → all Absher sub-articles
banking-money-guide      → bank account, SAR to INR, etc.
iqama-residency-guide    → iqama renewal, color status, etc.
driving-traffic-guide    → license, fines, Fahas, etc.

🔐 Credentials & Config

ServiceLocationNotes
GitHub Token~/.git-indian-tokenFormat: https://Anshad2u:[TOKEN]@github.com/...
Gemini APItwitter-poster-signals/.envModel: gemini-3-flash-preview
Telegram Bottwitter-poster-signals/.envChat: 498691564
Twitter Authtwitter-poster-signals/.envRe-login every ~2 weeks
SNB Neo AffiliateArticle frontmattersnb-neo.onelink.me/vJWt/4l9iurx9
AI ModelHermes configzyloo/claude-sonnet-4-6 via Naraya Router

📋 Pending Tasks

TaskStatus
SPA.gov.sa faceless background images for OGPlanned
Run learn_accounts.py to expand account listPlanned
Phase 2: auto-post from approved queueFuture
Fix YouTube collector in cron (17/17 errors)Broken
Apply silhouette to OG default.pngPlanned

📦 Git Conventions

# Commit message format:
Add: new article slug
Fix: description of fix
Enhance: what was improved
Rebuild: when regenerating assets

# Branch: master (auto-deploys to Vercel)
# Never push directly to main without build verification

Admin dashboard • Only accessible at /anshad • Password protected