Asli असलीFor institutionsArkiv testnet

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

  1. An institution publishes each notice on Arkiv from its own wallet. Its website lists that wallet.
  2. The notice's lifetime on Arkiv is its validity. Postponing extends it; withdrawing deletes it and leaves a public revocation.
  3. Anyone pastes a forward. The text is cleaned (emoji, *stars*, spacing, Hindi digits) and hashed in the browser.
  4. 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

We could insert a fake "real" or delete an inconvenient notice, and readers could not tell. A notice checker that the checker controls is one more thing to trust. On Arkiv the author of every notice is its $creator, set by the chain, and readers query it without us.

IPFS

Content-addressed files cannot be queried ("all live notices from this board", "any notice with this hash"), and have no notion of a notice ending. Asli's core is exactly those queries and that lifetime.

A subgraph over a contract

An indexer someone operates sits between the reader and the data, and expiry becomes our code comparing dates. On Arkiv an expired notice is simply not returned: there is no date check in Asli to get wrong.

What stays off Arkiv

PDFs and images (only their fingerprint), any student or candidate data (not even hashed), signing keys and the access key, OCR and diffing (done in the browser), and the playground rate limits.

Entity lifetimes

EntityLifetimeWhy
issuer365 days, renewed yearly by the issuer (Lifetime Extension)An issuer that stops renewing drops off the verified list instead of vouching forever.
noticeuntil the notice's own valid-until date (ExpirationTime.atDate)An expired circular stops verifying as current. Postponement extends it.
amendmentuntil the new valid-until date + 30 daysThe postponement record outlives the notice briefly so late forwards still explain.
revocation180 days, permissionless extensionAnyone can keep a revocation alive while the fake still circulates; nobody but the issuer can change it.
offeruntil the offer's acceptance deadlineA job offer past its deadline is no longer an offer; a scammer cannot reuse it.

The exact queries

Run any of these against the public Tiramisu RPC with arkiv_query; you do not need Asli.

noticeByTextHash
app = str('asli_v1') AND kind = str('notice') AND text_hash = bytes32(<hash>)
noticeByCode
app = str('asli_v1') AND kind = str('notice') AND code = str(<CODE>)
noticeByFileHash
app = str('asli_v1') AND kind = str('notice') AND file_hash = bytes32(<hash>)
activeNoticesOfIssuer
app = str('asli_v1') AND kind = str('notice') AND $creator = addr(<issuer>)
noticesValidBetween
app = str('asli_v1') AND kind = str('notice') AND valid_until >= u64(<from>) AND valid_until <= u64(<to>)
issuers
app = str('asli_v1') AND kind = str('issuer')
amendmentsOfNotice
app = str('asli_v1') AND kind = str('amendment') AND notice = key(<noticeKey>)
revocationByTextHash
app = str('asli_v1') AND kind = str('revocation') AND text_hash = bytes32(<hash>)
revocationByCode
app = str('asli_v1') AND kind = str('revocation') AND code = str(<CODE>)
offerByFileHash
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

  1. Prove the wallet is yours: put /.well-known/asli-issuer.json on your website listing your wallet, or add a DNS record _asli.your-domain TXT "asli-issuer=0x…". About five minutes for your IT team.
  2. Publish as you do now, then paste the same circular into the console and sign with your wallet. Postpone or withdraw it there later.

No account, no database, no change to your website, ERP or student portal. Asli never holds a real institution's keys.

Other apps can read the same data

Every notice is public on Arkiv, in the schema below. A school app, a news site or a fact-checker can query it with the Arkiv SDK and run the same check, without asking us and without our servers.

Coming next

Coming next

Check on WhatsApp

Forward a message to Asli's number and get the verdict back in the same chat.

Coming next

Website plugin

Post a notice on your school or university site and it is published to Arkiv at the same time.

Coming next

Bulk publishing

Upload a CSV of circulars and sign them all from the institution's own wallet.

Coming next

npm package

asli-verify: one call returns real, altered, withdrawn, expired or unknown, for any app.

Coming next

Offer letters from HR tools

The HR system publishes each offer letter's fingerprint when the offer goes out.

Demo issuers (fictional)

IssuerDomainWallet ($creator)
Demo Board of Secondary Educationasli-board.vercel.app0x2043DB00a32bd8C4804227B72b97438af39a7De6
Pune Demo Universityasli-puneuni.vercel.app0x94a9C31a9dcdd7EBD44b9c4d7511a27149ec6F81
Acme Infotechasli-acme.vercel.app0x51Ad2Cf42bc81C254bcdd078e15c75890532905f

A real institution would keep its key in a hardware wallet or a multisig. The demo keys are held by this deployment's server so judges can use the playground without a wallet.