QuillNode: Own your stories as NFTs. IPFS storage, Web3 auth, reputation & plagiarism detection.
QuillNode - Decentralized Storytelling Platform Overview QuillNode is a Web3-native storytelling platform that reimagines how writers publish, own, and monetize their creative content. By combining NFTs, IPFS storage, and blockchain technology, we've built a censorship-resistant alternative to traditional platforms like Wattpad and Medium where authors truly own their work. Smart Contracts (Solidity 0.8.28):
StoryNFT.sol: ERC-721 contract that mints stories as NFTs, stores IPFS CIDs, and manages ownership transfers ReputationSystem.sol: Tracks author XP and levels, integrates with StoryNFT to reward quality content PlagiarismCourt.sol: Stake-based voting system for community dispute resolution Frontend (Next.js 15.2.4 + React 18.3.1):
Server-side rendering for SEO TypeScript for type safety Tailwind CSS + shadcn/ui for polished UI Dark mode support with next-themes Blockchain Integration (Ethers.js v6.15.0):
Custom hooks for fetching blockchain data (useBlockchainStories) Provider/signer separation for read/write operations MetaMask and Privy wallet support Deployed on Sepolia testnet for low-cost testing Decentralized Storage (Pinata SDK):
Story content uploaded as JSON to IPFS Permanent pinning ensures content availability Metadata tagging for searchability Global CDN gateway for fast content delivery Authentication (Privy SDK v3.3.0):
Social logins (Google, Twitter, Email) Embedded wallets created automatically Non-custodial (users control private keys) Session management for seamless UX The Problem Traditional storytelling platforms suffer from fundamental flaws:
No True Ownership: Authors don't own their content—platforms do. Stories can be deleted, censored, or lost if the platform shuts down. Rampant Plagiarism: Content is copied without attribution, and there's no effective community-driven mechanism to detect or penalize plagiarists. High Platform Fees: Authors lose 30-50% of earnings to centralized platforms. Privacy Concerns: User reading habits are tracked and monetized without consent. Censorship Risk: Platform policies can arbitrarily remove content without recourse. Our Solution QuillNode transforms stories into ERC-721 NFTs stored permanently on IPFS, giving authors:
True Digital Ownership: Each story is minted as a unique NFT. Authors hold the token, proving authorship forever.
Permanent Storage: Story content is uploaded to IPFS via Pinata's pinning service, ensuring it never disappears even if our frontend goes offline.
Seamless Web3 Onboarding: Using Privy's embedded wallets, users can sign up with Google/Twitter/Email—no MetaMask required. The wallet is created automatically in the background, making Web3 feel like Web2.
Reputation System: Authors earn XP and level up by publishing quality content. Reputation follows them on-chain, creating verifiable credibility.
Community-Driven Plagiarism Detection: Users can report plagiarism by staking ETH (0.001-0.5 ETH). The community votes over 24 hours. If plagiarism is confirmed, reporters earn rewards while plagiarists lose reputation. This creates economic incentives for honest reporting.
Transparent & Immutable: All metadata (story titles, categories, IPFS CIDs) is stored on Ethereum's Sepolia testnet. Every transaction is publicly verifiable on Etherscan. User Workflows Publishing a Story:
User clicks "Create Story" (authenticated via Privy) Fills form: title, content, category, cover image, tags Frontend uploads story JSON to Pinata IPFS Pinata returns Content Identifier (CID) Frontend calls mintStoryNFT() smart contract function User approves transaction in wallet Story minted as NFT on Ethereum, CID stored on-chain Author receives +50 XP, levels up if threshold reached Story appears on homepage for all readers Reading a Story:
User visits homepage (no wallet required) Blockchain stories displayed in grid (fetched via Ethers.js) Click on story → Navigate to detail page Frontend queries blockchain for IPFS CID Fetch full content from Pinata gateway using CID Display story with author reputation, Etherscan link, IPFS link Reporting Plagiarism:
Reader suspects plagiarism, clicks "Report" Provides IPFS hash of original work as evidence Stakes 0.001-0.5 ETH (prevents spam) 24-hour community voting period begins Anyone can vote YES/NO (free, one vote per address) After 24 hours, anyone calls finalizeReport() If YES wins: Story flagged, reporter rewarded, author loses 100 XP If NO wins: Report dismissed, reporter loses stake
Building QuillNode was a journey of integrating cutting-edge Web3 technologies to solve real-world problems in digital content ownership. Our goal was ambitious: create a storytelling platform that feels as easy as Wattpad but delivers the ownership guarantees of blockchain technology. Here's how we brought this vision to life.
The Foundation: Choosing the Right Stack We started with Next.js 15 as our frontend framework, specifically choosing the new App Router architecture for its server-side rendering capabilities. This wasn't just about performance—it was strategic. Stories are content, and content needs to be discoverable by search engines. The App Router's React Server Components mean we can render story previews server-side, making them instantly crawlable by Google while keeping our client bundle sizes small. This hybrid approach lets us deliver Web2-level performance while maintaining Web3 functionality.
The decision to use TypeScript throughout the entire stack was non-negotiable. When you're dealing with blockchain transactions where mistakes can cost real money, type safety isn't a luxury—it's essential. Every function that interacts with smart contracts, every API endpoint that handles IPFS uploads, and every component that displays NFT metadata is protected by TypeScript's compile-time checks.
Smart Contracts: The Backbone of Ownership For our smart contract development, we chose Foundry over the more popular Hardhat framework. This decision raised eyebrows initially, but the reasoning was sound. Foundry is written in Rust, making it ten times faster at compilation than JavaScript-based alternatives. When you're iterating on contract logic and running test suites dozens of times per day, those seconds add up to hours saved. Plus, Foundry's built-in fuzzing capabilities helped us identify edge cases in our plagiarism voting system that we would have missed with manual testing.
We architected three interconnected smart contracts that form the core of QuillNode's functionality. The StoryNFT contract implements the ERC-721 standard, making each story a unique, tradeable token. But it does more than just mint tokens—it stores critical metadata: the IPFS content identifier, story title, category, premium status, and timestamp. This metadata lives permanently on Ethereum's Sepolia testnet, making it immutable and publicly verifiable.
The ReputationSystem contract was designed to create accountability. Authors earn experience points for publishing quality content, and these points accumulate into levels. The clever part is how this integrates with the StoryNFT contract. When an author mints a new story, the minting transaction automatically triggers a reputation increase. This happens atomically—either both succeed or both fail—eliminating the need for separate transactions and reducing gas costs for users.
The PlagiarismCourt contract represents our most innovative piece of engineering. We wanted community-driven moderation without creating opportunities for abuse. The solution was economic incentives: reporters must stake real Ethereum to file a plagiarism claim. If the community votes in their favor after twenty-four hours, they get their stake back plus a reward. If they lose, they lose their stake. This creates skin-in-the-game economics that naturally filters out frivolous reports while empowering legitimate whistleblowers.
Solving the Storage Puzzle with IPFS and Pinata One of Web3's biggest challenges is storage costs. Storing a ten-kilobyte story directly on Ethereum would cost over a hundred dollars in gas fees. We needed a better solution, and that's where IPFS and Pinata came in.
The InterPlanetary File System offers decentralized storage where content is addressed by its cryptographic hash rather than its location. This means the same content always has the same identifier, making it perfect for immutable stories. However, raw IPFS has a problem: if no one is "pinning" your content, it can be garbage collected and disappear. This is where Pinata became invaluable.
Pinata provides a pinning service that guarantees our stories stay available forever. When a user publishes a story, our Next.js backend receives the content and uploads it to Pinata using their SDK. Pinata pins the content across their global network and returns a Content Identifier. This CID is a unique hash—something like "QmXYZ123abc"—that we then store in our smart contract. The beauty of this approach is that storing a forty-six-character CID on-chain costs pennies, while the actual story content lives on IPFS's distributed network.
We also implemented Pinata's metadata system to make stories searchable. Each upload includes tags for author name, category, and timestamp. This means in the future, we could build advanced search features without relying on a centralized database—everything can be queried through Pinata's API.
The retrieval process was equally important. Public IPFS gateways are notoriously unreliable and suffer from CORS issues that break browser-based applications. Our solution was to create a proxy through Next.js API routes. When a reader wants to view a story, the frontend requests the content through our API, which fetches it from Pinata's high-performance gateway and returns it. This architecture gives us control over caching, rate limiting, and error handling while maintaining the decentralized nature of the underlying storage.
Authentication: Making Web3 Accessible The biggest barrier to Web3 adoption isn't technology—it's user experience. Asking people to install MetaMask, secure a twelve-word seed phrase, and understand gas fees is a massive onboarding hurdle. Privy's SDK solved this elegantly.
With Privy, we implemented social logins that Web2 users already understand. Someone can click "Continue with Google," complete the OAuth flow they've done a thousand times, and boom—they have an Ethereum wallet. They don't see the wallet creation happen; they don't get confronted with seed phrases; they just have an account that works. Behind the scenes, Privy uses multi-party computation to create a non-custodial wallet where the user maintains control, but the complexity is abstracted away.
The integration required wrapping our entire application in Privy's provider component, which manages authentication state across all pages. We configured it to create embedded wallets automatically for any user who signs up without an existing wallet. The result is seamless: a user who arrives from Google search can be reading stories within seconds, and if they decide to publish, they can mint their first NFT without ever consciously thinking "I'm using blockchain technology."
We also maintained support for traditional MetaMask connections because hardcore Web3 users prefer controlling their own wallets. This dual approach—easy onboarding for newcomers, advanced options for power users—was crucial for broad appeal.
Avail: Planning for the Future While our current implementation stores metadata on Ethereum, we integrated Avail's data availability layer with future scalability in mind. Avail is designed to solve a fundamental blockchain problem: as networks grow, verifying that data is available becomes expensive. Avail separates data availability from execution, allowing us to store large metadata blobs off-chain while maintaining cryptographic proofs of their availability.
We installed Avail's Nexus SDK and configured it for Sepolia testnet. In future iterations, we'll migrate story metadata to Avail's data availability layer. This will dramatically reduce costs—instead of paying Ethereum's premium gas fees for every story, we can batch metadata to Avail and only store proof hashes on Ethereum. The stories remain verifiable and tamper-proof, but at a fraction of the cost.
This also enables our cross-chain vision. With Avail as the data layer, we could deploy QuillNode contracts on Polygon, Arbitrum, and Base, all referencing the same story metadata. An author could mint on Ethereum, but readers on Polygon would see the same content without bridging tokens or duplicating data.
The Frontend: Where It All Comes Together The user interface needed to hide all this complexity. We built custom React hooks that encapsulate blockchain interactions. One hook fetches all stories from the blockchain, another manages the minting process, and a third handles reputation lookups. Components simply consume these hooks without knowing about RPC calls, contract ABIs, or gas estimation.
We used Ethers.js version six for blockchain connectivity, which required navigating some tricky API changes from version five. Events are no longer directly exposed—they're buried in transaction receipt logs that must be manually parsed. We wrote parsing logic that extracts minted token IDs from event data, enabling us to show users their freshly minted NFT immediately after the transaction confirms.
The UI itself leverages Tailwind CSS for rapid styling and shadcn/ui for accessible components. We implemented a dark mode toggle using next-themes that persists across sessions. Every story card displays not just the title and author, but also blockchain-specific information: an NFT badge, links to Etherscan for transaction verification, and warnings if plagiarism reports exist. This transparency is core to our philosophy—everything should be verifiable.
Overcoming Technical Challenges Development wasn't without obstacles. Foundry doesn't support Windows natively, forcing us to set up WSL2 (Windows Subsystem for Linux) for contract development. This added complexity to our workflow but was worth it for Foundry's speed and testing capabilities.
We also grappled with CORS policies when fetching from IPFS gateways. Browsers block cross-origin requests to many public gateways, breaking client-side fetching. Our Next.js API proxy solved this while adding benefits like caching and rate limiting.
Gas optimization was an ongoing concern. We initially considered storing story content directly on-chain, but quick calculations showed this would cost hundreds of dollars per story. The IPFS hybrid approach reduced costs by ninety-five percent while maintaining immutability through content-addressed hashing.
Type safety with smart contracts required manual work. Unlike some ecosystems that auto-generate TypeScript types from ABIs, Ethereum's tooling doesn't offer this out-of-the-box. We wrote interface definitions for every contract interaction, ensuring compile-time safety even though it meant extra boilerplate.
The Result: Web3 That Feels Like Web2 What emerged from this development process is a platform that delivers Web3's promises—true ownership, permanent storage, transparent governance—without Web3's traditional complexity. A user can sign up with their Google account, publish a story, and receive an NFT proving authorship, all without understanding what a private key is.
For developers, the codebase is production-ready. It's not a hackathon prototype held together with duct tape. We have proper error handling, loading states, and fallbacks. The contracts are gas-optimized and tested. The frontend is server-rendered for SEO and split into reusable components.
The integration of sponsor technologies—Avail for data availability, Pinata for IPFS reliability, Privy for authentication, and Ethereum for immutability—isn't superficial. Each solves a specific problem in our architecture. Remove any one of them, and the experience degrades significantly.
QuillNode proves that Web3 applications can match Web2's polish while delivering fundamentally better guarantees around ownership and censorship resistance. The technology stack is complex, but the user experience is simple. That's how it should be.

