尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Монголд шуугиан биш, баримтад тулгуурласан мэдээлэл хэрэгтэй. UNENMEDEE нь албан ёсны мэдээ, төрийн нээлттэй өгөгдөл, шийдвэр, төсөв, тендерийн мэдээллийг нэг дороос хайж, эх сурвалжтай нь нягтлах нээлттэй платформ. Баримт ба AI хураангуйг ялгаж, баталгаагүй мэдээллийг үнэн мэт түгээхгүй. Ил тод байдал, нотолгоо, хариуцлагатай мэдээллийн төлөө.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗🇲🇳 Монгол Улсын төрийн байгууллагуудын албан ёсны мэдээ, хууль, төсөв, улстөрчдийн хөрөнгийн мэдүүлгийг автоматаар цуглуулж, баримтыг пи-араас салгадаг, зарцуулсан цент бүрээ ил тайлагнадаг нээлттэй эхийн мэдээллийн сайт: iltodmedee.mn.
🇬🇧 An open-source news site that collects official news, laws, budgets and MPs' asset declarations from Mongolian government websites, separates verifiable facts from PR spin, and publishes every cent it spends. English below.
Сайтыг ажиллуулдаг бүх зүйл энэ репод байна:
src/lib/ai/prompts.ts),.github/workflows/), тэдгээрийн бүртгэл Actions хэсэгт нээлттэй.📐 Техникийн дэлгэрэнгүй: docs/ARCHITECTURE.md: систем, өгөгдлийн сан, скрапер, AI pipeline, кластерчлал, аюулгүй байдал, шийдвэрүүдийн шалтгаан (англиар).
.gov.mn холбоос, цэвэрлэсэн эх текстийн SHA-256 хэштэй.| Хуудас | Юу харуулдаг |
|---|---|
/ | Сүүлийн мэдээ, сэдвээр (/topic/…), нэг сэдэвт нэг мөр, AI хураангуй, Монголбанкны 4 гол тоо |
/digest | Өдөрт 2 удаа AI редакторын сонгосон 10 чухал мэдээ, долоо хоногийн тоо |
/archive, /archive/<огноо> | Өдөр бүрийн бүх мэдээ, сэдвээр нь (сүүлийн 60 хоног) |
/source/<домэйн> | Нэг яам, агентлаг, аймгийн сайтын сүүлийн мэдээ |
/place/<аймаг> | Аймаг, дүүргийн мэдээ ба тойргийн УИХ-ын гишүүд |
/laws | legalinfo.mn-д шинээр гарсан хууль, тогтоол, товч тайлбартай |
/officials | УИХ-ын гишүүд: хөрөнгө орлогын мэдүүлэг (ХАСХОМ), ирц, мэдээнд дурдагдсан нь, "Миний гишүүн" |
/officials/companies | Төрийн өмчит компаниудын орлого, зардал, ашиг, цалингийн сан (Шилэн данс) |
/promises | Засгийн газрын 2024–2028 оны үйл ажиллагааны хөтөлбөрийн 620 зорилт, эх текстээр |
/budget | Улсын төсөв 1990 оноос, зарлага, орлого, өр, аудитын дүгнэлт |
/projects | Мега төслүүд (Шинэ Хархорум, метро, газрын тосны үйлдвэр…): зарласнаас хойш хэдэн жил, төсөвт хэдэн төгрөг, ямар үе шатанд гэж өөрсдөө мэдэгдсэн, эх сурвалжтай |
/prices | Махны үнэ, бензиний үнэ 1, 5, 10, 15 жилийн өмнө (ҮСХ), дундаж цалингаар хэмжсэн нь, аймгаар, цахилгаан, усны тариф |
/tax | Цалингийн татвар тооцоолуур: ХХОАТ, НДШ, НӨАТ юунд зарцуулагддаг вэ |
/data | Монголбанкны ханш, инфляц, бодлогын хүү, opendata.mn-ийн өгөгдөл |
/changes | Төрийн сайт нийтэлснийхээ дараа засварласан, устгасан мэдээ |
/my | Таны дагасан сэдэв, аймаг (бүртгэлгүй, зөвхөн таны төхөөрөмжид) |
/search | Мэдээ, гишүүдээс хайх |
/transparency | AI дуудлага бүрийн токен, долларын зардал, орлого |
/method | Арга зүй: AI яаж ажилладаг, эрсдэлийн оноо, AI-ийн заавар |
Тойм, чухал мэдээ автоматаар эдгээр сувагт гардаг: Facebook, Instagram, Threads, Discord (сувгийг өөрийн server-тээ Follow хийх, /toim /haih /aimag командууд), RSS. Сайт дээрх 🔔 товчоор утсандаа мэдэгдэл авна.
DATABASE_URL зөвхөн GitHub Actions secrets болон Vercel-ийн орчны хувьсагчид байна. .env* файлууд git-д ордоггүй (.env.example л байна).GEMINI_FREE_TIER=true); төлбөртэй түлхүүр бол үнэгүйнүүдийн дараа, зөвхөн хамгийн хямд gemini-2.5-flash-lite загвараар, мөнгөний хязгаар дотор. Зураг үүсгэх загвар хэзээ ч ашиглахгүй. Төлбөртэй (DeepSeek, Grok) нь сард AI_MONTHLY_BUDGET_USD ($3), өдөрт AI_DAILY_BUDGET_USD ($0.30)-оос хэтэрвэл автоматаар зогсоно (src/lib/ai/limits.ts).ai_usage_logs-д бичигдэж /transparency-д харагдана.git clone https://github.com/tmorius-eng/UNENMEDEE && cd UNENMEDEE
npm install # Node.js 24
npm run demo # http://localhost:3000: жишээ өгөгдөлтэй бүтэн сайт, DB болон API түлхүүр хэрэггүй
npm run demo нь tests/fixtures-д хадгалсан бодит төрийн мэдээ, УИХ-ын гишүүд, ХАСХОМ мэдүүлэг, Монголбанк, төсвийн өгөгдлийг процесс доторх Postgres (PGlite, .demo-db/) руу ачаалж сайтыг асаана. Хураангуй нь эхний өгүүлбэрүүд ("AI ажиллаагүй"); .env-д үнэгүй GROQ_API_KEY тавиад DATABASE_URL=pglite:./.demo-db npm run ai:process хийвэл AI хураангуй үүснэ. Дахин эхнээс нь: .demo-db/-г устгана.
Өгөгдөлтэй ажиллуулах:
cp .env.example .env # DATABASE_URL, нэг үнэгүй AI түлхүүр (GROQ_API_KEY), ADMIN_SECRET_PASSWORD
npm run db:migrate && npm run db:seed
npm run scrape -- --source mlsp.gov.mn --limit 2
npm run ai:process -- --limit 2
API түлхүүрээ шалгах: npm run ai:process -- --sample. Өгөгдлийн сангүй туршилт: npm run scrape -- --dry-run --source parliament.mn --limit 2.
DATABASE_URL: Supabase төсөл → Connect → Transaction pooler (порт 6543). Migration-д Session pooler (порт 5432)-ийг DATABASE_URL_DIRECT нэрээр нэмж болно.
Автоматжуулалт: репо → Settings → Secrets and variables → Actions хэсэгт DATABASE_URL болон дор хаяж нэг AI түлхүүр нэмэхэд мэдээ цаг тутам шинэчлэгдэнэ. Vercel дээр мөн адил (нэмээд ADMIN_SECRET_PASSWORD, 12+ тэмдэгт).
src/lib/sources.ts-д нэмээд PR илгээнэ. JSON API-тай сайтад src/lib/scraper/adapters/-д adapter бичнэ.npm run check (typecheck + lint + 330+ unit test) болон npm run build (нууц түлхүүргүй) давах ёстой. Алхам алхмаар заавар: CONTRIBUTING.md. Архитектурын дүрэм CLAUDE.md-д бий.Сайт хүнгүйгээр ажиллана: мэдээ цаг тутам, тойм өдөрт хоёр удаа, УИХ-ын гишүүд долоо хоног бүр, сонгуулийн дараа ч өөрөө шинэчлэгдэнэ. Ямар нэг зүйл зогсвол watchdog GitHub issue нээж танд имэйл илгээнэ: мөр бүр юу зогссон, аль secret/хуудсыг засахыг хэлнэ. Хүний гар шаардлагатай цорын ганц зүйлс:
| Хэзээ | Юу хийх |
|---|---|
| Одоо, нэг удаа | age-keygen-ээр нөөцийн түлхүүр үүсгэж BACKUP_AGE_PUBLIC_KEY secret-д хийх (docs/BACKUP.md). Чатад хуулсан Vercel токеныг хүчингүй болгох. |
| Watchdog issue ирэхэд | Мөрийг уншаад заасан secret, хувьсагч, хуудсыг засах. Засагдмагц issue өөрөө хаагдана. |
| Улиралд нэг удаа | Нөөц хуулбарыг нэг удаа тайлж шалгах (docs/BACKUP.md, 3-р алхам). Dependabot-ын PR-уудыг CI ногоон бол нэгтгэх. /admin-д сарын орлого (зар, хандив) оруулах: оруулаагүй сар «бүртгээгүй» гэж харагдана. |
| Жил бүр | Porkbun домэйн сунгалт. Meta Data Use Checkup. VERCEL_TOKEN-ийг шинэчлэх. Watchdog сануулбал POPULATION, RATES_CHECKED, GOVERNMENTS_VERIFIED_THROUGH-ийг шинэчлэх. |
| Засгийн газар солигдоход | src/lib/budget/governments.ts-д шинэ Ерөнхий сайдыг нэмж GOVERNMENTS_VERIFIED_THROUGH-ийг шилжүүлэх. Түүнээс өмнө /budget шинэ онд «—» гэж үнэнээр нь харуулна. |
| 2027-10 | audit.mn-ийн certs/rapidssl-tls-rsa-ca-g1.pem 2027-11-02-нд дуусна (watchdog 60 хоногийн өмнө сануулна). |
| 2028-04 | Node 24-ийн дэмжлэг дуусна: workflow-ууд болон Vercel дээр node-version-ийг ахиулах. |
| 2028-06 УИХ-ын сонгууль | Юу ч хийх шаардлагагүй: шинэ гишүүд дараагийн sync-ээр орж, тойргийн нэр өөрчлөгдсөн ч аймгийн хуудсууд гишүүдээ олно. Watchdog идэвхтэй гишүүн 100-аас цөөн эсвэл гишүүнгүй аймаг гарвал хэлнэ. |
| 2028-07 | Шинэ Засгийн газрын хөтөлбөр батлагдсаны дараа npm run promises:import. Тэр хүртэл /promises «өмнөх хөтөлбөр» гэж бичнэ. |
| Ерөнхийлөгчийн сонгууль | Юу ч хийх шаардлагагүй: сайтын аль ч хэсэг Ерөнхийлөгчөөс хамаардаггүй. |
| Supabase төсөл алдагдвал | Шинэ төсөл → secret-ууд → db:migrate → db:restore (docs/BACKUP.md). VAPID түлхүүрийг хэзээ ч шинээр бүү үүсгэ. |
| Сошиал токен дуусвал | Шинэ токеныг secret-д хийхэд хадгалагдсан токеныг өөрөө солино (docs/FACEBOOK.md). |
Сайттай холбоотой санал хүсэлт, алдаа, шинэ эх сурвалж, хамтын ажиллагаа, хэвлэл мэдээллийн асуудлаар [email protected] хаягаар бичээрэй. Кодын алдаа, санааг issue болгон нээж болно.
Эмзэг байдал олвол нээлттэй issue бүү бичээрэй: SECURITY.md-ийн дагуу нууцаар мэдэгдэнэ үү.
main салбар хамгаалагдсан: зөвхөн PR-ээр, CI ногоон үед нэгтгэнэ.GITHUB_TOKEN зөвхөн уншина.The full technical write-up, with diagrams, the data model, algorithms and design trade-offs, is in docs/ARCHITECTURE.md. A short version:
GitHub Actions (hourly, free on public repos)
├─ npm run scrape 130+ sources (curated + discovered), least-recently-scraped first, 30-min budget
│ ├─ JSON APIs / feeds opendata.gov.mn, parliament.mn, legalinfo.mn, police.gov.mn, mongolia.gov.mn RSS
│ ├─ HTTP pass (Crawlee) robots.txt (8 hosts at a time) → WordPress REST API → RSS → link harvesting → Readability
│ └─ Browser pass headless Chromium only for JavaScript-rendered sites
│ → SHA-256 dedup → clean text only → articles
└─ npm run ai:process
├─ Budget guard paid providers stop at $3/month, $0.30/day; Grok ≤ 5 calls/day
├─ Tier 1 4 free providers in turn → Z.ai → Gemini → DeepSeek free first; facts, spin, risk 0-100
├─ Tier 2 Grok → Gemini → Groq → … only when risk ≥ 65: investigative analysis
├─ Fallback first sentences if every provider fails for 24 h
└─ ai_usage_logs exact tokens and USD for every call
GitHub Actions (08:07 and 20:07 Ulaanbaatar)
├─ data:sync / macro:sync / budget:sync opendata.mn, Mongolbank, NSO, Шилэн данс, World Bank, audit.mn
├─ digest rank the last 12 h without AI → editor model picks 10 → /digest
├─ push:send / social:post Web Push + Facebook, Instagram, Threads, Telegram, Discord (docs/FACEBOOK.md)
└─ db:prune old bodies → excerpts, old unpublished rows deleted (bounded DB)
Weekly: officials:sync (MPs + ХАСХОМ declarations), sources:discover, sources:recheck (edited or deleted posts).
Daily: watchdog, keepalive, Vercel deployment cleanup. Weekly: encrypted database backup (`docs/BACKUP.md`).
Vercel (Next.js 16, Cache Components) reads Supabase and renders the public site + /admin.
| Path | What |
|---|---|
CLAUDE.md | Architecture rules for contributors and AI agents |
src/db/schema.ts, drizzle/ | Drizzle schema and SQL migrations |
src/lib/sources.ts | Curated source list and discovery hubs |
src/lib/scraper/ | robots.txt parser, polite fetch (8 s per host), extractor, adapters, two-pass crawler |
src/lib/ai/ | Provider router with cost logging, budget guard, prompts, schemas, clustering, digest |
src/lib/officials/, budget/, soe/, mongolbank/, opendata-mn/ | Civic-data clients and parsers (each unit-tested on saved fixtures) |
src/lib/queries.ts | Cached read model for the public site |
src/lib/social/ | Facebook, Instagram, Threads, Telegram and Discord posting, the Messenger and Discord bots |
src/lib/places.ts, src/lib/promises/ | Aimags, districts and their constituencies; the Government action programme |
src/lib/seo.ts, src/lib/structured-data.ts, src/lib/archive.ts | Which pages are indexed, JSON-LD builders, the day archive |
src/app/ | Pages (see the table above) and /admin |
.github/workflows/ | Pipeline, digest + data sync, officials, discovery, source re-check, social posts, watchdog, keepalive, backup, Vercel cleanup, maintenance, CI |
/transparency comes from SQL. ai_usage_logs stores provider, model, tokens and the USD cost from the public price table in src/lib/ai/pricing.ts..gov.mn original and shows the SHA-256 of the cleaned text. Edits are labelled on the page; the hash keeps proving the original scrape.src/lib/ai/prompts.ts and rendered verbatim on /method.noindex and out of the sitemaps, so search engines see the substantial ones.The site runs unattended: news hourly, digests twice a day, MPs weekly (elections included). When anything stops, the watchdog opens a GitHub issue (emailed to the owner) naming what stopped and which secret or page to fix. The only manual items:
| When | What |
|---|---|
| Now, once | Create the backup key with age-keygen and store the public key in BACKUP_AGE_PUBLIC_KEY (docs/BACKUP.md). Revoke the Vercel token that was pasted in chat. |
| On a watchdog issue | Fix what its lines name; the issue closes itself once healthy. |
| Quarterly | Decrypt one backup as a drill. Merge green Dependabot PRs. Enter monthly income in /admin (months left empty read "not entered"). |
| Yearly | Renew the Porkbun domain, Meta Data Use Checkup, rotate VERCEL_TOKEN; update POPULATION, RATES_CHECKED, GOVERNMENTS_VERIFIED_THROUGH when the watchdog asks. |
| New government | Add the Prime Minister in governments.ts and move GOVERNMENTS_VERIFIED_THROUGH; until then /budget shows "—" for unverified years. |
| 2027-10 | certs/rapidssl-tls-rsa-ca-g1.pem (audit.mn) expires 2027-11-02; the watchdog warns 60 days ahead. |
| 2028-04 | Node 24 reaches end of life: bump node-version in the workflows and on Vercel. |
| June 2028 election | Nothing: new MPs arrive with the next sync and place pages match redrawn constituencies; the watchdog flags fewer than 100 active MPs or a place without MPs. |
| July 2028 | Run npm run promises:import once the new programme is approved; /promises says "previous programme" meanwhile. |
| Presidential election | Nothing: no part of the site depends on the President. |
| Supabase project lost | New project → secrets → db:migrate → db:restore (docs/BACKUP.md); never regenerate the VAPID keys. |
| A social token dies | Put a new token in its secret; the stored one is replaced (docs/FACEBOOK.md). |
npm run demo # the full site on real sample data (PGlite, no database server, no API keys)
npm run check # typecheck + lint + 330+ unit tests (no secrets needed)
npm run build # must pass without DATABASE_URL
Changes land through pull requests with CI green; see CONTRIBUTING.md. Report vulnerabilities privately (see SECURITY.md).
Feedback, corrections, new sources, partnerships and press: [email protected]. Code issues and ideas: GitHub issues.
Код MIT; манай бэлтгэсэн агуулга CC BY 4.0: эх сурвалжаа iltodmedee.mn гэж холбоостой дурдаад чөлөөтэй ашиглаарай.