English | Español
eventos.wiki gathers the technological events and meetups happening in Spain, published by the community itself. Organizations keep their own agenda, and anyone can browse by province, by date or through the calendar.
Everything published is also available as open data — see Public feeds.
This project uses pnpm as its package manager, and the version is pinned in the
packageManager field, so the easiest way to get the right one is Corepack:
corepack enableThe Node version is pinned in .nvmrc and in the volta field of package.json. If you use
volta or nvm, they will pick it up on their own.
| Requirement | Version |
|---|---|
| Node | >= 24.16.0 |
| pnpm | >= 11.23.0 |
- Astro web framework, rendering on the server with the Node adapter
- Astro DB over libSQL, with Drizzle for queries
- React for dynamic components
- Lucia for sessions, with GitHub, Google and X as providers
- Tailwind CSS v4 and Radix UI primitives
- TipTap as the rich text editor
- React Email plus Resend for transactional email
- Zod for validation, and React Hook Form for forms
- MDX for the changelog content
- TypeScript
- Biome for linting and formatting, with Prettier covering the
.astrofiles
To install the required dependencies you should execute the following command:
pnpm i --frozen-lockfileCopy the example file and fill in the values you need:
cp .env.example .env| Variable | What it is for |
|---|---|
BASE_URL |
Public base URL, used to build OAuth callbacks |
ASTRO_DB_REMOTE_URL, ASTRO_DB_APP_TOKEN |
Remote Astro DB connection |
OAUTH_GITHUB_CLIENT_ID, OAUTH_GITHUB_CLIENT_SECRET |
Sign in with GitHub |
GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET |
Sign in with Google |
TWITTER_CLIENT_ID, TWITTER_CLIENT_SECRET |
Sign in with X |
GOOGLE_MAPS_PLACES_API_KEY |
Place lookup on the server |
PUBLIC_GOOGLE_MAPS_EMBED_API_KEY |
Embedded map on the event page |
PINATA_JWT, PINATA_GATEWAY_URL |
Image upload and serving |
RESEND_API_KEY |
Sending notification emails |
To run the application in develop mode (in your local machine enabling hot reload) you can use:
pnpm devThat command works against a local database. To point at the remote one instead, use pnpm start, which is the same
dev server with the --remote flag. The production build also reads from the remote database:
pnpm build
pnpm previewBiome handles linting and formatting for TypeScript, JavaScript, JSON and CSS:
pnpm lint # check
pnpm lint:fix # check and apply the safe fixes
pnpm format # format only.astro files sit outside Biome's scope — biome.json ignores **/*.astro — so they are formatted by Prettier
through prettier-plugin-astro. Tailwind class order is normalized by prettier-plugin-tailwindcss.
Types and Astro collections are checked separately:
pnpm astro checkInstalling the git hooks with pnpm hooks adds two checks: Biome over the staged files, and commitlint over the
message, which follows Conventional Commits.
There is a Dockerfile and a docker-compose.yml to run the project in containers. The steps are in
DOCKER.md.
Published content is also exposed as open data, with CORS enabled so third parties can read it:
| Route | Format |
|---|---|
/events.json |
OpenTechEvents v0.4.0 feed, plus JSON-LD |
/events.ics |
iCalendar, to subscribe from any calendar app |
/organizations/<handle>/events.json |
The same feed limited to one organization |
/organizations/<handle>/events.ics |
The same calendar limited to one organization |
| File | What it covers |
|---|---|
| DESIGN.md | Design system: colors, typography, components |
| DOCKER.md | Running the project in containers |
| CHANGELOG.md | Notable changes |
| AGENTS.md | Architecture and conventions to follow when contributing |
Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.
If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". Don't forget to give the project a star! Thanks again!
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature) - Commit your Changes following Conventional Commits (
git commit -m 'feat: add some amazing feature') - Push to the Branch (
git push origin feature/AmazingFeature) - Open a Pull Request
Before opening it, give AGENTS.md a read: it describes the module structure and the conventions the codebase follows.
Distributed under the MIT License. See LICENSE for more information.
Alberto Chamorro - albertochamorro.dev