{"id":29089955,"url":"https://github.com/mcarlomagno/persssist","last_synced_at":"2025-06-28T04:05:32.659Z","repository":{"id":42195606,"uuid":"471467498","full_name":"MCarlomagno/persssist","owner":"MCarlomagno","description":"Storage decentralized application running on top of Rinkeby testnet for storing files metadata and IPFS protocol for uploading, sharing and downloading files.","archived":false,"fork":false,"pushed_at":"2022-08-30T11:52:13.000Z","size":958,"stargazers_count":37,"open_issues_count":1,"forks_count":17,"subscribers_count":2,"default_branch":"main","last_synced_at":"2023-03-05T16:26:46.194Z","etag":null,"topics":["blockchain","ethereum","ganache","ipfs","react","smart-contracts","solidity","truffle","web3","web3js"],"latest_commit_sha":null,"homepage":"https://persssist.vercel.app","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MCarlomagno.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-03-18T17:58:49.000Z","updated_at":"2023-02-18T18:14:16.000Z","dependencies_parsed_at":"2023-01-16T18:15:33.523Z","dependency_job_id":null,"html_url":"https://github.com/MCarlomagno/persssist","commit_stats":null,"previous_names":[],"tags_count":null,"template":null,"template_full_name":null,"purl":"pkg:github/MCarlomagno/persssist","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MCarlomagno%2Fpersssist","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MCarlomagno%2Fpersssist/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MCarlomagno%2Fpersssist/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MCarlomagno%2Fpersssist/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MCarlomagno","download_url":"https://codeload.github.com/MCarlomagno/persssist/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MCarlomagno%2Fpersssist/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262371678,"owners_count":23300597,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["blockchain","ethereum","ganache","ipfs","react","smart-contracts","solidity","truffle","web3","web3js"],"created_at":"2025-06-28T04:05:30.722Z","updated_at":"2025-06-28T04:05:32.639Z","avatar_url":"https://github.com/MCarlomagno.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"https://raw.githubusercontent.com/MCarlomagno/persssist/main/public/images/banner.png\" alt=\"banner image\"/\u003e\n\u003c/div\u003e\n\n# Persssist\n\n[![Vercel](https://img.shields.io/github/deployments/mcarlomagno/persssist/production?label=vercel\u0026logo=vercel\u0026logoColor=white)](https://persssist.vercel.app/)\n![Tests](https://github.com/MCarlomagno/persssist/actions/workflows/truffle.yml/badge.svg)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\nStorage web application running on top of Rinkeby testnet that uses IPFS protocol for storing files in an open and decentralized way.\n\n## How it works\n\n#### Architecture\nThis is a dApp or decentralized application with a simple frontend connected with a set of backend services composed by a Smart Contract deployed to Rinkeby testnet and a storage service using IPFS.\n\nThe **Smart Contract** role is to store basic information about the users and files stored in the app. \n\n\u003e  **IPFS** is a P2P API for storing files in a decentralized way, where each client work as a node for persisting files.\n\u003e [Learn more](https://ipfs.io/)\n\n![Alt text](./public/images/docs/diagram.svg)\n\n#### Stack\n\n- [Solidity](https://docs.soliditylang.org/en/v0.8.13/) for Smart Contract development on **Ethereum**.\n- [Truffle Suite](https://trufflesuite.com/) for local infrastructure and SC deployment.\n- [Ganache](https://trufflesuite.com/ganache/index.html) as a local development blockchain.\n- [Metamask](https://metamask.io/) for in-browser user authentication.\n- [React.js](https://reactjs.org/) (Next.js Framework).\n- [Mocha/Chai](https://mochajs.org/) for Smart Contract testing\n- [Tailwind CSS](https://tailwindcss.com/) for styling components.\n- [Ant UI](https://ant.design/) framework for prebuilt UI components.\n- [Github Actions](https://docs.github.com/en/actions) for CI and automated tests.\n- [Vercel](https://vercel.com/) for CD and Frontend hosting.\n\n#### Basic Process\n\n1. The users connect their account to **Metamask** after pressing _Connect_ button (the app attempts to do this automatically if there is an existing account logged in in Metamask).\n2. Once there is a connected account in the app, the app enables the button for start uploading files on the **Upload** section.\n3. Once you uploaded your first file, you will be able to see the result in the **Files** section (Below the upload section). \n\n## Running locally\n\n#### Configuring the app\n\nFirst, configure `.env` file for blockchain configuration\n\n```bash\nINFURA_PROJECT_ID = \u003cYour Infura Project ID\u003e\nPRIVATE_KEY = \u003cYour Infura private key\u003e\nACCOUNT_ADDRESS = \u003cYour Account Address\u003e\n```\n\nThen, configure `.env.local` file for frontend application.\n\n\n```bash\nNEXT_PUBLIC_MODE = \u003cPROD | DEV (depending of your environment)\u003e\nNEXT_PUBLIC_CONTRACT = \u003cAddress of the smart contract\u003e\n```\n#### Smart contract migration and deployment\n\nIn case you want to run locally for development, run a local blockchain using Ganache.\n\nFirst, initialize truffle project on the repo.\n\n```bash\ntruffle init\n```\n\nThen migrate smart contracts to ganache or any other network (see `truffle-config.js` for configuring networks).\n\nIn case you're running Ganache.\n\n```bash\ntruffle migrate --network development\n```\n\nIn case you prefer to debug against a deployed Smart Contract on rinkeby.\n\n```bash\ntruffle migrate --network rinkeby\n```\n\n#### Running frontend application\n\nThen, run the development server:\n\n```bash\nnpm run dev\n# or\nyarn dev\n```\n\nOpen [http://localhost:3000](http://localhost:3000) with your browser to see the result.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmcarlomagno%2Fpersssist","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmcarlomagno%2Fpersssist","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmcarlomagno%2Fpersssist/lists"}