Virtual Coffee is a laid-back conversation with developers twice a week. It's the conversation that keeps going in slack. It's the online events that support developers at all stages of the journey. It's the place where you go to make friends who all just happen to be in tech.
Anyone can join! Whether you're just thinking about getting into tech or have been in it for decades.
We know that growth comes at all levels and that no matter what stage of the journey you're on, you can teach and learn.
So come with a question or a topic to discuss, ask for feedback on your portfolio, answer another developer's question, or just sit back and listen to others talk about tech.
Our mission is to form community, allow room for growth and mentorship at all levels, and to provide a safe space for everyone interested in tech.
Please take a moment to read our Code of Conduct.
See you there!
- This site is built using Next.js.
- Check out our CONTRIBUTING guideline to make contributions.
- If you're new to open source, check out our Git & GitHub 101 and Contributor Guide resources.
Steps to run the site locally for development or curiosity
Follow these steps to create a fork of this repository and clone it to your local machine.
If you have just run git clone ... , the next step would be to move into the cloned repo:
cd virtualcoffee.ioThis repo requires node and pnpm to get started. The Netlify CLI is installed as a project dependency, so you don't need to install it globally.
The best way to install node is to download the installer from their site. This repo requires node version 24.20 (see .nvmrc).
If you already have a different version of node installed, but don't want to update globally, you can install a package called nvm, which will allow you to easily switch node versions. Once you have nvm installed (or if you already have it installed), you can run nvm use in the main directory and it will install the proper version of node.
pnpm is a package manager that is used to install the rest of our dependencies.
Read more about pnpm on their docs site.
The best way to install pnpm for this project is by using Corepack, a new feature bundled with Node.
Install pnpm via corepack with the following commands:
corepack enable
corepack prepareUse the following command to create a local .env file. Then open the new file (.env) and adjust any settings that are needed.
cp .env.example .envOnce you have node and pnpm installed, you're ready to install the local dependencies! Run the following command:
pnpm installAt this point you're ready to roll! Run the following command to get rolling!
pnpm devRead more about what pnpm dev does in the following section.
The following commands are available for your use. Most of the time you'll only ever need pnpm dev.
pnpm devThis is the only command you need to do normal local development.
Starts a local server and watches your source files for changes. Use this to preview local development.
Once you run this command, a local server is running at http://localhost:9000! Any changes you make to the src folder should also re-build the site and re-load your browser.
You should see something like 'Server now ready on http://localhost:9000' below, which means the watcher is waiting to build your awesome changes!
Use ctrl-c to quit the server when you're done.
pnpm dev:tunnelThe same as pnpm dev, but also served on a public https://<random>--virtual-coffee-io.netlify.live URL (printed on start) through netlify dev --live. Use it to check the site on a phone or to receive a webhook. It sets NETLIFY_TUNNEL=1, which switches on the tunnel-only settings in next.config.mjs; plain pnpm dev leaves them off because they break hot reloading on localhost.
pnpm buildBuilds a production-ready version of the site. This is what Netlify uses to build our site.
pnpm formatRuns Prettier on all of our files.
If your branch lives in this repository, CI formats it for you and pushes the fix back to your pull request. If you are working from a fork β which is the normal path for most contributors β CI cannot push to your branch, so the format check will fail and list the offending files. Run pnpm format locally and push the result.
pnpm lintRuns ESLint on all of our files, so you can check for errors or warnings. CI runs this on every pull request and fails on errors (warnings are allowed for now). Run pnpm build-member-files first if you haven't built recently.
Alongside the standard Next.js rules, eslint-rules/ holds a few rules of our own for the things TypeScript can't check:
vc/member-file-identityβ a member file's name and its exported const must both match itsgithubfield.githubis what we look you up by, so a typo quietly leaves you off the members page, and the exported name has to be unique because the members list is built fromexport *.vc/member-emojiβ youremojihas to be a standard Unicode emoji.vc/member-account-usernameβ account usernames are bare handles, not URLs and not@name; we add the@where a platform needs one.vc/no-raw-dangerously-set-inner-htmlβ render HTML throughDisplayHtml, and sanitize it first.vc/page-requires-metadataβ every page exportsmetadataorgenerateMetadata.
Most of these fix themselves with pnpm lint --fix.
pnpm typecheckRuns next typegen (which regenerates the gitignored next-env.d.ts and the route types) and then the TypeScript compiler (tsc --noEmit). CI runs this on every pull request. Run pnpm build-member-files first if you haven't built recently.
pnpm build-member-filesRegenerates src/data/members/core.ts and src/data/members/members.ts from the files in src/content/members/. These generated files are gitignored. pnpm dev and pnpm build run this for you, and the dev watcher re-runs it whenever a member file changes.
pnpm build-bot-listRegenerates src/data/bots.ts β the list of crawlers the site blocks β from the ai.robots.txt release pinned in .botlist-version.json. It feeds both /robots.txt and the Netlify edge function.
Unlike the other generated files this one is checked in, so nothing runs it for you and you only need it if you are changing the list. Edit src/data/botOverrides.ts β which holds every decision about who gets blocked or allowed β then run this and commit the result. Renovate keeps the pinned version current, and a scheduled workflow opens a PR when the list changes.
A lot of the data loaded on the site is from APIs that require private keys or tokens. Unfortunately we can't publish these or distribute them too widely.
All of the data points have mock data that is used if the required API key isn't present, so contributors should be able to make UX-related changes without needing them.
If you'd like to work on a feature that requires an API key, please reach out to a maintainer and we can probably get that going.
netlify/functions/join-coffee.ts serves /join-coffee?day=tuesday|thursday (a rewrite in netlify.toml), redirecting to that day's Zoom room. /join-slack is a page (src/app/join-slack/), not a function.
Our VC Resources are created using MDX. MDX is basically a combination of Markdown and React.
Any files added to src/content/resources will be automatically loaded and added to the appropriate index page.
A good way to start adding a new page would be to copy one of the existing pages, then edit the details and content.
Each challenge is an MDX file in src/content/monthly-challenges/, named after its URL (may-2025.mdx is /monthlychallenges/may-2025). Its frontmatter sets the title, description, date and the series it belongs to. Each series on the Monthly Challenges page is a file in src/content/monthly-challenges/series/. A new challenge appears there automatically as its series' most recent challenge. To change which series is current, move current: true to that series' file.
For more on the process, read the instructions at the Monthly Challenge Technical Guidelines page on the VC Community Building Resources.
Thanks goes to these wonderful people (emoji key):
This project follows the all-contributors specification. Contributions of any kind welcome!
The source code is licensed under the MIT License. The site's written content and illustrations are licensed under Creative Commons Attribution 4.0.