How Asli works
In 2026 alone, CBSE and PIB Fact Check had to deny fake circulars about cancelled board exams, re-evaluation and a NEET re-exam. Each spread on WhatsApp faster than any denial. Parents and students have no way to check a forward except "look at the official website", and job seekers get fake offer letters with real logos.
The flow
- An institution publishes each notice on Arkiv from its own wallet. Its website lists that wallet.
- The notice's lifetime on Arkiv is its validity. Postponing extends it; withdrawing deletes it and leaves a public revocation.
- Anyone pastes a forward. The text is cleaned (emoji, *stars*, spacing, Hindi digits) and hashed in the browser.
- The browser queries Arkiv and the institution's domain directly. Exact match: real. Near match: fake, with the changed words. Revoked, expired or unknown otherwise.
Why Arkiv, and not Postgres, IPFS or our own API
A database we run
IPFS
A subgraph over a contract
What stays off Arkiv
Entity lifetimes
| Entity | Lifetime | Why |
|---|---|---|
issuer | 365 days, renewed yearly by the issuer (Lifetime Extension) | An issuer that stops renewing drops off the verified list instead of vouching forever. |
notice | until the notice's own valid-until date (ExpirationTime.atDate) | An expired circular stops verifying as current. Postponement extends it. |
amendment | until the new valid-until date + 30 days | The postponement record outlives the notice briefly so late forwards still explain. |
revocation | 180 days, permissionless extension | Anyone can keep a revocation alive while the fake still circulates; nobody but the issuer can change it. |
offer | until the offer's acceptance deadline | A job offer past its deadline is no longer an offer; a scammer cannot reuse it. |
The exact queries
app = str('asli_v1') AND kind = str('notice') AND text_hash = bytes32(<hash>)app = str('asli_v1') AND kind = str('notice') AND code = str(<CODE>)app = str('asli_v1') AND kind = str('notice') AND file_hash = bytes32(<hash>)app = str('asli_v1') AND kind = str('notice') AND $creator = addr(<issuer>)app = str('asli_v1') AND kind = str('notice') AND valid_until >= u64(<from>) AND valid_until <= u64(<to>)app = str('asli_v1') AND kind = str('issuer')app = str('asli_v1') AND kind = str('amendment') AND notice = key(<noticeKey>)app = str('asli_v1') AND kind = str('revocation') AND text_hash = bytes32(<hash>)app = str('asli_v1') AND kind = str('revocation') AND code = str(<CODE>)app = str('asli_v1') AND kind = str('offer') AND file_hash = bytes32(<hash>)Add Asli to what an institution already runs
Two steps, nothing to replace
- Prove the wallet is yours: put
/.well-known/asli-issuer.jsonon your website listing your wallet, or add a DNS record_asli.your-domain TXT "asli-issuer=0x…". About five minutes for your IT team. - Publish as you do now, then paste the same circular into the console and sign with your wallet. Postpone or withdraw it there later.
Other apps can read the same data
Coming next
Coming next
Check on WhatsApp
Coming next
Website plugin
Coming next
Bulk publishing
Coming next
npm package
Coming next
Offer letters from HR tools
Demo issuers (fictional)
| Issuer | Domain | Wallet ($creator) |
|---|---|---|
| Demo Board of Secondary Education | asli-board.vercel.app | 0x2043DB00a32bd8C4804227B72b97438af39a7De6 |
| Pune Demo University | asli-puneuni.vercel.app | 0x94a9C31a9dcdd7EBD44b9c4d7511a27149ec6F81 |
| Acme Infotech | asli-acme.vercel.app | 0x51Ad2Cf42bc81C254bcdd078e15c75890532905f |