From 0649d26e9cace9a8a6b9b0176f9a68060b6eefc3 Mon Sep 17 00:00:00 2001 From: Ben Visness Date: Mon, 3 Aug 2026 21:35:19 -0500 Subject: [PATCH 01/11] Update manifesto and values for the AI Era (tm) --- src/templates/src/manifesto.html | 24 +++++++++++++++++----- src/templates/src/values.html | 34 +++++++++++--------------------- 2 files changed, 31 insertions(+), 27 deletions(-) diff --git a/src/templates/src/manifesto.html b/src/templates/src/manifesto.html index b3f2e321..0d7ddf57 100644 --- a/src/templates/src/manifesto.html +++ b/src/templates/src/manifesto.html @@ -14,8 +14,21 @@

The Handmade Manifesto


+
+
+
+ “What I cannot create,
 
I do not understand.” +
+
+ - Richard Feynman +
+
+
+ +
+

Computers are amazing.

-

Computing has changed our lives for the better. Computers allow us to learn, connect with each other, and express ourselves in amazing new ways. And every year our devices get more powerful, less expensive, and more accessible - computers today can do things we hardly dreamed of twenty years ago.

+

Computing has changed our lives for the better. Computers allow us to learn, connect with each other, and express ourselves in amazing new ways. And every year our devices get more powerful, less expensive, and more accessible – computers today can do things we hardly dreamed of twenty years ago.

So why is software so terrible?

Why do high-end gaming PCs struggle to browse the web at 60 frames per second? Why does a simple calculator need a splash screen? Why does your phone's battery still die so quickly? And why does each update make the problem worse?

@@ -23,12 +36,13 @@

So why is software so terrible?

We made it terrible.

We, programmers, have made it terrible through our thoughtless behavior. We rewrite our apps in new languages, and rather than measure anything, we just assume it will be better. We ship thousands of dependencies to our users to save ourselves a few minutes of effort. We build towers of abstractions, forget how they work, and then build new ones on top.

-

This isn't engineering. We're building Rube Goldberg machines, and users are paying the cost.

-

You may have learned that programming is about classes, monads, or type systems. You may have been taught to make your code clean, abstract, and future-proof. None of that matters when the end result is garbage.

+

This isn't engineering. We're building Rube Goldberg machines, and everyone is paying the cost.

+

You may have learned that programming is about classes, monads, or type systems. You may have been taught to make your code clean, abstract, and future-proof.

+

None of that matters when the end result is garbage.

But there is another way.

-

You can break out of this cycle. You can learn how computers actually work, so you can unleash the full potential of modern systems. You can dig deep into the tech stack and learn what others take for granted. When you run into a wall, rather than stop, you can dig under it.

-

This is our mission. You don't have to be a genius to make your software better - you just have to be willing to learn and willing to go against conventions. We're here to teach you, to inspire you, to help you break free from the mess of modern software development and make software the Handmade way.

+

You can break out of this cycle. You can learn how computers actually work, so you can unleash the full potential of modern systems. You can dig deep into the tech stack and learn what others take for granted. When you run into a wall, rather than stop, you can climb over it – or dig under it.

+

This is our mission. You don't have to be a genius to make your software better – you just have to be willing to learn and willing to go against conventions. And you don't have to depend on AI – computers are not magic, and you can just learn how they work. We're here to teach you, to inspire you, to help you break free from the mess of modern software development and make software the Handmade way.

So join us.

We know how much better software can be. The industry needs to change, and we're going to lead the way. Join us, and learn to build software by hand.

diff --git a/src/templates/src/values.html b/src/templates/src/values.html index 0c484f69..c8e98e97 100644 --- a/src/templates/src/values.html +++ b/src/templates/src/values.html @@ -12,29 +12,16 @@

Our Values

-
- -
-
-
- “What I cannot create,
 
I do not understand.” -
-
- - Richard Feynman -
-
-
-

We love learning how things work.

-

Many programmers are afraid of learning how computers work behind the scenes—but not us. We are driven to understand how systems work at every layer of the stack.

-

If someone gives us JavaScript, we’ll dig deeper into the runtime. If someone gives us C++, we’ll dig deeper into the machine code. If someone gives us machine code, we’ll dig deeper into the microarchitecture. There is a real computer behind our magic abstractions, and we want to understand what makes it tick.

+

Many programmers are afraid of learning how computers work behind the scenes, but not us. We are driven to understand how systems work at every layer of the stack.

+

If someone gives us JavaScript, we will dig deeper into the engine. If someone gives us C++, we will dig deeper into the machine code. If someone gives us machine code, we will dig deeper into the microarchitecture. There is a real computer behind our magic abstractions, and we love to learn what makes it tick.

We like to reinvent the wheel.

-

Many programmers think that writing software from scratch is a waste of time. They will criticize you for “reinventing the wheel”. They think that the hard problems have already been solved.

-

But programming is a very young field. Much of the world’s software is a first draft. There is so much room to innovate, and the only way to innovate is by trying new approaches to familiar problems.

-

As Casey Muratori said on day 1 of Handmade Hero, nothing we have developed in the past 30 years is a “wheel”. Our software today is like a bicycle with square wheels, awkwardly clunking along. To make better software, we must reinvent the wheel, and we love that challenge.

+

Many programmers think writing software from scratch is a waste of time. They will criticize you for “reinventing the wheel”. They think the hard problems have already been solved.

+

But programming is a very young field! Much of the world’s software is a first draft. There is so much room to innovate, and the only way to innovate is by trying new approaches to familiar problems.

+

As Casey Muratori said on day 1 of Handmade Hero, nothing we have developed in the past 30 years is a “wheel”. Software today is like a bicycle with square wheels, awkwardly clunking along. To make better software, we must reinvent the wheel, and we love that challenge.

We don’t make excuses for bad software.

There is no excuse for bad software. If it doesn’t work, it doesn’t work. If it’s slow, it’s slow. No amount of excuses can make up for software that doesn’t work the way it should.

@@ -46,15 +33,18 @@

We value competence.

We like to be self-sufficient.

We like to build things ourselves. We don’t care if someone else has already made a library or a framework for us. We’d rather write the code that we need, when we need it, and learn from what others have built instead of using it blindly.

+

We like to write the code ourselves.

+

High-level programming wisdom is born from years of lower-level work. You don't know how to build a system until you've built it by hand a few times. It may be easy to use a library or prompt an AI, but by doing so you rob yourself of the understanding that makes it worthwhile.

+

We question “best practices”.

-

We don’t contort our code in weird ways, write useless tests, or type a bunch of boilerplate unless we understand why. We strive to be experts, not to blindly trust those who claim to be.

-

After all, if the “best practices” still produce terrible software, maybe the “best practices” are wrong.

+

We don’t turn our code inside out, write useless tests, or type a bunch of boilerplate unless we understand why. We strive to be experts, not to blindly trust those who claim to be.

+

After all, if the “best practices” still produce terrible software, maybe it’s the “best practices” that are wrong.

We are not “language people”.

We are not “C programmers”, “C++ programmers”, “Rust programmers”, or “web programmers”. We are programmers, and languages are tools. What actually matters is how the software works, not how the software is created.

-

We value the user more than the programmer.

+

We value the user above the programmer.

The user doesn’t care about the code. The user is not impressed by how elegant our programs are, or how quickly we wrote them. They only care if their software works, and works well.

-

We are happy when the user is happy.

+

Users can feel when software was made with care and craft. They can also feel when it was made without. Nothing we do as programmers matters unless it produces actually good software.

{{ end }} From d99f90c3e691c05414705e2fea0f74f87878f2cf Mon Sep 17 00:00:00 2001 From: Ben Visness Date: Sat, 5 Sep 2026 21:06:17 -0500 Subject: [PATCH 02/11] Update 'em more --- src/templates/src/manifesto.html | 21 ++++++++++----------- src/templates/src/values.html | 4 ++++ src/website/staticpages.go | 10 +++------- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/templates/src/manifesto.html b/src/templates/src/manifesto.html index 0d7ddf57..39abfae6 100644 --- a/src/templates/src/manifesto.html +++ b/src/templates/src/manifesto.html @@ -24,28 +24,27 @@

The Handmade Manifesto

- +

Computers are amazing.

-

Computing has changed our lives for the better. Computers allow us to learn, connect with each other, and express ourselves in amazing new ways. And every year our devices get more powerful, less expensive, and more accessible – computers today can do things we hardly dreamed of twenty years ago.

+

Computing has changed our lives for the better. Computers allow us to learn, connect with each other, and express ourselves in amazing new ways. And every year our devices get more powerful, less expensive, and more accessible – computers today can do things we hardly dreamed of just twenty years ago.

So why is software so terrible?

-

Why do high-end gaming PCs struggle to browse the web at 60 frames per second? Why does a simple calculator need a splash screen? Why does your phone's battery still die so quickly? And why does each update make the problem worse?

-

And why do we all use huge frameworks that no one understands? Why do our projects take minutes to compile? Why do we have to restart our language servers every twenty minutes? And why does everyone think this is fine?

+

Why do high-end gaming PCs struggle to browse the web at 60 frames per second? Why do simple applications need splash screens? Why does your phone's battery still die so quickly? And why does each update make the problem worse?

+

And why do we all use huge frameworks that no one understands? Why do our projects still take minutes to compile? Why do we have to restart our language servers every twenty minutes? And why does everyone think this is fine?

We made it terrible.

-

We, programmers, have made it terrible through our thoughtless behavior. We rewrite our apps in new languages, and rather than measure anything, we just assume it will be better. We ship thousands of dependencies to our users to save ourselves a few minutes of effort. We build towers of abstractions, forget how they work, and then build new ones on top.

-

This isn't engineering. We're building Rube Goldberg machines, and everyone is paying the cost.

-

You may have learned that programming is about classes, monads, or type systems. You may have been taught to make your code clean, abstract, and future-proof.

-

None of that matters when the end result is garbage.

+

We, programmers, have made it terrible through our thoughtless behavior. We rewrite our apps in new languages without measuring a thing. We buy faster computers rather than make our software faster. We ship thousands of dependencies to our users to save a few minutes of effort. We build towers of abstractions, forget how they work, and then build new ones on top.

+

This isn't engineering. We're building Rube Goldberg machines, and everyone else is paying the cost.

+

You may have learned that programming is about classes, monads, or type systems. You may have been taught to make your code clean, abstract, and future-proof. But none of that matters when the end result is garbage.

But there is another way.

-

You can break out of this cycle. You can learn how computers actually work, so you can unleash the full potential of modern systems. You can dig deep into the tech stack and learn what others take for granted. When you run into a wall, rather than stop, you can climb over it – or dig under it.

-

This is our mission. You don't have to be a genius to make your software better – you just have to be willing to learn and willing to go against conventions. And you don't have to depend on AI – computers are not magic, and you can just learn how they work. We're here to teach you, to inspire you, to help you break free from the mess of modern software development and make software the Handmade way.

+

You can fight the trends of laziness and slop. You can learn how computers actually work, so you can unleash the full potential of modern systems. You can dig deep into the tech stack and learn what others take for granted. When you run into a wall, rather than stop, you can climb over it – or dig under it.

+

This is our mission. You don't have to be a genius to make your software better – you just have to be willing to learn and willing to go against conventions. You don't have to depend on libraries, StackOverflow, or AI – computers are not magic, and you can learn how they work. We're here to teach you, to inspire you, to help you break free from the mess of modern software development and make software the Handmade way.

So join us.

-

We know how much better software can be. The industry needs to change, and we're going to lead the way. Join us, and learn to build software by hand.

+

We know how much better software can be. Join us, and learn to build software by hand.


diff --git a/src/templates/src/values.html b/src/templates/src/values.html index c8e98e97..3f47eb79 100644 --- a/src/templates/src/values.html +++ b/src/templates/src/values.html @@ -46,5 +46,9 @@

We are not “language people”.

We value the user above the programmer.

The user doesn’t care about the code. The user is not impressed by how elegant our programs are, or how quickly we wrote them. They only care if their software works, and works well.

Users can feel when software was made with care and craft. They can also feel when it was made without. Nothing we do as programmers matters unless it produces actually good software.

+ +
+ +

Explore the best Handmade projects created by the community.

{{ end }} diff --git a/src/website/staticpages.go b/src/website/staticpages.go index 602e5516..ab182f13 100644 --- a/src/website/staticpages.go +++ b/src/website/staticpages.go @@ -27,18 +27,14 @@ func Manifesto(c *RequestContext) ResponseData { func Values(c *RequestContext) ResponseData { type TemplateData struct { templates.BaseData - AboutUrl string + ProjectsUrl string } baseData := getBaseTemplateData(c, "Values", nil) - baseData.OpenGraphItems = append(baseData.OpenGraphItems, templates.OpenGraphItem{ - Property: "og:description", - Value: "“What I cannot create, I do not understand.”", - }) var res ResponseData res.MustWriteTemplate("values.html", TemplateData{ - BaseData: baseData, - AboutUrl: hmnurl.BuildAbout(), + BaseData: baseData, + ProjectsUrl: hmnurl.BuildProjectIndex(), }, c.Perf) return res } From 2a9ed550f57aedec8923325a99be270fbce07c6c Mon Sep 17 00:00:00 2001 From: Ben Visness Date: Sat, 5 Sep 2026 21:12:08 -0500 Subject: [PATCH 03/11] Actually --- src/templates/src/values.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/templates/src/values.html b/src/templates/src/values.html index 3f47eb79..834226ec 100644 --- a/src/templates/src/values.html +++ b/src/templates/src/values.html @@ -45,7 +45,7 @@

We are not “language people”.

We value the user above the programmer.

The user doesn’t care about the code. The user is not impressed by how elegant our programs are, or how quickly we wrote them. They only care if their software works, and works well.

-

Users can feel when software was made with care and craft. They can also feel when it was made without. Nothing we do as programmers matters unless it produces actually good software.

+

Users can feel when software was made with care and craft. They can also feel when it was made without. Nothing we do as programmers matters unless it actually produces good software.


From af47c465bd38823b1cbb8784acd3e7c25f7e6d66 Mon Sep 17 00:00:00 2001 From: Ben Visness Date: Sun, 6 Sep 2026 10:40:28 -0500 Subject: [PATCH 04/11] Add initial privacy policy --- src/hmnurl/urls.go | 6 ++ src/templates/src/privacy.html | 131 +++++++++++++++++++++++++++++++++ src/website/routes.go | 1 + src/website/staticpages.go | 6 ++ 4 files changed, 144 insertions(+) create mode 100644 src/templates/src/privacy.html diff --git a/src/hmnurl/urls.go b/src/hmnurl/urls.go index 5f1ae547..cf078812 100644 --- a/src/hmnurl/urls.go +++ b/src/hmnurl/urls.go @@ -344,6 +344,12 @@ func BuildAbout() string { return Url("/about", nil) } +var RegexPrivacyPolicy = regexp.MustCompile("^/privacy$") + +func BuildPrivacyPolicy() string { + return Url("/privacy", nil) +} + var RegexCommunicationGuidelines = regexp.MustCompile("^/communication-guidelines$") func BuildCommunicationGuidelines() string { diff --git a/src/templates/src/privacy.html b/src/templates/src/privacy.html new file mode 100644 index 00000000..7727c628 --- /dev/null +++ b/src/templates/src/privacy.html @@ -0,0 +1,131 @@ +{{ template "base-2024.html" . }} + +{{ define "extrahead" }} + +{{ end }} + +{{ define "content" }} +
+
+
+

Privacy Policy

+
+
+
+
+ +

As programmers, we know how much programmers care about privacy. We endeavor to only store the minimum data required to operate our services on behalf of the Handmade community, and we never share or sell user data.

+ +

This privacy policy covers this website (https://handmade.network/) and its subdomains, as well as our Discord server (https://discord.gg/hmn).

+ +

If you have any privacy-related questions, concerns, or requests, please contact us at team@handmade.network.

+ + +

General data practices

+ +

We are located in the United States and our data is hosted on US servers. Our database storage is encrypted at rest. User-created assets and media are stored in a cloud object storage service. Access to production data is restricted to site administrators.

+ +

We always endeavor to maintain strong security practices, and to follow industry-standard guidance by organizations such as OWASP.

+ + +

Explicitly-collected user data

+ +

We store the following data provided directly by users as part of our normal operation:

+ +
    +
  • Authentication information, including usernames, email addresses, passwords, and OAuth access tokens. Stored passwords are hashed and salted according to OWASP guidelines.
  • +
  • Profile information to be displayed publicly, including display names, bios, avatars, and other fields present in user settings.
  • +
  • User-created content, such as projects (and associated media), timeline posts, blog posts and forum posts.
  • +
  • Event-specific information for ticket purchasers, such as name, email address, dietary restrictions, requests for accommodation, and Stripe transaction IDs.
  • +
  • Newsletter email addresses for newsletter subscribers.
  • +
  • Other explicitly-provided user information in cases such as surveys or if users contact us for support.
  • + +
+ +

We never process or store direct payment information such as credit card numbers or bank account numbers, except in limited form (e.g. the last four digits of a credit card number). Payments are always performed externally through our payment processor, Stripe. We use Stripe's API to get information about transactions, but Stripe never permits us to see users' payment information.

+ + +

Automatically-collected user data

+ +

Some data is automatically collected as part of the normal process of operating the website:

+ +
    +
  • Basic request information, including IP address and request headers. This data is logged on our server.
  • +
  • IP addresses used for account creation, in order to help fight spam.
  • + + + +
+ +

We do not use any client-side analytics or tracking whatsoever, including in our emails.

+ + +

Discord bot data

+ +

We have a custom Discord bot as part the website codebase that provides various helpful services for the Handmade Network Discord server. The bot is special-purpose and is only used on the Handmade Network Discord. Most user interaction with the Handmade Network Discord is governed by Discord's own privacy policy, but as part of the bot's operation, we process and store some additional kinds of data from Discord:

+ +
    +
  • Message metadata, such as message ID, channel ID, and author ID. This data is stored for all messages in select channels so that we can quickly fetch messages when a user enables cross-posting.
  • +
  • +

    Message contents, including text and attachments, may be processed and stored for various purposes:

    +
      +
    1. Message contents may be read (but not stored) in order to provide automatic moderation, such as the automatic deletion of messages.
    2. +
    3. Message contents may be stored in order to enable Discord messages to be cross-posted to the website. Message contents will only be stored when the message author has linked their Discord account to their website account.
    4. +
    +
  • +
  • Profile information, such as user ID, username, and avatar. This is used to provide account information for new signups and to correlate messages to authors.
  • +
  • Role information, which allows us to grant and revoke Discord roles for community events such as jams.
  • +
+ +

When a user unlinks their Discord account, all profile and role information and all stored message contents from that Discord user are immediately deleted. Existing cross-posts are preserved.

+ + +

Third parties

+ +

We use a variety of third-party services as part of our normal operation. In some cases these third parties may require user information, but we endeavor to keep this at a minimum.

+ +

Third-party services include:

+ +
    +
  • Web hosting services, where user content and assets are routinely stored as part of normal operation.
  • +
  • Email services, for transactional emails and newsletters, where user email addresses are required.
  • +
  • Discord, for the aforementioned bot integration.
  • +
  • Stripe, for payment processing.
  • +
+ + +

User data controls

+ +

Users can edit and delete their own user-generated content, such as forum posts, timeline posts, and user profile contents, at any time.

+ +

Users with a linked Discord account can disable the cross-posting feature at any time, which will stop creating posts automatically but will not stop saving message contents. Users can unlink their account at any time, in which case all message contents will be deleted but previously created cross-posts will remain.

+ +

Users may request that their account be deleted by contacting us at the email address provided above. When an account is deleted, user-specific data and associated Discord data will be deleted, but user-generated content may be retained in anonymized form.

+ +

Users may at any time request a copy of all data associated with their user or identity. Data will be provided in a straightforward and machine-readable format.

+ + +

Data retention

+ +

Generally speaking, we retain user data for as long as that user has an active account. We delete user information immediately upon account deletion, but some user data may be retained for up to 90 days in server logs and database backups.

+ +

Additionally, we may retain some user information indefinitely as part of responsible operation:

+ +
    +
  • As mentioned above, user-generated content may be retained in anonymized form upon account deletion.
  • +
  • Banned accounts may be retained for analysis, but are still subject to data deletion requests.
  • +
  • Bounced email addresses are always retained in order to protect our sender reputation.
  • +
+ + +

Changes to this policy

+ +

Changes to our privacy policy will be announced in a notice on this website and on our Discord server.

+ + +
+ + +

Last updated on September 6, 2026. For any questions or requests, please contact us at team@handmade.network

+
+{{ end }} diff --git a/src/website/routes.go b/src/website/routes.go index 2e778e0b..9b9ae537 100644 --- a/src/website/routes.go +++ b/src/website/routes.go @@ -108,6 +108,7 @@ func NewWebsiteRoutes(conn *pgxpool.Pool, perfCollector *perf.PerfCollector) htt hmnOnly.GET(hmnurl.RegexManifesto, Manifesto) hmnOnly.GET(hmnurl.RegexValues, Values) hmnOnly.GET(hmnurl.RegexAbout, About) + hmnOnly.GET(hmnurl.RegexPrivacyPolicy, PrivacyPolicy) hmnOnly.GET(hmnurl.RegexCommunicationGuidelines, CommunicationGuidelines) hmnOnly.GET(hmnurl.RegexContactPage, ContactPage) hmnOnly.GET(hmnurl.RegexOldNewsletterSignup, func(c *RequestContext) ResponseData { diff --git a/src/website/staticpages.go b/src/website/staticpages.go index ab182f13..5bd37922 100644 --- a/src/website/staticpages.go +++ b/src/website/staticpages.go @@ -45,6 +45,12 @@ func About(c *RequestContext) ResponseData { return res } +func PrivacyPolicy(c *RequestContext) ResponseData { + var res ResponseData + res.MustWriteTemplate("privacy.html", getBaseTemplateData(c, "Privacy Policy", nil), c.Perf) + return res +} + func CommunicationGuidelines(c *RequestContext) ResponseData { baseData := getBaseTemplateData(c, "Communication Guidelines", nil) baseData.OpenGraphItems = append(baseData.OpenGraphItems, templates.OpenGraphItem{ From 7ff752c341ef787358838e3478e9ae1b3a3ddf6c Mon Sep 17 00:00:00 2001 From: Ben Visness Date: Sun, 6 Sep 2026 11:34:03 -0500 Subject: [PATCH 05/11] Update privacy policy --- src/templates/src/privacy.html | 38 ++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/src/templates/src/privacy.html b/src/templates/src/privacy.html index 7727c628..62ae0030 100644 --- a/src/templates/src/privacy.html +++ b/src/templates/src/privacy.html @@ -34,15 +34,14 @@

Explicitly-collected user data

  • Authentication information, including usernames, email addresses, passwords, and OAuth access tokens. Stored passwords are hashed and salted according to OWASP guidelines.
  • -
  • Profile information to be displayed publicly, including display names, bios, avatars, and other fields present in user settings.
  • +
  • Profile information, including public-visible data such as display names, bios, and avatars, as well as behind-the-scenes info such as email addresses and linked third-party accounts.
  • User-created content, such as projects (and associated media), timeline posts, blog posts and forum posts.
  • Event-specific information for ticket purchasers, such as name, email address, dietary restrictions, requests for accommodation, and Stripe transaction IDs.
  • Newsletter email addresses for newsletter subscribers.
  • Other explicitly-provided user information in cases such as surveys or if users contact us for support.
  • -
-

We never process or store direct payment information such as credit card numbers or bank account numbers, except in limited form (e.g. the last four digits of a credit card number). Payments are always performed externally through our payment processor, Stripe. We use Stripe's API to get information about transactions, but Stripe never permits us to see users' payment information.

+

We never process or store direct payment information such as credit card numbers or bank account numbers. Payments are always performed externally through our payment processor, Stripe. We use Stripe's API to get information about transactions, but Stripe never permits us to see users' payment information.

Automatically-collected user data

@@ -51,13 +50,10 @@

Automatically-collected user data

  • Basic request information, including IP address and request headers. This data is logged on our server.
  • -
  • IP addresses used for account creation, in order to help fight spam.
  • - - - +
  • Information used for account creation, including usernames, email addresses, and IP addresses, in order to help fight spam.
-

We do not use any client-side analytics or tracking whatsoever, including in our emails.

+

We do not use client-side analytics or tracking, including in our emails. We only use cookies for strictly necessary purposes, such as authentication.

Discord bot data

@@ -74,29 +70,39 @@

Discord bot data

  • Profile information, such as user ID, username, and avatar. This is used to provide account information for new signups and to correlate messages to authors.
  • -
  • Role information, which allows us to grant and revoke Discord roles for community events such as jams.
  • -

    When a user unlinks their Discord account, all profile and role information and all stored message contents from that Discord user are immediately deleted. Existing cross-posts are preserved.

    +

    When a user unlinks their Discord account, all profile information except the Discord user ID and all stored message text from that Discord user are immediately deleted. Existing cross-posts are preserved.

    + + +

    Twitch bot data

    + +

    We have a feature on our Discord server that posts in a channel when community members stream on Twitch. To enable this feature, we subscribe to webhook events from Twitch and store the following data:

    + +
      +
    • Basic channel info, including ID and channel name.
    • +
    • Stream and VOD info, including ID, title, category, tags, and start and end times.
    • +
    • Webhook events, which we store in full for a limited time for debugging purposes.
    • +

    Third parties

    We use a variety of third-party services as part of our normal operation. In some cases these third parties may require user information, but we endeavor to keep this at a minimum.

    -

    Third-party services include:

    +

    Third-party services that may encounter user data include:

      -
    • Web hosting services, where user content and assets are routinely stored as part of normal operation.
    • -
    • Email services, for transactional emails and newsletters, where user email addresses are required.
    • -
    • Discord, for the aforementioned bot integration.
    • +
    • DigitalOcean, our web hosting service, where user content and assets are routinely stored as part of normal operation.
    • +
    • Postmark, for transactional emails and newsletters, where user email addresses are required.
    • +
    • Cloudflare, for networking and site protection.
    • Stripe, for payment processing.

    User data controls

    -

    Users can edit and delete their own user-generated content, such as forum posts, timeline posts, and user profile contents, at any time.

    +

    Users can edit their own user-generated content, such as forum posts, timeline posts, and user profile contents, at any time. Most user-generated content can be deleted by users at any time; some, like projects, can only be deleted by a website administrator upon request.

    Users with a linked Discord account can disable the cross-posting feature at any time, which will stop creating posts automatically but will not stop saving message contents. Users can unlink their account at any time, in which case all message contents will be deleted but previously created cross-posts will remain.

    @@ -117,6 +123,8 @@

    Data retention

  • Bounced email addresses are always retained in order to protect our sender reputation.
  • +

    Webhook events from Twitch are retained in full for four days to facilitate debugging.

    +

    Changes to this policy

    From 670450b60ed033fba97b0882625c9d05ffb8a34e Mon Sep 17 00:00:00 2001 From: Ben Visness Date: Sun, 6 Sep 2026 11:37:15 -0500 Subject: [PATCH 06/11] Fix wonky italics --- src/templates/src/privacy.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/templates/src/privacy.html b/src/templates/src/privacy.html index 62ae0030..0b36e901 100644 --- a/src/templates/src/privacy.html +++ b/src/templates/src/privacy.html @@ -134,6 +134,6 @@

    Changes to this policy


    -

    Last updated on September 6, 2026. For any questions or requests, please contact us at team@handmade.network

    +

    Last updated on September 6, 2026. For any questions or requests, please contact us at team@handmade.network.

    {{ end }} From 4a79d799e894faf1ebf3d92ab77d9b29ea3e149d Mon Sep 17 00:00:00 2001 From: Ben Visness Date: Sun, 6 Sep 2026 11:51:41 -0500 Subject: [PATCH 07/11] Parentheseses --- src/templates/src/privacy.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/templates/src/privacy.html b/src/templates/src/privacy.html index 0b36e901..a8e86e49 100644 --- a/src/templates/src/privacy.html +++ b/src/templates/src/privacy.html @@ -72,7 +72,7 @@

    Discord bot data

  • Profile information, such as user ID, username, and avatar. This is used to provide account information for new signups and to correlate messages to authors.
  • -

    When a user unlinks their Discord account, all profile information except the Discord user ID and all stored message text from that Discord user are immediately deleted. Existing cross-posts are preserved.

    +

    When a user unlinks their Discord account, all profile information (except the Discord user ID) and all stored message text from that Discord user are immediately deleted. Existing cross-posts are preserved.

    Twitch bot data

    From 2c843ac3f5e4362ec3acdb9f89e3311249805b72 Mon Sep 17 00:00:00 2001 From: Ben Visness Date: Sun, 6 Sep 2026 15:04:33 -0500 Subject: [PATCH 08/11] Add AI policy --- src/hmnurl/urls.go | 6 ++ src/templates/src/ai_policy.html | 96 ++++++++++++++++++++++++++++++++ src/website/routes.go | 1 + src/website/staticpages.go | 6 ++ 4 files changed, 109 insertions(+) create mode 100644 src/templates/src/ai_policy.html diff --git a/src/hmnurl/urls.go b/src/hmnurl/urls.go index cf078812..ed1eb8cc 100644 --- a/src/hmnurl/urls.go +++ b/src/hmnurl/urls.go @@ -350,6 +350,12 @@ func BuildPrivacyPolicy() string { return Url("/privacy", nil) } +var RegexAIPolicy = regexp.MustCompile("^/ai-policy$") + +func BuildAIPolicy() string { + return Url("/ai-policy", nil) +} + var RegexCommunicationGuidelines = regexp.MustCompile("^/communication-guidelines$") func BuildCommunicationGuidelines() string { diff --git a/src/templates/src/ai_policy.html b/src/templates/src/ai_policy.html new file mode 100644 index 00000000..d1a12498 --- /dev/null +++ b/src/templates/src/ai_policy.html @@ -0,0 +1,96 @@ +{{ template "base-2024.html" . }} + +{{ define "extrahead" }} + +{{ end }} + +{{ define "content" }} +
    +
    +
    +

    AI Policy

    +
    +
    +
    +
    + +

    The Handmade Network exists to promote the development of high-quality software and foster a community of programmers who enjoy and deeply understand programming. We recognize that AI tools are powerful, but because they make it easy to produce code without understanding, AI tends to go against the values of this community in practice.

    + +

    Our goal with this policy is not to forbid the responsible use of AI. Instead, our AI policy is designed to put boundaries on AI use that preserve the community’s values and provide guidance on how to use AI in ways we consider responsible.

    + +

    Please remember: We do NOT believe that it is impossible to create useful (or even high-quality) software using the tools and practices forbidden here. If we forbid a practice, that ONLY means that it goes against our community values.

    + + +

    No vibe-coding

    + +

    We are firmly against “vibe-coding”, by which we mean “producing software without looking at the code”. Vibe-coded projects are not allowed to be shared under any circumstances. For discussion purposes, vibe-coding should be considered off-topic for the community.

    + +

    The Handmade community has always encouraged its members to build things for themselves, whether for self-sufficiency, education, or simply the joy of programming. We care about what the computer is actually doing, and the best way to understand this will always be to write the code yourself, but reading the code is the bare minimum.

    + + +

    No AI prose

    + +

    It is never acceptable for any of your communication within the community to be generated by AI. This includes messages on the website and Discord, blog posts, READMEs, and any other text authored by you and intended to be read by members of the community.

    + +

    It is rude to expect others to put more effort into reading than you put into writing. Furthermore, in an online community, you are the words you write. Your words reveal your personality, your background, your experience, and your understanding. Writing is also thinking; by writing about a subject, you clarify your own understanding of it, and become a better community member and a better engineer.

    + +

    We would always rather read broken English or a half-finished blog post instead of sanitized AI prose.

    + + +

    All projects require AI disclosure

    + +

    All projects on the website must disclose how they use generative AI, including for prototypes, secondary artifacts like tests and build scripts, and purposes other than code generation. This gives the community and its leadership the information they need to judge whether a project is a good fit for Handmade values.

    + +

    We understand that many community members are using AI in ways they feel are responsible and in line with the Handmade ethos, and we wish to respect that, while recognizing that opinions vary widely within the community on which kinds of AI use are acceptable. Disclosure is the most practical way for us to navigate this tension.

    + + +

    Restrictions on Discord

    + +

    Some channels on the Handmade Network Discord server have additional restrictions on AI content:

    + +
      +
    • Discussion of generative AI is forbidden in #general. This ensures that community members always have a space they can visit for AI-free programming discussion. General discussion of generative AI is permitted in other channels such as #undefined-behavior.
    • +
    • All #project-showcase posts must be Zero AI*. The showcase channel is our community’s greatest source of inspiration, and should be the clearest expression of our values. Projects that use some amount of AI may still be discussed in other channels like #workspace.
    • +
    + +

    By “Zero AI*” we mean that the material being showcased has zero AI generated code, in all respects (including build scripts and tests, if applicable), with two exceptions:

    + +
      +
    1. Using AI as a search tool is acceptable. For the purposes of this policy, we do not consider copy-paste of AI search results to be “AI codegen”, although you really ought to read and understand it carefully.
    2. +
    3. Using AI for entirely mechanical and deterministic purposes is acceptable, e.g. generating bindings or data tables. In such cases, the end result is indistinguishable from handwritten code.
    4. +
    + +

    The #project-showcase restriction applies only to the material being showcased, not the entire project. The author of a project that has disclosed AI use may therefore still share updates in #project-showcase as long as AI was not involved in the material being showcased.

    + + +

    FAQ

    + +

    Can I use AI to find bugs or do security analysis?

    + +

    Yes. Just don’t be too eager to apply an AI-suggested fix :)

    + +

    I have no sense of aesthetics. Can I use AI to help my projects look more appealing?

    + +

    We do not draw a distinction between AI-generated styles and AI-generated code. As with prose, we would rather see programmer UI than artificially polished UI. If you want to make your project look better, the community is full of people who would be happy to help!

    + +

    As for assets, while we have no specific rules against AI-generated media, you are strongly discouraged from using AI assets in your projects. We like programmer art!

    + +

    I am a beginner. Is it ok to use AI to find my way around?

    + +

    We understand that AI can be very helpful as a beginner tool, but please don’t take shortcuts! We pride ourselves on being welcoming to beginners and willing to answer stupid questions, and are happy to provide guidance. We also love when beginners share their work, so don’t be afraid to engage with the community. We were all once beginners.

    + +

    What’s wrong with using AI for tests?

    + +

    Testing is a serious and important skill in programming that needs to be developed like any other. Programmers who are good at testing their code have developed their instincts through experience, and often employ a variety of techniques to make their tests more coherent, maintainable, and effective.

    + +

    What’s wrong with using AI for build scripts?

    + +

    Your build script is a critical part of your project that also deserves care and attention. If your build script is so complicated that you need an AI to write it for you, perhaps you just need to simplify your builds. Your future self, and future coworkers, will thank you for taking your build seriously!

    + + +
    + + +

    Last updated on September 6, 2026.

    +
    +{{ end }} diff --git a/src/website/routes.go b/src/website/routes.go index 9b9ae537..ef49ae4b 100644 --- a/src/website/routes.go +++ b/src/website/routes.go @@ -109,6 +109,7 @@ func NewWebsiteRoutes(conn *pgxpool.Pool, perfCollector *perf.PerfCollector) htt hmnOnly.GET(hmnurl.RegexValues, Values) hmnOnly.GET(hmnurl.RegexAbout, About) hmnOnly.GET(hmnurl.RegexPrivacyPolicy, PrivacyPolicy) + hmnOnly.GET(hmnurl.RegexAIPolicy, AIPolicy) hmnOnly.GET(hmnurl.RegexCommunicationGuidelines, CommunicationGuidelines) hmnOnly.GET(hmnurl.RegexContactPage, ContactPage) hmnOnly.GET(hmnurl.RegexOldNewsletterSignup, func(c *RequestContext) ResponseData { diff --git a/src/website/staticpages.go b/src/website/staticpages.go index 5bd37922..82e194ca 100644 --- a/src/website/staticpages.go +++ b/src/website/staticpages.go @@ -51,6 +51,12 @@ func PrivacyPolicy(c *RequestContext) ResponseData { return res } +func AIPolicy(c *RequestContext) ResponseData { + var res ResponseData + res.MustWriteTemplate("ai_policy.html", getBaseTemplateData(c, "AI Policy", nil), c.Perf) + return res +} + func CommunicationGuidelines(c *RequestContext) ResponseData { baseData := getBaseTemplateData(c, "Communication Guidelines", nil) baseData.OpenGraphItems = append(baseData.OpenGraphItems, templates.OpenGraphItem{ From 13fda0a57575dfaabcef7c4ed88276e569a4bedd Mon Sep 17 00:00:00 2001 From: Ben Visness Date: Sun, 6 Sep 2026 15:06:48 -0500 Subject: [PATCH 09/11] About tweaks --- src/templates/src/about.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/templates/src/about.html b/src/templates/src/about.html index 1966a4e3..4e7053d8 100644 --- a/src/templates/src/about.html +++ b/src/templates/src/about.html @@ -13,7 +13,7 @@

    The Handmade Network was founded by Abner Coimbre as a community for fans of Handmade Hero, a Twitch series where games industry veteran Casey Muratori teaches you how to make a game and engine from scratch. Since then, the community has grown massively, launched many careers, and spawned amazing projects that thousands of people use every day. Handmade Hero is no longer active, but Casey is still producing high-quality programming education through Computer, Enhance!

    - The Handmade Network is an initiative of the Handmade Software Foundation, a (soon-to-be) 501(c)(6) nonprofit corporation. + The Handmade Network is an initiative of the Handmade Software Foundation, a 501(c)(6) nonprofit corporation.

    @@ -30,7 +30,7 @@

    Lead, Foundation President

    As lead and foundation president, Ben sets the vision and direction for the Handmade community and writes a lot of web pages like this one. His goal is to foster the development of Handmade software and Handmade programmers, and to move the software industry toward a new future where our "high-level" tools are built on solid low-level foundations.

    - On the professional side, Ben works on WebAssembly at Mozilla within the SpiderMonkey team. Before this, he spent many years as a web developer building apps and backend services, with a focus on performance. He also acts as lead mentor of a FIRST Robotics team. + On the professional side, Ben works on WebAssembly at Mozilla within the SpiderMonkey team. Before this, he spent many years as a web developer building apps and backend services. He also mentors a FIRST Robotics team.