All projects

Personal · Dec 2023

DigiSignID: Document Verification

My first blockchain project, submitted one minute before the deadline and somehow the winner of CodeFest Indonesia.

My contribution

Owned the Azle canister setup, Internet Identity authentication, and PDF upload and signing flow in a five-person team.

DigiSignID: Document Verification screenshot 1
1 / 5

Searching for an idea with real value

DigiSignID was unexpected in almost every sense. It was my first experience with blockchain, we submitted it one minute before the deadline, and none of us expected it to win.

The competition let us build any application using the Internet Computer. We considered ideas such as hospital records, but a teammate suggested document verification after seeing a similar non-blockchain tool. It offered the clearest economic value for our proposal.

The Internet Computer was interesting and deeply confusing. Its canisters, identities, generated interfaces, and deployment environment were unlike the backends I already understood.

The ecosystem was also relatively small. Documentation and community discussions did not answer every question, so some bugs had to be solved through inspection and experimentation.

Keeping the document off the blockchain

Owen and I handled most of the implementation. Atqiya designed the UI and user experience, while Syakira and David developed the pitch deck and product presentation.

I introduced the Azle canister, implemented Internet Identity authentication, and connected the PDF registration flow from the frontend to the backend. Seeing that complete loop work was the part I was proudest of.

During implementation, we realized the blockchain did not need the PDF itself. It only needed a fingerprint that would change if the file were altered. The browser could calculate that fingerprint and send only the commitment to the canister.

This kept sensitive contents off a public ledger and reduced on-chain storage. It taught me that blockchain should hold only the information that benefits from being persistent and independently verifiable.

c=AES⁡k(principal) ⁣(SHA-256⁡(PDF))c = \operatorname{AES}_{k(\mathrm{principal})}\!\left(\operatorname{SHA\text{-}256}(\mathrm{PDF})\right)
The proof of concept stored a deterministic encrypted document hash as its on-chain commitment, while the PDF remained in the browser.

One minute before the deadline

DigiSignID demonstrated how document tampering could be detected using an on-chain commitment. It was designed for our demonstration video, not as a production-ready digital-signature system.

The current design is technically a deterministic commitment rather than a conventional public-key signature. A real version would need stronger signing, identity verification, and authorization guarantees.

The cutoff was 22:00, and we submitted at 21:59. We had no comfortable polishing period. We focused on getting the proof of concept working and presenting its value clearly enough for the judges to understand.

When DigiSignID was announced as the first-place project, the entire team was surprised and genuinely joyful. The result gave me more confidence and encouraged me to keep exploring Web3.

I would replace the proof-of-concept commitment with a proper digital-signature scheme, strengthen publisher verification, and improve deployment and authorization.

I would also design the non-technical workflow around it: how organizations become trusted publishers, how verification evidence is presented, and how the service fits into existing administration.

What stayed with me

  • A blockchain only needs the fingerprint, not the document.
  • Sparse documentation taught me to debug through experimentation.
  • A proof of concept can win while still leaving important security work unfinished.
  • One minute can separate unfinished work from first place.

Run it locally

Clone the source repository or download the project ZIP, then run these commands from the project folder.

Explore the complete project

Download the source, assets, and included documentation as a ZIP archive.

Download project ZIP
bash

Generate the Candid bindings

$ cd digisign-app/src/azle
$ dfx generate azle
$ cd ../..

Run the frontend

$ cp .env.local.example .env.local
$ npm install
$ npm run dev

# open http://localhost:3000

# If the dev server cannot resolve '@icp-sdk/core/agent', rewrite the
# generated imports to '@dfinity/agent' — see SETUP.md.