diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..12b4e97
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,214 @@
+# Contributing to HackUDC 2026
+
+Thank you for your interest in contributing to the HackUDC 2026 website! We welcome contributions from everyone in the community.
+
+## Branching Strategy
+
+We follow a structured branching workflow to maintain stability in production:
+
+### Branch Overview
+
+- **`main`** - Production branch
+ - This branch represents the live website at [hackudc.gpul.org](https://hackudc.gpul.org)
+ - Merges to `main` trigger automatic deployments to production
+ - Only fully tested and approved changes should be merged here
+ - Protected branch with review requirements
+
+- **`develop`** - Development branch
+ - This is where active development happens
+ - Contains the latest features and changes being prepared for the next release
+ - **All pull requests should be directed to this branch**
+ - Used to create draft versions for review before production deployment
+
+### Workflow
+
+1. **Create your feature branch** from `develop`:
+ ```bash
+ git checkout develop
+ git pull origin develop
+ git checkout -b feature/your-feature-name
+ ```
+
+2. **Make your changes** and commit them with clear, descriptive messages following [Conventional Commits](https://www.conventionalcommits.org).
+
+3. **Open a Pull Request** to the `develop` branch
+ - Provide a clear description of your changes
+ - Reference any related issues
+ - Ensure all checks pass
+
+4. **Code review** - Maintainers will review your PR
+ - Address any requested changes
+ - Once approved, your PR will be merged to `develop`
+
+5. **Release to production** - Maintainers periodically merge `develop` to `main`
+ - This is a controlled process to ensure production stability
+ - Triggers automatic deployment to the live website
+
+## Getting Started
+
+### Prerequisites
+
+Before you begin, ensure you have the following installed:
+
+- **Node.js** >= 22.0.0 ([Download](https://nodejs.org/))
+- **pnpm** (recommended package manager)
+ ```bash
+ npm install -g pnpm
+ ```
+- **Git** for version control
+
+### Local Development Setup
+
+1. **Fork the repository** on GitHub (if you're not a direct collaborator)
+
+2. **Clone your fork** (or the main repo if you have access):
+ ```bash
+ git clone https://github.com/YOUR-USERNAME/hackudc-2026.git
+ cd hackudc-2026
+ ```
+
+3. **Add upstream remote** (if you forked):
+ ```bash
+ git remote add upstream https://github.com/gpul-org/hackudc-2026.git
+ ```
+
+4. **Install dependencies**:
+ ```bash
+ pnpm install
+ ```
+
+5. **Start the development server**:
+ ```bash
+ pnpm dev
+ ```
+ The site will be available at `http://localhost:4321`
+
+6. **Make your changes** and test them locally
+
+### Available Scripts
+
+```bash
+pnpm dev # Start development server with hot reload
+pnpm build # Build the site for production
+pnpm preview # Preview the production build locally
+pnpm astro # Run Astro CLI commands
+```
+
+## Development Guidelines
+
+### Code Style
+
+- **JavaScript/TypeScript**: Follow the existing code style in the project
+- **Astro Components**: Use `.astro` files for pages and layouts
+- **React Components**: Use for interactive components when needed
+- **Styling**: Use Tailwind CSS utility classes consistently
+- **Formatting**: Code will be automatically formatted (if configured)
+
+### Design Consistency
+
+This website features a **retro/cyberpunk aesthetic**. When contributing:
+
+- Maintain the amber gradient color scheme on dark backgrounds
+- Use the Roboto font family with expanded letter spacing
+- Preserve visual effects like scanlines and CRT-inspired elements
+- Ensure smooth hover animations and transitions
+- Keep the futuristic, tech-focused visual language
+
+
+### Responsive Design
+
+- Test your changes across different screen sizes:
+ - Mobile (320px+)
+ - Tablet (768px+)
+ - Desktop (1024px+)
+ - Large screens (1440px+)
+- Use Tailwind's responsive utilities (`sm:`, `md:`, `lg:`, etc.)
+
+## Commit Message Guidelines
+
+Write clear, concise commit messages that describe **what** changed and **why**:
+
+```bash
+# Good examples
+git commit -m "chore: add FAQ section to homepage"
+git commit -m "fix: navigation menu overflow on mobile devices"
+git commit -m "chore: update event date and location details"
+
+# Less helpful examples (avoid these)
+git commit -m "Update stuff"
+git commit -m "Fix bug"
+git commit -m "Changes"
+```
+
+### Conventional Commits
+
+Consider using conventional commit format:
+- `feat:` - New features
+- `fix:` - Bug fixes
+- `docs:` - Documentation changes
+- `style:` - Code style changes (formatting, no logic changes)
+- `refactor:` - Code refactoring
+- `test:` - Adding or updating tests
+- `chore:` - Maintenance tasks
+
+Example: `feat: add sponsor section to homepage`
+
+## Pull Request Process
+
+1. **Update your branch** with the latest changes from `develop`:
+ ```bash
+ git checkout develop
+ git pull upstream develop
+ git checkout your-feature-branch
+ git rebase develop
+ ```
+
+2. **Push your changes** to your fork:
+ ```bash
+ git push origin your-feature-branch
+ ```
+
+3. **Open a Pull Request** on GitHub:
+ - Base branch: `develop`
+ - Compare branch: `your-feature-branch`
+ - Fill out the PR template (if available)
+ - Add a clear title and description
+ - Link any related issues
+
+4. **Respond to feedback**:
+ - Address code review comments
+ - Make requested changes
+ - Push updates to your branch (they'll appear in the PR automatically)
+
+5. **Wait for approval**:
+ - Maintainers will review and merge your PR
+ - Once merged to `develop`, your changes will be in the next production release
+
+## Reporting Issues
+
+Found a bug or have a feature request? Please open an issue on GitHub:
+
+1. **Check existing issues** to avoid duplicates
+2. **Use a clear title** that describes the issue
+3. **Provide details**:
+ - What happened vs. what you expected
+ - Steps to reproduce (for bugs)
+ - Screenshots or screen recordings (if applicable)
+ - Browser and device information (for UI issues)
+
+## Getting Help
+
+- **Questions?** Open a discussion on GitHub or reach out to the maintainers
+- **Email:** hackudc@gpul.org
+
+## Code of Conduct
+
+Be respectful, inclusive, and constructive in all interactions. We're all here to build something great together.
+
+## License
+
+By contributing to this project, you agree that your contributions will be licensed under the same MIT License that covers the project.
+
+---
+
+Thank you for contributing to HackUDC 2026! 🚀
diff --git a/astro.config.mjs b/astro.config.mjs
index 7ffe3e2..6cf3b08 100644
--- a/astro.config.mjs
+++ b/astro.config.mjs
@@ -14,4 +14,17 @@ export default defineConfig({
},
integrations: [react()],
+ i18n: {
+ locales: ["en", "es"],
+ defaultLocale: "en",
+ routing: {
+ prefixDefaultLocale: false,
+ },
+ },
+ redirects: {
+ "/terminos": "/es/terminos",
+ "/conducta": "/es/conducta",
+ "/privacidad": "/es/privacidad",
+ "/informacion": "/es/informacion",
+ },
});
diff --git a/package.json b/package.json
index e2288ef..6d325c8 100644
--- a/package.json
+++ b/package.json
@@ -16,6 +16,12 @@
"@astrojs/react": "^4.3.1",
"@astrojs/sitemap": "^3.5.1",
"@fontsource/roboto": "^5.2.6",
+ "@fortawesome/fontawesome-free": "^7.1.0",
+ "@fortawesome/fontawesome-svg-core": "^7.1.0",
+ "@fortawesome/free-brands-svg-icons": "^7.1.0",
+ "@fortawesome/free-regular-svg-icons": "^7.1.0",
+ "@fortawesome/free-solid-svg-icons": "^7.1.0",
+ "@fortawesome/react-fontawesome": "^3.1.0",
"@tailwindcss/vite": "^4.1.11",
"@types/react": "^19.1.10",
"@types/react-dom": "^19.1.7",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 0e3f87b..4c05410 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -20,6 +20,24 @@ importers:
'@fontsource/roboto':
specifier: ^5.2.6
version: 5.2.6
+ '@fortawesome/fontawesome-free':
+ specifier: ^7.1.0
+ version: 7.1.0
+ '@fortawesome/fontawesome-svg-core':
+ specifier: ^7.1.0
+ version: 7.1.0
+ '@fortawesome/free-brands-svg-icons':
+ specifier: ^7.1.0
+ version: 7.1.0
+ '@fortawesome/free-regular-svg-icons':
+ specifier: ^7.1.0
+ version: 7.1.0
+ '@fortawesome/free-solid-svg-icons':
+ specifier: ^7.1.0
+ version: 7.1.0
+ '@fortawesome/react-fontawesome':
+ specifier: ^3.1.0
+ version: 3.1.0(@fortawesome/fontawesome-svg-core@7.1.0)(react@19.1.1)
'@tailwindcss/vite':
specifier: ^4.1.11
version: 4.1.11(vite@6.3.6(@types/node@24.2.1)(jiti@2.5.1)(lightningcss@1.30.1))
@@ -334,6 +352,37 @@ packages:
'@fontsource/roboto@5.2.6':
resolution: {integrity: sha512-hzarG7yAhMoP418smNgfY4fO7UmuUEm5JUtbxCoCcFHT0hOJB+d/qAEyoNjz7YkPU5OjM2LM8rJnW8hfm0JLaA==}
+ '@fortawesome/fontawesome-common-types@7.1.0':
+ resolution: {integrity: sha512-l/BQM7fYntsCI//du+6sEnHOP6a74UixFyOYUyz2DLMXKx+6DEhfR3F2NYGE45XH1JJuIamacb4IZs9S0ZOWLA==}
+ engines: {node: '>=6'}
+
+ '@fortawesome/fontawesome-free@7.1.0':
+ resolution: {integrity: sha512-+WxNld5ZCJHvPQCr/GnzCTVREyStrAJjisUPtUxG5ngDA8TMlPnKp6dddlTpai4+1GNmltAeuk1hJEkBohwZYA==}
+ engines: {node: '>=6'}
+
+ '@fortawesome/fontawesome-svg-core@7.1.0':
+ resolution: {integrity: sha512-fNxRUk1KhjSbnbuBxlWSnBLKLBNun52ZBTcs22H/xEEzM6Ap81ZFTQ4bZBxVQGQgVY0xugKGoRcCbaKjLQ3XZA==}
+ engines: {node: '>=6'}
+
+ '@fortawesome/free-brands-svg-icons@7.1.0':
+ resolution: {integrity: sha512-9byUd9bgNfthsZAjBl6GxOu1VPHgBuRUP9juI7ZoM98h8xNPTCTagfwUFyYscdZq4Hr7gD1azMfM9s5tIWKZZA==}
+ engines: {node: '>=6'}
+
+ '@fortawesome/free-regular-svg-icons@7.1.0':
+ resolution: {integrity: sha512-0e2fdEyB4AR+e6kU4yxwA/MonnYcw/CsMEP9lH82ORFi9svA6/RhDyhxIv5mlJaldmaHLLYVTb+3iEr+PDSZuQ==}
+ engines: {node: '>=6'}
+
+ '@fortawesome/free-solid-svg-icons@7.1.0':
+ resolution: {integrity: sha512-Udu3K7SzAo9N013qt7qmm22/wo2hADdheXtBfxFTecp+ogsc0caQNRKEb7pkvvagUGOpG9wJC1ViH6WXs8oXIA==}
+ engines: {node: '>=6'}
+
+ '@fortawesome/react-fontawesome@3.1.0':
+ resolution: {integrity: sha512-5OUQH9aDH/xHJwnpD4J7oEdGvFGJgYnGe0UebaPIdMW9UxYC/f5jv2VjVEgnikdJN0HL8yQxp9Nq+7gqGZpIIA==}
+ engines: {node: '>=20'}
+ peerDependencies:
+ '@fortawesome/fontawesome-svg-core': ~6 || ~7
+ react: ^18.0.0 || ^19.0.0
+
'@img/sharp-darwin-arm64@0.34.3':
resolution: {integrity: sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
@@ -2406,6 +2455,31 @@ snapshots:
'@fontsource/roboto@5.2.6': {}
+ '@fortawesome/fontawesome-common-types@7.1.0': {}
+
+ '@fortawesome/fontawesome-free@7.1.0': {}
+
+ '@fortawesome/fontawesome-svg-core@7.1.0':
+ dependencies:
+ '@fortawesome/fontawesome-common-types': 7.1.0
+
+ '@fortawesome/free-brands-svg-icons@7.1.0':
+ dependencies:
+ '@fortawesome/fontawesome-common-types': 7.1.0
+
+ '@fortawesome/free-regular-svg-icons@7.1.0':
+ dependencies:
+ '@fortawesome/fontawesome-common-types': 7.1.0
+
+ '@fortawesome/free-solid-svg-icons@7.1.0':
+ dependencies:
+ '@fortawesome/fontawesome-common-types': 7.1.0
+
+ '@fortawesome/react-fontawesome@3.1.0(@fortawesome/fontawesome-svg-core@7.1.0)(react@19.1.1)':
+ dependencies:
+ '@fortawesome/fontawesome-svg-core': 7.1.0
+ react: 19.1.1
+
'@img/sharp-darwin-arm64@0.34.3':
optionalDependencies:
'@img/sharp-libvips-darwin-arm64': 1.2.0
diff --git a/public/logos/logo_h_accented.svg b/public/logos/logo_h_accented.svg
new file mode 100644
index 0000000..67a078f
--- /dev/null
+++ b/public/logos/logo_h_accented.svg
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/meta.png b/public/meta.png
index de5ffd7..9b0736f 100644
Binary files a/public/meta.png and b/public/meta.png differ
diff --git a/src/assets/collaborators/amtega.svg b/src/assets/collaborators/amtega.svg
new file mode 100644
index 0000000..3fb0461
--- /dev/null
+++ b/src/assets/collaborators/amtega.svg
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/assets/collaborators/astro.svg b/src/assets/collaborators/astro.svg
new file mode 100644
index 0000000..0f4fbf2
--- /dev/null
+++ b/src/assets/collaborators/astro.svg
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/collaborators/fic.svg b/src/assets/collaborators/fic.svg
new file mode 100644
index 0000000..c117bc5
--- /dev/null
+++ b/src/assets/collaborators/fic.svg
@@ -0,0 +1,213 @@
+
+
+
+
+
+Created by potrace 1.11, written by Peter Selinger 2001-2013
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/collaborators/gadis.jpg b/src/assets/collaborators/gadis.jpg
new file mode 100644
index 0000000..97da6b0
Binary files /dev/null and b/src/assets/collaborators/gadis.jpg differ
diff --git a/src/assets/collaborators/gpul-small.svg b/src/assets/collaborators/gpul-small.svg
new file mode 100644
index 0000000..09feb1c
--- /dev/null
+++ b/src/assets/collaborators/gpul-small.svg
@@ -0,0 +1,501 @@
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/collaborators/perusinas.png b/src/assets/collaborators/perusinas.png
new file mode 100644
index 0000000..f11514b
Binary files /dev/null and b/src/assets/collaborators/perusinas.png differ
diff --git a/src/assets/collaborators/udc.svg b/src/assets/collaborators/udc.svg
new file mode 100644
index 0000000..2835cc8
--- /dev/null
+++ b/src/assets/collaborators/udc.svg
@@ -0,0 +1,189 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/assets/logos/logo_h_noroot.svg b/src/assets/logos/logo_h_noroot.svg
new file mode 100644
index 0000000..67a078f
--- /dev/null
+++ b/src/assets/logos/logo_h_noroot.svg
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/assets/pattern.svg b/src/assets/pattern.svg
new file mode 100644
index 0000000..6e6c90a
--- /dev/null
+++ b/src/assets/pattern.svg
@@ -0,0 +1,436 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/assets/sponsors/hack udc-5.jpg b/src/assets/sponsors/hack udc-5.jpg
new file mode 100644
index 0000000..373ff48
Binary files /dev/null and b/src/assets/sponsors/hack udc-5.jpg differ
diff --git a/src/assets/sponsors/hacking.jpg b/src/assets/sponsors/hacking.jpg
new file mode 100644
index 0000000..1b9ebbc
Binary files /dev/null and b/src/assets/sponsors/hacking.jpg differ
diff --git a/src/components/About.astro b/src/components/About.astro
new file mode 100644
index 0000000..0cd68f8
--- /dev/null
+++ b/src/components/About.astro
@@ -0,0 +1,88 @@
+---
+import { Image } from "astro:assets";
+import hackImage from "../assets/sponsors/hacking.jpg";
+---
+
+
+
+ What is HackUDC?
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Hack + Marathon
+
+
+
+ HackUDC is an open-source hackathon organized by
+
+ 🔗 GPUL.
+
+
+ Build a project in 36 hours based on sponsored challenges,
+ or create something original with your team of up to 4 hackers .
+
+
+
+
+
+
+ When? Where?
+
+
+
+ The event will take place from February 27th to March 1st
+ at the Faculty of Computer Science of the University of A Coruña.
+ 🔗 View in map.
+
+
+
+
+
+
+
+
diff --git a/src/components/EventDayInfo.astro b/src/components/EventDayInfo.astro
new file mode 100644
index 0000000..d1426c0
--- /dev/null
+++ b/src/components/EventDayInfo.astro
@@ -0,0 +1,70 @@
+---
+
+---
+
+
+
diff --git a/src/components/FAQ.astro b/src/components/FAQ.astro
new file mode 100644
index 0000000..8b3f464
--- /dev/null
+++ b/src/components/FAQ.astro
@@ -0,0 +1,293 @@
+---
+const questions = [
+ {
+ title: "When does HackUDC take place?",
+ description:
+ "HackUDC will take place from February 27th to March 1st, 2026. The opening ceremony will be on Friday afternoon, February 27th. The event concludes on Sunday with an awards ceremony during the closing act.",
+ },
+ {
+ title: "Where does HackUDC take place?",
+ description:
+ "The event will take place at the Faculty of Computer Science (FIC) of the A Coruña University (UDC), on the Elviña Campus in A Coruña.",
+ },
+ {
+ title: "What does HackUDC include?",
+ description:
+ "HackUDC is completely free for participants. WiFi and workspaces are provided, as well as breakfasts, lunches, dinners, and snacks throughout the event. Don't forget to include any dietary restrictions when registering.",
+ },
+ {
+ title: "Where can I rest?",
+ description:
+ "If you don't have accommodation, rest areas will be available in classrooms. However, keep in mind that the Faculty is not a hotel, and these areas are meant to take quick naps so that you can get back to hacking.",
+ },
+ {
+ title: "Will I be able to take a shower during the event?",
+ description:
+ "Of course! The faculty will be open throughout the event, and there will be designated times for you to take a shower and stay fresh.",
+ },
+ {
+ title: "What can I create?",
+ description:
+ "You can create any project related to technology. We have no restrictions on the topic. The only requirement is that the project developed during the hackathon is published under a free license. Some examples could be web applications, mobile applications, hardware projects, games, APIs...",
+ },
+ {
+ title: "What do I need to bring?",
+ description:
+ "For admission, you will need to verify your identity with a valid government-issued ID. Other common things to bring to the hackathon are: laptop and charger (don't forget the charger!), comfortable clothing, and eagerness to create something awesome! If you have any specific hardware you want to use, feel free to bring it along.",
+ },
+ {
+ title: "Who can participate?",
+ description:
+ "Students or recent graduates (up to 1 year after graduation) from universities, vocational training programs, high schools, or other educational backgrounds are all welcome.",
+ },
+ {
+ title: "How can I register?",
+ description:
+ //"Registration is not yet open, but you can join the waitlist on our landing page to be the first to know when it becomes available. We'll also announce it on our website and social media channels once registration opens.",
+ "Registration is now open! To register, you will need to submit your application through the registration form found in the landing page of this website. We will send you a confirmation once your application is accepted.",
+ },
+ {
+ title: "What if I'm not a student?",
+ description:
+ "You can still participate as a mentor to enjoy the event and help participants with their projects. Mentor registration will open later.",
+ },
+ {
+ title: "What if I have no coding experience?",
+ description:
+ "HackUDC is a place to learn, so no prior programming experience is required. There are many other areas where you can contribute, such as design, testing, project management, and more.",
+ },
+ {
+ title: "What if I don't have a team?",
+ description:
+ "Part of the fun of a hackathon is meeting new people. We will have a team-building activity at the beginning of the event so that everyone can meet and form teams.",
+ },
+ {
+ title: "What is the maximum team size?",
+ description: "Teams can have up to 4 hackers.",
+ },
+ {
+ title: "Can I switch teams during the event?",
+ description:
+ "Yes! Only the final submission counts, so make sure your project is submitted correctly. Submission instructions will be provided during the event.",
+ },
+ {
+ title: "About ECTS credits",
+ description:
+ "If you are a UDC student, you can earn 1.5 ECTS credits by participating in HackUDC. Attendance will be monitored during the event. UDC students interested in receiving credits must request recognition through the VEE. More detailed information will be provided before, during, and after the event.",
+ },
+ {
+ title: "Will there be mentors?",
+ description:
+ "Yes. Mentors will be available throughout the event to answer any questions you may have. If you would like to participate as a mentor, you can fill out the form linked below the participant registration. For any questions, email us at hackudc@gpul.org!",
+ },
+];
+
+// Split point for two columns. Use ceil so left column gets the extra item when odd.
+const mid = Math.ceil(questions.length / 2);
+---
+
+
+
+
+ FAQs
+
+
+
+ Have questions? We've got answers.
+
+
+ The most common questions grouped in our FAQ
+
+
+
+
+ {
+ questions.map((q, i) => {
+ // Left column: items [0, mid)
+ if (i >= mid) return null;
+ return (
+
+
+ {q.title}
+
+
+
+
+
+
+ );
+ })
+ }
+
+
+ {
+ questions.map((q, i) => {
+ // Right column: items [mid, end)
+ if (i < mid) return null;
+ return (
+
+
+ {q.title}
+
+
+
+
+
+
+ );
+ })
+ }
+
+
+
+
+
+ If you have any other questions, feel free to contact us via social
+ media or at
+ hackudc@gpul.org .
+
+
+
+
+
+
+
+
diff --git a/src/components/Footer.astro b/src/components/Footer.astro
new file mode 100644
index 0000000..e0d73ca
--- /dev/null
+++ b/src/components/Footer.astro
@@ -0,0 +1,90 @@
+---
+import {
+ faInstagram,
+ faLinkedin,
+ faTelegram,
+ faTwitch,
+ faTwitter,
+} from "@fortawesome/free-brands-svg-icons";
+import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
+
+import { Image } from "astro:assets";
+
+//Images:
+import LogoGPUL from "../assets/collaborators/gpul-small.svg";
+
+const socials = [
+ {
+ title: "Instagram",
+ href: "https://www.instagram.com/gpul_",
+ icon: faInstagram,
+ },
+ {
+ title: "Twitter",
+ href: "https://x.com/gpul_",
+ icon: faTwitter,
+ },
+ {
+ title: "Twitch",
+ href: "https://www.twitch.tv/gpul_/",
+ icon: faTwitch,
+ },
+ {
+ title: "Telegram",
+ href: "https://t.me/+PrK44xhqJ9eP9ZUf",
+ icon: faTelegram,
+ },
+ {
+ title: "LinkedIn",
+ href: "https://www.linkedin.com/company/gpul/",
+ icon: faLinkedin,
+ },
+];
+---
+
+
+
+
+
+
+ Web page developed by
+ GPUL
+
+
+
+
+ {
+ socials.map((s) => (
+
+
+
+ ))
+ }
+
+
+
+
+
diff --git a/src/components/ImageGallery.astro b/src/components/ImageGallery.astro
new file mode 100644
index 0000000..3e1ba50
--- /dev/null
+++ b/src/components/ImageGallery.astro
@@ -0,0 +1,564 @@
+---
+// ImageGallery.astro
+// Usage inside an Astro page/component:
+// import ImageGallery from "../components/ImageGallery.astro";
+//
+// // If you import images with Astro's asset import, use '.src' for the URL:
+// import exampleImg from "../assets/example.jpg";
+// const images = [ { src: exampleImg.src, alt: "Example" } ];
+//
+//
+//
+// Props:
+// - images: { src: string; alt: string }[] (required) — array of image objects.
+// - autoPlayInterval?: number (ms) — default 5000. Set to 0 to disable autoplay.
+//
+// Notes:
+// - Pass raw string URLs for 'src'. When using Astro image imports, use the '.src' property.
+// - The component runs a small client-side carousel script to clone and animate slides.
+// - Provide 'alt' text for accessibility.
+
+export interface Props {
+ images: { src: string | { src: string; [k: string]: any }; alt: string }[];
+ autoPlayInterval?: number;
+}
+
+const { images, autoPlayInterval = 5000 } = Astro.props;
+
+// Normalize image imports. Allow passing either a string URL or Astro ImageMetadata.
+const resolvedImages = (images || []).map((image) => {
+ const raw = image?.src ?? "";
+ const src = typeof raw === "string" ? raw : (raw?.src ?? raw?.default ?? "");
+ return { src, alt: image?.alt ?? "" };
+});
+---
+
+
+
+ Gallery
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/ImpactNumbers.astro b/src/components/ImpactNumbers.astro
new file mode 100644
index 0000000..fcde0ed
--- /dev/null
+++ b/src/components/ImpactNumbers.astro
@@ -0,0 +1,59 @@
+---
+
+---
+
+
+
+
+
+ +400
+
+
+ Participants
+
+
+
+
+
+ 36H
+
+
+ Of Hacking
+
+
+
+
+
+ +3K€
+
+
+ in prizes
+
+
+
+
+
+ 100%
+
+
+ Open source
+
+
+
+
diff --git a/src/components/Info.astro b/src/components/Info.astro
new file mode 100644
index 0000000..b1130e0
--- /dev/null
+++ b/src/components/Info.astro
@@ -0,0 +1,200 @@
+---
+import InfoCarousel from "./InfoCarousel.astro";
+
+const carouselSlides = [
+ "HackUDC is back and bigger than ever! Join 400+ participants for 36 hours of non-stop hacking, learning, and networking.",
+ "Grab your team of up to 4 people, pick a challenge and create innovative projects, with mentorship and workshops available throughout the event.",
+ "Open source only. Bring your laptop, your ideas, and your energy. Let's make something cool together.",
+ "Students and recent graduates are welcome - no prior coding experience required. There's a place for everyone!",
+];
+---
+
+
+
+
+
+
+ What you need to know
+
+
+
+
+
+
+
+
+ Step 1: The Team
+
+
+ Form your team of up to 4 members, have fun, and collaborate
+ effectively. You can bring your own team or join one at the event.
+
+
+
+
+
+
+
+
+
+ Step 2: The Idea
+
+
+ Get inspired by the challenges proposed by sponsors and the
+ organization to create an original solution.
+
+
+
+
+
+
+
+
+
+ Step 3: Code
+
+
+ You have 36h to bring your idea to life: Use your go-to programming
+ language, or try something new!
+
+
+
+
+
+
+
+
+
+ Step 4: Submit
+
+
+ Include documentation and a compelling demo to showcase the
+ potential and applicability of your project. Don't forget that all
+ projects must be open source!
+
+
+
+
+
+
+
+
+
+ The Prizes!
+
+
+ Compete for amazing prizes and recognition. Winners will be
+ announced at the closing ceremony.
+
+
+
+
+
+
diff --git a/src/components/InfoCarousel.astro b/src/components/InfoCarousel.astro
new file mode 100644
index 0000000..119d1c4
--- /dev/null
+++ b/src/components/InfoCarousel.astro
@@ -0,0 +1,304 @@
+---
+export interface Props {
+ slides: string[];
+ autoPlayInterval?: number;
+ showNavButtons?: boolean;
+ minHeight?: string;
+}
+
+const {
+ slides,
+ autoPlayInterval = 10000,
+ showNavButtons = true,
+ minHeight = "min-h-[160px] sm:min-h-[180px] md:min-h-[200px] lg:min-h-[220px]",
+} = Astro.props;
+---
+
+
+
+
+ {
+ slides.map((slide, index) => (
+
+ ))
+ }
+
+
+ {
+ showNavButtons && (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+ >
+ )
+ }
+
+
+
+ {
+ slides.map((_, index) => (
+
+ ))
+ }
+
+
+
+
+
+
diff --git a/src/components/LanguageSwitcher.astro b/src/components/LanguageSwitcher.astro
new file mode 100644
index 0000000..fbb8482
--- /dev/null
+++ b/src/components/LanguageSwitcher.astro
@@ -0,0 +1,102 @@
+---
+interface Props {
+ alternates?: Record;
+}
+
+const { alternates = {} } = Astro.props;
+const currentPath = Astro.url.pathname.replace(/\/$/, "");
+const currentLocale = Astro.currentLocale || "en";
+
+// Build alternate URLs
+const alternateUrls: Record = {
+ en:
+ currentPath.startsWith("/es/") || currentPath.startsWith("/gl/")
+ ? "/"
+ : currentPath,
+ es: "/", // fallback
+ gl: "/", // fallback
+ ...alternates,
+};
+
+// Ensure current locale points to current path
+if (
+ currentLocale === "en" &&
+ !currentPath.startsWith("/es/") &&
+ !currentPath.startsWith("/gl/")
+) {
+ alternateUrls.en = currentPath;
+} else if (currentLocale === "es") {
+ alternateUrls.es = currentPath;
+} else if (currentLocale === "gl") {
+ alternateUrls.gl = currentPath;
+}
+
+// Galician fallback: if no GL version exists, use Spanish version
+if (!alternates.gl && alternateUrls.es && alternateUrls.es !== "/") {
+ alternateUrls.gl = alternateUrls.es;
+}
+
+const languages = [
+ { code: "en", label: "EN" },
+ { code: "es", label: "ES" },
+ //{ code: "gl", label: "GL" },
+];
+---
+
+
+
+
diff --git a/src/components/Schedule.astro b/src/components/Schedule.astro
new file mode 100644
index 0000000..9d0295e
--- /dev/null
+++ b/src/components/Schedule.astro
@@ -0,0 +1,501 @@
+---
+import type { ScheduleDay, ScheduleTag } from "../data/schedule";
+
+interface Props {
+ days: ScheduleDay[];
+}
+
+const { days } = Astro.props as Props;
+
+/**
+ * Converts markdown-style links in description text to HTML anchor tags
+ * Example: [text](url) -> text 🔗
+ */
+function parseDescription(text: string): string {
+ return text.replace(
+ /\[([^\]]+)\]\(([^)]+)\)/g,
+ '$1 🔗 '
+ );
+}
+
+/**
+ * Check if a tag is a ScheduleTag object (with optional URL)
+ */
+function isTagObject(tag: string | ScheduleTag): tag is ScheduleTag {
+ return typeof tag === "object" && "label" in tag;
+}
+---
+
+
+ {
+ days.map((day) => (
+
+ ))
+ }
+
+
+
+
+
diff --git a/src/components/ShowCollaborators.astro b/src/components/ShowCollaborators.astro
new file mode 100644
index 0000000..11ec05a
--- /dev/null
+++ b/src/components/ShowCollaborators.astro
@@ -0,0 +1,55 @@
+---
+import { Image } from "astro:assets";
+
+// Images:
+import logoAMTEGA from "../assets/collaborators/amtega.svg";
+import logoFIC from "../assets/collaborators/fic.svg";
+import logoUDC from "../assets/collaborators/udc.svg";
+
+// Base styles
+const cardBase =
+ "mx-auto flex flex-col justify-center overflow-hidden rounded-lg transition-transform duration-300 hover:scale-105";
+---
+
+
+
+ Collaborators
+
+
+
+
diff --git a/src/components/ShowSponsors.astro b/src/components/ShowSponsors.astro
new file mode 100644
index 0000000..5c6bdb9
--- /dev/null
+++ b/src/components/ShowSponsors.astro
@@ -0,0 +1,147 @@
+---
+// base styles
+const cardBase =
+ "relative mx-auto flex flex-col items-center justify-center overflow-hidden text-center text-amber-300 rounded-lg bg-amber-300/20 backdrop-blur-sm border-2 border-white hover:scale-105 sm:hover:scale-110 hover:bg-yellow-300 hover:text-black hover:shadow-[0_0_20px_4px_rgba(255,255,255,0.8)] transition-all duration-300";
+
+const cautionTape =
+ "pointer-events-none absolute left-1/2 top-1/2 z-10 flex h-14 sm:h-16 w-[200%] -translate-x-1/2 -translate-y-1/2 -rotate-12 items-center justify-center bg-[repeating-linear-gradient(135deg,#facc15_0_18px,#111827_18px_36px)] border-y-2 border-black shadow-[0_14px_22px_rgba(0,0,0,0.45)]";
+
+const cautionTapeText =
+ "pointer-events-none flex w-full items-center justify-around gap-10 text-xs sm:text-sm md:text-base lg:text-lg font-extrabold uppercase tracking-[0.4em] text-slate-900/90";
+
+const comingSoonOverlay =
+ "pointer-events-none absolute left-1/2 top-1/2 z-20 flex w-full -translate-x-1/2 -translate-y-1/2 -rotate-12 items-center justify-center px-4";
+
+const comingSoonOverlayText =
+ "whitespace-nowrap flex items-center justify-center rounded-md bg-amber-300 px-3 py-1.5 sm:px-4 sm:py-2 text-xs sm:text-sm md:text-base lg:text-lg font-extrabold uppercase tracking-[0.35em] sm:tracking-[0.4em] md:tracking-[0.45em] text-black shadow-[0_10px_20px_rgba(0,0,0,0.45)]";
+
+const srOnlyText = "sr-only";
+
+const tierHeading =
+ "mt-10 sm:mt-12 md:mt-16 text-center font-mono tracking-wider text-lg sm:text-xl md:text-2xl text-amber-300";
+---
+
+
diff --git a/src/components/ShowStart.astro b/src/components/ShowStart.astro
new file mode 100644
index 0000000..427eb48
--- /dev/null
+++ b/src/components/ShowStart.astro
@@ -0,0 +1,154 @@
+---
+const videoId = "EDIGMHPDKsI";
+import logoSrc from "/public/logos/logo_h_accented.svg";
+import { Image } from "astro:assets";
+---
+
+
+
+
+
+
+
+
+ OPEN SOURCE HACKATHON
+
+
+
+
+
+
+
+ 27 FEB — 1 MAR
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/data/schedule.ts b/src/data/schedule.ts
new file mode 100644
index 0000000..03ed1fd
--- /dev/null
+++ b/src/data/schedule.ts
@@ -0,0 +1,149 @@
+// DATA TYPES
+
+export type ScheduleTag = {
+ label: string;
+ url?: string; // Optional clickable URL for the tag
+};
+
+
+// Represents a single event in the schedule
+export type ScheduleEvent = {
+ time: string; // Start time, e.g., "09:00"
+ endTime?: string; // Optional end time, e.g., "11:00"
+ datetime?: string; // ISO datetime string for HTML
+ title: string;
+ location?: string;
+ speakers?: string;
+ tags?: (string | ScheduleTag)[]; // Array of tags (can be simple strings or objects with URLs)
+ description?: string; // Detailed description (supports markdown-style links)
+};
+
+// Represents a single day in the schedule
+export type ScheduleDay = {
+ dateLabel: string; // e.g., "Friday, Oct 24"
+ isoDate?: string; // ISO date string, e.g., "2025-10-24"
+ events: ScheduleEvent[]; // Array of events for this day
+};
+
+// SCHEDULE DATA
+
+/**
+ * Main schedule data structure
+ * Days and events render in the order listed below
+ *
+ * To modify:
+ * - Add/remove days by adding/removing objects in the array
+ * - Add/remove events by modifying the `events` array for each day
+ * - Tags can be strings or objects: "Tag" or { label: "Tag", url: "https://..." }
+ * - Descriptions support markdown links: [text](url)
+ */
+export const schedule: ScheduleDay[] = [
+ {
+ dateLabel: "Friday, Feb 27",
+ isoDate: "2026-02-27",
+ events: [
+ {
+ time: "17:30",
+ datetime: "2026-02-27T17:30",
+ title: "Check-in",
+ location: "Auditorium Lobby",
+ description:
+ "Pick up your badges, swag, and get settled in.",
+ },
+ {
+ time: "19:00",
+ datetime: "2026-02-27T19:00",
+ title: "Opening Ceremony",
+ speakers: "Organizing Team",
+ location: "Auditorium",
+ description: "Event kickoff, logistics, challenges, and rules.",
+ },
+ {
+ time: "19:00",
+ datetime: "2026-02-27T19:00",
+ title: "Dinner",
+ location: "Floor 1",
+ },
+ ],
+ },
+ {
+ dateLabel: "Saturday, Feb 28",
+ isoDate: "2026-02-28",
+ events: [
+ {
+ time: "09:00",
+ datetime: "2026-02-28T09:00",
+ title: "Breakfast",
+ location: "Floor 1",
+ },
+ {
+ time: "11:00",
+ datetime: "2026-02-28T11:00",
+ endTime: "18:00",
+ title: "Showers",
+ location: "Elviña Sports Complex",
+ description:
+ "Freshen up during the day at the Elviña Sports Complex, located Directly in front of the venue.",
+ },
+ {
+ time: "14:00",
+ datetime: "2026-02-28T14:00",
+ title: "Lunch",
+ location: "Floor 1",
+ },
+ {
+ time: "21:00",
+ datetime: "2026-02-28T21:00",
+ title: "Dinner",
+ location: "Floor 1",
+ },
+ ],
+ },
+ {
+ dateLabel: "Sunday, Mar 1",
+ isoDate: "2026-03-01",
+ events: [
+ {
+ time: "09:00",
+ datetime: "2026-03-01T09:00",
+ title: "Breakfast",
+ location: "Cafeteria",
+ },
+ {
+ time: "09:00",
+ datetime: "2026-03-01T09:00",
+ title: "Project Submission Deadline",
+ description: "Submit projects on Devpost.",
+ },
+ {
+ time: "10:00",
+ datetime: "2026-02-28T10:00",
+ endTime: "12:00",
+ title: "Showers",
+ location: "Elviña Sports Complex",
+ description:
+ "Freshen up during the day at the Elviña Sports Complex, located Directly in front of the venue.",
+ },
+ {
+ time: "10:00",
+ datetime: "2026-03-01T10:00",
+ title: "Demos & Judging",
+ location: "Classrooms",
+ description: "Demo your projects to judges in assigned rooms.",
+ },
+ {
+ time: "13:40",
+ datetime: "2026-03-01T13:40",
+ title: "Lunch",
+ location: "Floor 1",
+ },
+ {
+ time: "16:00",
+ datetime: "2026-03-01T16:00",
+ title: "Awards Ceremony",
+ location: "Auditorium",
+ description: "Event highlights and awards.",
+ },
+ ],
+ },
+];
diff --git a/src/layouts/InfoLayout.astro b/src/layouts/InfoLayout.astro
new file mode 100644
index 0000000..b0744fa
--- /dev/null
+++ b/src/layouts/InfoLayout.astro
@@ -0,0 +1,189 @@
+---
+import Layout from "./Layout.astro";
+
+interface Props {
+ frontmatter: {
+ title: string;
+ alternates?: Record;
+ };
+}
+
+const { frontmatter } = Astro.props;
+
+import Footer from "../components/Footer.astro";
+import LanguageSwitcher from "../components/LanguageSwitcher.astro";
+import patternSvg from "../assets/pattern.svg";
+---
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {frontmatter.title}
+
+
+
+
+
+
+
diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro
index 674e2f5..7a4b55a 100644
--- a/src/layouts/Layout.astro
+++ b/src/layouts/Layout.astro
@@ -81,7 +81,21 @@ const { title, light = false } = Astro.props;