vccs
Vue 3용 차트 컴포넌트 모음, Recharts에서 포팅
LandStack 시민용 인증 문서 기록을 읽고 카르나타카 주 5개 시스템 간 불일치를 감지하여 담당자에게 이관
LandStack reads records obtained as citizen-facing certified documents, detects where five Karnataka state systems disagree about the same parcel, and refers each case to the officer statutorily empow
데이터TypeScript · CSSGitHub @princedaniel1197온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기LandStack reads records obtained as citizen-facing certified documents, detects where five Karnataka state systems disagree about the same parcel, and refers each case to the officer statutorily empowered to act on it. It writes nothing to any government record.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Five Karnataka state systems hold records about the same physical parcels and share no common
key: Bhoomi (the pahani/RTC), Kaveri (registration and encumbrance), e-Swathu (gram
panchayat property), e-Aasthi (urban khata) and Mojini/Dishaank (survey and sketches).
LandStack ingests records from those systems, detects where they disagree about the same parcel,
assembles the evidence, and refers each case to the officer statutorily empowered to act on it.README 전문 보기 ↗Five Karnataka state systems hold records about the same physical parcels and share no common key: Bhoomi (the pahani/RTC), Kaveri (registration and encumbrance), e-Swathu (gram panchayat property), e-Aasthi (urban khata) and Mojini/Dishaank (survey and sketches).
LandStack ingests records from those systems, detects where they disagree about the same parcel, assembles the evidence, and refers each case to the officer statutorily empowered to act on it.
The demonstration subject is a road corridor in Shettihalli, Tumakuru — a real road with fabricated parcels along it. A second, smaller set of records covers Divya Villas, a converted plotted layout by Zion Estate at Lingambudi village, Kasaba hobli, Mysuru taluk, Mysuru district, covering Survey Numbers 83/2 and 84/2.
No officer can alter a Record of Rights by a data write. Substantive change happens only through a mutation proceeding under ss.128–129 of the Karnataka Land Revenue Act 1964, an appeal to the Assistant Commissioner under s.136(2), or revision by the Deputy Commissioner under s.136(3). There is no online RTC correction facility anywhere in Karnataka, for citizens or officers. Section 133 makes the pahani presumptive, not conclusive, evidence of title.
LandStack therefore writes nothing to any government record, ever. It is a referral system, not an adjudication system. It never decides which record is correct — that is the officer's function, and where title is disputed, the civil court's.
These govern all copy, headings, tooltips and empty states. They are not decoration; they are the product.
Confirmed, Disagreement, Unmatched, Insufficient data. Never
"verified", "validated" or "title confirmed".Real or Synthetic badge. Anything fabricated to
populate a screen says so on its face.npm install
npm run dev # http://localhost:3000
npm test # Vitest — 57 tests
npm run typecheck # tsc --noEmit, strict
npm run build # 42 static pages
No database, no environment variables, no external API calls at runtime. All data lives in typed
JSON under /data and is loaded at build time. Deploys to Vercel with zero configuration.
SourceRecordThis is the whole ingestion path. It is manual by design — there is no portal to connect to.
Obtain the document as a citizen would: a pahani (RTC) through Nadakacheri or a Bhoomi kiosk, a Form 16 encumbrance certificate or certified instrument extract through Kaveri, a Form 9 from the gram panchayat, a khata extract from the urban local body, or a sketch extract through the Mojini workflow.
Add an entry to data/records.json. Give it an id of the form
<SYSTEM>-<DOCTYPE>-<SURVEY> (for example KA-EC-83-2, BH-PAH-84-2).
Set provenance. "Real" only if every field below was read off an actual issued
document. Otherwise "Synthetic", and put the reason in notes. Do not mix: a Real record
with invented owner names is the one failure mode this field exists to prevent.
Copy rawKeyString character for character as the document prints it — 84*2, 84/2,
086/01. Do not tidy it. Normalisation happens in code and the raw string is displayed above
the normalised form on every screen.
Fill parcelKey with the LGD village code and the village name as printed on that
document. Where a document spells the village differently from its neighbours, keep the
printed spelling — KA-EC-83-2 prints "Lingaabudi" where other records read "Lingambudi", and
that difference is preserved.
Fill extent by unit. Populate only the units the document actually prints; leave the rest
null. Put the literal printed line in asPrinted — that string is what every screen shows.
kharabA and kharabB are recorded separately and are deliberately excluded from the
comparable area.
Fill owners. nameAsPrinted verbatim, and script set to "Kannada" or "Latin"
according to what is on the page. Never transliterate: a cross-script pair returns no score and
the verdict becomes Insufficient data, which is the intended outcome.
Set the flags. isPaiki where the pahani carries the allotment as a paiki;
bupaFlagged where the pahani carries the Bu.Pa conversion flag; mrNumber where a mutation
register entry is printed.
Nothing else is required. The reconciliation run in lib/run.ts derives the parcel grouping,
the verdicts and the disagreements from the record set alone, deterministically.
The Karnataka outline in data/karnataka-districts.ts was imported from the Vantis codebase
(components/shared/KarnatakaMap.tsx) rather than redrawn, and restyled to this palette. It is
SVG path data, not GeoJSON — 31 districts keyed by slug, plus a label coordinate each, against
the viewBox 0 0 1633.9257 2366.7335.
To swap in different boundary data:
DISTRICT_PATHS with a Record<string, string> of district slug to SVG path d
attribute, and set KARNATAKA_VIEWBOX to match your source.DISTRICTS with one { id, label, lx, ly } per district; lx/ly are label
coordinates in the same viewBox space.karnataka-districts.geojson, project it to a flat SVG coordinate
space first (for example with d3-geo's geoMercator and geoPath) and emit the path
strings. Do not add a runtime mapping dependency — the component must keep making no network
calls.SUBJECT_DISTRICT in components/KarnatakaMap.tsx selects which district is filled gold.The original carried no accuracy caveat, so one is stated in the file and in the figure caption: this is a schematic outline for locating a district on screen. It is not a survey document, it is not to scale, and no boundary shown has evidentiary value. LandStack holds no parcel geometry at all. The second map level is an adjacency diagram drawn from boundary fields printed on the encumbrance certificates — it is not a sketch of anything.
Full detail is on the /method screen. In short:
normaliseKey trims, collapses whitespace, splits on the first of *, /, -, and
strips leading zeros per segment. One separator means the second segment is the hissa; two means
the second is the surnoc and the third the hissa. The printed string is never altered.null.Confirmed needs a key match, a name score ≥ 0.85 and an extent within tolerance.
e-Swathu and e-Aasthi records are never confirmed.Comparisons are anchored on the pahani rather than run over every pair of records. A referral asks an officer to act on an entry in the Record of Rights, so a difference between a registered deed and a survey sketch belongs to no officer, and comparing every pair would raise the same underlying fact several times over — four identical requests to the ADLR for one sketch, or one owner conflict addressed to two different officers under two different provisions.
Restating /method, because these are the point rather than the caveats.
Not a notified Sakala service — no day-count is
invented for them.observation and labelled on screen as
"not a disagreement". Putting a false mismatch on an officer's desk is the fastest way to have
the whole queue ignored.Surfaced in the interface as an amber Manual verification required badge:
On conversion the pahani is flagged Bu.Pa (ಭೂ ಪರಿವರ್ತನೆ), Bhoomi stops tracking the parcel, and nothing carries the record across to the gram panchayat or the urban local body. Statewide, Aadhaar-linkage checking found roughly 72.11 lakh parcels in non-agricultural use against only 4.69 lakh recorded as converted, out of about 4.11 crore agricultural plots.
Divya Villas was seeded as an instance of this class. That is an assertion carried in the brief, not a finding: the conversion flag sits on a Synthetic pahani, and the two Real certificates are Nil encumbrance certificates, which say nothing about conversion. The parcel screen says so.
Four levels, each a distinct route so the path can be driven by URL:
/ Karnataka -> Tumakuru road corridor (the landing screen)
/parcels flat index of every parcel, both districts
/parcels/[composite] the five-system crosswalk
/queue exception queue, FIFO
/queue/[id] case sheet + printable referral note
/ledger append-only audit trail
/records/[id] a single source record
/method the matching rules, the routing table, and the limits
Position lives in the URL. /?at=870 puts you 870 m along the road, so coming back from a
parcel returns you to the stretch you were standing on rather than to the Karnataka map.
Records with no shape are listed, never drawn. A paiki is a textual-only sub-division carried in the pahani with no spatial record, and an e-Swathu Form 9 prints no survey number at all. Neither can be placed on a map, so both appear in the sidebar under "Held, but not on the map" with the reason. The absent shape is the finding; dropping them silently would hide it.
The corridor shows what the records show. Owner and extent come from the records themselves,
never from the layout file. An earlier build kept copies in both and they drifted — hovering
Sy. 107/2 showed one owner while opening it showed another. parcelDisplay in lib/corridor.ts
is now the single path, and a test asserts the two agree.
/ is the landing screen and has two states. It opens on Karnataka; clicking Tumakuru
transitions in place into a road corridor you travel along.
↑ ↓ ← →, Home, End) and a position scrubber. Parcels are tinted by case status and
clickable through to the five-system view.SCHEMATIC — NOT A PHOTOGRAPH, NOT A SURVEY because that is what it is.The centreline is OpenStreetMap way 400940819 — Shettihalli Main Road, Tumakuru, 1752 m. The
basemap around it is genuine OSM road and building geometry for the corridor's bounding box (728
roads, 4 781 building footprints). All 26 parcels drawn against it — every boundary, survey
number, owner and extent — are fabricated, five of them wired through to full five-system
records. The screen says so above the map, and the LGD code 999061 is a demonstration code
rather than a real village code.
There is no keyless raster basemap that permits pre-caching:
So the basemap is the OSM vector data, extracted once into data/tumakuru-basemap.json and
rendered by LandStack in its own palette. That keeps the geometry genuinely real, needs no key,
makes no runtime network call, and works with no connection at all. Attribution is required either
way and is shown on the map: © OpenStreetMap contributors.
Tumakuru is the corridor. Mysuru holds the only two Real documents in the corpus — issued
encumbrance certificates for Sy. 83/2 and 84/2 — and is reached through /parcels, /queue and
/ledger rather than through a map of its own. Between them the corpus covers all eight rows of
the routing table; the corridor alone covers all eight too.
A referral note derives its location and its addressee from the parcel's own records
(placeOf in lib/run.ts, officerOffice in lib/constants.ts). It used to build both from a
fixed project constant, so a Tumakuru case was addressed to "Tahsildar, Mysuru taluk" — an
officer with no jurisdiction over the parcel, which makes the note unactionable.
ParcelIdentity (in lib/types.ts, built by lib/identity.ts) holds what each system already
calls a parcel alongside the shared anchor those references were matched against.
We do not mint a new parcel identifier. Karnataka already has too many; inventing a sixth is the first thing an officer would object to. The contribution is normalisation and linkage, not a new number.
Three rules are enforced in code and visible on screen:
referenceHeld: null and linkMethod: "unlinked", never omitted. Absence is a finding, and a
missing row hides it.linkMethod is never a key method for e-Swathu or e-Aasthi. They carry no survey number, so
the best available is "name and extent" at low confidence, with a note saying what did and did
not corroborate.ulpin is null unless the parcel is georeferenced, and ulpinNote then says why.app/ Screens — /, /parcels, /parcels/[composite], /queue,
/queue/[id], /ledger, /records/[id], /method
components/ Nav, KarnatakaMap (both levels), SakalaClock, Term
(glossary), store (session referrals + ledger), ui
lib/types.ts The domain model
lib/extent.ts Unit conversion — comparison only
lib/reconcile.ts normaliseKey, nameScore, extentDelta
lib/routing.ts routeDisagreement — the routing table
lib/run.ts The reconciliation run, records -> MatchCandidate[]
lib/identity.ts The crosswalk — ParcelIdentity per parcel
lib/geography.ts District / taluk / hobli / village hierarchy and counts
lib/corridor.ts Tumakuru corridor geometry and road coordinates
data/tumakuru.json Corridor centreline (real OSM) + 26 fabricated parcels
data/tumakuru-basemap.json Real OSM roads and buildings for the corridor bbox
components/corridor/ PlanMap (Leaflet), PerspectiveInset, CorridorScreen
lib/constants.ts Sakala limits, tolerances, data-quality flags, framing copy
data/records.json The record set
data/systems.json What each system holds and cannot tell you
data/karnataka-districts.ts Imported district boundary paths
The department's own words are used in the interface, with the English gloss in a tooltip — not the reverse: pahani (ಪಹಣಿ), khata (ಖಾತೆ), MR number, phodi (ಪೋಡಿ), tippan (ಟಿಪ್ಪಣಿ), akarband (ಆಕಾರಬಂದ್), hissa (ಹಿಸ್ಸಾ), surnoc, J-Slip, Bu.Pa (ಭೂ ಪರಿವರ್ತನೆ), kharab A and B, paiki, 11E sketch, Nadakacheri, Sakala, durasti. Kannada is rendered in a Kannada face and never transliterated for display.
Fill attributes. For a pahani use the full statutory 13-column structure with the exact
keys col01_surveyNumber … col13_cropDetails. For an encumbrance certificate include the
boundary fields boundary_north / _east / _west / _south, which is what the adjacency
sketch is drawn from. For a local-body record include propertyNumber and, if the document
states one, parentSurveyNumberAsStated.
Set sourceFile to the filename of the certified copy, or null for a synthetic record.