├── .eslintignore ├── .eslintrc.json ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── contribution.md │ └── feature_request.md └── PULL_REQUEST_TEMPLATE.md ├── .gitignore ├── .prettierrc ├── LICENSE.txt ├── README.md ├── next-sitemap.config.js ├── next.config.js ├── package.json ├── public ├── content │ ├── cookie-policy │ │ └── index.md │ └── fellowship │ │ ├── Abhishek │ │ ├── abhishek-headshot.jpg │ │ └── index.md │ │ ├── Benson │ │ ├── benson-headshot-logo.jpg │ │ └── index.md │ │ ├── Brian │ │ ├── brian-headshot.jpg │ │ └── index.md │ │ ├── Chuy │ │ ├── chuy-headshot-logo.jpg │ │ └── index.md │ │ ├── David │ │ ├── david-headshot.jpg │ │ └── index.md │ │ ├── Devansh │ │ ├── devansh-headshot.jpg │ │ ├── funding_flywheel.png │ │ ├── funding_system_design.png │ │ ├── index.md │ │ └── marketplace_journalism.png │ │ ├── Eddie │ │ ├── eddie-headshot.jpg │ │ └── index.md │ │ ├── Gabriela │ │ ├── gabriela-headshot.jpg │ │ └── index.md │ │ ├── Guo │ │ ├── guo-headshot.jpg │ │ └── index.md │ │ ├── Karam │ │ ├── index.md │ │ └── karam-headshot.jpg │ │ ├── Kuldeep │ │ ├── index.md │ │ └── kuldeep-headshot.jpg │ │ ├── Lefteris │ │ ├── boat.jpg │ │ ├── fishers.jpg │ │ ├── index.md │ │ ├── lefteris-headshot.jpg │ │ ├── lefteris_final.jpg │ │ └── port_woman.jpg │ │ ├── Marcus │ │ ├── index.md │ │ └── marcus-headshot.jpg │ │ ├── Masa │ │ ├── index.md │ │ └── masa-headshot.jpg │ │ ├── Mercedes │ │ ├── index.md │ │ └── mercedes-headshot.jpg │ │ ├── Mihajlo │ │ ├── index.md │ │ └── mihajlo-headshot.jpg │ │ ├── Mulenga │ │ ├── index.md │ │ └── mulenga-headshot.jpg │ │ ├── Naroa │ │ ├── index.md │ │ └── naroa-headshot.jpg │ │ ├── Rebecca │ │ ├── index.md │ │ ├── miyani_pesa.jpg │ │ ├── oceanview_workshop.jpg │ │ ├── rebecca-headshot.jpg │ │ └── watercolor_sketch.jpg │ │ ├── Robert │ │ ├── index.md │ │ └── robert-headshot.jpg │ │ ├── Sharfy │ │ ├── index.md │ │ └── sharfy-headshot.jpg │ │ ├── Teodor │ │ ├── index.md │ │ └── teodor-headshot.jpg │ │ ├── Tomislav │ │ ├── index.md │ │ └── tomislav-headshot.jpg │ │ └── Valeriia │ │ ├── index.md │ │ └── valeriia-headshot.jpg ├── images │ ├── about │ │ ├── about-hero.jpg │ │ ├── exploration.jpg │ │ ├── representation.jpg │ │ └── stories.jpg │ ├── devconSEA_scholars.jpg │ ├── devcon_2022.png │ ├── devconnect-arg-hero.jpg │ ├── devconnect-arg-logo.png │ ├── devconnect_2022.png │ ├── devconnect_2023.png │ ├── fellow-stars.png │ ├── fellowship │ │ └── fellowship-hero.jpg │ ├── homepage │ │ ├── background.jpg │ │ ├── devcon_home.jpg │ │ ├── fellow_home.jpg │ │ ├── foreground.png │ │ ├── home-stars.jpg │ │ └── middleground.png │ ├── map.jpg │ ├── scholars │ │ ├── artifact.jpg │ │ ├── eth-glyph.png │ │ ├── scholars-hero-closed.jpg │ │ └── scholars-hero-open.jpg │ ├── stars.jpg │ ├── stars.png │ └── temp.png ├── robots.txt ├── sitemap-0.xml └── sitemap.xml ├── src ├── @chakra-ui │ ├── components │ │ ├── Heading.ts │ │ ├── Text.ts │ │ └── index.ts │ ├── foundations │ │ ├── colors.ts │ │ ├── fonts.ts │ │ ├── index.ts │ │ └── textStyles.ts │ └── theme.ts ├── components │ ├── BlogFeed.tsx │ ├── Breadcrumbs.tsx │ ├── Buttons │ │ ├── ButtonLink.tsx │ │ └── FilterButton.tsx │ ├── ContentContainer.tsx │ ├── FAQ.tsx │ ├── FellowCard.tsx │ ├── FellowList.tsx │ ├── FellowStories.tsx │ ├── Headings.tsx │ ├── Heroes │ │ ├── FellowLayoutHero.tsx │ │ ├── HomeHero.tsx │ │ └── ImageHero.tsx │ ├── ImageSplitContent.tsx │ ├── Link.tsx │ ├── Map │ │ └── Globe.tsx │ ├── Md │ │ ├── MarkdownImage.tsx │ │ └── MdComponents.tsx │ ├── Nav │ │ ├── Footer │ │ │ └── Footer.tsx │ │ └── Header │ │ │ ├── HamburgerMenu.tsx │ │ │ ├── Header.tsx │ │ │ └── HeaderButtons.tsx │ ├── PreviousEditions.tsx │ ├── TableOfContents.tsx │ ├── WhoAreNextBillion.tsx │ └── icons │ │ ├── ArrowIcon.tsx │ │ ├── CloseIcon.tsx │ │ ├── HamburgerIcon.tsx │ │ ├── LogoIcon.tsx │ │ └── index.ts ├── layouts │ ├── CookieLayout.tsx │ ├── FellowLayout.tsx │ ├── RootLayout.tsx │ ├── ScholarsClosed.tsx │ └── ScholarsOpen.tsx ├── lib │ └── fonts.ts ├── pages │ ├── [...slug].tsx │ ├── _app.tsx │ ├── _document.tsx │ ├── about.tsx │ ├── fellowship.tsx │ ├── index.tsx │ └── scholars.tsx └── utils │ ├── constants.ts │ ├── getContentPaths.ts │ ├── md.ts │ ├── rehypeHeadingIds.ts │ ├── rehypeImg.ts │ ├── relativePath.ts │ ├── remarkInferToc.ts │ ├── toc.ts │ └── url.ts ├── tsconfig.json └── yarn.lock /.eslintignore: -------------------------------------------------------------------------------- 1 | .next 2 | dist 3 | node_modules/ -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["next/core-web-vitals", "prettier"], 3 | "rules": { 4 | "react/no-unescaped-entities": "off" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: "" 5 | labels: "bug" 6 | assignees: "" 7 | --- 8 | 9 | **Describe the bug** 10 | 11 | 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 16 | 1. Go to '...' 17 | 2. Click on '....' 18 | 3. Scroll down to '....' 19 | 4. See error 20 | 21 | **Expected behavior** 22 | 23 | 24 | 25 | **Screenshots** 26 | 27 | 28 | 29 | **Desktop (please complete the following information):** 30 | 31 | - OS: [e.g. iOS] 32 | - Browser [e.g. chrome, safari] 33 | - Version [e.g. 22] 34 | 35 | **Smartphone (please complete the following information):** 36 | 37 | - Device: [e.g. iPhone6] 38 | - OS: [e.g. iOS8.1] 39 | - Browser [e.g. stock browser, safari] 40 | - Version [e.g. 22] 41 | 42 | **Additional context** 43 | 44 | 45 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/contribution.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Contribution 3 | about: Something that you'd like to contribute to the nxbn website 4 | title: "" 5 | labels: "feature" 6 | assignees: "" 7 | --- 8 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: "" 5 | labels: "enhancement" 6 | assignees: "" 7 | --- 8 | 9 | **Is your feature request related to a problem? Please describe.** 10 | 11 | 12 | 13 | **Describe the solution you'd like** 14 | 15 | 16 | 17 | **Describe alternatives you've considered** 18 | 19 | 20 | 21 | **Additional context** 22 | 23 | 24 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## Description 4 | 5 | 6 | 7 | ## Related Issue 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | .yarn/install-state.gz 8 | 9 | # testing 10 | /coverage 11 | 12 | # next.js 13 | /.next/ 14 | /out/ 15 | 16 | # production 17 | /build 18 | 19 | # misc 20 | .DS_Store 21 | *.pem 22 | 23 | # debug 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | next-env.d.ts 37 | 38 | # Local Netlify folder 39 | .netlify 40 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "es5", 3 | "semi": false, 4 | "singleQuote": false, 5 | "tabWidth": 2, 6 | "endOfLine": "lf" 7 | } 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Every Next Billion Fellow has the opportunity to share their story in at least two places (though we hope you'll share elsewhere, as well): *The Ethereum Foundation Blog*, and *The Next Billion Story Archive*. 2 | 3 | ## Adding to the Story Archive 4 | 5 | Every Next Billion Fellow has a folder in this repository that will display whatever information the fellow would like to present that relates to their story and activities during the duration of the Fellowship. 6 | 7 | The page is formatted in **[markdown](https://www.markdownguide.org/)**, which can display most commonly used text styles including headings, block quotes, and tables, as well as HTML styling. To begin with, story pages contain a one-paragraph description of the project that the Fellow applied with. 8 | 9 | Over the course of your fellowship and after its completion, you may want to add or amend the content. **You can change or update your page at any time** through a *pull request* on github. If you don't have a github account, make one! 10 | 11 | > The Next Billion website repository is located at **https://github.com/ethereum/nxbn-website** 12 | 13 | ### Submit a Pull Request 14 | 15 | #### **Step One:** Find what you want to change. 16 | 17 | Fellowship stories are in the folder `public/content/fellowship/. 18 | 19 | All fellows have a unique folder in which their story lives as a markdown file titled `index.md` 20 | 21 | For example, Mulenga's story is inside `public/content/fellowship/Mulenga/index.md` 22 | 23 | #### **Step Two:** Add your changes as a new commit. 24 | 25 | The easiest way to change the content of `index.md` is to use the in-browser code editor that github provides. 26 | 27 | > Github will ask you to **Fork the Repository**. Do so! Forking helps keep open-source contributions organized, so that everyone can have their own version of a codebase without affecting the work of others. You will use a *pull request* to *merge* your proposed changes with the main website *branch*. 28 | 29 | #### Step Three: Submit your Pull Request 30 | 31 | Once your changes are saved on your *Fork*, you can submit them to the main website repository in the form of a *pull request*. 32 | 33 | The changes will be reviewed by a nxbn-website maintainer, and added to the next website update. 34 | 35 | > Before your change goes live, you will receive a **deploy preview** link to see what it looks like live on the website. You can make new changes if it doesn't look quite how you expected, or want to do something different. 36 | 37 | 38 | ---- 39 | 40 | ## Website Development 41 | 42 | This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). 43 | 44 | ## Getting Started 45 | 46 | First, run the development server: 47 | 48 | ```bash 49 | yarn dev 50 | ``` 51 | 52 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. 53 | 54 | You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. 55 | 56 | This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. 57 | 58 | ## Learn More 59 | 60 | To learn more about Next.js, take a look at the following resources: 61 | 62 | - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. 63 | - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. 64 | 65 | You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! 66 | 67 | ## Deploy on Vercel 68 | 69 | The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. 70 | 71 | Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. 72 | -------------------------------------------------------------------------------- /next-sitemap.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next-sitemap').IConfig} */ 2 | 3 | module.exports = { 4 | siteUrl: "https://fellowship.ethereum.org", 5 | generateRobotsTxt: true, 6 | } 7 | -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | const { PHASE_DEVELOPMENT_SERVER } = require("next/constants") 2 | const withMDX = require("@next/mdx")() 3 | 4 | const LIMIT_CPUS = Number(process.env.LIMIT_CPUS ?? 2) 5 | 6 | const experimental = LIMIT_CPUS 7 | ? { 8 | // This option could be enabled in the future when flagged as stable, to speed up builds 9 | // (see https://nextjs.org/docs/pages/building-your-application/configuring/mdx#using-the-rust-based-mdx-compiler-experimental) 10 | // mdxRs: true, 11 | 12 | // Reduce the number of cpus and disable parallel threads in prod envs to consume less memory 13 | workerThreads: false, 14 | cpus: LIMIT_CPUS, 15 | } 16 | : {} 17 | 18 | /** @type {import('next').NextConfig} */ 19 | const nextConfig = { 20 | reactStrictMode: true, 21 | swcMinify: true, 22 | // Configure `pageExtensions` to include MDX files 23 | pageExtensions: ["md", "mdx", "ts", "tsx"], 24 | // Optionally, add any other Next.js config below 25 | } 26 | 27 | module.exports = withMDX((phase) => { 28 | if (phase !== PHASE_DEVELOPMENT_SERVER) { 29 | return { 30 | ...nextConfig, 31 | experimental: { 32 | ...experimental, 33 | outputFileTracingExcludes: { 34 | "*": [ 35 | /** 36 | * Exclude these paths from the trace output to avoid bloating the 37 | * Netlify functions bundle. 38 | * 39 | * @see https://github.com/orgs/vercel/discussions/103#discussioncomment-5427097 40 | * @see https://nextjs.org/docs/app/api-reference/next-config-js/output#automatically-copying-traced-files 41 | */ 42 | "node_modules/@swc/core-linux-x64-gnu", 43 | "node_modules/@swc/core-linux-x64-musl", 44 | "node_modules/@esbuild/linux-x64", 45 | "public/**/*.png", 46 | "public/**/*.jpg", 47 | "public/**/*.gif", 48 | ], 49 | }, 50 | }, 51 | } 52 | } 53 | 54 | return nextConfig 55 | }) 56 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "next-billion-website", 3 | "version": "1.0.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "postbuild": "next-sitemap", 9 | "start": "next start", 10 | "lint": "next lint", 11 | "format": "prettier --write ." 12 | }, 13 | "dependencies": { 14 | "@chakra-ui/react": "^2.8.2", 15 | "@emotion/react": "^11.11.3", 16 | "@emotion/styled": "^11.11.0", 17 | "@mdx-js/loader": "^3.0.1", 18 | "@mdx-js/react": "^3.0.1", 19 | "@next/mdx": "^14.1.3", 20 | "@types/mdx": "^2.0.11", 21 | "eslint-config-prettier": "^9.1.0", 22 | "framer-motion": "^11.0.3", 23 | "gray-matter": "^4.0.3", 24 | "image-size": "^1.1.1", 25 | "mdast-util-toc": "^7.0.0", 26 | "next": "14.1.0", 27 | "next-mdx-remote": "^4.4.1", 28 | "next-sitemap": "^3.1.32", 29 | "prettier": "^3.2.5", 30 | "react": "^18.2.0", 31 | "react-dom": "^18.2.0", 32 | "react-globe.gl": "^2.27.2", 33 | "react-icons": "^5.0.1", 34 | "remark-gfm": "^4.0.0", 35 | "rss-parser": "^3.13.0", 36 | "unist-util-visit": "^5.0.0" 37 | }, 38 | "devDependencies": { 39 | "@types/node": "^20.4.2", 40 | "@types/react": "^18.2.15", 41 | "@types/react-dom": "^18.2.7", 42 | "eslint": "^8.45.0", 43 | "eslint-config-next": "^14.1.0", 44 | "typescript": "^5.1.6" 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /public/content/cookie-policy/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: cookie 3 | title: Cookie Policy 4 | --- 5 | 6 | ## Introduction 7 | 8 | Our websites use cookies to distinguish you from other users of our websites. This helps us to provide you with a good experience when you browse our websites and also allows us to improve our sites. By continuing to browse the sites, you are agreeing to our use of cookies, and the terms of this policy ("Cookie Policy"). A cookie is a small file of letters and numbers that we store on your browser or the hard drive of your computer if you agree. Cookies contain information that is transferred to your computer's hard drive. We use the following cookies: 9 | 10 | ## Policy 11 | 12 | - Strictly necessary cookies. These are cookies that are required for the operation of our websites. They include, for example, cookies that enable you to log into secure areas of our websites, use a shopping cart or make use of e-commerce payment processing services. 13 | - Analytical/performance cookies. They allow us to recognise and count the number of visitors and to see how visitors move around our websites when they are using it. This helps us to improve the way our websites work, for example, by ensuring that users are finding what they are looking for easily. 14 | - Functionality cookies. These cookies are used to recognise you when you return to our websites. They enable us to personalise our content for you, greet you by name and remember your preferences (for example, your choice of language or region). 15 | - Targeting cookies. These cookies record your visit to our websites, the pages you have visited and the links you have followed. 16 | -------------------------------------------------------------------------------- /public/content/fellowship/Abhishek/abhishek-headshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/Abhishek/abhishek-headshot.jpg -------------------------------------------------------------------------------- /public/content/fellowship/Abhishek/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | index: 4 3 | layout: fellow 4 | title: Farmer Finance 5 | fellowName: Abhishek 6 | cohort: 2 7 | country: India 8 | lat: 28.6139 9 | lon: 77.209 10 | image: /content/fellowship/Abhishek/abhishek-headshot.jpg 11 | description: Harvest-time loans for farmers in India 12 | bio: | 13 | ## Abhishek Bhattacharya 14 | 15 | Abhishek Bhattacharya is a co-founder at [Brú Finance](https://bru.finance/) . Brú Finance is a platform that aims to provide harvest-time loans for farmers in India. For his Fellowship project, Abhishek learned from the launch of Brú's platform to a public chain that utilizes decentralized liquidity for the farmers and explored what this system could look like on a global scale. 16 | 17 | [**Interview at Devcon6 2022**](https://youtu.be/K18r8_mHS6E?si=a0pCIEZ1GHe3181d) 18 | tags: 19 | - defi 20 | - SEAsia 21 | - hidden 22 | - 2022-cohort-2 23 | --- 24 | -------------------------------------------------------------------------------- /public/content/fellowship/Benson/benson-headshot-logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/Benson/benson-headshot-logo.jpg -------------------------------------------------------------------------------- /public/content/fellowship/Benson/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | index: 0 3 | layout: fellow 4 | title: Microinsurance for Every Farmer 5 | fellowName: Benson 6 | cohort: 1 7 | lat: -1.2921 8 | lon: 36.8219 9 | country: Kenya 10 | image: /content/fellowship/Benson/benson-headshot-logo.jpg 11 | description: Microinsurance products for small-scale farmers in Kenya in extreme weather events 12 | bio: | 13 | ## Benson Njuguna 14 | 15 | Benson Njuguna [(Acre Africa)](https://acreafrica.com/) worked to implement blockchain solutions to a microinsurance product that protects thousands of small-scale farmers in Kenya from extreme weather events. His project tested and showcased Ethereum's potential in enabling the viability and sustainability of products and services that target the bottom of the wealth pyramid. [Read more about Benson's work here.](https://blog.ethereum.org/2021/12/07/fellows-spotlight-on-kenya/) 16 | 17 | [**Ethereum Foundation Blog**](https://blog.ethereum.org/2021/12/07/fellows-spotlight-on-kenya) 18 | 19 | [**Interview at Devconnect 2021**](https://youtu.be/3wMgDyuWdWU?si=1WboMtuB6VYfc0dd) 20 | tags: 21 | - farmers 22 | - insurance 23 | - defi 24 | - africa-east 25 | - 2021-cohort-1 26 | - kenya 27 | --- 28 | -------------------------------------------------------------------------------- /public/content/fellowship/Brian/brian-headshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/Brian/brian-headshot.jpg -------------------------------------------------------------------------------- /public/content/fellowship/Brian/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | index: 9 3 | layout: fellow 4 | title: Fair Lending for Web3 workers 5 | fellowName: Brian 6 | cohort: 3 7 | country: Indonesia 8 | lat: -6.2088 9 | lon: 106.8456 10 | image: /content/fellowship/Brian/brian-headshot.jpg 11 | description: Brian investigated the needs of web3 workers through Copra Finance, a startup that designs web3 financial products for working folks in Jakarta, Indonesia 12 | bio: | 13 | ## Brian Limiardi 14 | 15 | **Brian Limiardi** builds for financial inclusion in Indonesia as co-founder of [Copra](https://www.copra.finance/). While access to personal loans is available through banks, there are many contexts in which the only way to get a loan for business is through informal lenders (read: loan sharks). For folks who choose to work and invoice in cryptocurrency, access to even simple legacy financial tools like personal or small business loans can be an obstacle. For his Fellowship, Brian will focus on researching the needs and realities of the growing demographic of workers and small businesses who use crypto as a primary means of invoicing and bookkeeping. 16 | 17 | [**Interview at Devconnect 2023**](https://youtu.be/7W0EU9Qsu1Y?si=V6omURU5MijzUPxe) 18 | tags: 19 | - defi 20 | - NFT 21 | - asia-southeast 22 | - 2023-cohort-3 23 | --- 24 | -------------------------------------------------------------------------------- /public/content/fellowship/Chuy/chuy-headshot-logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/Chuy/chuy-headshot-logo.jpg -------------------------------------------------------------------------------- /public/content/fellowship/Chuy/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | index: 1 3 | layout: fellow 4 | title: Identity Solutions for Govtech 5 | fellowName: Chuy 6 | cohort: 1 7 | country: Mexico 8 | lat: 19.4326 9 | lon: -99.1332 10 | image: /content/fellowship/Chuy/chuy-headshot-logo.jpg 11 | description: Chuy explores government-issued documents on chain in Argentina and other LatAm countries. 12 | bio: | 13 | ## Chuy Cepeda 14 | 15 | **Chuy Cepeda** [(OS.City)](https://os.city/) worked with municipal and national governments to create an Ethereum wallet app in Spanish for citizens, with a vision to one-day hold government-issued documents (like permits and IDs). During the Fellowship Program, he and his team worked with the government of Argentina and created strategies to advance the meaningful adoption of blockchain in the public sector in Latin America. [Read more about Chuy's work here.](https://blog.ethereum.org/2022/06/07/spotlight-on-latam-identity/) 16 | tags: 17 | - identity 18 | - america-latin 19 | - america-central 20 | - 2021-cohort-1 21 | --- 22 | -------------------------------------------------------------------------------- /public/content/fellowship/David/david-headshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/David/david-headshot.jpg -------------------------------------------------------------------------------- /public/content/fellowship/David/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | index: 14 3 | layout: fellow 4 | title: Operating a node in Africa 5 | fellowName: David 6 | cohort: 4 7 | country: Nigeria 8 | lat: 6.5244 9 | lon: 3.3792 10 | image: /content/fellowship/David/david-headshot.jpg 11 | description: David is documenting the nuts and bolts of running a node in Nigeria and, more generally, on the African continent and all the challenges that come with it. 12 | bio: | 13 | ## David Uzochukwu 14 | 15 | Running an Ethereum node in Africa faces challenges such as limited internet connectivity, high data costs, inconsistent power supply, and lack of education, all of which can hinder consistent operation. However, it presents significant opportunities for local innovation, improved financial inclusion, and participation in the global blockchain ecosystem, particularly as infrastructure continues to improve. David will be researching and documenting what it takes for Ethereum to be a decentralized world computer where everyone, independently of their location, can play a role in ensuring its geographical spread and robustness. 16 | 17 | [**Interview, 2024**](https://youtu.be/5mN2qoYNAYU?si=D16oaihOpUxbp8VD) 18 | 19 | [**Telegram**](t.me/nodebridege) 20 | 21 | [**X**](https://x.com/Nodebridgeafric) 22 | tags: 23 | - 2024-cohort-4 24 | - Africa-west 25 | - infrastructure 26 | - staking-for-good 27 | --- 28 | -------------------------------------------------------------------------------- /public/content/fellowship/Devansh/devansh-headshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/Devansh/devansh-headshot.jpg -------------------------------------------------------------------------------- /public/content/fellowship/Devansh/funding_flywheel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/Devansh/funding_flywheel.png -------------------------------------------------------------------------------- /public/content/fellowship/Devansh/funding_system_design.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/Devansh/funding_system_design.png -------------------------------------------------------------------------------- /public/content/fellowship/Devansh/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | index: 10 3 | layout: fellow 4 | title: Retroactive Impact funding for Journalists 5 | fellowName: Devansh 6 | cohort: 3 7 | country: India 8 | publishedDate: May 22, 2025 9 | lat: 12.9716 10 | lon: 77.5946 11 | image: /content/fellowship/Devansh/devansh-headshot.jpg 12 | description: Devansh is exploring retroactive funding for citizen journalists using the hypercerts standard. 13 | storyHook: "Think of the experience of buying a t-shirt: you go to a shop, inspect the quality, and purchase it directly. Imagine that same experience for buying impact. You can see some verified, achieved outcome, look at the price at which it was achieved, and then purchase it." 14 | bio: | 15 | ## Devansh Mehta 16 | 17 | Devansh Mehta, co-founder of [VoiceDeck](https://voicedeck.org/), is interested in mapping out public good impact space. Impact methodologies and markets for environmental use cases are well-documented mechanisms, but sometimes 'impact' wanders into more subjective territory: Investigative journalism, for example, is undoubtedly a public good. How can the real work of journalists be documented and valued in a way that fits into the right funding mechanism? Devansh will work with citizen journalism newsrooms to explore methodologies of impact documentation using the [hypercerts standard](https://hypercerts.org/), with an aim to find a good mechanism of retroactive funding for positive social outcomes. 18 | 19 | [**Interview at Devconnect 2023**](https://youtu.be/42ukRSN0-ms?si=4T4ud4CDUmIkPsii) 20 | tags: 21 | - asia-south 22 | - impact 23 | - funding 24 | - hypercerts 25 | - 2023-cohort-3 26 | --- 27 | 28 | ## Piloting Journalism Impact Certificates, a new blockspace frontier 29 | 30 | As an investigative journalist, I have published stories at newsrooms like the Organized Crime and Corruption Reporting Project and CGNet Swara. Both newsrooms, like many investigative outlets, face a common problem: while many of their stories create tangible outcomes, the impact rarely translates into sustainable revenue. In response, I experimented with alternative revenue models like distributing news via WhatsApp API and Bluetooth, and even paying readers to listen to ads! 31 | 32 | But the fundamental issue remained: how do we create a feedback loop where real-world outcomes of journalists’ work directly fuels their revenue? 33 | 34 | ## Outcome-based Funding: A Potential Solution 35 | 36 | In outcome-based funding, money is given based on results, not just effort or promises. In the case of journalism, for example, traditional funding may support the process (like writing, investigating, and publishing), whereas outcome-based funding rewards the results (like a criminal being arrested and a policy change). 37 | 38 | The most prominent instrument of outcome-based funding is social impact bonds, where investors provide upfront capital, repaid with interest if predefined outcome targets are met. Since 2010, there have been 300 impact bonds raising around USD 750 million to serve 2.5 million globally. 39 | 40 | Despite its innovation, however, outcome-based funding has had relatively low uptake for 3 main reasons: 41 | 42 | 1. Organizations focus on easy-to-achieve outcomes at the expense of more difficult ones 43 | 2. Only deep-pocketed funders use it since there are high setup costs, with one study finding a required ticket size of at least USD 20 million to be viable 44 | 3. Risk of overpayment of outcomes that may have occurred even without the intervention or insufficiently capture meaningful change 45 | 46 | ## Outcome-based Funding, On-chain 47 | 48 | In August 2021, I stumbled upon the concept of a non-fungible token: using a blockchain to create unique digital objects. I saw that this could be applied to social impact bonds to replicate key features like single sale of outcomes while lowering setup costs and need for big funders. Blockchain-powered outcome funding could become a new approach to fundraising in the social sector by shifting from an existing service contract model (i.e., grants, donations) to a disruptive, product sales approach via certificates of impact. 49 | 50 | Think of the experience of buying a t-shirt: you go to a shop, inspect the quality, and purchase it directly. Imagine that same experience for buying impact. You can see some verified, achieved outcome, look at the price at which it was achieved, and then purchase it. 51 | 52 | The idea of impact certificates was first brought up in 2014 by Paul Christiano on the Effective Altruism forum. He saw it as a coordination mechanism, bringing together people with the ability to undertake a project, means to fund it, and knowledge to evaluate it, premised around creating positive feedback loops between impact creation and revenue generation. 53 | 54 | ![Funding Flywheel with Impact Certificates](funding_flywheel.png) 55 | 56 | Even back then, Paul [proposed](https://paulfchristiano.medium.com/certificates-of-impact-34fa4621481e) the use of a blockchain to solve the issue of double spending, where the same impact might be sold multiple times. However, it wasn’t until [Hypercerts](https://www.hypercerts.org/)—digital tokens that represent the impact of some work—launched last year that a clear standard for impact certificates came into existence. 57 | 58 | ## Building Version One: Journalism Impact Certificates 59 | 60 | As part of the Ethereum Foundation’s Next Billion Fellowship, I attended a global investigative journalism conference in Gothenburg to get feedback from journalists on outcome-based funding for their past work. Seeing some initial [validation](https://x.com/TheDevanshMehta/status/1708818000093294810) of the idea, I drew up a prototype that received some initial funding, from Funding the Commons and Scott Alexander, who is a leader in the rationalist community. The project was also [featured](https://www.astralcodexten.com/p/impact-market-mini-grants-results?hide_intro_popup=true) on his widely read blog, Astral Codex Ten. Additionally, the product accellerator [Pollen Labs](https://pollenlabs.org/) provided crucial design and development help to the project. 61 | 62 | We then started collaborations with three social enterprises to bring on chain their past impact—such as getting a human trafficker arrested and suspending a teacher stealing from a lunch program. Each verified outcome was priced, quantified, and made available for purchase by customers. 63 | 64 | ![Funding System Design](funding_system_design.png) 65 | 66 | After a testnet launch, the marketplace of journalism impact went live in November 2024\. That same month, at Devcon SEA, I gave [a talk](https://app.devcon.org/schedule/SJE7VP) about all the support provided in the Ethereum ecosystem to manifest an idea, from Gitcoin quadratic funding rounds that keep the mission alive, to hackathons for recruiting team members, to initiatives like Pollen Labs and the Next Billion Fellowship Program. 67 | 68 | Since the launch, 13 supporters have bought $125 in impact certificates. The project’s repository has had two prominent forks for taking outcome-based funding to other domains. A writeup on our implementation of outcome-based online donations was [published](https://dl.acm.org/doi/abs/10.1145/3678884.3687146) at a top peer-reviewed conference called Computer Supported Cooperative Work (CSCW), showcasing a new blockchain use case to internet researchers outside web3. 69 | 70 | ![A look at the marketplace for buying impact created by citizen journalism 71 | ](marketplace_journalism.png) 72 | 73 | ## What’s next? 74 | 75 | Going ahead, the plan is tapping into three markets for driving more buyers to impact certificates: existing media funders; algorithmic funding platforms like Gitcoin, Ooctant, and Public Nouns-type DAOs; and the gift card market. 76 | 77 | Every impact certificate has space for its buyers to write a comment showing their gratitude to a person on a special occasion. Why give a material gift to someone when you can buy an already-achieved impact advancing a cause they care about? 78 | 79 | On that note, if you liked this article you can leave a comment expressing your appreciation by buying an impact certificate (for any amount) at [app.voicedeck.org](http://app.voicedeck.org/). 80 | 81 | *Special thanks to Nidhi Harihar for reviewing the draft and providing comments* 82 | -------------------------------------------------------------------------------- /public/content/fellowship/Devansh/marketplace_journalism.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/Devansh/marketplace_journalism.png -------------------------------------------------------------------------------- /public/content/fellowship/Eddie/eddie-headshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/Eddie/eddie-headshot.jpg -------------------------------------------------------------------------------- /public/content/fellowship/Eddie/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | index: 15 3 | layout: fellow 4 | title: On-chain credit scores for smallholder farmers and co-ops in Kenya 5 | fellowName: Eddie 6 | cohort: 4 7 | country: Kenya 8 | lat: -1.2922 9 | lon: 36.8218 10 | image: /content/fellowship/Eddie/eddie-headshot.jpg 11 | description: Eddie's Antugrow platform digitizes farmer production records and farm metadata to create reputation scores on-chain, with a goal to access to affordable working capital for smallholder farmers and cooperatives in Kenya 12 | bio: | 13 | ## Eddie Kago 14 | 15 | Eddie, founded [Antugrow](https://antugrow.com/) to help farmer cooperatives modernize their post-harvest record-keeping while creating on-chain credit scores for smallholder farmers in Kenya. By standardizing farmer data for interoperability purposes, Eddie aims to unlock low-cost credit and scalable agricultural insurance, leveraging his expertise in building digital identities within the agricultural development context. Antugrow intends to provide a human friendly stack to getting farmers onchain to enable economic prosperity. 16 | 17 | [**Interview, 2024**](https://youtu.be/qj30b6kuFoM?si=nWnCHh6QPXQ_Os9M) 18 | 19 | [**Interview, 2024 (SW)**](https://youtu.be/K_S6Mz8SccM?si=-hy1CrOH8V11WeO1) 20 | tags: 21 | - defi 22 | - 2024-cohort-4 23 | - africa-east 24 | - farmers 25 | - identity 26 | --- 27 | -------------------------------------------------------------------------------- /public/content/fellowship/Gabriela/gabriela-headshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/Gabriela/gabriela-headshot.jpg -------------------------------------------------------------------------------- /public/content/fellowship/Gabriela/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | index: 5 3 | layout: fellow 4 | title: Small Business Savings Circles 5 | fellowName: Gabriela 6 | cohort: 2 7 | country: Mexico 8 | lat: 25.6866 9 | lon: -100.3161 10 | image: /content/fellowship/Gabriela/gabriela-headshot.jpg 11 | description: Bloinx is a project that focuses on 'tandas' in Mexico. In 2022, Gabriela conducted user research with several women's saving circles, and ran a pilot of Bloinx deployed on the polygon and celo side-chains. 12 | bio: | 13 | ## Gabriela Guerra 14 | 15 | **Gabriela Guerra** founded [Bloinx](https://bloinx.io/), a startup that implements blockchain-based tandas (also known as cundinas, susu, hui, arisan, quiniela, stokvel, and others around the world) – informal savings circles. Gabriela is convinced that blockchain can have real benefit for the unbanked population of the world, and that savings circles are one good starting mechanism. During her Fellowship, Gabriela conducted pilots in Mexico and Venezuela and used the research to help improve Bloinx for larger scales. 16 | 17 | [**Interview at Devcon6 2022**](https://youtu.be/JVIi0t6JLcQ?si=sbQuMIya61KIFgkR) 18 | tags: 19 | - america-latin 20 | - 2022-cohort-2 21 | - defi 22 | - research 23 | --- 24 | -------------------------------------------------------------------------------- /public/content/fellowship/Guo/guo-headshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/Guo/guo-headshot.jpg -------------------------------------------------------------------------------- /public/content/fellowship/Karam/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | index: 6 3 | layout: fellow 4 | title: Peer to peer aid in Humanitarian Crises 5 | fellowName: Karam 6 | cohort: 2 7 | country: Syria 8 | lat: 35.3292 9 | lon: 40.135 10 | image: /content/fellowship/Karam/karam-headshot.jpg 11 | description: Beyond Borders - Unveiling Potential of Blockchain in a Crisis - the case of Syria 12 | bio: | 13 | ## Karam Alhamad 14 | 15 | **Karam Alhamad** is an entrepreneur, fintech visionary, international development professional, and human rights policy advocate. Karam founded [ZeFi,](https://zefi.com/en) an educational platform and community focused on fostering blockchain education and research custom-fit for the Syrian context. For the Fellowship, Karam conducted research that increases practical and culturally-sensitive understandings of how blockchains can solve problems in conflict settings. 16 | 17 | [**Ethereum Foundation Blog**](https://blog.ethereum.org/2023/11/15/beyond-borders-nb) 18 | 19 | [**Interview, 2022**](https://youtu.be/obzaTeuJFYQ?si=rGOrThE39mbYTmQa) 20 | 21 | [**Interview, 2024**](https://youtu.be/8ro36jqLmfk?si=5BZ0R73FUM7RbFuT) 22 | 23 | [**Interview, 2024 (AR)**](https://youtu.be/9J_7rTwVWkI?si=LPUxLkWgL3PMuonv) 24 | tags: 25 | - middle-east 26 | - p2p 27 | - research 28 | - NGO 29 | - CSO 30 | - aid 31 | - 2022-cohort-2 32 | - human-rights 33 | --- 34 | -------------------------------------------------------------------------------- /public/content/fellowship/Karam/karam-headshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/Karam/karam-headshot.jpg -------------------------------------------------------------------------------- /public/content/fellowship/Kuldeep/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | index: 2 3 | layout: fellow 4 | title: Re-decentralizing with BRAC 5 | fellowName: Kuldeep 6 | cohort: 1 7 | country: Bangladesh 8 | lat: 23.685 9 | lon: 90.3563 10 | image: /content/fellowship/Kuldeep/kuldeep-headshot.jpg 11 | description: How should the world's largest NGO approach decentralized technology? 12 | bio: | 13 | ## Kuldeep Bandhu Aryal 14 | 15 | **Kuldeep Bandhu Aryal** [(BRAC)](http://www.brac.net/) sought to build a blockchain and crypto strategy for BRAC - the world's largest NGO based in Bangladesh that annually serves over 100 million people. His project - which also involves multiple experiments using blockchain - could serve as a model for other social enterprises and the development sector at large. 16 | 17 | [**Interview at Devconnect 2023**](https://youtu.be/yhoAygTNsls?si=4wUTfOsyt1zRNtKB) 18 | tags: 19 | - asia-south 20 | - asia 21 | - identity 22 | - NGO 23 | - 2021-cohort-1 24 | --- 25 | -------------------------------------------------------------------------------- /public/content/fellowship/Kuldeep/kuldeep-headshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/Kuldeep/kuldeep-headshot.jpg -------------------------------------------------------------------------------- /public/content/fellowship/Lefteris/boat.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/Lefteris/boat.jpg -------------------------------------------------------------------------------- /public/content/fellowship/Lefteris/fishers.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/Lefteris/fishers.jpg -------------------------------------------------------------------------------- /public/content/fellowship/Lefteris/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | index: 17 3 | layout: fellow 4 | title: Fishing for the Commons 5 | fellowName: Lefteris 6 | cohort: 4 7 | country: Greece 8 | publishedDate: May 22, 2025 9 | lat: 37.9838 10 | lon: 23.7275 11 | image: /content/fellowship/Lefteris/lefteris-headshot.jpg 12 | description: Lefteris is focused on reducing marine plastic pollution by engaging with fishers in Greece and the Mediterranean and adopting cleaning and sustainability practices. 13 | storyHook: "On one of the first trips out on the boat, as the men hauled up a net filled with fish, I noticed a can of coke, recognizable if a little bit worn out. I picked it up to examine it, and was startled to see the date 1987 written in faded lettering on the side. As I stood there contemplating that this piece of trash had been floating in the sea for almost 30 years, one of the fishermen came beside me, plucked the can from my hand, and casually tossed it back into the sea. 'Trash isn't our problem,' he said." 14 | bio: | 15 | ## Lefteris Arapakis 16 | 17 | Lefteris was born into a family with a deep-rooted tradition in the fishing industry. In 2016, he founded [Enaleia](https://enaleia.com/) to engage fishers in addressing the social and environmental challenges of ocean degradation. 18 | Lefteris began by educating fishers on sustainable practices and integrating collected waste into a circular economy, focusing on the plastics value chain in Greece. His initiative quickly expanded to encompass the entire Mediterranean Sea. A key aspect of Enaleia's work is tracking the lifecycle of ocean-collected plastic, and as part of his Fellowship, Lefteris will transition the platform into a public chain and explore other blockchain-related verticals into Eneleia. 19 | 20 | [**Interview, 2024**](https://youtu.be/IgOMyZUQUH0?si=MYjS8tXt-jjksm1I) 21 | 22 | [**Interview, 2024 (GR)**](https://youtu.be/0E5S9V-uKPg?si=Ow7gqnb53-8l1nNR) 23 | 24 | tags: 25 | - 2024-cohort-4 26 | - europe 27 | - climate 28 | - circular-economy 29 | --- 30 | 31 | >*Enaleia started as a training school for fishers; meant to help new people find and learn the timeless trade and tradition that my family has carried on for 5 generations. On one of the first trips out on the boat, and as the men hauled up a net filled with fish , I noticed a can of coke, recognizable if a little bit worn out. I picked it up to examine it, and was startled to see the date 1987 written in faded lettering on the side. As I stood there contemplating that **this piece of trash had been floating in the sea for almost 30 years**, one of the fishermen came beside me, plucked the can from my hand, and casually tossed it back into the sea. "Trash isn't our problem," he said.* 32 | 33 | ## Main Character Energy 34 | The Mediterranean sea is a perfect example of a *commons* in the modern world. This vast body of water supports almost 500 million people across 22 different coastal countries and territories. Being an international sea commons, its ecosystem is not fully anyone's responsibility or jurisdiction, and therein lies the possible *tragedy*: The Mediterranean is today one of the seas with the highest levels of plastic pollution in the world — up to four times as many microplastic fragments (1.25 million per km^2) as the 'plastic island' in the Pacific. At current rates by 2050, kilogram for kilogram, there may be more plastic than fish in its waters. And there is the truth that bothered me on the boat; trash—plastic trash in particular—is *everyone's problem*, including and especially fishers, who depend on a healthy ocean ecosystem to live! 35 | 36 | Enaleia is on a mission to write a new chapter in the story of sea fishing, to restore sustainable practices, and to empower those who live closest to the ocean, the Fishers, to be heroes in the story. Through education, prevention, and mitigation, we can set ourselves on a path toward ocean ecosystem flourishing. 37 | 38 | This problem of plastic is not a national problem, or even an EU problem; it's a Mediterranean problem. And so it requires Mediterranean collaboration. More importantly, the change can't come from the top-down — just like the plastic itself, real change needs to *come from the bottom-up*! We must find a way for many different people, from very different backgrounds, contexts, and cultures to work together to solve a complex coordination challenge. 39 | 40 | ![fishers](fishers.jpg) 41 | 42 | ## Writing the Ocean Cleanup Playbook 43 | The first part of the solution is straightforward: we want to get the *Fishers to fish for plastic*. When you think about it, it makes quite a lot of sense: The fishers were already catching lots of plastic out on their hauls, but because it has no value to them, they would always throw it back. All we needed was a small nudge to keep the plastic on the boat and bring it back to port, instead of tossing it back into the sea. 44 | 45 | ![boat](boat.jpg) 46 | 47 | So when we set up at a port, we provide real payments for items like bottles, plastic pipes, nets from the sea (“ghost nets” are a significant part of ocean plastic waste), and we set up a weigh station to pay Fishers for any caught plastics that they haul back. In all of the ports that we operate in combined, participating Fishers bring in about 20,000 kilos weekly (about 2 trucks filled with plastic *daily*). The way we have things set up so far, we've removed more than a million and a half tonnes of plastic from the oceans since 2018. The process works because the Fishers *know* deep down that hauling the plastic to port is better for everyone, and the payment at our port station gives them some validation and incentive to do the right thing. 48 | 49 | ![port_woman](port_woman.jpg) 50 | 51 | The next step in the pipeline is what to do with all those plastics. In participating ports, with plastics weighed and Fishers paid, the "waste" materials are brought to a container or warehouse where they can be sorted into recycling categories, crushed for transport, or sent to a proper landfill. The goal with this sorting is maximum efficiency for circular economy re-integration. 52 | 53 | The used fishing nets that I mentioned earlier are sent, depending on the type, to various companies, such as Gravity Wave, that turn them into furniture. Compatible PET plastics are sent to *pelletization* factories offsite, that grind up the plastic into a form that can be mixed with other materials to create sustainable products, such as jackets and shoes. Other mixed plastic is sent to specialist companies that can use it as inputs for many types of products from building materials to car parts. My favorite recent example of a circular economy product is [a Kayak model](https://www.nelo.eu/product/400/) made up of about 60% reclaimed Mediterranean plastic! 54 | 55 | While this playbook functions well in the ports of Greece that Enaleia is most active in, there’s still a lot of room to explore and grow. Ports of every country are unique, and what works at one port might need to be adapted to fit other contexts. For example in Egypt, where a large amount of plastic waste that aggregates in the Nile river, and where the industrial landscape is much different than in Europe, most of Enaleia’s collected plastics are compressed into building materials like paving tiles for more immediate local use, rather than upcycled consumer products. 56 | 57 | 58 | ## From Playbook to Open Platform 59 | We started our journey humbly, of course: beginning with paper records, then weight slips from the waste management companies, then a simple spreadsheet system to accompany a weigh station at every port we operated on. Every record was manually inputted and tracked by Enaleia HQ. When the word “blockchain” started to buzz around, we didn’t immediately see the benefit. But the more I looked into the kinds of guarantees blockchain systems offer, the more convinced I became that Enaleia’s core mission could flourish as a public platform. 60 | 61 | We had set up new incentives and mechanisms to improve coordination around cleanup. The recycled plastic supply chain needs tamper-resistant records that move between multiple stakeholders from sea to sorting to factory to recycled product. After the point of sale, consumers also want proof and validation that their products are contributing to regenerative activities. Researchers and governments need open-access public data about cleanup activities. All of these features and properties seemed within reach, but it wasn’t until I discovered Ethereum and the Next Billion Fellowship that it all came into focus. 62 | 63 | Over the course of my Fellowship, I and the Enaleia team worked with [Pollen Labs](https://pollenlabs.org/) to map out our activities from end-to-end, identifying all stakeholders, partners, and processes. We thought through the journey from ocean to product, from multiple perspectives. 64 | 65 | We built out a powerful new back-end system for our reclaimed plastic supply chain. At the port of collection, fishers get issued ID cards with their vessel name and other unique identifiers, and port coordinators can use a new mobile app to quickly tag plastic hauls with a unique code that will stay with the materials all the way to the point of sale of a recycled product. Using that same tracking code, consumers can use the [public dashboard](https://enaleia-hub.com/) to trace all the way back to the port and waters their bit of recycled ocean plastic came from. 66 | 67 | 68 | 69 | ## From Platform to Protocol 70 | While our current model has proven effective in the ports where we operate, the scale of the Mediterranean's plastic pollution demands a solution that can spread faster than any single organization can grow. Enaleia alone cannot be present in every fishing community across 46,000 kilometers of Mediterranean coastline. 71 | 72 | By leveraging the Ethereum Attestation Service, Enaleia's system is designed to allow it to evolve beyond a platform controlled by us into a protocol enacted by everyone—a set of open standards and tools that can be implemented at any port, anywhere, by independent actors, and still benefit from the same traceability guarantees. 73 | 74 | This transition represents a fundamental shift in how environmental initiatives can scale: rather than growing through traditional organizational expansion, we're creating the conditions for permissionless innovation where others can adopt, adapt, and improve upon our model of ocean cleanup to fit their context. The most powerful solution to the tragedy of the commons isn't a single hero, but rather a distributed network of local heroes all working in concert, their efforts verified and valued through a common way of doing things. 75 | 76 | ![Lefteris](lefteris_final.jpg) 77 | -------------------------------------------------------------------------------- /public/content/fellowship/Lefteris/lefteris-headshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/Lefteris/lefteris-headshot.jpg -------------------------------------------------------------------------------- /public/content/fellowship/Lefteris/lefteris_final.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/Lefteris/lefteris_final.jpg -------------------------------------------------------------------------------- /public/content/fellowship/Lefteris/port_woman.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/Lefteris/port_woman.jpg -------------------------------------------------------------------------------- /public/content/fellowship/Marcus/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | index: 7 3 | layout: fellow 4 | title: LatAm Empowerment 5 | fellowName: Marcus 6 | cohort: 2 7 | country: Guatemala 8 | lat: 14.6349 9 | lon: -90.5069 10 | image: /content/fellowship/Marcus/marcus-headshot.jpg 11 | description: Empowering disenfranchised communities in Latin America using Ethereum 12 | bio: | 13 | ## Marcus Alburez Myers 14 | 15 | **Marcus Alburez Myers** is a Guatemalan entrepreneur working to address today's pressing challenges. He is currently a Founder-in-Residence at Europe's leading accelerator, Entrepreneur First, where he is drawing on the power of web3 to empower marginalized communities. With a focus in Guatemala, Marcus explored the real-world barriers to physical asset financing for DeFi, and compiled his finding into the ["Last Mile DeFi Report"](https://marcus.mirror.xyz/nFmYxl7DkZF655eCFz7Z4QlrOZ5ycg7Ny5gDcMpQ-tQ). 16 | 17 | [**Ethereum Foundation Blog**](https://blog.ethereum.org/2023/02/06/empower-latam-ethereum-fellows) 18 | 19 | [**Interview at Devcon 2022**](https://youtu.be/0L0EBD0Ho6c?si=-4SwO25mbQCZPiqB) 20 | tags: 21 | - america-latin 22 | - defi 23 | - research 24 | - 2022-cohort-2 25 | --- 26 | -------------------------------------------------------------------------------- /public/content/fellowship/Marcus/marcus-headshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/Marcus/marcus-headshot.jpg -------------------------------------------------------------------------------- /public/content/fellowship/Masa/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | index: 11 3 | layout: fellow 4 | title: Retroactive solidarity payments in education and employment 5 | fellowName: Masa 6 | cohort: 3 7 | country: Japan 8 | lat: 35.6895 9 | lon: 139.6917 10 | image: /content/fellowship/Masa/masa-headshot.jpg 11 | description: Ongaeshi is exploring retroactive solidarity payments in education and employment. 12 | bio: | 13 | ## Masahiro Fukuhara 14 | 15 | Masahiro (Masa) Fukuhara wants to spread the spirit of ONGAESHI, (恩返し, "To return a favor") in the world of education. [ONGAESHI DAO](https://www.lp.ongaeshi-pj.jp/en) is exploring mechanisms of retroactive solidarity payments in education and employment. For his Fellowship, Masa and other ONGAESHI DAO team members will learn from pilot programs in which contributors to the public good of education like funders and teachers are rewarded when businesses hire their students. 16 | 17 | [**Interview at Devconnect 2023**](https://youtu.be/NiT5kUfnPc8?si=s_tK_gkzMjNJOkPh) 18 | tags: 19 | - asia 20 | - education 21 | - funding 22 | - 2023-cohort-3 23 | --- 24 | -------------------------------------------------------------------------------- /public/content/fellowship/Masa/masa-headshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/Masa/masa-headshot.jpg -------------------------------------------------------------------------------- /public/content/fellowship/Mercedes/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | index: 18 3 | layout: fellow 4 | title: Activism, Human Rights and Web3 in Venezuela 5 | fellowName: Mercedes 6 | cohort: 4 7 | country: Venezuela 8 | lat: 10.4806 9 | lon: -66.9036 10 | image: /content/fellowship/Mercedes/mercedes-headshot.jpg 11 | description: Mercedes' research focuses on understanding the impact of crypto in Venezuela through the lenses of human experiences and how this can help us creare Web3 solutions to strengthen civil organizations in Venezuela 12 | bio: | 13 | ## Mercedes Rodriguez Simon 14 | 15 | Mercedes' project explores the impact of crypto usage on overcoming hyperinflation and devaluation in Venezuela's national economy and the experiences of small communities and project grantees currently using crypto donation platforms to fund non-governmental initiatives. 16 | 17 | [**Interview on the ETHKipu blog**](https://www.ethkipu.org/en/blog/interview-with-mercedes-rodriguez) 18 | 19 | [**Interview, 2024**](https://youtu.be/No0I4eMJUa0?si=xV9_Lm_rMn6hw637) 20 | 21 | [**Interview, 2024 (ES)**](https://youtu.be/XVk7-k5wdNY?si=_fOCBaSR70GlNc2V) 22 | tags: 23 | - 2024-cohort-4 24 | - america-latin 25 | - research 26 | - human-rights 27 | - NGO 28 | --- 29 | -------------------------------------------------------------------------------- /public/content/fellowship/Mercedes/mercedes-headshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/Mercedes/mercedes-headshot.jpg -------------------------------------------------------------------------------- /public/content/fellowship/Mihajlo/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | index: 8 3 | layout: fellow 4 | title: Scouting for the Future 5 | fellowName: Mihajlo 6 | cohort: 2 7 | country: Serbia 8 | lat: 44.7866 9 | lon: 20.4489 10 | image: /content/fellowship/Mihajlo/mihajlo-headshot.jpg 11 | description: The scouting movement is decentralised by nature and community-driven by essence. They are working on a Scout's passport on chain, onboarding youth all over the world. 12 | bio: | 13 | ## **Mihajlo Atanackovic** 14 | 15 | **Mihajlo Atanackovic** is leading the digital transformation journey of one of the world's biggest non-formal educational youth movements - the [World Organization of the Scout Movement](https://www.scout.org/) with 57+ million members from around the globe. To get the Scout Movement ready for web3, he is embarking on an ambitious project involving digitalising badges, exploring DAOs for different levels of the Movement, and how the scouts might employ novel coordination mechanisms for grassroots organization. You can read more about Mihajlo's work [in this blogpost.](https://blog.ethereum.org/2023/05/01/scouting-future-movement) 16 | 17 | [**Ethereum Foundation Blog**](https://blog.ethereum.org/2023/05/01/scouting-future-movement) 18 | 19 | [**Interview at Devcon6 2022**](https://youtu.be/Gu_Ex8ynyGE?si=bgFiVTRzOKBpXoXn) 20 | tags: 21 | - identity 22 | - europe-east 23 | - DID-VC 24 | - 2022-cohort-2 25 | - global 26 | --- 27 | -------------------------------------------------------------------------------- /public/content/fellowship/Mihajlo/mihajlo-headshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/Mihajlo/mihajlo-headshot.jpg -------------------------------------------------------------------------------- /public/content/fellowship/Mulenga/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | index: 12 3 | layout: fellow 4 | title: Digital repatriation of art and revenue sharing 5 | fellowName: Mulenga 6 | cohort: 3 7 | country: Zambia 8 | lat: -15.3875 9 | lon: 28.3228 10 | image: /content/fellowship/Mulenga/mulenga-headshot.jpg 11 | description: Mulenga is developing a tokenized artifact registry and experimenting with museum revenue sharing for community documentation of art, customs, and crafting practices. 12 | bio: | 13 | ## Mulenga Kapwepwe 14 | 15 | Mulenga Kapwepwe is co-founder of the Women's History Museum of Zambia. There are many African artifacts in museums around the world, but rarely do those items have a tangible connection to the people and communities who created them. For her Fellowship, Mulenga is working with the Zambian web3 community to create a tokenized artifact registry, experimenting with museum revenue sharing for community documentation of art, customs, and crafting methodologies still practiced by the descendants of those items on display in museums around the world. Even if the items won't return to their places of origin in the near future, it's a small step toward bridging a gap of ownership that spans centuries. 16 | 17 | [**Interview at Devconnect 2023**](https://youtu.be/rJjcK61UaEE?si=I0Li5E_ey8umGRcw) 18 | tags: 19 | - 2023-cohort-3 20 | - art-and-culture 21 | - africa-southern 22 | - africa 23 | --- 24 | 25 | ## SummitShare 26 | 27 | In December, Mulenga and her team launched [SummitShare](https://summitshare.co/), a platform that enables digital exhibitions of art and artifacts. Through a collaboration with the [Sweedish Ethnographic Museum](https://www.etnografiskamuseet.se/en/), SummitShare will host a first exhibition titled "The Leading Ladies", which distributes proceeds to communities in the Gwembe Valley in Zambia with connection to the artifacts on display. 28 | -------------------------------------------------------------------------------- /public/content/fellowship/Mulenga/mulenga-headshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/Mulenga/mulenga-headshot.jpg -------------------------------------------------------------------------------- /public/content/fellowship/Naroa/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | index: 3 3 | layout: fellow 4 | title: Internet for every school 5 | fellowName: Naroa 6 | cohort: 1 7 | country: Spain 8 | lat: -1.9499 9 | lon: 30.0588 10 | image: /content/fellowship/Naroa/naroa-headshot.jpg 11 | description: Naroa explores Ethereum-based solutions as part of Giga's effort to connect every school to the internet. 12 | bio: | 13 | ## **Naroa Zurutuza** 14 | 15 | **Naroa Zurutuza** [(Giga)](https://gigaconnect.org/) explored Ethereum-based solutions as part of Giga's effort to connect every school to the internet. By helping to provide today's most important public good to billions of currently unconnected people, Naroa envisioned many roles that blockchain can play, from increasing accountability of service providers and financing connectivity infrastructures to an access point to the global economy and marketplaces. 16 | tags: 17 | - 2021-cohort-1 18 | - global 19 | - america-latin 20 | - africa 21 | - africa-east 22 | --- 23 | -------------------------------------------------------------------------------- /public/content/fellowship/Naroa/naroa-headshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/Naroa/naroa-headshot.jpg -------------------------------------------------------------------------------- /public/content/fellowship/Rebecca/miyani_pesa.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/Rebecca/miyani_pesa.jpg -------------------------------------------------------------------------------- /public/content/fellowship/Rebecca/oceanview_workshop.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/Rebecca/oceanview_workshop.jpg -------------------------------------------------------------------------------- /public/content/fellowship/Rebecca/rebecca-headshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/Rebecca/rebecca-headshot.jpg -------------------------------------------------------------------------------- /public/content/fellowship/Rebecca/watercolor_sketch.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/Rebecca/watercolor_sketch.jpg -------------------------------------------------------------------------------- /public/content/fellowship/Robert/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | index: 21 3 | layout: fellow 4 | title: ZK-Proofs for Emergency Response Systems 5 | fellowName: Robert 6 | cohort: 5 7 | country: United Kingdom 8 | lat: 55.8642 9 | lon: -4.2518 10 | image: /content/fellowship/Robert/robert-headshot.jpg 11 | description: Robert Cowlishaw is an aerospace engineer researching zero-knowledge proofs, trusted execution, and satellite imagery for automatic and verifiable emergency response systems. 12 | bio: | 13 | ## Robert Cowlishaw 14 | 15 | **Robert Cowlishaw** (LinkedIn: robert-cowlishaw) is an aerospace engineer pioneering research at the intersection of zero-knowledge proofs, trusted execution, and satellite imagery. He is developing a prototype app that automatically and verifiably triggers emergency response systems after natural disasters. His work includes collaboration with the European Space Agency to activate satellites for monitoring affected areas across political and systemic boundaries. 16 | 17 | Based in Glasgow, UK, Robert is combining advanced cryptographic techniques with satellite technologies to create systems that can respond to emergencies with speed and reliability. His research aims to overcome jurisdictional barriers that often slow down disaster response by creating verifiable and trustworthy systems that can operate across different political landscapes. 18 | tags: 19 | - satellite 20 | - ai 21 | - emergency-response 22 | - zero-knowledge 23 | - trusted execution 24 | - 2025-cohort-5 25 | --- 26 | -------------------------------------------------------------------------------- /public/content/fellowship/Robert/robert-headshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/Robert/robert-headshot.jpg -------------------------------------------------------------------------------- /public/content/fellowship/Sharfy/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | index: 22 3 | layout: fellow 4 | title: Climate Finance for Local Conservation 5 | fellowName: Sharfy 6 | cohort: 5 7 | country: France 8 | lat: 48.8566 9 | lon: 2.3522 10 | image: /content/fellowship/Sharfy/sharfy-headshot.jpg 11 | description: Sharfy Adamantine enables environmental stewardship by connecting climate finance directly to local conservation efforts and data at Gainforest, improving compatibility and functionality of the Hypercerts standard. 12 | bio: | 13 | ## Sharfy Adamantine 14 | 15 | **Sharfy Adamantine** (X: @sharfyae) enables environmental stewardship by connecting climate finance directly to local conservation efforts and data at [Gainforest](https://gainforest.earth/). By improving compatibility and functionality of the Hypercerts standard, ecosystem protection can become more economically viable for organizations and conservation communities of all shapes, sizes, and contexts. 16 | 17 | Sharfy's work focuses on creating direct financial pathways between funding sources and on-the-ground conservation efforts. Through advancements in the Hypercerts standard, the project aims to make environmental protection more accessible and economically sustainable for diverse conservation communities worldwide. 18 | tags: 19 | - climate 20 | - conservation 21 | - finance 22 | - hypercerts 23 | - 2025-cohort-5 24 | --- 25 | -------------------------------------------------------------------------------- /public/content/fellowship/Sharfy/sharfy-headshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/Sharfy/sharfy-headshot.jpg -------------------------------------------------------------------------------- /public/content/fellowship/Teodor/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | index: 23 3 | layout: fellow 4 | title: Blockchain Impact Framework for UN Development 5 | fellowName: Teodor 6 | cohort: 5 7 | country: Croatia 8 | lat: 45.8150 9 | lon: 15.9819 10 | image: /content/fellowship/Teodor/teodor-headshot.jpg 11 | description: Teodor Petricevic leads blockchain initiatives at the UN Development Programme, mapping Ethereum-based projects within the UN ecosystem and developing an impact management framework. 12 | bio: | 13 | ## Teodor Petricevic 14 | 15 | **Teodor Petricevic** (X: @XtXeXo) leads blockchain initiatives at the UN Development Programme. He will map Ethereum-based projects within the UN ecosystem and develop an impact management framework that enables global development organisations - such as UN agencies - to effectively design impact models, measure and analyse outcomes and impacts, and harness the unique properties of blockchain technology to advance global development initiatives. 16 | tags: 17 | - impact 18 | - international development 19 | - UN 20 | - governance 21 | - 2025-cohort-5 22 | --- 23 | -------------------------------------------------------------------------------- /public/content/fellowship/Teodor/teodor-headshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/Teodor/teodor-headshot.jpg -------------------------------------------------------------------------------- /public/content/fellowship/Tomislav/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | index: 20 3 | layout: fellow 4 | title: Municipal Quadratic Funding 5 | fellowName: Tomislav 6 | cohort: 4 7 | country: Croatia 8 | lat: 43.5081 9 | lon: 16.4402 10 | image: /content/fellowship/Tomislav/tomislav-headshot.jpg 11 | description: MUQA - Municipal Quadratic Funding Initiative 12 | bio: | 13 | ## Tomislav Mamić 14 | 15 | Tomislav or "Tomo," from Croatia, is working on the Municipal Quadratic Funding Initiative ([Muqa](https://muqa.org/)). In its broader purpose of onboarding institutions to Ethereum, Muqa team has built and maintains [Zazelenimo](https://zazelenimo.com) - a participatory budgeting application with Quadratic Funding and Ethereum accounts included. This will allow cities to both engage their citizens and fundraise from them for public goods. Visit Muqa site or join their [community](https://t.me/muqaorg) to learn more and engage. 16 | 17 | [**Interview, 2024**](https://youtu.be/wf5ua1yO-c4?si=MpvjSu836A6W6A6L) 18 | 19 | [**Interview, 2024 (CR)**](https://youtu.be/c93SvMTY1hc?si=5NhWU4--66LIeGSn) 20 | tags: 21 | - europe 22 | - 2024-cohort-4 23 | - funding 24 | --- 25 | -------------------------------------------------------------------------------- /public/content/fellowship/Tomislav/tomislav-headshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/Tomislav/tomislav-headshot.jpg -------------------------------------------------------------------------------- /public/content/fellowship/Valeriia/valeriia-headshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/content/fellowship/Valeriia/valeriia-headshot.jpg -------------------------------------------------------------------------------- /public/images/about/about-hero.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/images/about/about-hero.jpg -------------------------------------------------------------------------------- /public/images/about/exploration.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/images/about/exploration.jpg -------------------------------------------------------------------------------- /public/images/about/representation.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/images/about/representation.jpg -------------------------------------------------------------------------------- /public/images/about/stories.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/images/about/stories.jpg -------------------------------------------------------------------------------- /public/images/devconSEA_scholars.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/images/devconSEA_scholars.jpg -------------------------------------------------------------------------------- /public/images/devcon_2022.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/images/devcon_2022.png -------------------------------------------------------------------------------- /public/images/devconnect-arg-hero.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/images/devconnect-arg-hero.jpg -------------------------------------------------------------------------------- /public/images/devconnect-arg-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/images/devconnect-arg-logo.png -------------------------------------------------------------------------------- /public/images/devconnect_2022.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/images/devconnect_2022.png -------------------------------------------------------------------------------- /public/images/devconnect_2023.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/images/devconnect_2023.png -------------------------------------------------------------------------------- /public/images/fellow-stars.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/images/fellow-stars.png -------------------------------------------------------------------------------- /public/images/fellowship/fellowship-hero.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/images/fellowship/fellowship-hero.jpg -------------------------------------------------------------------------------- /public/images/homepage/background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/images/homepage/background.jpg -------------------------------------------------------------------------------- /public/images/homepage/devcon_home.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/images/homepage/devcon_home.jpg -------------------------------------------------------------------------------- /public/images/homepage/fellow_home.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/images/homepage/fellow_home.jpg -------------------------------------------------------------------------------- /public/images/homepage/foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/images/homepage/foreground.png -------------------------------------------------------------------------------- /public/images/homepage/home-stars.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/images/homepage/home-stars.jpg -------------------------------------------------------------------------------- /public/images/homepage/middleground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/images/homepage/middleground.png -------------------------------------------------------------------------------- /public/images/map.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/images/map.jpg -------------------------------------------------------------------------------- /public/images/scholars/artifact.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/images/scholars/artifact.jpg -------------------------------------------------------------------------------- /public/images/scholars/eth-glyph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/images/scholars/eth-glyph.png -------------------------------------------------------------------------------- /public/images/scholars/scholars-hero-closed.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/images/scholars/scholars-hero-closed.jpg -------------------------------------------------------------------------------- /public/images/scholars/scholars-hero-open.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/images/scholars/scholars-hero-open.jpg -------------------------------------------------------------------------------- /public/images/stars.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/images/stars.jpg -------------------------------------------------------------------------------- /public/images/stars.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/images/stars.png -------------------------------------------------------------------------------- /public/images/temp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethereum/nxbn-website/e4c2b409c751b0ce38b9f191cde164f9b6a236b1/public/images/temp.png -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # * 2 | User-agent: * 3 | Allow: / 4 | 5 | # Host 6 | Host: https://fellowship.ethereum.org 7 | 8 | # Sitemaps 9 | Sitemap: https://fellowship.ethereum.org/sitemap.xml 10 | -------------------------------------------------------------------------------- /public/sitemap-0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | https://fellowship.ethereum.org2025-05-28T10:22:44.002Zdaily0.7 4 | https://fellowship.ethereum.org/about2025-05-28T10:22:44.002Zdaily0.7 5 | https://fellowship.ethereum.org/fellowship2025-05-28T10:22:44.002Zdaily0.7 6 | https://fellowship.ethereum.org/scholars2025-05-28T10:22:44.002Zdaily0.7 7 | https://fellowship.ethereum.org/cookie-policy2025-05-28T10:22:44.002Zdaily0.7 8 | https://fellowship.ethereum.org/fellowship/Abhishek2025-05-28T10:22:44.002Zdaily0.7 9 | https://fellowship.ethereum.org/fellowship/Benson2025-05-28T10:22:44.002Zdaily0.7 10 | https://fellowship.ethereum.org/fellowship/Brian2025-05-28T10:22:44.002Zdaily0.7 11 | https://fellowship.ethereum.org/fellowship/Chuy2025-05-28T10:22:44.002Zdaily0.7 12 | https://fellowship.ethereum.org/fellowship/David2025-05-28T10:22:44.002Zdaily0.7 13 | https://fellowship.ethereum.org/fellowship/Devansh2025-05-28T10:22:44.002Zdaily0.7 14 | https://fellowship.ethereum.org/fellowship/Eddie2025-05-28T10:22:44.002Zdaily0.7 15 | https://fellowship.ethereum.org/fellowship/Gabriela2025-05-28T10:22:44.002Zdaily0.7 16 | https://fellowship.ethereum.org/fellowship/Guo2025-05-28T10:22:44.002Zdaily0.7 17 | https://fellowship.ethereum.org/fellowship/Karam2025-05-28T10:22:44.002Zdaily0.7 18 | https://fellowship.ethereum.org/fellowship/Kuldeep2025-05-28T10:22:44.002Zdaily0.7 19 | https://fellowship.ethereum.org/fellowship/Lefteris2025-05-28T10:22:44.002Zdaily0.7 20 | https://fellowship.ethereum.org/fellowship/Marcus2025-05-28T10:22:44.002Zdaily0.7 21 | https://fellowship.ethereum.org/fellowship/Masa2025-05-28T10:22:44.002Zdaily0.7 22 | https://fellowship.ethereum.org/fellowship/Mercedes2025-05-28T10:22:44.002Zdaily0.7 23 | https://fellowship.ethereum.org/fellowship/Mihajlo2025-05-28T10:22:44.002Zdaily0.7 24 | https://fellowship.ethereum.org/fellowship/Mulenga2025-05-28T10:22:44.002Zdaily0.7 25 | https://fellowship.ethereum.org/fellowship/Naroa2025-05-28T10:22:44.002Zdaily0.7 26 | https://fellowship.ethereum.org/fellowship/Rebecca2025-05-28T10:22:44.002Zdaily0.7 27 | https://fellowship.ethereum.org/fellowship/Robert2025-05-28T10:22:44.002Zdaily0.7 28 | https://fellowship.ethereum.org/fellowship/Sharfy2025-05-28T10:22:44.002Zdaily0.7 29 | https://fellowship.ethereum.org/fellowship/Teodor2025-05-28T10:22:44.002Zdaily0.7 30 | https://fellowship.ethereum.org/fellowship/Tomislav2025-05-28T10:22:44.002Zdaily0.7 31 | https://fellowship.ethereum.org/fellowship/Valeriia2025-05-28T10:22:44.002Zdaily0.7 32 | -------------------------------------------------------------------------------- /public/sitemap.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | https://fellowship.ethereum.org/sitemap-0.xml 4 | -------------------------------------------------------------------------------- /src/@chakra-ui/components/Heading.ts: -------------------------------------------------------------------------------- 1 | export const Heading = { 2 | baseStyle: { 3 | mb: 8, 4 | color: "body", 5 | fontFamily: "heading", 6 | fontStyle: "normal", 7 | lineHeight: "normal", 8 | textAlign: "start", 9 | }, 10 | variants: { 11 | action: { 12 | color: "action", 13 | }, 14 | }, 15 | } 16 | -------------------------------------------------------------------------------- /src/@chakra-ui/components/Text.ts: -------------------------------------------------------------------------------- 1 | export const Text = { 2 | baseStyle: { 3 | fontFamily: "body", 4 | fontSize: 16, 5 | color: "body", 6 | mb: 6, 7 | }, 8 | variants: { 9 | small: { 10 | fontSize: 14, 11 | }, 12 | big: { 13 | fontSize: 18, 14 | }, 15 | action: { 16 | color: "action", 17 | }, 18 | }, 19 | } 20 | -------------------------------------------------------------------------------- /src/@chakra-ui/components/index.ts: -------------------------------------------------------------------------------- 1 | export * from "@/@chakra-ui/components/Heading" 2 | export * from "@/@chakra-ui/components/Text" 3 | -------------------------------------------------------------------------------- /src/@chakra-ui/foundations/colors.ts: -------------------------------------------------------------------------------- 1 | export const colors = { 2 | background: "#056589", 3 | backgroundHighlight: "#064A64", 4 | highlight: "#2C7DC5", 5 | body: "#F0F7FF", 6 | bodyHover: "#99BFCD", 7 | action: "#B3E678", 8 | actionHover: "#CFF8A0", 9 | actionHighlight: "#6F9D39", 10 | } 11 | -------------------------------------------------------------------------------- /src/@chakra-ui/foundations/fonts.ts: -------------------------------------------------------------------------------- 1 | export const fonts = { 2 | // set base fonts as fallback 3 | heading: "var(--font-roboto_slab), monospace", 4 | button: "var(--font-roboto), monospace", 5 | code: '"JetBrains Mono", monospace', 6 | body: "var(--font-roboto), monospace", 7 | link: "var(--font-roboto_slab), monospace", 8 | } 9 | -------------------------------------------------------------------------------- /src/@chakra-ui/foundations/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./colors" 2 | export * from "./fonts" 3 | export * from "./textStyles" 4 | -------------------------------------------------------------------------------- /src/@chakra-ui/foundations/textStyles.ts: -------------------------------------------------------------------------------- 1 | export const textStyles = { 2 | h1: { 3 | fontSize: 56, 4 | fontWeight: 400, 5 | letterSpacing: "2.9px", 6 | }, 7 | h2: { 8 | fontSize: 48, 9 | fontWeight: 400, 10 | letterSpacing: "2.2px", 11 | }, 12 | h3: { 13 | fontSize: 32, 14 | fontWeight: 500, 15 | letterSpacing: "0.9px", 16 | }, 17 | h4: { 18 | fontSize: 24, 19 | fontWeight: 500, 20 | letterSpacing: "0.72px", 21 | }, 22 | h5: { 23 | fontSize: 16, 24 | fontWeight: 500, 25 | letterSpacing: "0.48px", 26 | }, 27 | h6: { 28 | fontSize: 14, 29 | fontWeight: 500, 30 | letterSpacing: "0.42px", 31 | }, 32 | "fellow-title": { 33 | fontFamily: "heading", 34 | fontSize: 58, 35 | fontWeight: 400, 36 | fontStyle: "normal", 37 | lineHeight: "normal", 38 | letterSpacing: "2.9px", 39 | m: 0, 40 | }, 41 | tag: { 42 | fontFamily: "heading", 43 | fontSize: 14, 44 | fontStyle: "normal", 45 | fontWeight: 700, 46 | lineHeight: "150%", 47 | letterSpacing: "-0.154px", 48 | textTransform: "uppercase", 49 | }, 50 | "base-text": { 51 | fontFamily: "body", 52 | fontWeight: 300, 53 | fontStyle: "normal", 54 | fontSize: 16, 55 | lineHeight: "150%", 56 | color: "body", 57 | }, 58 | "footer-text": { 59 | fontFamily: "body", 60 | fontWeight: 300, 61 | fontSyle: "normal", 62 | fontSize: 12, 63 | lineHeight: "150%", 64 | color: "bodyHover", 65 | }, 66 | "link-text": { 67 | fontFamily: "link", 68 | fontSize: 16, 69 | fontStyle: "normal", 70 | fontWeight: 400, 71 | lineHeight: "150%", 72 | color: "body", 73 | borderBottom: "1px solid transparent", 74 | _hover: { 75 | borderBottom: "1px solid #B3E678", 76 | color: "action", 77 | }, 78 | }, 79 | "link-text-action": { 80 | fontFamily: "link", 81 | fontSize: 16, 82 | fontStyle: "normal", 83 | fontWeight: 400, 84 | lineHeight: "150%", 85 | color: "action", 86 | borderBottom: "1px solid transparent", 87 | _hover: { 88 | borderBottom: "1px solid #CFF8A0", 89 | color: "actionHover", 90 | }, 91 | }, 92 | "drawer-link": { 93 | color: "body", 94 | fontFamily: "link", 95 | fontSize: 30, 96 | fontStyle: "normal", 97 | fontWeight: 500, 98 | lineHeight: "150%", 99 | letterSpacing: "0.6px", 100 | }, 101 | "drawer-link-active": { 102 | color: "#E5FFC7", 103 | borderBottom: "1px solid #E5FFC7", 104 | fontFamily: "link", 105 | fontSize: 30, 106 | fontStyle: "normal", 107 | fontWeight: 500, 108 | lineHeight: "150%", 109 | letterSpacing: "0.6px", 110 | }, 111 | "header-link": { 112 | fontFamily: "link", 113 | fontSize: 16, 114 | fontStyle: "normal", 115 | fontWeight: 400, 116 | lineHeight: "150%", 117 | color: "body", 118 | borderBottom: "1px solid transparent", 119 | _hover: { 120 | borderBottom: "1px solid #B3E678", 121 | color: "action", 122 | }, 123 | }, 124 | "header-link-active": { 125 | fontFamily: "link", 126 | fontSize: 16, 127 | fontStyle: "normal", 128 | fontWeight: 400, 129 | lineHeight: "150%", 130 | color: "#E5FFC7", 131 | borderBottom: "1px solid #E5FFC7", 132 | _hover: { 133 | borderBottom: "1px solid #B3E678", 134 | color: "action", 135 | }, 136 | }, 137 | "button-link": { 138 | fontFamily: "heading", 139 | fontSize: 18, 140 | fontStyle: "normal", 141 | fontWeight: 500, 142 | lineHeight: "150%", 143 | letterSpacing: "0.26px", 144 | color: "#034057", 145 | }, 146 | } 147 | -------------------------------------------------------------------------------- /src/@chakra-ui/theme.ts: -------------------------------------------------------------------------------- 1 | import { extendBaseTheme } from "@chakra-ui/react" 2 | import type { ThemeConfig } from "@chakra-ui/react" 3 | 4 | import { Heading, Text } from "@/@chakra-ui/components" 5 | import { colors, fonts, textStyles } from "@/@chakra-ui/foundations" 6 | 7 | const config: ThemeConfig = { 8 | initialColorMode: "system", 9 | useSystemColorMode: true, 10 | } 11 | 12 | /** 13 | * Override default styles with our custom theme. 14 | * 15 | * The complete list of default Chakra styles can be found here: 16 | * https://github.com/chakra-ui/chakra-ui/tree/main/packages/theme/src 17 | */ 18 | const theme = { 19 | colors, 20 | components: { 21 | Heading, 22 | Text, 23 | }, 24 | config, 25 | fonts, 26 | styles: { 27 | global: () => ({ 28 | body: { 29 | background: "background", 30 | transition: "all 200ms linear !important", 31 | }, 32 | }), 33 | }, 34 | textStyles, 35 | } 36 | 37 | export default extendBaseTheme(theme) 38 | -------------------------------------------------------------------------------- /src/components/BlogFeed.tsx: -------------------------------------------------------------------------------- 1 | import { Box, Grid, Text } from "@chakra-ui/react" 2 | import { useRouter } from "next/router" 3 | 4 | import { H3 } from "@/components/Headings" 5 | import Link from "./Link" 6 | 7 | const BlogFeed = ({ blogs }) => { 8 | const router = useRouter() 9 | 10 | return ( 11 | 15 | {blogs.map((blog) => { 16 | const date = new Date(blog.isoDate) 17 | 18 | const formattedDate = date.toLocaleDateString("en-US", { 19 | month: "long", // full name of the month 20 | day: "numeric", // numeric day 21 | year: "numeric", // numeric year 22 | }) 23 | return ( 24 | router.replace(blog.link)} 27 | cursor="pointer" 28 | borderRadius={4} 29 | border="1px solid transparent" 30 | p={4} 31 | _hover={{ 32 | bg: "#00000010", 33 | }} 34 | > 35 |

{blog.title}

36 | 45 | {formattedDate} 46 | 47 | 48 | {blog.contentSnippet} 49 | 50 | 51 | Read more 52 | 53 |
54 | ) 55 | })} 56 |
57 | ) 58 | } 59 | export default BlogFeed 60 | -------------------------------------------------------------------------------- /src/components/Breadcrumbs.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | Breadcrumb, 3 | BreadcrumbItem, 4 | BreadcrumbLink, 5 | Stack, 6 | } from "@chakra-ui/react" 7 | import { useRouter } from "next/router" 8 | 9 | import Link from "@/components/Link" 10 | 11 | export const Breadcrumbs = () => { 12 | const router = useRouter() 13 | const path = router.asPath 14 | .split("#")[0] 15 | .split("/") 16 | .filter((x) => x) 17 | 18 | return ( 19 | 20 | 21 | {path.map((segment, index) => { 22 | const url = `/${path.slice(0, index + 1).join("/")}` 23 | 24 | return ( 25 | 26 | 31 | {segment} 32 | 33 | 34 | ) 35 | })} 36 | 37 | 38 | ) 39 | } 40 | -------------------------------------------------------------------------------- /src/components/Buttons/ButtonLink.tsx: -------------------------------------------------------------------------------- 1 | import Link from "@/components/Link" 2 | 3 | const ButtonLink = ({ 4 | isSecondary = false, 5 | href, 6 | children, 7 | variant = "primary", 8 | ...props 9 | }) => { 10 | const variants = { 11 | primary: { 12 | bg: "action", 13 | }, 14 | disabled: { 15 | bg: "action", 16 | opacity: 0.4, 17 | }, 18 | secondary: { 19 | bg: "white", 20 | }, 21 | } 22 | 23 | return ( 24 | 40 | {children} 41 | 42 | ) 43 | } 44 | 45 | export default ButtonLink 46 | -------------------------------------------------------------------------------- /src/components/Buttons/FilterButton.tsx: -------------------------------------------------------------------------------- 1 | import { Box, Text } from "@chakra-ui/react" 2 | 3 | const FilterButton = ({ children, ...props }) => { 4 | return ( 5 | 15 | 25 | {children} 26 | 27 | 28 | ) 29 | } 30 | 31 | export default FilterButton 32 | -------------------------------------------------------------------------------- /src/components/ContentContainer.tsx: -------------------------------------------------------------------------------- 1 | import React from "react" 2 | import { Container } from "@chakra-ui/react" 3 | 4 | const ContentContainer = (props) => { 5 | return 6 | } 7 | 8 | export default ContentContainer 9 | -------------------------------------------------------------------------------- /src/components/FAQ.tsx: -------------------------------------------------------------------------------- 1 | import { Box, Flex, Text } from "@chakra-ui/react" 2 | 3 | import { H2, H4 } from "@/components/Headings" 4 | 5 | export type Question = { 6 | question: string 7 | answer: string[] 8 | } 9 | 10 | interface FAQInterface { 11 | questions: Question[] 12 | } 13 | 14 | const FAQ = ({ questions }: FAQInterface) => { 15 | return ( 16 | 17 |

Frequent asked questions

18 | {questions.map((question, index) => ( 19 | 25 | 26 |

27 | {question.question} 28 |

29 |
30 | 31 | {question.answer.map((answer, index) => ( 32 | 33 | {answer} 34 | 35 | ))} 36 | 37 |
38 | ))} 39 |
40 | ) 41 | } 42 | 43 | export default FAQ 44 | -------------------------------------------------------------------------------- /src/components/FellowCard.tsx: -------------------------------------------------------------------------------- 1 | import { Box, Image, Flex, Text, Divider } from "@chakra-ui/react" 2 | import { useRouter } from "next/router" 3 | 4 | import ButtonLink from "@/components/Buttons/ButtonLink" 5 | import { H3, H5 } from "@/components/Headings" 6 | 7 | import { 8 | IMAGE_ZOOM_HOVER_STYLE_CONSTANT, 9 | IMAGE_ZOOM_TRANSITION_STYLE_CONSTANT, 10 | } from "@/utils/constants" 11 | 12 | const FellowCard = ({ 13 | title, 14 | description, 15 | image, 16 | fellowName, 17 | country, 18 | tags, 19 | slug, 20 | }) => { 21 | const router = useRouter() 22 | 23 | return ( 24 | router.push(`/fellowship/${slug}`)} 41 | > 42 | 43 | 50 | 58 | 59 | 60 | 61 | 62 |

68 | {fellowName} 69 |

70 | 79 | {country} 80 | 81 | 87 |
88 | 89 |
90 | {title} 91 |
92 | 93 | {tags.map((tag, index) => { 94 | return ( 95 | 111 | {tag} 112 | 113 | ) 114 | })} 115 | 116 | 117 | {description} 118 | 119 |
120 | 121 | 122 | Learn more 123 | 124 | 125 |
126 |
127 | ) 128 | } 129 | 130 | export default FellowCard 131 | -------------------------------------------------------------------------------- /src/components/FellowList.tsx: -------------------------------------------------------------------------------- 1 | import { useState } from "react" 2 | import { Box, Center, Divider, Flex, Grid, Text } from "@chakra-ui/react" 3 | 4 | import ContentContainer from "@/components/ContentContainer" 5 | import FellowCard from "@/components/FellowCard" 6 | import FilterButton from "@/components/Buttons/FilterButton" 7 | import { H2, H3, H6 } from "@/components/Headings" 8 | 9 | import { FELLOW_LIST_PAGINATION_LIMIT } from "@/utils/constants" 10 | 11 | const FellowList = ({ fellowsData }) => { 12 | const [paginationIndex, setPaginationIndex] = useState(1) 13 | 14 | const indexOfLastItem = paginationIndex * FELLOW_LIST_PAGINATION_LIMIT 15 | const indexOfFirstItem = indexOfLastItem - FELLOW_LIST_PAGINATION_LIMIT 16 | const currentItems = fellowsData.slice(indexOfFirstItem, indexOfLastItem) 17 | 18 | const pageNumbers: number[] = [] 19 | for ( 20 | let i = 1; 21 | i <= Math.ceil(fellowsData.length / FELLOW_LIST_PAGINATION_LIMIT); 22 | i++ 23 | ) { 24 | pageNumbers.push(i) 25 | } 26 | 27 | const paginate = (pageNumber: number) => { 28 | const element = document.getElementById("fellow-list") 29 | element?.scrollIntoView({ 30 | behavior: "smooth", 31 | block: "start", 32 | }) 33 | setPaginationIndex(pageNumber) 34 | } 35 | 36 | return ( 37 | 38 | 39 | 40 |

41 | Fellows, past and present 42 |

43 | {/* TODO: Implement filter for fellows */} 44 | {/*
50 |
Filter list
51 | 52 | Year 53 | Region 54 | Area 55 | 56 |
*/} 57 | 58 | 62 | {currentItems.map((fellow, index) => ( 63 | 64 | 73 | 74 | ))} 75 | 76 |
77 |
84 | {pageNumbers.map((number) => ( 85 | paginate(number)} 95 | _hover={{ 96 | cursor: "pointer", 97 | borderColor: "action", 98 | color: "action", 99 | }} 100 | > 101 | {number} 102 | 103 | ))} 104 |
105 |
106 | ) 107 | } 108 | 109 | export default FellowList 110 | -------------------------------------------------------------------------------- /src/components/FellowStories.tsx: -------------------------------------------------------------------------------- 1 | import { Box, Grid, Text, Flex } from "@chakra-ui/react" 2 | import { useRouter } from "next/router" 3 | import { H3 } from "@/components/Headings" 4 | import Link from "./Link" 5 | 6 | const FellowStories = ({ fellows }) => { 7 | const router = useRouter() 8 | 9 | return ( 10 | 14 | {fellows.map((fellow) => { 15 | return ( 16 | router.push(`/fellowship/${fellow.slug}`)} 19 | cursor="pointer" 20 | borderRadius={12} 21 | border="1px solid" 22 | borderColor="gray.200" 23 | p={6} 24 | bg="#00000020" 25 | color="body" 26 | transition="all 0.2s ease-in-out" 27 | _hover={{ 28 | bg: "#00000030", 29 | borderColor: "gray.500", 30 | transform: "translateY(-2px)", 31 | boxShadow: "0 4px 12px rgba(0, 0, 0, 0.2)", 32 | }} 33 | > 34 |

{fellow.title}

35 | 44 | By {fellow.fellowName} · {fellow.country} 45 | 46 | {fellow.publishedDate && ( 47 | 54 | Published: {fellow.publishedDate} 55 | 56 | )} 57 | 58 | {fellow.storyHook} 59 | 60 | {fellow.tags && fellow.tags.length > 0 && ( 61 | 62 | {fellow.tags.map((tag, index) => ( 63 | 79 | {tag} 80 | 81 | ))} 82 | 83 | )} 84 | 89 | Read more 90 | 91 |
92 | ) 93 | })} 94 |
95 | ) 96 | } 97 | 98 | export default FellowStories 99 | -------------------------------------------------------------------------------- /src/components/Headings.tsx: -------------------------------------------------------------------------------- 1 | import { Heading } from "@chakra-ui/react" 2 | 3 | export const H1 = ({ children, ...props }) => { 4 | return ( 5 | 12 | {children} 13 | 14 | ) 15 | } 16 | 17 | export const H2 = ({ children, ...props }) => { 18 | return ( 19 | 20 | {children} 21 | 22 | ) 23 | } 24 | 25 | export const H3 = ({ children, ...props }) => { 26 | return ( 27 | 28 | {children} 29 | 30 | ) 31 | } 32 | 33 | export const H4 = ({ children, ...props }) => { 34 | return ( 35 | 36 | {children} 37 | 38 | ) 39 | } 40 | 41 | export const H5 = ({ children, ...props }) => { 42 | return ( 43 | 44 | {children} 45 | 46 | ) 47 | } 48 | 49 | export const H6 = ({ children, ...props }) => { 50 | return ( 51 | 52 | {children} 53 | 54 | ) 55 | } 56 | -------------------------------------------------------------------------------- /src/components/Heroes/FellowLayoutHero.tsx: -------------------------------------------------------------------------------- 1 | import { Box, Center, Image, Flex, Text } from "@chakra-ui/react" 2 | 3 | import { Breadcrumbs } from "@/components/Breadcrumbs" 4 | import { H1 } from "@/components/Headings" 5 | 6 | const FellowLayoutHero = ({ title, fellowName, country, tags, image }) => { 7 | return ( 8 | 9 | 10 | 11 |

{title}

12 |
13 | 14 | {tags.map((tag, index) => { 15 | return ( 16 | 32 | {tag} 33 | 34 | ) 35 | })} 36 | 37 | 38 | 46 |
47 | 48 | 56 | {fellowName} 57 | 58 | 59 | {country} 60 | 61 | 62 |
63 |
64 |
65 | ) 66 | } 67 | 68 | export default FellowLayoutHero 69 | -------------------------------------------------------------------------------- /src/components/Heroes/HomeHero.tsx: -------------------------------------------------------------------------------- 1 | // pages/index.js or another component file 2 | import dynamic from "next/dynamic" 3 | import { useState } from "react" 4 | import { useRouter } from "next/router" 5 | 6 | import { 7 | Box, 8 | Center, 9 | Divider, 10 | Flex, 11 | Heading, 12 | Image, 13 | Text, 14 | useBreakpointValue, 15 | } from "@chakra-ui/react" 16 | 17 | import { ArrowIcon } from "@/components/icons" 18 | import { H4 } from "@/components/Headings" 19 | 20 | import { 21 | IMAGE_ZOOM_TRANSITION_STYLE_CONSTANT, 22 | IMAGE_ZOOM_HOVER_STYLE_CONSTANT, 23 | } from "@/utils/constants" 24 | 25 | import { H1 } from "@/components/Headings" 26 | import ContentContainer from "../ContentContainer" 27 | 28 | const GlobeComponentWithNoSSR = dynamic( 29 | () => import("../../components/Map/Globe"), 30 | { 31 | ssr: false, // This line is key to making sure the import is client-side only 32 | loading: () => , 33 | } 34 | ) 35 | 36 | const HomeHero = ({ allFellowsFrontmatter, initialFellowIndex = 0 }) => { 37 | const router = useRouter() 38 | const [activeFellowIndex, setActiveFellowIndex] = useState(initialFellowIndex) 39 | const value = useBreakpointValue({ base: 300, md: 380 }) 40 | 41 | return ( 42 | 43 | 50 |
51 | 60 | Ethereum’s 61 | 68 | next billion 69 | 70 | are here, now 71 | 72 |
73 |
74 |
75 | 79 |
80 |
81 | 88 |
89 |
90 | { 99 | setActiveFellowIndex( 100 | (activeFellowIndex - 1 + allFellowsFrontmatter.length) % 101 | allFellowsFrontmatter.length 102 | ) 103 | }} 104 | /> 105 | 139 | router.push( 140 | `/fellowship/${allFellowsFrontmatter[activeFellowIndex].slug}` 141 | ) 142 | } 143 | > 144 | 145 | 152 | 158 | 159 | 160 |
166 | {`Fellowship Cohort ${allFellowsFrontmatter[activeFellowIndex].cohort}`} 178 | 187 |

197 | {allFellowsFrontmatter[activeFellowIndex].fellowName} 198 |

199 | 200 | {allFellowsFrontmatter[activeFellowIndex].country} 201 | 202 |
203 | 204 | {allFellowsFrontmatter[activeFellowIndex].tags.map( 205 | (tag, index) => { 206 | return ( 207 | 223 | {tag} 224 | 225 | ) 226 | } 227 | )} 228 | 229 |
230 |
231 | { 239 | setActiveFellowIndex( 240 | (activeFellowIndex + 1 + allFellowsFrontmatter.length) % 241 | allFellowsFrontmatter.length 242 | ) 243 | }} 244 | /> 245 |
246 |
247 |
248 |
249 | ) 250 | } 251 | 252 | export default HomeHero 253 | -------------------------------------------------------------------------------- /src/components/Heroes/ImageHero.tsx: -------------------------------------------------------------------------------- 1 | import { Box } from "@chakra-ui/react" 2 | 3 | import Image, { StaticImageData } from "next/image" 4 | 5 | const ImageHero = ({ 6 | children, 7 | heroImage, 8 | }: { 9 | children: any 10 | heroImage: StaticImageData 11 | }) => { 12 | return ( 13 | <> 14 | 15 | 21 | 22 | {children} 23 | 24 | ) 25 | } 26 | 27 | export default ImageHero 28 | -------------------------------------------------------------------------------- /src/components/ImageSplitContent.tsx: -------------------------------------------------------------------------------- 1 | import { Box, Center, Flex, Image } from "@chakra-ui/react" 2 | import { 3 | IMAGE_ZOOM_TRANSITION_STYLE_CONSTANT, 4 | IMAGE_ZOOM_HOVER_STYLE_CONSTANT, 5 | } from "@/utils/constants" 6 | 7 | type ImageSplitContentProps = { 8 | image: string 9 | imageBorder: "round" | "left" | "right" | "none" 10 | imageSide: "left" | "right" 11 | children: React.ReactNode 12 | } 13 | 14 | const ImageSplitContent = ({ 15 | image, 16 | imageBorder, 17 | imageSide, 18 | children, 19 | }: ImageSplitContentProps) => { 20 | const imageBorderRadiusOptions = { 21 | round: 1800, 22 | left: "120px 400px", 23 | right: "400px 120px", 24 | none: "none", 25 | } 26 | 27 | const wrapperStyle = { 28 | left: { 29 | position: "relative", 30 | display: "inline-block", 31 | borderRadius: imageBorderRadiusOptions[imageBorder], 32 | "::before": { 33 | content: '""', 34 | position: "absolute", 35 | top: 0, 36 | right: 0, 37 | bottom: 0, 38 | left: 0, 39 | borderRadius: imageBorderRadiusOptions[imageBorder], 40 | border: "7px solid #034057", // Adjust based on your color needs 41 | mixBlendMode: "multiply", 42 | boxSizing: "border-box", 43 | opacity: 0.1, 44 | }, 45 | _hover: { 46 | ...IMAGE_ZOOM_HOVER_STYLE_CONSTANT, 47 | }, 48 | ...IMAGE_ZOOM_TRANSITION_STYLE_CONSTANT, 49 | }, 50 | right: { 51 | position: "relative", 52 | display: "inline-block", 53 | borderRadius: imageBorderRadiusOptions[imageBorder], 54 | "::before": { 55 | content: '""', 56 | position: "absolute", 57 | top: 0, 58 | right: 0, 59 | bottom: 0, 60 | left: 0, 61 | borderRadius: imageBorderRadiusOptions[imageBorder], 62 | border: "7px solid #034057", // Adjust based on your color needs 63 | mixBlendMode: "multiply", 64 | boxSizing: "border-box", 65 | opacity: 0.1, 66 | }, 67 | _hover: { 68 | ...IMAGE_ZOOM_HOVER_STYLE_CONSTANT, 69 | }, 70 | ...IMAGE_ZOOM_TRANSITION_STYLE_CONSTANT, 71 | }, 72 | round: { 73 | position: "relative", 74 | display: "inline-block", 75 | "::before": { 76 | content: '""', 77 | position: "absolute", 78 | top: 0, 79 | right: 0, 80 | bottom: 0, 81 | left: 0, 82 | borderRadius: imageBorderRadiusOptions[imageBorder], 83 | border: "7px solid #034057", // Adjust based on your color needs 84 | mixBlendMode: "multiply", 85 | boxSizing: "border-box", 86 | opacity: 0.1, 87 | }, 88 | _hover: { 89 | ...IMAGE_ZOOM_HOVER_STYLE_CONSTANT, 90 | }, 91 | ...IMAGE_ZOOM_TRANSITION_STYLE_CONSTANT, 92 | }, 93 | none: {}, 94 | } 95 | 96 | return ( 97 | 106 |
112 | 113 | 118 | 119 |
120 |
121 | {children} 122 |
123 |
124 | ) 125 | } 126 | 127 | export default ImageSplitContent 128 | -------------------------------------------------------------------------------- /src/components/Link.tsx: -------------------------------------------------------------------------------- 1 | import NextLink from "next/link" 2 | import { Icon, Link as ChakraLink, VisuallyHidden } from "@chakra-ui/react" 3 | import { RxExternalLink } from "react-icons/rx" 4 | 5 | import { isExternal } from "@/utils/url" 6 | 7 | const Link = ({ children, href, ...props }) => { 8 | const isExternalValue = isExternal(href) 9 | 10 | return ( 11 | 19 | {children} 20 | {isExternalValue && ( 21 | <> 22 | (opens in a new tab) 23 | 30 | 31 | )} 32 | 33 | ) 34 | } 35 | 36 | export default Link 37 | -------------------------------------------------------------------------------- /src/components/Map/Globe.tsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useRef } from "react" 2 | import Globe from "react-globe.gl" 3 | 4 | import { Box, useBreakpointValue } from "@chakra-ui/react" 5 | 6 | interface GlobeComponentProps { 7 | activeFellow: { lat: number; lon: number } 8 | size: number | undefined 9 | } 10 | 11 | const GlobeComponent: React.FC = ({ 12 | activeFellow, 13 | size, 14 | }) => { 15 | const value = useBreakpointValue({ 16 | xs: 300, 17 | sm: 300, 18 | md: 380, 19 | lg: 380, 20 | xl: 380, 21 | }) 22 | const lastValidValue = useRef(380) // default value 23 | 24 | if (value !== undefined) { 25 | lastValidValue.current = value 26 | } 27 | 28 | const globeEl = useRef() 29 | 30 | useEffect(() => { 31 | if (globeEl.current) { 32 | globeEl.current.pointOfView( 33 | { lat: activeFellow.lat, lng: activeFellow.lon, altitude: 2 }, 34 | 0 35 | ) 36 | const controls = globeEl.current.controls() 37 | controls.enableZoom = false 38 | controls.enableRotate = false 39 | controls.enablePan = false 40 | } 41 | }, [size]) 42 | 43 | useEffect(() => { 44 | if (globeEl.current && activeFellow) { 45 | globeEl.current.pointOfView( 46 | { lat: activeFellow.lat, lng: activeFellow.lon, altitude: 1.5 }, 47 | 1000 48 | ) // Smooth transition 49 | } 50 | }, [activeFellow]) 51 | 52 | return ( 53 | 59 | 67 | 68 | ) 69 | } 70 | 71 | export default GlobeComponent 72 | -------------------------------------------------------------------------------- /src/components/Md/MarkdownImage.tsx: -------------------------------------------------------------------------------- 1 | import { extname } from "path" 2 | 3 | import { Box, Flex, Image } from "@chakra-ui/react" 4 | 5 | import { toPosixPath } from "@/utils/relativePath" 6 | 7 | import { MARKDOWN_CONTENT_MAX_WIDTH } from "@/utils/constants" 8 | import { DetailedHTMLProps, ImgHTMLAttributes } from "react" 9 | 10 | interface MarkdownImageProps 11 | extends DetailedHTMLProps< 12 | ImgHTMLAttributes, 13 | HTMLImageElement 14 | > { 15 | width: string 16 | height: string 17 | aspectRatio?: string 18 | } 19 | 20 | const MarkdownImage = ({ 21 | width, 22 | height, 23 | aspectRatio = "1 / 1", 24 | alt = "", 25 | src, 26 | ...rest 27 | }: MarkdownImageProps) => { 28 | const imageAspectRatio = parseFloat(aspectRatio) 29 | let imageWidth = parseFloat(width) 30 | let imageHeight = parseFloat(height) 31 | 32 | // Ensure that src path has forward slashes only, to avoid issues with Windows filepaths 33 | const transformedSrc = toPosixPath(src!.toString()) 34 | 35 | // keep the size of the images proportional to the max width constraint 36 | if (imageWidth > MARKDOWN_CONTENT_MAX_WIDTH) { 37 | imageWidth = MARKDOWN_CONTENT_MAX_WIDTH 38 | imageHeight = MARKDOWN_CONTENT_MAX_WIDTH / imageAspectRatio 39 | } 40 | 41 | const fileExt = extname(transformedSrc).toLowerCase() 42 | const isAnimated = [".gif", ".apng", ".webp"].includes(fileExt) 43 | 44 | return ( 45 | // display the wrapper as a `span` to avoid dom nesting warnings as mdx 46 | // sometimes wraps images in `p` tags 47 | 48 | 55 | {alt} 64 | 65 | 66 | ) 67 | } 68 | 69 | export default MarkdownImage 70 | -------------------------------------------------------------------------------- /src/components/Md/MdComponents.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | Box, 3 | Divider, 4 | Heading, 5 | ListItem, 6 | OrderedList, 7 | Text, 8 | UnorderedList, 9 | } from "@chakra-ui/react" 10 | 11 | import { H1, H2, H3, H4, H5, H6 } from "@/components/Headings" 12 | import Link from "@/components/Link" 13 | import MarkdownImage from "@/components/Md/MarkdownImage" 14 | 15 | const Header1 = (props) => { 16 | return ( 17 | 25 | ) 26 | } 27 | 28 | const Header2 = (props) => { 29 | return

30 | } 31 | 32 | const Header3 = (props) => { 33 | return

34 | } 35 | 36 | const Header4 = (props) => { 37 | return

38 | } 39 | 40 | const Header5 = (props) => { 41 | return

42 | } 43 | 44 | const Header6 = (props) => { 45 | return
46 | } 47 | 48 | const Paragraph = (props) => { 49 | return 50 | } 51 | 52 | const ListItemStyled = (props) => { 53 | return 54 | } 55 | 56 | export const HR = () => ( 57 | 65 | ) 66 | 67 | // Enhanced blockquote version that properly separates quote from attribution 68 | const BlockQuote = (props) => { 69 | // Process the children to extract quote and attribution 70 | const { quoteContent, attributionContent } = React.useMemo(() => { 71 | // Default - everything is quote content 72 | let quote = props.children; 73 | let attribution = null; 74 | 75 | // Convert children to searchable format 76 | let contentString = ''; 77 | 78 | if (typeof props.children === 'string') { 79 | contentString = props.children; 80 | } else if (Array.isArray(props.children)) { 81 | contentString = props.children.map(child => { 82 | if (typeof child === 'string') return child; 83 | if (child?.props?.children && typeof child.props.children === 'string') 84 | return child.props.children; 85 | return ''; 86 | }).join('\n'); 87 | } else if (props.children?.props?.children) { 88 | if (typeof props.children.props.children === 'string') { 89 | contentString = props.children.props.children; 90 | } else if (Array.isArray(props.children.props.children)) { 91 | contentString = props.children.props.children 92 | .map(c => typeof c === 'string' ? c : '') 93 | .join('\n'); 94 | } 95 | } 96 | 97 | // Look for attribution pattern at the end - an em dash followed by text 98 | const attributionMatch = contentString.match(/([^\n]+)[\s\n]+—([^\n]+)$/); 99 | if (attributionMatch) { 100 | // The part before the attribution pattern is the quote 101 | const attrIndex = contentString.lastIndexOf(attributionMatch[0]); 102 | const quoteText = contentString.substring(0, attrIndex).trim(); 103 | const attrText = attributionMatch[2].trim(); 104 | 105 | // Format properly 106 | return { 107 | quoteContent: quoteText, 108 | attributionContent: `— ${attrText}` 109 | }; 110 | } 111 | 112 | return { quoteContent: quote, attributionContent: attribution }; 113 | }, [props.children]); 114 | 115 | return ( 116 | 126 | {/* Quote content box */} 127 | 154 | {quoteContent} 155 | 156 | 157 | {/* Attribution - displayed separately from the quote */} 158 | {attributionContent && ( 159 | 166 | {attributionContent} 167 | 168 | )} 169 | 170 | ); 171 | } 172 | 173 | // Add React import 174 | import React from "react"; 175 | 176 | export const htmlElements = { 177 | a: Link, 178 | div: Box, 179 | h1: Header1, 180 | h2: Header2, 181 | h3: Header3, 182 | h4: Header4, 183 | h5: Header5, 184 | h6: Header6, 185 | p: Paragraph, 186 | img: MarkdownImage, 187 | li: ListItemStyled, 188 | ol: OrderedList, 189 | ul: UnorderedList, 190 | hr: HR, 191 | blockquote: BlockQuote, 192 | } 193 | 194 | /** 195 | * All base markdown components as default export 196 | */ 197 | const MdComponents = { 198 | ...htmlElements, 199 | } 200 | 201 | export default MdComponents 202 | -------------------------------------------------------------------------------- /src/components/Nav/Footer/Footer.tsx: -------------------------------------------------------------------------------- 1 | import { Box, Center, Flex, Text } from "@chakra-ui/react" 2 | 3 | import { LogoIcon } from "@/components/icons" 4 | import Link from "@/components/Link" 5 | 6 | import { 7 | ETHEREUM_DOT_ORG_LINK, 8 | ETHEREUM_FOUNDATION_LINK, 9 | PRIVACY_POLICY_LINK, 10 | TERMS_OF_USE_LINK, 11 | COOKIE_POLICY_PAGE, 12 | } from "@/utils/constants" 13 | 14 | const Footer = () => { 15 | return ( 16 | 17 | 18 | 24 | 25 | 26 | 27 |
28 | 33 | 40 | Ethereum.org 41 | Ethereum.foundation 42 | Privacy Policy 43 | Terms of Use 44 | Cookie Policy 45 | 46 | 47 | © 2024 Ethereum Foundation. All rights reserved. 48 | 49 | 50 |
51 |
52 |
53 | ) 54 | } 55 | 56 | export default Footer 57 | -------------------------------------------------------------------------------- /src/components/Nav/Header/HamburgerMenu.tsx: -------------------------------------------------------------------------------- 1 | import { motion } from "framer-motion" 2 | import { type ButtonProps, Icon, IconButton } from "@chakra-ui/react" 3 | 4 | const hamburgerSvg = 5 | "M 2 13 l 10 0 l 0 0 l 10 0 M 4 19 l 8 0 M 12 19 l 8 0 M 2 25 l 10 0 l 0 0 l 10 0" 6 | const glyphSvg = 7 | "M 2 19 l 10 -14 l 0 0 l 10 14 M 2 19 l 10 7 M 12 26 l 10 -7 M 2 22 l 10 15 l 0 0 l 10 -15" 8 | 9 | const hamburgerVariants = { 10 | closed: { d: hamburgerSvg, transition: { duration: 0.25 } }, 11 | open: { d: glyphSvg, transition: { duration: 0.25 } }, 12 | } 13 | 14 | type HamburgerProps = ButtonProps & { 15 | isMenuOpen: boolean 16 | onToggle: () => void 17 | } 18 | 19 | const HamburgerButton = ({ 20 | isMenuOpen, 21 | onToggle, 22 | ...props 23 | }: HamburgerProps) => { 24 | return ( 25 | 40 | 45 | 46 | } 47 | {...props} 48 | /> 49 | ) 50 | } 51 | 52 | export default HamburgerButton 53 | -------------------------------------------------------------------------------- /src/components/Nav/Header/Header.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | Box, 3 | Center, 4 | Drawer, 5 | DrawerBody, 6 | DrawerContent, 7 | DrawerOverlay, 8 | IconButton, 9 | Flex, 10 | Menu, 11 | MenuButton, 12 | useDisclosure, 13 | } from "@chakra-ui/react" 14 | import { useRouter } from "next/router" 15 | 16 | import { CloseIcon, HamburgerIcon, LogoIcon } from "@/components/icons" 17 | import HeaderButtons from "@/components/Nav/Header/HeaderButtons" 18 | 19 | const Header = () => { 20 | const { isOpen, onOpen, onClose } = useDisclosure() 21 | const router = useRouter() 22 | 23 | const bgColor = isOpen ? "transparent" : "rgba(0, 0, 0, 0.60)" 24 | 25 | return ( 26 |
27 | 28 | 39 | router.push("/")} 41 | cursor={isOpen ? "default" : "pointer"} 42 | > 43 | 44 | 45 | 46 | 47 | 48 | {!isOpen && ( 49 | } 53 | onClick={onOpen} 54 | /> 55 | )} 56 | 57 | {isOpen && ( 58 | } 62 | onClick={onClose} 63 | /> 64 | )} 65 | 66 | 67 | 68 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 |
84 | 85 |
86 |
87 |
88 |
89 | ) 90 | } 91 | 92 | export default Header 93 | -------------------------------------------------------------------------------- /src/components/Nav/Header/HeaderButtons.tsx: -------------------------------------------------------------------------------- 1 | import { useRouter } from "next/router" 2 | import { Center, Flex } from "@chakra-ui/react" 3 | 4 | import Link from "@/components/Link" 5 | 6 | import { 7 | ABOUT_PAGE, 8 | BLOG_PAGE, 9 | FELLOWSHIP_PAGE, 10 | SCHOLARS_PAGE, 11 | } from "@/utils/constants" 12 | 13 | const HeaderButtons = ({ onClose }) => { 14 | const router = useRouter() 15 | const path = router.asPath 16 | 17 | return ( 18 |
24 | 32 | Home 33 | 34 | 42 | Fellowship 43 | 44 | 52 | Scholars 53 | 54 | 62 | About 63 | 64 | 72 | Blog 73 | 74 |
75 | ) 76 | } 77 | 78 | export default HeaderButtons 79 | -------------------------------------------------------------------------------- /src/components/PreviousEditions.tsx: -------------------------------------------------------------------------------- 1 | import { Box, Center, Divider, Flex, Image, Text } from "@chakra-ui/react" 2 | import ContentContainer from "@/components/ContentContainer" 3 | import { H2, H4 } from "@/components/Headings" 4 | import Link from "@/components/Link" 5 | 6 | import { 7 | IMAGE_ZOOM_HOVER_STYLE_CONSTANT, 8 | IMAGE_ZOOM_TRANSITION_STYLE_CONSTANT, 9 | } from "@/utils/constants" 10 | 11 | const previousEditions = [ 12 | { 13 | name: "Devcon SEA 2024", 14 | location: "Bangkok, Thailand", 15 | description: 16 | "Devcon Southeast Asia brought together the Ethereum community in Bangkok from November 12-15, 2024. The event featured talks, workshops, and networking opportunities, with a special focus on expanding Ethereum's reach across Southeast Asia.", 17 | image: "/images/devconSEA_scholars.jpg", 18 | url: "https://archive.devcon.org/watch/?event=devcon-7&sort=eventId&order=desc", 19 | }, 20 | { 21 | name: "Devconnect 2023", 22 | location: "Istanbul, Turkey", 23 | description: 24 | "The vibrant metropolis of Istanbul hosted Devconnect from November 13-19. Over 3500 Ethereum enthusiasts gathered at the Devconnect Cowork in the Istanbul Congress Center, while many more attended independent events throughout Istanbul.", 25 | image: "/images/devconnect_2023.png", 26 | url: "https://devconnect.org/istanbul", 27 | }, 28 | { 29 | name: "Devcon 2022", 30 | location: "Bogotá, Colombia", 31 | description: 32 | "After a three-year-long pause, we emerged from the pandemic stronger than before and reunited in Bogotá for the largest and some would say, “best Devcon yet.”", 33 | image: "/images/devcon_2022.png", 34 | url: "https://archive.devcon.org/archive/watch/?order=desc&sort=eventId", 35 | }, 36 | { 37 | name: "Devconnect 2022", 38 | location: "Amsterdam, Netherlands", 39 | description: 40 | "For eight days, the city of Amsterdam was filled with bicycles bearing the Devconnect flag, as the Ethereum community came together to coordinate a variety of independent events and workshops.", 41 | image: "/images/devconnect_2022.png", 42 | url: "https://devconnect.org/amsterdam", 43 | }, 44 | ] 45 | 46 | const cityFontStyle = { 47 | fontFamily: "body", 48 | fontSize: 14, 49 | fontStyle: "normal", 50 | fontWeight: 300, 51 | lineHeight: "150%", 52 | } 53 | 54 | const PreviousEditions = () => { 55 | return ( 56 | <> 57 | 58 | 59 |

60 | Previous Editions 61 |

62 | 63 | {previousEditions.map((edition, index) => ( 64 | 65 | 74 |
75 | {edition.name} 82 |
83 | 84 |
85 |

86 | {edition.name} 87 |

88 | 89 | {edition.location} 90 | 91 | {edition.description} 92 | 93 | 94 | Check out {edition.name} 95 | 96 | 97 |
98 |
99 | {index < previousEditions.length - 1 && ( 100 | 101 | )} 102 |
103 | ))} 104 |
105 |
106 |
107 | 108 | ) 109 | } 110 | 111 | export default PreviousEditions 112 | -------------------------------------------------------------------------------- /src/components/TableOfContents.tsx: -------------------------------------------------------------------------------- 1 | import { List, ListItem } from "@chakra-ui/react" 2 | import { useEffect, useState } from "react" 3 | 4 | import Link from "@/components/Link" 5 | 6 | const TableOfContents = ({ tocItems }) => { 7 | function flattenToC(items, result = [] as { title: string; url: string }[]) { 8 | items.forEach((item) => { 9 | // Add the current item to the result list, excluding the 'items' property 10 | const { title, url } = item 11 | result.push({ title, url }) 12 | 13 | // If the current item has nested items, recursively flatten them 14 | if (item.items && item.items.length) { 15 | flattenToC(item.items, result) 16 | } 17 | }) 18 | return result 19 | } 20 | 21 | const flattenedTocItems = flattenToC(tocItems) 22 | 23 | const titleIds = flattenedTocItems.map((item) => item.url.substring(1)) 24 | 25 | const [activeHeaderId, setActiveHeaderId] = useState(titleIds[0]) 26 | 27 | useEffect(() => { 28 | const checkActiveHeader = () => { 29 | for (const id of titleIds) { 30 | const header = document.getElementById(id) 31 | if (header) { 32 | const rect = header.getBoundingClientRect() 33 | if ( 34 | rect.top >= 0 && 35 | rect.bottom <= window.innerHeight - window.innerHeight / 3 36 | ) { 37 | setActiveHeaderId(id) 38 | break // Stop checking once the active header is found 39 | } 40 | } 41 | } 42 | } 43 | 44 | // Listen for scroll events 45 | window.addEventListener("scroll", checkActiveHeader) 46 | 47 | // Clean up the event listener when the component unmounts 48 | return () => { 49 | window.removeEventListener("scroll", checkActiveHeader) 50 | } 51 | }, [titleIds]) // Depend on headerIds to re-run if they change 52 | 53 | return ( 54 | 55 | {flattenedTocItems.map((item) => ( 56 | 67 | {item.title} 68 | 69 | ))} 70 | 71 | ) 72 | } 73 | 74 | export default TableOfContents 75 | -------------------------------------------------------------------------------- /src/components/WhoAreNextBillion.tsx: -------------------------------------------------------------------------------- 1 | import { Box, Center, Image, Text } from "@chakra-ui/react" 2 | import { H2 } from "@/components/Headings" 3 | import ButtonLink from "@/components/Buttons/ButtonLink" 4 | import ContentContainer from "./ContentContainer" 5 | import { useEffect, useState, useRef } from "react" 6 | 7 | const WhoAreNextBillion = () => { 8 | const [offsetY, setOffsetY] = useState(0) 9 | const refContainer = useRef(null) 10 | 11 | const handleScroll = () => { 12 | if (refContainer.current) { 13 | const { top, height } = refContainer.current.getBoundingClientRect() 14 | if (top <= window.innerHeight && top + height >= 0) { 15 | setOffsetY(window.scrollY - top) 16 | } 17 | } 18 | } 19 | 20 | useEffect(() => { 21 | window.addEventListener("scroll", handleScroll, { passive: true }) 22 | 23 | return () => window.removeEventListener("scroll", handleScroll) 24 | }, []) 25 | 26 | const parallaxFactor = 0.05 27 | const computedOffset = Math.min(offsetY * parallaxFactor - 110, 1.45) 28 | 29 | return ( 30 | 31 | 32 | 42 | 53 | 64 | 65 | 66 | 67 | 68 |

Who Are The Next Billion?

69 | 70 | 71 | In Internet lore, 'the next billion' is often told as a grand 72 | narrative about shifting perspectives and challenged 73 | assumptions. As a meme, it lets us question the form and 74 | function of technologies that reach the scale of “world-wide” 75 | use. 76 | 77 | 78 | Web3 does not yet have a first billion users, but shifting 79 | perspectives and challenging assumptions is an evergreen 80 | endeavor. There are about eight billion human people at the 81 | moment, and Ethereum is supposed to treat every-one fairly, to 82 | the extent that it’s possible to treat people fairly when 83 | capabilities and needs are so different in this world. 84 | 85 | 86 | Someone of 'the next billion' lives in a world filled with 87 | games, too often played for life-and-death outcomes. It's a 88 | messy, complicated place some think might need saving. But 89 | within any world, with the right tools at hand, people will 90 | solve their own problems; they will create their own 91 | opportunities; they will imagine their own future. 92 | 93 | 94 | The future is a frontier. To learn what (and who) comes next, we 95 | need only to look at the maps, listen to the stories, and 96 | inspect the artifacts made by people who problem-solve, who 97 | build, who imagine — not to save a world, but to build new (and 98 | improved) ones. 99 | 100 | 101 |
107 | 108 | Next Billion 109 | 110 | 116 | Ethereum Foundation 117 | 118 |
119 |
120 |
121 |
122 |
123 | ) 124 | } 125 | 126 | export default WhoAreNextBillion 127 | -------------------------------------------------------------------------------- /src/components/icons/ArrowIcon.tsx: -------------------------------------------------------------------------------- 1 | import { createIcon } from "@chakra-ui/react" 2 | 3 | export const ArrowIcon = createIcon({ 4 | displayName: "ArrowIcon", 5 | path: ( 6 | 13 | 14 | 15 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | ), 28 | }) 29 | -------------------------------------------------------------------------------- /src/components/icons/CloseIcon.tsx: -------------------------------------------------------------------------------- 1 | import { createIcon } from "@chakra-ui/react" 2 | 3 | export const CloseIcon = createIcon({ 4 | displayName: "CloseIcon", 5 | viewBox: "0 0 24 24", 6 | path: [ 7 | , 8 | , 9 | ], 10 | }) 11 | -------------------------------------------------------------------------------- /src/components/icons/HamburgerIcon.tsx: -------------------------------------------------------------------------------- 1 | import { createIcon } from "@chakra-ui/react" 2 | 3 | export const HamburgerIcon = createIcon({ 4 | displayName: "HamburgerIcon", 5 | viewBox: "0 0 26 18", 6 | path: [ 7 | , 15 | , 23 | , 31 | ], 32 | }) 33 | -------------------------------------------------------------------------------- /src/components/icons/index.ts: -------------------------------------------------------------------------------- 1 | export * from "@/components/icons/ArrowIcon" 2 | export * from "@/components/icons/CloseIcon" 3 | export * from "@/components/icons/HamburgerIcon" 4 | export * from "@/components/icons/LogoIcon" 5 | -------------------------------------------------------------------------------- /src/layouts/CookieLayout.tsx: -------------------------------------------------------------------------------- 1 | import { Box, Flex, Image } from "@chakra-ui/react" 2 | 3 | import ContentContainer from "@/components/ContentContainer" 4 | import { MARKDOWN_CONTENT_MAX_WIDTH } from "@/utils/constants" 5 | import TableOfContents from "@/components/TableOfContents" 6 | import { H1 } from "@/components/Headings" 7 | 8 | export const CookieLayout = ({ children, frontmatter, tocItems }) => { 9 | const { title } = frontmatter 10 | 11 | return ( 12 | <> 13 | 14 | Stars 15 | 16 | 17 | 18 |

19 | {title} 20 |

21 |
22 | 29 | 36 | {children} 37 | 38 | 45 | 46 | 47 | 48 |
49 | 50 | ) 51 | } 52 | -------------------------------------------------------------------------------- /src/layouts/FellowLayout.tsx: -------------------------------------------------------------------------------- 1 | import { Box, Flex, Image, Divider } from "@chakra-ui/react" 2 | import { MDXRemote } from "next-mdx-remote" 3 | 4 | import ContentContainer from "@/components/ContentContainer" 5 | import FellowLayoutHero from "@/components/Heroes/FellowLayoutHero" 6 | import { MARKDOWN_CONTENT_MAX_WIDTH } from "@/utils/constants" 7 | import TableOfContents from "@/components/TableOfContents" 8 | import { H3 } from "@/components/Headings" 9 | import FellowCard from "@/components/FellowCard" 10 | import MdComponents from "@/components/Md/MdComponents" 11 | 12 | export const FellowLayout = ({ 13 | children, 14 | frontmatter, 15 | tocItems, 16 | allFellowsFrontmatter, 17 | }) => { 18 | const { index, title, fellowName, country, tags, image, bio, bioSource } = frontmatter 19 | 20 | const meetMoreFellows = [ 21 | allFellowsFrontmatter[ 22 | index === 0 ? allFellowsFrontmatter.length - 1 : index - 1 23 | ], 24 | allFellowsFrontmatter[ 25 | index === allFellowsFrontmatter.length - 1 ? 0 : index + 1 26 | ], 27 | ] 28 | 29 | return ( 30 | <> 31 | 32 | Stars 33 | 34 | 37 | 44 | {/* Bio section */} 45 | {bioSource && ( 46 | 52 | 63 | 64 | 65 | 66 | 67 | )} 68 | 69 | {/* Main content section */} 70 | 78 | 84 | {children} 85 | 86 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 |

Meet more fellows

101 | 102 | 103 | 112 | 113 | 114 | 123 | 124 | 125 |
126 |
127 |
128 | 129 | ) 130 | } 131 | -------------------------------------------------------------------------------- /src/layouts/RootLayout.tsx: -------------------------------------------------------------------------------- 1 | import { Container } from "@chakra-ui/react" 2 | 3 | import ContentContainer from "@/components/ContentContainer" 4 | import Header from "@/components/Nav/Header/Header" 5 | import Footer from "@/components/Nav/Footer/Footer" 6 | 7 | export const RootLayout = ({ children }: any) => { 8 | return ( 9 | 10 | 11 |
12 | 13 | {children} 14 | 15 |