Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 90 additions & 0 deletions app/components/pages/CodeOfConductPage.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
import StaticPage from "@/components/pages/StaticPage";

const CodeOfConductPage = () => (
<StaticPage title="Code of Conduct">
<div class="px-4 flex flex-col gap-8">
<p>
<strong>Last updated:</strong> [2025-12-27]
</p>
<section>
<h2 class="font-bold text-lg mb-2">1. Harassment & Consent</h2>
<p class="pb-2">We operate on a strict opt-in protocol.</p>
<ul class="list-disc px-6 space-y-1.5">
<li>
<strong>Respecting boundaries</strong>: If someone says "no,"
"stop," or physically disengages, the transaction is void.
Continuing to push—whether for a debate, a pitch, or a chat—is a
violation of the non-aggression principle..
</li>
<li>
<strong>Assume Zero Consent</strong>: Do not touch anyone without
explicit permission. Do not photograph anyone wearing a "no photo"
indicator where we have them.
</li>
<li>
<strong>Scope</strong>: This applies to all venues, afterparties,
and the official digital channels.
</li>
</ul>
</section>
<section>
<h2 class="font-bold text-lg mb-2">2. Shilling & Spam</h2>
<p class="pb-2">
Attention is the scarcest resource out here now. Do not steal it.
</p>
<ul class="list-disc px-6 space-y-1.5">
<li>
<strong>Signal vs noise</strong>: Do not corner people to pitch your
tokens. Aggressive shilling is taxes on our collective cognitive
load. Engage on fundamental engineering or philosophy and let price
talk in the market.
</li>
<li>
<strong>Recruitment</strong>: Headhunting is acceptable; pestering
builders in the flow state is not. Read the room.
</li>
</ul>
</section>
<section>
<h2 class="font-bold text-lg mb-2">3. Property & Commons</h2>
<p class="pb-2">
Do not let the space devolve into another tragedy of the commons.
</p>
<ul class="list-disc px-6 space-y-1.5">
<li>
<strong>Property rights</strong>: Never touch another person's
keyboard or unlocked laptop (or anything not explicitly yours,
really). Building trustless systems does not absolve us of the need
for physical integrity.
</li>
<li>
<strong>The Commons</strong>: Minimize your negative externalities.
Respect the space(s) that you occupy. Leave the environment in a
better condition than you found it.
</li>
</ul>
</section>
<section>
<h2 class="font-bold text-lg mb-2">4. Physical Security</h2>
<p class="pb-2">
The decentralized future requires each of us to be capable of
self-regulation. Do not force us to be the leviathan.
</p>
<ul class="list-disc px-6 space-y-1.5">
<li>
<strong>Zero Tolerance</strong>: Any act of harm towards
participants or staff—violence, doxxing, or harassment—results in
immediate, permanent exclusion.
</li>
<li>
<strong>Dispute Resolution</strong>: In the event of a dispute,
resolution will be determined by the sole discretion of the event
staff team.
</li>
</ul>
</section>
</div>
</StaticPage>
);

export default CodeOfConductPage;
137 changes: 137 additions & 0 deletions app/components/pages/ManifestoPage.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
import StaticPage from "@/components/pages/StaticPage";

const ManifestoPage = () => (
<StaticPage title="Manifesto">
<div class="px-4 flex flex-col gap-4">
<p>
ETHTokyo exists, because Tokyo is one of the few places where the
contradictions of Ethereum can be held without immediately resolving
them.
</p>
<p>
Protocol and culture. Finance and art. Public goods and private
ambition. Cypherpunk sovereignty and institutional legitimacy.
Technological acceleration and sustainable continuity.
</p>
<p> This is the terrain.</p>
<p>
ETHTokyo is not defined by whether we run a hackathon, a conference, a
meetup, a dinner, a research salon, or a public gathering. Formats
change. Ethereum does not need another event for the sake of an event.
What remains is our reason.
</p>
<p>
We are here to coordinate the people building credible, open,
programmable systems from Tokyo.
</p>
<p>
Ethereum has crossed an important threshold. It is no longer merely a
speculative frontier or an experiment in alternative money. The stack is
becoming real: programmable accounts, cheaper data, rollups,
zero-knowledge proofs, privacy-preserving systems, autonomous agents,
decentralized infrastructure, and new forms of digital organization are
all converging.
</p>
<p> The question is no longer whether Ethereum can exist.</p>
<p>The question is what kind of world it will make possible.</p>
<p>ETHTokyo exists to raise that question.</p>
<section>
<h2 class="font-bold text-lg mb-2">Our thesis</h2>
<p class="mb-4">
ETHTokyo is not defined by a single format, venue, or hackathon. It is
a coordination layer for Ethereum in Tokyo: a place where builders,
researchers, artists, operators, founders, institutions, and
independent weirdos can gather around a shared civilizational
question.
</p>
<p class="">
What should a credible, open, programmable society look like from
Tokyo?
</p>
</section>

<section>
<h2 class="font-bold text-lg mb-2">Why now?</h2>
<p class="mb-4">
Ethereum is no longer just a speculative frontier. The protocol stack
has matured. Account abstraction, cheaper data, rollups, privacy
research, restaking, ZK, hardware verification, and agentic execution
are converging into a new design space.
</p>
<p class="mb-4">
The question is no longer whether Ethereum can technically exist.
Rather, we're here to ask: what kind of real-world order will it make
possible?
</p>
</section>
<section>
<h2 class="font-bold text-lg mb-2">Our principles</h2>
<ol class="list-decimal ml-6 space-y-1">
<li>
<strong>Permissionlessness over gatekeeping</strong> — Anyone should
be able to build, fork, join, contribute, exit, and create without
asking institutional permission.
</li>
<li>
<strong>Commons over capture</strong> — Ethereum only matters if it
sustains infrastructure, knowledge, norms, and commons that outlive
individual cycles.
</li>
<li>
<strong>Intent over interface</strong> — Ethereum should expand
human agency first and foremost beyond wallet UX, dashboards, and
manual transaction clicking.
</li>
<li>
<strong>Verification over trust</strong> - Crypto must escape
self-referential token games; serious systems should make claims
checkable, whether they concern code, assets, compute, or
institutional infrastructure. The physical reality is our substrate.
</li>
<li>
<strong>Privacy over surveillance</strong> - Privacy is not a niche
feature or a criminal suspicion; it is a precondition for freedom,
security, experimentation, and dignity.
</li>
<li>
<strong>Pluralism over monoculture</strong> — Ethereum's strength
comes from many clients, L2s, apps, cultures, teams, and scenes, not
one official path.
</li>
<li>
<strong>Localization over globalization</strong> — ETHTokyo aims to
connect global Ethereum to Tokyo's actual cultural, institutional,
and underground reality rather than importing generic conference
aesthetics.
</li>
</ol>
</section>

<section>
<h2 class="font-bold text-lg mb-2">What ETHTokyo does</h2>
<p class="mb-4">
ETHTokyo convenes, curates, and coordinates. We are not here to
civilize the edge until it becomes harmless. We are here to protect
the edge from becoming isolated, illegible, or wasted.
</p>
<p class="mb-4">
ETHTokyo acts as the coordination layer, not a factional machine,
sponsor vehicle, or narrative cartel.
</p>
</section>

<section>
<h2 class="font-bold text-lg mb-2">Closing call</h2>
<p class="mb-4">
Tokyo has always been a city of contradiction; hypermodern and
ancient, orderly and chaotic, corporate and underground, disciplined
and playful. That contradiction is the essential to a florishing human
life. ETHTokyo exists to make that contradiction productive for
Ethereum.
</p>
</section>
</div>
</StaticPage>
);

export default ManifestoPage;
112 changes: 112 additions & 0 deletions app/components/pages/PrivacyPolicyPage.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
import StaticPage from "@/components/pages/StaticPage";

const PrivacyPolicyPage = () => (
<StaticPage title="Privacy Policy">
<div class="px-4 flex flex-col gap-8">
<p>
<strong>Last updated:</strong> [2025-12-27]
</p>
<section>
<p>
ETHTokyo (“we”, “us”, or “the event”) respects your privacy. This
Privacy Policy explains what information we collect, how we use it,
and your rights regarding your personal data when you visit{" "}
<strong>https://ethtokyo.org</strong> or participate in
ETHTokyo-related activities.
</p>
</section>
<section>
<h2 class="font-bold text-lg mb-2">1. Information We Collect</h2>
<p>
We only collect personal data that you voluntarily provide to us. This
may include:
</p>
<ul>
<li>
<strong>Email address</strong> — When you sign up for event updates,
register for the event, or contact us.
</li>
</ul>
<p>
We do <strong>not</strong> collect personal data automatically beyond
what is technically required to operate the event.
</p>
</section>
<section>
<h2 class="font-bold text-lg mb-2">2. How We Use Your Information</h2>
<p>
We use the collected information solely for the following purposes:
</p>
<ul class="list-disc px-6">
<li>Communicating event-related information</li>
<li>Sending important updates or announcements</li>
<li>Responding to inquiries and support requests</li>
</ul>
<p>
We do not sell, rent, or trade your personal data to third parties,
unless required by law.
</p>
</section>
<section>
<h2 class="font-bold text-lg mb-2">3. Third-Party Services</h2>
<p>We may use third-party services for basic operations such as:</p>
<ul class="list-disc px-6">
<li>Website hosting</li>
<li>Email delivery</li>
<li>Event registration tools</li>
</ul>
<p>
These services may process limited data (such as email addresses or IP
addresses) only as necessary to provide their functionality and in
accordance with their own privacy policies.
</p>
</section>
<section>
<h2 class="font-bold text-lg mb-2">4. Data Retention</h2>
<p>
We retain personal data only for as long as necessary to operate the
event and communicate with participants.
</p>
</section>
<section>
<h2 class="font-bold text-lg mb-2">5. Your Rights</h2>
<p>You will reserve the right at all times to:</p>
<ul class="list-disc px-6">
<li>Access your personal data</li>
<li>Request correction of inaccurate data</li>
<li>Request deletion of your data</li>
<li>Withdraw consent at any time</li>
</ul>
<p>
To exercise these rights, please contact us using the details below.
</p>
</section>
<section>
<h2 class="font-bold text-lg mb-2">6. Data Security</h2>
<p>
We take reasonable technical and organizational measures to protect
your data. However, no method of transmission over the internet is
completely secure, and we cannot guarantee absolute security.
</p>
</section>
<section>
<h2 class="font-bold text-lg mb-2">7. Changes to This Policy</h2>
<p>
We may update this Privacy Policy from time to time. Any changes will
be posted on this page. Continued use of the website after changes
constitutes acceptance of the updated policy.
</p>
</section>
<section>
<h2 class="font-bold text-lg mb-2">8. Contact</h2>
<p>
If you have any questions about this Privacy Policy or how your data
is handled, please contact us at:
</p>
<p>privsec [at] ethtokyo.org</p>
</section>
</div>
</StaticPage>
);

export default PrivacyPolicyPage;
15 changes: 4 additions & 11 deletions app/components/pages/top/PastEvents.tsx
Original file line number Diff line number Diff line change
@@ -1,21 +1,14 @@
const PastEvents = () => {
const images = [
"/images/2025/conf1.jpg",
"/images/2025/conf2.jpg",
"/images/2025/conf3.jpg",
"/images/2025/conf4.jpg",
"/images/2025/hack1.jpg",
"/images/2025/hack2.jpg",
];
import { pastEventImages } from "@/components/pages/top/data";

const PastEvents = () => {
return (
<div class="py-10 overflow-hidden">
<div class="max-w-3xl mx-auto px-4">
<h3 class="font-bold text-center text-2xl pb-8">Past events</h3>
</div>
<div class="flex overflow-hidden gap-2 md:gap-4 marquee py-4">
<div class="flex shrink-0 justify-start gap-2 md:gap-4 min-w-max animate-marquee">
{images.map((src, i) => (
{pastEventImages.map((src, i) => (
<div key={i} class="h-48 shrink-0">
<img
src={src}
Expand All @@ -31,7 +24,7 @@ const PastEvents = () => {
class="flex shrink-0 justify-start gap-2 md:gap-4 min-w-max animate-marquee"
aria-hidden="true"
>
{images.map((src, i) => (
{pastEventImages.map((src, i) => (
<div key={`dup-${i}`} class="h-48 shrink-0">
<img
src={src}
Expand Down
22 changes: 22 additions & 0 deletions app/components/pages/top/Section.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import type { Child } from "hono/jsx";

const Section = ({
title,
children,
className = "border-b",
}: {
title?: string;
children: Child;
className?: string;
}) => (
<section class={`w-full pt-8 pb-9 px-6 ${className}`}>
<div class="max-w-3xl mx-auto">
{title ? (
<h3 class="font-bold text-center text-2xl pb-5">{title}</h3>
) : null}
{children}
</div>
</section>
);

export default Section;
Loading