diff --git a/set_version.sh b/set_version.sh
index 7e7ea8e7251c95d494e9f9245f46a7970d72f87f..44ddcfd6dc885be754d31e0c167709eb219b6116 100755
--- a/set_version.sh
+++ b/set_version.sh
@@ -1,3 +1,3 @@
 #!/bin/bash
-export version=0.4.1-alpha.12
+export version=0.4.1-alpha.13
 echo "pub const VERSION: &str = \"${version}\";" > src/version.rs
diff --git a/src/database/entities/user.rs b/src/database/entities/user.rs
index 48befa4db17d28bf9e42e1b06f0d262e2a7c5b35..6648ad1aec5b997bd169fe935926a3c2129a57d2 100644
--- a/src/database/entities/user.rs
+++ b/src/database/entities/user.rs
@@ -6,11 +6,15 @@ use mongodb::{
 };
 use serde::{Deserialize, Serialize};
 use validator::Validate;
+use num_enum::TryFromPrimitive;
+use ulid::Ulid;
+use std::ops;
 
 use crate::database::permissions::user::UserPermissions;
 use crate::database::*;
 use crate::notifications::websocket::is_online;
 use crate::util::result::{Error, Result};
+use crate::util::variables::EARLY_ADOPTER_BADGE;
 
 #[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
 pub enum RelationshipStatus {
@@ -30,13 +34,6 @@ pub struct Relationship {
     pub status: RelationshipStatus,
 }
 
-/*
-pub enum Badge {
-    Developer = 1,
-    Translator = 2,
-}
-*/
-
 #[derive(Serialize, Deserialize, Debug)]
 pub enum Presence {
     Online,
@@ -62,6 +59,17 @@ pub struct UserProfile {
     pub background: Option<File>,
 }
 
+#[derive(Debug, PartialEq, Eq, TryFromPrimitive, Copy, Clone)]
+#[repr(i32)]
+pub enum Badges {
+    Developer = 1,
+    Translator = 2,
+    Supporter = 4,
+    EarlyAdopter = 256
+}
+
+impl_op_ex_commutative!(+ |a: &i32, b: &Badges| -> i32 { *a | *b as i32 });
+
 // When changing this struct, update notifications/payload.rs#80
 #[derive(Serialize, Deserialize, Debug)]
 pub struct User {
@@ -110,6 +118,15 @@ impl User {
 
     /// Mutate the user object to appear as seen by user.
     pub fn with(mut self, permissions: UserPermissions<[u32; 1]>) -> User {
+        let mut badges = self.badges.unwrap_or_else(|| 0);
+        if let Ok(id) = Ulid::from_string(&self.id) {
+            if id.datetime().timestamp_millis() < *EARLY_ADOPTER_BADGE {
+                badges = badges + Badges::EarlyAdopter;
+            }
+        }
+
+        self.badges = Some(badges);
+
         if permissions.get_view_profile() {
             self.online = Some(is_online(&self.id));
         } else {
diff --git a/src/database/permissions/channel.rs b/src/database/permissions/channel.rs
index d58886b8a5535805cf34818307e59584382aff9d..2009bb4e4a58eca1f85aa8eb4946115463d9921b 100644
--- a/src/database/permissions/channel.rs
+++ b/src/database/permissions/channel.rs
@@ -16,6 +16,9 @@ pub enum ChannelPermission {
     VoiceCall = 16,
 }
 
+impl_op_ex!(+ |a: &ChannelPermission, b: &ChannelPermission| -> u32 { *a as u32 | *b as u32 });
+impl_op_ex_commutative!(+ |a: &u32, b: &ChannelPermission| -> u32 { *a | *b as u32 });
+
 bitfield! {
     pub struct ChannelPermissions(MSB0 [u32]);
     u32;
@@ -26,9 +29,6 @@ bitfield! {
     pub get_voice_call, _: 27;
 }
 
-impl_op_ex!(+ |a: &ChannelPermission, b: &ChannelPermission| -> u32 { *a as u32 | *b as u32 });
-impl_op_ex_commutative!(+ |a: &u32, b: &ChannelPermission| -> u32 { *a | *b as u32 });
-
 impl<'a> PermissionCalculator<'a> {
     pub async fn calculate_channel(self) -> Result<u32> {
         let channel = if let Some(channel) = self.channel {
diff --git a/src/util/variables.rs b/src/util/variables.rs
index 788bb94ffc5979505379ea4cd67da1ed6f316e39..9d4a136cbda329dc8a58b9e361e50b26827e2b61 100644
--- a/src/util/variables.rs
+++ b/src/util/variables.rs
@@ -64,6 +64,8 @@ lazy_static! {
     // Application Logic Settings
     pub static ref MAX_GROUP_SIZE: usize =
         env::var("REVOLT_MAX_GROUP_SIZE").unwrap_or_else(|_| "50".to_string()).parse().unwrap();
+    pub static ref EARLY_ADOPTER_BADGE: i64 =
+        env::var("REVOLT_EARLY_ADOPTER_BADGE").unwrap_or_else(|_| "0".to_string()).parse().unwrap();
 }
 
 pub fn preflight_checks() {
diff --git a/src/version.rs b/src/version.rs
index be9c2743b5bf5ea33b27253f4cf9aad586fbc5d3..3ea17218961c31e178a72f525de561152f8961ae 100644
--- a/src/version.rs
+++ b/src/version.rs
@@ -1 +1 @@
-pub const VERSION: &str = "0.4.1-alpha.12";
+pub const VERSION: &str = "0.4.1-alpha.13";