fix loading
ci/woodpecker/push/woodpecker Pipeline was successful Details

dev
Adam Sobotka 5 months ago
commit 126f6d6484

@ -0,0 +1,3 @@
IPFS_CLUSTER_HOST=https://my-ipfs-cluster.example
IPFS_CLUSTER_USER=my_username
IPFS_CLUSTER_PASS=my_password

@ -0,0 +1,13 @@
.DS_Store
node_modules
/build
/.svelte-kit
/package
.env
.env.*
!.env.example
# Ignore files for PNPM, NPM and YARN
pnpm-lock.yaml
package-lock.json
yarn.lock

@ -0,0 +1,15 @@
module.exports = {
root: true,
extends: ['eslint:recommended', 'prettier'],
plugins: ['svelte3'],
overrides: [{ files: ['*.svelte'], processor: 'svelte3/svelte3' }],
parserOptions: {
sourceType: 'module',
ecmaVersion: 2020
},
env: {
browser: true,
es2017: true,
node: true
}
};

12
.gitignore vendored

@ -0,0 +1,12 @@
.DS_Store
node_modules
/build
/.svelte-kit
/package
.env
.env.*
!.env.example
bun.lockb
src/lib/data.json
static/data.json
.gitsigners

@ -0,0 +1 @@
engine-strict=true

@ -0,0 +1 @@
16.15.0

@ -0,0 +1,13 @@
.DS_Store
node_modules
/build
/.svelte-kit
/package
.env
.env.*
!.env.example
# Ignore files for PNPM, NPM and YARN
pnpm-lock.yaml
package-lock.json
yarn.lock

@ -0,0 +1,9 @@
{
"useTabs": true,
"singleQuote": true,
"trailingComma": "none",
"printWidth": 100,
"plugins": ["prettier-plugin-svelte"],
"pluginSearchDirs": ["."],
"overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }]
}

@ -0,0 +1,29 @@
pipeline:
build_and_test:
image: node
commands:
- node --version
- npm ci
- npm run build
- npm run test
deploy:
image: rclone/rclone
commands:
- "rclone sync build/ :sftp: --sftp-host frontier.gwei.cz --sftp-user eb2-website-dev --sftp-port 2022 --sftp-pass $RCLONE_PASS -v"
secrets: [RCLONE_PASS]
when:
branch: [main]
deploy_ipfs:
image: node
environment:
IPFS_CLUSTER_HOST: https://ipfs-cluster.gwei.cz
IPFS_CLUSTER_USER: ethbrno
commands:
- npx -y --loglevel=error github:burningtree/ipfs-cluster-deploy ./build ethbrno-web
secrets: [IPFS_CLUSTER_PASS]
when:
event: tag
branch: main

@ -0,0 +1,13 @@
# ETHBrno² Website
Website is created using [SvelteKit](https://kit.svelte.dev/) and deployed as a static application to these addresses:
* [ethbrno.cz](https://ethbrno.cz) (self-hosted @ [gwei.cz](https://gwei.cz))
* [mirror.ethbrno.cz](https://mirror.ethbrno.cz/) (mirror @ [Netlify](https://www.netlify.com/))
* IPFS network - the url is changing (example: [bafybeiddx4e2yyur3kjyppcvcg2nb7yxrxs2b2y7lfe4pgekgwpjwtsh7y.ipfs.gwei.cz](https://bafybeiddx4e2yyur3kjyppcvcg2nb7yxrxs2b2y7lfe4pgekgwpjwtsh7y.ipfs.gwei.cz))
The [IPFS](https://ipfs.io/) addresses of the major versions are stored directly in the `ethbrno.eth` [ENS](https://ens.domains/) record. You can access the site using these gateways:
* [ethbrno.eth.link](https://ethbrno.eth.link)
* [ethbrno.eth.limo](https://ethbrno.eth.limo)
## Authors
* vorcigernix

@ -0,0 +1,223 @@
# ---- CONTRIBUTORS ----
contributorTypes:
all:
title: All
role: null
speakers:
title: Speakers
role: speaker
mentors:
title: Mentors
role: mentor
judges:
title: Judges
role: judge
advisors:
title: Advisors
role: advisor
team:
title: Core Team
role: team
contributors:
# ---- SPEAKERS ----
- id: silur
name: Abraham Endre
nickname: Silur
link: https://github.com/Silur
bio: Hackoholic Cryptonaut - Early Ethereum dev and blockchain pioneer
roles: [ speaker ]
- id: rachel-oleary
name: Rachel-Rose O'Leary
twitter: lunar_mining
bio: DarkFi core dev, writer
roles: [ speaker ]
desc: |
Rachel-Rose OLeary is a core dev at lunarpunk layer 1, DarkFi. She is also co-editor of the philosophy journal Agorism in the 21st Century. As a writer she has published in egirlcapital, CoinDesk, Defiant, Wired and elsewhere under anonymous accounts. She believes privacy is necessary for communities to define their own destinies.
- id: nick-almond
name: Nick Almond
nickname: DrNick
twitter: DrNickA
bio: FactoryDAO
roles: [ speaker ]
- id: juraj-bednar
name: Juraj Bednar
twitter: jurbed
bio: Hacktrophy, Hackyourself.io
roles: [ speaker ]
- id: pavol-luptak
name: Pavol Luptak
nickname: wilder
twitter: wilderco
bio: Nethemba, Hacktrophy, liberation.travel
roles: [ speaker ]
remote: true
- id: dcbuilder
name: dcbuilder.eth
twitter: DCbuild3r
bio: WorldCoin, devpill.me
roles: [ speaker, advisor ]
- id: artem-vorotnikov
name: Artem Vorotnikov
twitter: vorot93
bio: Ethereum Core Developer, creator of Akula
roles: [ speaker ]
remote: true
- id: owen-barnes
name: Owen Barnes
nickname: temporalwave
twitter: temporalwave
bio: Independent freedom adviser
roles: [ speaker, mentor ]
- id: william-mitsuda
name: Willian Mitsuda
twitter: wmitsuda
bio: Creator of Otterscan
roles: [ speaker ]
remote: true
- id: vojtech-simetka
name: Vojtěch Šimetka
twitter: vojtechsimetka
bio: Blockchain for Humanity, Swarm, Giveth
roles: [ speaker, mentor ]
- id: qedk
name: QEDK
twitter: qedk_
bio: Engineering Polygon, Moonshot Collective
roles: [ speaker ]
remote: true
- id: radek-svarz
name: Radek Švarz
twitter: radk
bio: dCZK, Apus.finance
roles: [ speaker ]
- id: lauri-peltonen
name: Lauri Peltonen
twitter: lauripelto
bio: Ethereum & StarkNet @ Equilibrium
roles: [ speaker, mentor ]
# ---- ADVISORS ----
- id: mario-havel
name: Mario Havel
twitter: TMIYChao
bio: Ethereum Foundation, Bordel Hackerspace
roles: [ advisor ]
remote: true
- id: josef-j
name: Josef J
twitter: JosefJ_
bio: ETHPrague, PWN Finance (previously Ethereum Foundation & Devcon)
roles: [ advisor ]
remote: true
- id: anett
name: Anett Rolikova
twitter: AnettRolikova
bio: Nethermind, previously Ethereum Magicians
roles: [ advisor ]
remote: true
# ---- TEAM ----
- id: tree
name: Tree
twitter: treecz
bio: Vision, content | Gwei.cz and BohemianDAO founder, Ethereum enthusiast
roles: [ team ]
- id: tereza
name: Tereza
twitter: terkastarostova
bio: Production, sponsors | Holky v Kryptu co-founder, chairman of UTXO Foundation
roles: [ team ]
- id: exez
name: Exez
twitter: OndraPulc
bio: Visual identity, design
roles: [ team ]
- id: adam
name: Adam
nickname: vorcigernix
twitter: vorcigernix
bio: Website, community calls | Zitrone founder, member of Developer DAO and Forefront
roles: [ team ]
- id: hedvika
name: Hedvika
twitter: HedvikaPa
nickname: headwitch
bio: Mentor seeking, experiences curation
roles: [ team ]
- id: clairee
name: Clairee
twitter: De_luneClaire
bio: Social networks
roles: [ team ]
- id: jacob
name: Jacob
twitter: jacobjelen
bio: Networking support
roles: [ team ]
- id: dominika
name: Dominika
twitter: DominikaV5
bio: Volunteers
roles: [ team ]
- id: damsky
name: Damsky
twitter: helloitsdamsky
bio: Community calls
roles: [ team ]
# ---- SPONSORS ----
sponsors:
- id: ef
name: Ethereum Foundation
tier: ecdsa
url: https://ethereum.foundation/
- id: mitonc
name: MitonC
tier: 3des
url: https://mitonc.com/
- id: radicle
name: Radicle
tier: 3des
url: https://radicle.xyz/
- id: ethindia
name: ETHIndia
tier: community
url: https://ethindia.co/
- id: devfolio
name: Devfolio
tier: community
url: https://devfolio.co/

@ -0,0 +1 @@
../static/photos

5997
package-lock.json generated

File diff suppressed because it is too large Load Diff

@ -0,0 +1,38 @@
{
"name": "eb2-website",
"version": "v2022-10-16",
"private": true,
"scripts": {
"dev": "vite dev",
"build": "npm run make-data && vite build",
"preview": "vite preview",
"test": "playwright test",
"lint": "prettier --plugin-search-dir . --check . && eslint .",
"format": "prettier --plugin-search-dir . --write .",
"make-data": "node ./scripts/make-data.js",
"ipfs-deploy": "npx -y --loglevel=error github:burningtree/ipfs-cluster-deploy ./build ethbrno-web",
"postinstall": "npx playwright install --with-deps chromium"
},
"devDependencies": {
"@playwright/test": "^1.25.0",
"@sveltejs/adapter-auto": "next",
"@sveltejs/adapter-static": "next",
"@sveltejs/kit": "next",
"autoprefixer": "^10.4.12",
"eslint": "^8.16.0",
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-svelte3": "^4.0.0",
"js-yaml": "^4.1.0",
"postcss": "^8.4.17",
"prettier": "^2.6.2",
"prettier-plugin-svelte": "^2.7.0",
"svelte": "^3.44.0",
"svelte-preprocess": "^4.10.7",
"tailwindcss": "^3.1.8",
"vite": "^3.1.0"
},
"type": "module",
"dependencies": {
"snarkdown": "^2.0.0"
}
}

@ -0,0 +1,13 @@
/** @type {import('@playwright/test').PlaywrightTestConfig} */
const config = {
use: {
browserName: 'chromium',
headless: true,
},
webServer: {
command: 'npm run build && npm run preview',
port: 4173
}
};
export default config;

@ -0,0 +1,6 @@
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
}

@ -0,0 +1,33 @@
import yaml from 'js-yaml'
import fs from 'fs'
const DATA_FILE = './data/data.yaml'
const DATA_OUTPUT = './src/lib/data.json'
const DATA_STATIC_OUTPUT = './static/data.json'
const PKG_FILE = './package.json'
const VERSION_PATTERN = /^v\d{4}-\d{2}-\d{2}$/
function gen() {
// load data
const data = yaml.load(fs.readFileSync(DATA_FILE))
const pkg = JSON.parse(fs.readFileSync(PKG_FILE))
if (!pkg.version.match(VERSION_PATTERN)) {
console.error(`Version not match pattern [${VERSION_PATTERN}]: ${pkg.version}`)
process.exit(1)
}
// add generation time
data.time = new Date
data.version = pkg.version
// write to json
fs.writeFileSync(DATA_OUTPUT, JSON.stringify(data, null, 2))
console.log(`Writed: ${DATA_OUTPUT}`)
// write to json (static)
fs.writeFileSync(DATA_STATIC_OUTPUT, JSON.stringify(data, null, 2))
console.log(`Writed: ${DATA_STATIC_OUTPUT}`)
}
gen()

@ -0,0 +1,87 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer components {
.header {
@apply sm:text-4xl text-3xl mb-4 font-medium text-white;
}
.subhead {
@apply text-xl md:text-3xl my-2;
}
.list {
@apply text-white
}
}
@font-face {
font-family: 'Roboto Mono';
font-style: normal;
font-weight: 300;
font-display: swap;
src: url('/fonts/roboto-mono-v22-latin-300.woff2'), url('https://fonts.gstatic.com/s/robotomono/v22/L0x5DF4xlVMF-BfR8bXMIjhLq38.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Roboto Mono';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('/fonts/roboto-mono-v22-latin-regular.woff2'), url('https://fonts.gstatic.com/s/robotomono/v22/L0x5DF4xlVMF-BfR8bXMIjhLq38.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'Roboto Mono';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('/fonts/roboto-mono-v22-latin-700.woff2'), url('https://fonts.gstatic.com/s/robotomono/v22/L0x5DF4xlVMF-BfR8bXMIjhLq38.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
body {
font-family: 'Roboto Mono', monospace;
background: white;
scrollbar-width: none;
scrollbar-color: black;
}
.serif {
font-family: 'Roboto Slab', serif;
}
.hyph {
overflow-wrap: break-word;
hyphens: manual;
-webkit-hyphenate-character: "...";
hyphenate-character: "...";
}
.clippic {
clip-path: polygon(85% 0%, 100% 20%, 100% 100%, 0% 100%, 0% 0%);
}
@layer components {
.active {
@apply underline;
}
}
.external::after {
padding-left: 10px;
content: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='13.5' height='13.5' aria-hidden='true' viewBox='0 0 24 24' class='iconExternalLink_nPIU'%3E%3Cpath fill='currentColor' d='M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z'%3E%3C/path%3E%3C/svg%3E");
}
.external.text-white::after {
content: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='13.5' height='13.5' aria-hidden='true' viewBox='0 0 24 24' class='iconExternalLink_nPIU'%3E%3Cpath fill='white' d='M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z'%3E%3C/path%3E%3C/svg%3E");
}
.contributor-remote::after {
width: 1rem;
height: 1rem;
margin-left: 3px;
content: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' stroke-width='1.5' stroke='white' %3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M12 21a9.004 9.004 0 008.716-6.747M12 21a9.004 9.004 0 01-8.716-6.747M12 21c2.485 0 4.5-4.03 4.5-9S14.485 3 12 3m0 18c-2.485 0-4.5-4.03-4.5-9S9.515 3 12 3m0 0a8.997 8.997 0 017.843 4.582M12 3a8.997 8.997 0 00-7.843 4.582m15.686 0A11.953 11.953 0 0112 10.5c-2.998 0-5.74-1.1-7.843-2.918m15.686 0A8.959 8.959 0 0121 12c0 .778-.099 1.533-.284 2.253m0 0A17.919 17.919 0 0112 16.5c-3.162 0-6.133-.815-8.716-2.247m0 0A9.015 9.015 0 013 12c0-1.605.42-3.113 1.157-4.418' /%3E%3C/svg%3E");
}

@ -0,0 +1,38 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
%sveltekit.head%
<link rel="icon" href="%sveltekit.assets%/icons/favicon-32x32.png" />
<meta name="description" content="November 11 - 13, 2022, Impact Hub / Clubco, Brno, Czech Republic - Lunarpunk hackathon focused on privacy and security. We believe that privacy is a fundamental human right. And good privacy needs good security foundations." />
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<!-- Facebook Meta Tags -->
<meta property="og:url" content="https://ethbrno.cz/">
<meta property="og:type" content="website">
<meta property="og:title" content="ETHBrno² 2022">
<meta property="og:description" content="November 11 - 13, 2022, Impact Hub / Clubco, Brno, Czech Republic - Lunarpunk hackathon focused on privacy and security. We believe that privacy is a fundamental human right. And good privacy needs good security foundations.">
<meta property="og:image" content="https://ethbrno.pages.dev/ogbrno.png">
<!-- Twitter Meta Tags -->
<meta name="twitter:card" content="summary_large_image">
<meta property="twitter:domain" content="ethbrno.cz">
<meta property="twitter:url" content="https://ethbrno.pages.dev/">
<meta name="twitter:title" content="ETHBrno² 2022">
<meta name="twitter:description" content="November 11 - 13, 2022, Impact Hub / Clubco, Brno, Czech Republic - Lunarpunk hackathon focused on privacy and security. We believe that privacy is a fundamental human right. And good privacy needs good security foundations.">
<meta name="twitter:image" content="https://dev.ethbrno.cz/ogbrno.png">
<!-- Plausible -->
<script defer data-domain="ethbrno.cz" src="https://x.gwei.cz/js/script.js"></script>
<meta name="viewport" content="width=device-width" />
</head>
<body>
<div>%sveltekit.body%</div>
</body>
</html>

@ -0,0 +1,59 @@
<script>
import logo from '$lib/assets/logo_black.svg';
import cityscape from '$lib/assets/cityscape2.png';
import { time } from '$lib/data.json';
const options = {
weekday: 'long',
year: 'numeric',
month: 'long',
day: 'numeric',
hour: 'numeric',
minute: 'numeric',
second: 'numeric',
timeZone: 'Europe/Prague'
};
</script>
<footer class="bg-black mx-auto">
<div class="pt-12">
<img src={cityscape} alt="cityscape" class="object-cover w-full" />
</div>
<div class="bg-white flex flex-col justify-end">
<div
class="container mx-auto px-4 flex flex-wrap flex-col sm:flex-row justify-center items-center mt-20"
>
<div>
<img src={logo} class=" h-6" alt="logo" />
</div>
<div class="md:inline-flex gap-10 sm:ml-auto sm:mt-0 mt-10 justify-center sm:justify-start">
<div class="flex justify-center">
<a class="text-black external" href="https://docs.ethbrno.cz/events/2022" rel="noopener noreferrer"
>Documentation
</a>
</div>
<div class="flex justify-center">
<a
class="text-black external"
href="https://twitter.com/ethbrno"
rel="noopener noreferrer"
>Twitter
</a>
</div>
<div class="flex justify-center">
/join
<a class="text-black external" href="https://matrix.ethbrno.cz" rel="noopener noreferrer"
>#ethbrno:gwei.cz
</a>
</div>
</div>
</div>
<div class="text-black text-center my-16 text-sm opacity-50 leading-7">
<a href="https://git.gwei.cz/ethbrno/eb2-website" target="_blank" class="external"
>Source code</a
>
- Generated @ {new Date(time).toLocaleString('en-GB', options)} (UTC+2)
</div>
</div>
</footer>

@ -0,0 +1,83 @@
<script>
/**
* @type {boolean}
*/
export let open;
import logo from '$lib/assets/logo_black.svg';
import { page } from '$app/stores';
</script>
<nav class="flex flex-wrap items-center justify-center py-6 bg-white mx-auto sticky top-0 z-50">
<div class="container flex flex-wrap items-center justify-between xl:max-w-screen-xl px-3">
<div class="w-full relative flex justify-between xl:w-auto xl:static xl:block xl:justify-start">
<a class="text-sm leading-relaxed flex items-center justify-center" href="/" on:click={() => (open = false)}>
<img src={logo} alt="logo" class="w-[145px] h-[54px] md:mr-14 ml-4 md:ml-0" />
</a>
<button
class="text-black cursor-pointer text-xl leading-none px-3 py-1 border border-solid border-transparent rounded bg-transparent block xl:hidden outline-none focus:outline-none"
type="button"
on:click={() => (open = !open)}
>
</button>
</div>
<div
class={open ? 'block w-full' : 'xl:flex flex-grow items-center hidden'}
id="navbar"
>
<div class="text-sm pt-10 xl:pt-0 pl-4 xl:pl-0">
<strong>November 11 - 13, 2022</strong><br />
Brno, Czech Republic
</div>
<div class="flex flex-grow items-center">
<ul
class="flex flex-col xl:flex-row xl:flex-grow-0 xl:mt-0 list-none xl:ml-auto text-base flex-grow my-8 xl:my-0"
>
<li>
<a
href="/"
class="px-5 py-2 flex items-center leading-snug text-black hover:opacity-75" on:click={() => (open = false)}
class:active={$page.url.pathname === '/'}>Home</a
>
</li>
<li>
<a
href="/venues"
class="px-5 py-2 flex items-center leading-snug text-black hover:opacity-75" on:click={() => (open = false)}
class:active={$page.url.pathname === '/venues/'}>Venues</a
>
</li>
<li>
<a
href="/contributors"
class="px-5 py-2 flex items-center leading-snug text-black hover:opacity-75" on:click={() => (open = false)}
class:active={$page.url.pathname.match(/^\/contributors\//)}
>Contributors</a
>
</li>
<li>
<a
href="https://matrix.ethbrno.cz"
rel="noopener noreferrer"
target="_blank"
on:click={() => (open = false)}
class="px-5 py-2 flex items-center leading-snug text-black hover:opacity-75 external">Chat</a
>
</li>
<li class="pl-0 xl:pl-5">
<a
href="https://join.ethbrno.cz"
rel="noopener noreferrer"
target="_blank"
on:click={() => (open = false)}
class="px-5 py-2 flex items-center bg-black text-white leading-snug hover:opacity-75 external"
>Join</a
>
</li>
</ul>
</div>
</div>
</div>
</nav>

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.4 KiB

@ -0,0 +1,8 @@
/** @type {import('./$types').PageLoad} */
export const prerender = true;
export async function load() {
return {
title: 'ETHBrno² 2022'
}
}

@ -0,0 +1,9 @@
<script>
import '../app.css';
import Navigation from '$lib/Navigation.svelte';
import Footer from '$lib/Footer.svelte';
</script>
<Navigation open={false} />
<slot />
<Footer />

@ -0,0 +1,171 @@
<script>
import { sponsors } from '$lib/data.json';
const tiers = [
{
id: 'schnorr',
name: 'Schnorr'
},
{
id: 'ecdsa',
name: 'ECDSA'
},
{
id: 'aes',
name: 'AES'
},
{
id: '3des',
name: '3DES'
},
{
id: 'community',
name: 'Community'
}
];
</script>
<svelte:head>
<title>ETHBrno² 2022</title>
</svelte:head>
<section class="text-gray-400 bg-black border-b">
<div class="w-full mx-auto flex md:flex-row md:h-5/6 flex-col items-center">
<div class="md:w-5/12 md:mb-0 mb-4 md:flex justify-center md:h-[800px] bg-white">
<img src="cam2.png" class="object-cover object-center invert -ml-20 md:ml-0 md:invert-0 -mt-20 md:mt-0" alt="cam" />
</div>
<div
class="md:w-5/12 xl:pr-16 md:pr-4 pt-4 flex flex-col md:items-start md:text-left mx-auto items-center text-center text-white transition-transform px-4 md:px-0"
>
<img src="logo.svg" class="md:-ml-4 p-2 md:p-0 w-[250px] md:w-[343px] " alt="logo" />
<p class="text-xl md:text-3xl my-2">privacy {`&`} security edition</p>
<p class="text-base md:text-xl">NOVEMBER 11-13, 2022</p>
<p class="text-base md:text-xl">Brno, Czech republic</p>
<div class="h-[1px] bg-white w-full my-2 opacity-20" />
<p class="mb-8 py-4 leading-relaxed opacity-30 text-sm md:text-lg font-light" data-testid="tags">
#freedom #anonymity #non-kyc #encryption #selfsovereignty #p2p #opensource #web3
#smartcontracts #audits #vulnerabilities #analytics #wallets #scams #darkforest #mev
#zeroknowledgeproofs #cypherpunk #lunarpunk #hackathon
</p>
</div>
</div>
</section>
<section class="text-black bg-white body-font border-b">
<div class="container mx-auto flex px-5 py-12 md:py-24 md:flex-row flex-col items-center">
<div
class="xl:flex-grow md:w-1/2 xl:pl-32 md:pl-16 xl:pr-32 md:pr-16 flex flex-col md:items-start md:text-left mb-16 md:mb-0 items-center text-center"
>
<h1 class="md:text-5xl text-3xl font-bold mb-4">About</h1>
<p class="mb-8 leading-relaxed">
<a href="https://docs.ethbrno.cz" target="_blank">ETHBrno²</a> is an annual independent {`&`}
open community hackathon for supporters of decentralised finance, smart contracts and Web3 happening
in
<a href="https://en.wikipedia.org/wiki/Brno" target="_blank" class="external"
>Brno, Czech Republic</a
>. ETHBrno² is the second, and we believe the best yet, edition.
</p>
<!--p class="mb-8 leading-relaxed">
ETHBrno² events are organized by <a href="https://gwei.cz" target="_blank" class="external">Gwei.cz community</a>
with the help of the <a href="https://utxo.foundation" target="_blank" class="external">UTXO Foundation</a>.
</p-->
<p class="mb-8 leading-relaxed">
This year we are focusing on <strong>privacy and security</strong> topics.
</p>
<p class="mb-8 leading-relaxed">
You can read more in the article <a
href="https://mirror.xyz/ethbrno.eth/6BH9cUVuD85hy5O0L5cOOOE7niSA9Yo5eWsXVzKOlO4"
target="_blank"
class="external">"Announcing ETHBrno²" on Mirror</a
>.
</p>
<div class="flex justify-center flex-wrap">
<a
href="https://join.ethbrno.cz/"
class="inline-flex text-white bg-black border-0 py-2 px-6 focus:outline-none hover:bg-gray-900 text-lg external"
>Apply To Hack</a
>
<a
href="https://ethbrno.cz/sponsor-deck.pdf"
target="_blank"
rel="noopener noreferrer"
class="ml-4 inline-flex border-0 py-2 px-6 focus:outline-none hover:bg-gray-100 text-lg underline external"
>Sponsor</a
>
</div>
</div>
<div class="xl:max-w-lg xl:w-full md:w-1/2 w-[300px]">
<img class="object-cover object-center" alt="hero" src="key.png" />
</div>
</div>
</section>
<section class="text-white bg-black body-font">
<div class="container mx-auto flex px-5 py-12 md:py-24 md:flex-row flex-col-reverse items-center">
<div class="xl:max-w-lg xl:w-full md:w-1/2 w-[150px] md:mb-0 mt-10 md:mb-10 flex justify-center">
<img class="object-cover object-center" alt="hero" src="lock.png" />
</div>
<div
class="xl:flex-grow md:w-1/2 xl:pl-32 md:pl-2 xl:pr-32 md:pr-8 flex flex-col md:items-start md:text-left items-center text-center"
>
<h1 class="md:text-5xl text-3xl mb-4 font-bold text-white">Manifesto</h1>
<p class="mb-4 leading-relaxed">
We believe that privacy is a fundamental human right. And good privacy needs good security
foundations. Especially today, in a digital age full of people, organizations or governments
that want to control you, your money or your data. Therefore, the second edition of ETHBrno
(ETHBrno²) will be mainly dedicated to these important topics ― privacy & security.
</p>
<p class="mb-4 leading-relaxed">
Our hackathon is for everyone who understands the urgency of these issues and wants to help.
We want to present the current progress in this sector as well as the projects, technologies
and people involved. We are Ethereum people, but we welcome creators and fans of all
blockchains and directions.
</p>
<p class="mb-4 leading-relaxed">
Let's learn together to defend against all threats, whether it's loss of privacy and state
oppression, smart-contract exploits or simple phishing scams. Let's learn how to analyse
them retrospectively. Let's learn how to use the right tools, and if we don't have them,
let's create them together.
</p>
<p class="leading-relaxed">Don't Trust. Verify. - Run a node - Protect privacy</p>
<p class="mt-8 leading-relaxed">
<a
href="https://docs.ethbrno.cz/events/2022/hackathon"
class="inline-flex text-black bg-white border-0 py-2 px-6 focus:outline-none hover:bg-gray-600 text-lg external"
>Read more about hackathon</a
>
</p>
</div>
</div>
</section>
<section class="text-white bg-black body-font">
<div class="container mx-auto flex px-5 py-24 md:flex-row flex-col items-center">
<div
class="flex-grow w-full px-4 md:px-0 xl:pl-32 md:pl-16 xl:pr-32 md:pr-16 flex flex-col md:items-start md:text-left items-center text-center"
>
<h1 class="md:text-5xl text-3xl mb-8 font-bold text-white">Sponsors</h1>
{#each tiers as tier, tierNumber}
<div class="mb-4 flex flex-row w-full items-center">
<p class="leading-relaxed font-bold whitespace-nowrap">{tier.name}</p>
<div class="border-b border-white border-dashed w-full ml-4 opacity-30" />
<p class="whitespace-nowrap ml-4 opacity-30">Tier {tierNumber}</p>
</div>
<div
class="flex flex-col md:flex-row items-center justify-center w-full md:m-6 border-l border-white/30"
>
{#each sponsors.filter((x) => x.tier.includes(tier.id)) as sponsor}
<a href={sponsor.url} rel="noopener noreferrer" target="_blank" alt="link to">
<img
class="w-60 m-6"
src="/photos/sponsors/{sponsor.id}.png"
alt="{sponsor.name} Logo"
/>
</a>
{/each}
</div>
{/each}
</div>
</div>
</section>

@ -0,0 +1,19 @@
/** @type {import('./$types').PageLoad} */
import { error } from '@sveltejs/kit';
import { contributorTypes, contributors } from '$lib/data.json';
export const prerender = true;
export async function load({ parent, params }) {
let type = params.type.replace(/\//, "");
if (!type.trim()) {
type = 'all'
}
const typeConfig = contributorTypes[type]
if (!typeConfig) {
throw error(404, 'Not found');
}
return { type, typeConfig, contributors, contributorTypes }
}

@ -0,0 +1,81 @@
<script>
//import { contributors, contributorTypes } from '$lib/data.json';
import { base } from '$app/paths';
import { onMount } from 'svelte';
export let data;
function wrapContributor(c) {
if (c.twitter) {
c.link = 'https://twitter.com/' + c.twitter;
}
return c;
}
onMount(async () => {
//console.log(data.contributors);
const response = await fetch(`${base}/data.json`);
const result = await response.json();
data.contributors = result.contributors;
//console.log(data.contributors);
});
$: filteredContributors = data.contributors
.filter((c) => data.type === 'all' || c.roles.includes(data.typeConfig.role))
.sort((a, b) => 0.5 - Math.random())
.map(wrapContributor);
</script>
<svelte:head>
<title>Contributors{data.type !== 'all' ? `: ${data.typeConfig.title}` : ''} | ETHBrno²</title>
</svelte:head>
<section
class="text-white body-font bg-black px-2 py-6 md:py-12 flex justify-center flex-row overflow-x-scroll flex-wrap text-sm md:text-base"
>
{#each Object.entries(data.contributorTypes) as [ctKey, ct]}
<a
href="/contributors/{ctKey === 'all' ? '' : ctKey}"
class="px-3 py-2 md:px-5 md:py-2 border m-2 {ctKey === data.type
? 'text-black bg-white'
: 'hover:outline-none hover:bg-gray-600'}">{ct.title}</a
>
{/each}
</section>
<section class="text-gray-400 body-font bg-black py-6 md:py-12">
<div class=" px-5 mx-auto">
<div class="flex flex-wrap justify-center" data-testid="list">
{#if filteredContributors.length > 0}
{#each filteredContributors as item}
<div class="bg-black bg-opacity-40 p-6 h-full w-full md:w-1/3 lg:w-1/4">
<a href={item.link} target="_blank">
<img
class="h-40 md:h-60 w-full object-cover object-center mb-6 grayscale hover:grayscale-0"
loading="lazy"
src={`/photos/contributors/${item.id}.jpg`}
alt={item.desc}
/>
</a>
<h3
class="tracking-widest text-gray-400 text-xs font-medium title-font flex flex-row divide-x"
>
{#each item.roles as role}
<span class="underline">{role}</span>
{/each}
</h3>
<div class="flex flex-row mb-2 {item.remote ? 'contributor-remote' : ''}">
<a class="text-lg text-white font-medium title-font" href={item.link} target="_blank">
{item.name}
{#if item.nickname}
({item.nickname})
{/if}
</a>
</div>
<p class="leading-relaxed text-sm">{item.bio}</p>
</div>
{/each}
{:else}
<div class="p-6">Nobody's here yet.</div>
{/if}
</div>
</div>
</section>

@ -0,0 +1,13 @@
/** @type {import('./$types').PageLoad} */
import { error } from '@sveltejs/kit';
import snarkdown from 'snarkdown';
export async function load({ fetch }) {
const response = await fetch("https://raw.githubusercontent.com/ethbrno/docs/master/events/2022/hackathon/hacker-manual-wip.md").then((r) => r.text());
//console.log(response);
const compiledResponse = await snarkdown(response);
//console.log('compiledResponse is: ', compiledResponse);
return { content: compiledResponse };
}

@ -0,0 +1,11 @@
<script>
export let data;
</script>
<section class="text-white bg-black body-font">
<div class="container mx-auto py-12 md:py-24 xl:max-w-screen-xl md:px-0 px-4">
<div class="[&_h1]:header [&_h2]:subhead [&_li]:list [&_h3]:font-bold">
{@html data.content}
</div>
</div>
</section>

@ -0,0 +1,111 @@
<script>
export let data;
</script>
<svelte:head>
<title>Venues | {data.title}</title>
</svelte:head>
<section class="text-white bg-black body-font">
<div class="container mx-auto flex py-12 md:py-24 md:flex-row flex-col items-center xl:max-w-screen-xl md:px-0 px-4">
<div
class="xl:flex-grow xl:pr-24 md:pr-16 flex flex-col lg:items-start lg:text-left mb-16 md:mb-0 items-center text-center"
>
<h1 class="title-font sm:text-4xl text-3xl mb-4 font-medium text-white">
<a href="https://www.hubbrno.cz/en/" class="hover:underline"> Impact Hub Brno </a>
</h1>
<p class="leading-relaxed text-white">Opening hours:</p>
<p class="leading-relaxed mb-5 text-white">Fri Nov 11 13:00 - Sun Nov 13 20:00 (nonstop!)</p>
<div class="leading-relaxed relative mb-4">
The main venue will be a modern coworking space called Impact Hub, just a few minutes walk
from the city centre and the main train station. In less than 7 years of its existence, it
has become an important part of Brno's freelancing community, inspiring and connecting many
people. Great place for our hackathon, don't you think?
</div>
<div class="leading-relaxed relative mb-4">
Impact Hub will serve as the main basecamp for the hackathon and will be available for
hackers all day 24/7.
</div>
<div class="leading-relaxed relative mb-4">
You'll have everything you might need - different work areas (single or team, sitting or
standing), fast internet, power sockets everywhere, meeting rooms, refreshments and much
more. We want you to feel as comfortable as possible and we will do everything we can to
make that happen.
</div>
<div class="flex flex-wrap justify-center gap-4">
<a
href="https://www.openstreetmap.org/way/339769163"
target="_blank"
class="inline-flex text-black bg-white border-0 py-2 px-6 focus:outline-none hover:bg-gray-600 text-lg external"
>
OpenStreetMap
</a>
<a
href="https://goo.gl/maps/8bKsGHhVSYrF8ZmE8"
target="_blank"
class="inline-flex text-black bg-white border-0 py-2 px-6 focus:outline-none hover:bg-gray-600 text-lg external"
>
Google Maps
</a>
</div>
</div>
<div class="xl:max-w-lg xl:w-full w-5/6 flex md:justify-end">
<img
class="object-cover object-center "
decoding="async"
loading="lazy"
src="/venues/ihhero.png"
alt="venue"
/>
</div>
</div>
</section>
<section class="text-white bg-black body-font">
<div class="container mx-auto flex py-12 md:py-24 md:flex-row flex-col-reverse items-center xl:max-w-screen-xl md:px-0 px-4">
<div class="xl:max-w-lg xl:w-full md:w-1/2 w-5/6 md:mb-0 mt-10 md:mt-0">
<img
class="object-cover object-center grayscale hover:grayscale-0"
decoding="async"
loading="lazy"
src="/venues/cc1.png"
alt="venue"
/>
</div>
<div
class="xl:flex-grow md:w-1/2 xl:pl-24 md:pl-16 flex flex-col md:items-start md:text-left items-center text-center"
>
<h1 class="title-font sm:text-4xl text-3xl mb-4 font-medium text-white">Clubco Brno</h1>
<p class="leading-relaxed text-white">Opening hours:</p>
<p class="leading-relaxed mb-5 text-white">
Fri Nov 11: 14:30 - 22:00, Sat Nov 10: 9:00 - 22:00, Sun Nov 13: 9:00 - 17:00
</p>
<p class="relative mb-4">
Additional venue, only 5 minutes walk (400m) from the main venue (Impact Hub).
</p>
{' '}
<p class="relative mb-4">
It will be an additional space for hackers that offers another style, with private meeting
rooms and open workspaces. It also includes an event space where additional workshops and
lectures will be held.
</p>
<div class="relative mb-4">
This location will NOT be open 24/7, you will need to move to the Impact Hub for the night.
</div>
<div class="flex flex-wrap justify-center gap-4">
<a
href="https://www.openstreetmap.org/node/8848071783"
target="_blank"
class="inline-flex text-black bg-white border-0 py-2 px-6 focus:outline-none hover:bg-gray-600 text-lg external"
>
OpenStreetMap
</a>
<a
href="https://g.page/clubco-brno"
target="_blank"
class="inline-flex text-black bg-white border-0 py-2 px-6 focus:outline-none hover:bg-gray-600 text-lg external"
>
Google Maps
</a>
</div>
</div>
</div>
</section>

@ -0,0 +1,4 @@
<h1>We need JavaScript</h1>
<p>You reached part of the web that use javascript to fetch the data from external sources. When we had a choice between
making javascript mandatory and using a centralized infrastructure, we picked prior. Apologies for any
inconvenience.</p>

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

@ -0,0 +1,16 @@
<svg xmlns="http://www.w3.org/2000/svg">
<filter id="duotone_peachypink">
<feColorMatrix type="matrix" result="grayscale"
values="1 0 0 0 0
1 0 0 0 0
1 0 0 0 0
0 0 0 1 0" >
</feColorMatrix>
<feComponentTransfer color-interpolation-filters="sRGB" result="duotone">
<feFuncR type="table" tableValues="0.7411764706 0.9882352941"></feFuncR>
<feFuncG type="table" tableValues="0.0431372549 0.7333333333"></feFuncG>
<feFuncB type="table" tableValues="0.568627451 0.05098039216"></feFuncB>
<feFuncA type="table" tableValues="0 1"></feFuncA>
</feComponentTransfer>
</filter>
</svg>

After

Width:  |  Height:  |  Size: 704 B

@ -0,0 +1,16 @@
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//ICalendarCreator//NONSGML//EN
BEGIN:VEVENT
DTSTART;VALUE=DATE:20221111
DTEND;VALUE=DATE:20221113
SUMMARY:ETHBrno
LOCATION:Impact Hub, Brno
DESCRIPTION:ETHBrno² is an annual independent & open community hackathon (former conference) for supporters of decentralised finance, smart contracts and Web3 happening in Brno, Czech Republic. ETHBrno² is the second, and we believe the best yet, edition.
BEGIN:VALARM
TRIGGER:-PT7D
ACTION:DISPLAY
DESCRIPTION:ETHBrno
END:VALARM
END:VEVENT
END:VCALENDAR

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 337 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 598 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

@ -0,0 +1,19 @@
{
"name": "ETH Brno volume 2",
"short_name": "ETHBrno",
"icons": [
{
"src": "/icons/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/icons/android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"theme_color": "#000",
"background_color": "#000",
"display": "standalone"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

@ -0,0 +1,7 @@
<svg width="516" height="401" viewBox="0 0 516 401" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="85.7948" cy="85.7948" r="70.5424" stroke="white" stroke-width="30.5048"/>
<path d="M183.029 304.914V280.114H100.138V239.116H210.458V213.534H68.6355V280.114V304.914V376.187H210.793V350.828H100.138V304.914H183.029Z" fill="white"/>
<path d="M377.581 239.116V213.534L244.544 213.534V239.116L295.92 239.116V377.186H327.423V239.116H377.581Z" fill="white"/>
<path d="M516 378.867V216.215H484.944V282.907H438.919V216.215H407.751V378.867H438.919V308.377H484.944V378.867H516Z" fill="white"/>
<rect x="68.6355" y="152.524" width="30.5048" height="247.852" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 679 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 241 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB