diff --git a/.gitignore b/.gitignore
index d17f34632adb1768d2551edb1a9907862d6a8122..5f5db0d3a1379b2949b79c468de095de1a50ef41 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,4 +11,5 @@
 /snowflake*.zip
 /snowflake*.pom
 /snowflake*.jar
-/reference
\ No newline at end of file
+/reference
+/output
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 2b5812702a7b6f6e1e75c0ac79d2dfc2f63cdceb..0ec0d84dabf3d83f02056318bcd11afd7a3c2642 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -21,27 +21,14 @@ build:
     - docker build -t ${TEST_IMAGE} .
     - docker push $TEST_IMAGE
 
-test_obfs4proxy:
+test_lyrebird:
   stage: test
   script:
-    - docker run -v `pwd`/output:/opt/go-reproducer/output ${TEST_IMAGE} /bin/bash -c "./build-binary.py obfs4proxy && ./verify-binary.py obfs4proxy"
+    - docker run -v `pwd`/output:/opt/go-reproducer/output ${TEST_IMAGE} /bin/bash -c "./build-binary.py lyrebird && ./verify-binary.py lyrebird"
   allow_failure: true
   artifacts:
     paths:
-      - output/obfs4proxy
-    expire_in: 1 week
-    when: always
-  except:
-    - tags
-
-test_snowflake:
-  stage: test
-  script:
-    - docker run -v `pwd`/output:/opt/go-reproducer/output ${TEST_IMAGE} /bin/bash -c "./build-binary.py snowflake && ./verify-binary.py snowflake"
-  allow_failure: true
-  artifacts:
-    paths:
-      - output/snowflake
+      - output/lyrebird
     expire_in: 1 week
     when: always
   except:
@@ -50,12 +37,10 @@ test_snowflake:
 test_tag:
   stage: test
   script:
-    - docker run -v `pwd`/output:/opt/go-reproducer/output ${TEST_IMAGE} /bin/bash -c "./verify-binary.py obfs4proxy ${CI_COMMIT_REF_NAME}"
-    - docker run -v `pwd`/output:/opt/go-reproducer/output ${TEST_IMAGE} /bin/bash -c "./verify-binary.py snowflake ${CI_COMMIT_REF_NAME}"
+    - docker run -v `pwd`/output:/opt/go-reproducer/output ${TEST_IMAGE} /bin/bash -c "./verify-binary.py lyrebird ${CI_COMMIT_REF_NAME}"
   artifacts:
     paths:
-    - output/obfs4proxy
-    - output/snowflake
+    - output/lyrebird
     expire_in: 1 week
     when: always
   only:
diff --git a/build-binary.py b/build-binary.py
index 6dd281d5d69f3c8c5bd04d99124be7964fe6571c..2ca9fc687f96bc2beb3896fac8247595652a4109 100755
--- a/build-binary.py
+++ b/build-binary.py
@@ -5,7 +5,8 @@ from subprocess import check_call
 
 from utils import get_build_versions, ex, get_sha256, zip_files, get_final_file_path, \
     get_sources_file_path, get_pom_file_path, reset_time, get_version_number, check_go_version, \
-    get_version_and_tool, get_output_dir, get_platform_output_dir, GO_PATH, GO_ROOT, NDK_DIR
+    get_version_and_tool, get_output_dir, get_platform_output_dir, get_ld_flags, \
+    GO_PATH, GO_ROOT, NDK_DIR
 
 
 def main():
@@ -122,8 +123,14 @@ def build_android_arch(tool, versions, env, clang_arch, ndk_arch, abi):
 
     output_file = os.path.abspath(os.path.join(os.path.curdir, tool))
     go_flags = ['-asmflags', '-trimpath', '-o', output_file]
+    base_ld_flags = '-w -s -extldflags=-pie'
+    config_ld_flags = get_ld_flags(versions)
+    if config_ld_flags:
+        ld_flags = ['-ldflags', "%s %s" % (base_ld_flags, config_ld_flags)]
+    else:
+        ld_flags = ['-ldflags', base_ld_flags]
     repo_dir = get_repo_dir(versions)
-    ex(['go', 'build', '-buildmode=pie', '-ldflags', '-w -s -extldflags=-pie'] + go_flags +
+    ex(['go', 'build', '-buildmode=pie'] + ld_flags + go_flags +
        [os.path.join('.', versions['build_path'])], env=env, cwd=repo_dir)
     shutil.copy(output_file, tool_path)
 
@@ -165,8 +172,14 @@ def build_desktop_arch(tool, versions, platform, arch, goarch, goarm=None, outpu
 
     output_file = os.path.abspath(os.path.join(os.path.curdir, tool))
     go_flags = ['-asmflags', '-trimpath', '-o', output_file]
+    base_ld_flags = '-w -s'
+    config_ld_flags = get_ld_flags(versions)
+    if config_ld_flags:
+        ld_flags = ['-ldflags', "%s %s" % (base_ld_flags, config_ld_flags)]
+    else:
+        ld_flags = ['-ldflags', base_ld_flags]
     repo_dir = get_repo_dir(versions)
-    ex(['go', 'build', '-ldflags', '-w -s'] + go_flags + [build_path], env=env, cwd=repo_dir)
+    ex(['go', 'build'] + ld_flags + go_flags + [build_path], env=env, cwd=repo_dir)
     shutil.copy(output_file, tool_path)
 
 
diff --git a/template-lyrebird-android.pom b/template-lyrebird-android.pom
new file mode 100644
index 0000000000000000000000000000000000000000..74eacc2f5f63b6c2520f2f427c1f871136644f99
--- /dev/null
+++ b/template-lyrebird-android.pom
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.briarproject</groupId>
+  <artifactId>lyrebird-android</artifactId>
+  <name>lyrebird-android</name>
+  <version>VERSION</version>
+  <url>https://torproject.org</url>
+  <description>Repo for building lyrebird for Android.</description>
+  <licenses>
+   <license>
+     <name>BSD-3-clause</name>
+     <url>https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/lyrebird/-/blob/main/LICENSE</url>
+   </license>
+  </licenses>
+  <developers>
+    <developer>
+      <id>yawning</id>
+      <name>Yawning Angel</name>
+      <email>yawning at schwanenlied dot me</email>
+    </developer>
+    <developer>
+      <id>torproject</id>
+      <name>Tor Project</name>
+      <email>frontdesk@rt.torproject.org</email>
+    </developer>
+  </developers>
+  <scm>
+    <connection>scm:https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/lyrebird.git</connection>
+    <developerConnection>scm:git@gitlab.torproject.org:tpo/anti-censorship/pluggable-transports/lyrebird.git</developerConnection>
+    <url>scm:https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/lyrebird.git</url>
+  </scm>
+</project>
diff --git a/template-lyrebird-linux.pom b/template-lyrebird-linux.pom
new file mode 100644
index 0000000000000000000000000000000000000000..f010b110586031da78135d80821396c6bfc16e65
--- /dev/null
+++ b/template-lyrebird-linux.pom
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.briarproject</groupId>
+  <artifactId>lyrebird-linux</artifactId>
+  <name>lyrebird-linux</name>
+  <version>VERSION</version>
+  <url>https://torproject.org</url>
+  <description>Repo for building lyrebird for Linux.</description>
+  <licenses>
+   <license>
+     <name>BSD-3-clause</name>
+     <url>https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/lyrebird/-/blob/main/LICENSE</url>
+   </license>
+  </licenses>
+  <developers>
+    <developer>
+      <id>yawning</id>
+      <name>Yawning Angel</name>
+      <email>yawning at schwanenlied dot me</email>
+    </developer>
+    <developer>
+      <id>torproject</id>
+      <name>Tor Project</name>
+      <email>frontdesk@rt.torproject.org</email>
+    </developer>
+  </developers>
+  <scm>
+    <connection>scm:https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/lyrebird.git</connection>
+    <developerConnection>scm:git@gitlab.torproject.org:tpo/anti-censorship/pluggable-transports/lyrebird.git</developerConnection>
+    <url>scm:https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/lyrebird.git</url>
+  </scm>
+</project>
diff --git a/template-lyrebird-macos.pom b/template-lyrebird-macos.pom
new file mode 100644
index 0000000000000000000000000000000000000000..467129034f58e1c4d7be30cd8b723a0d72037826
--- /dev/null
+++ b/template-lyrebird-macos.pom
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.briarproject</groupId>
+  <artifactId>lyrebird-macos</artifactId>
+  <name>lyrebird-macos</name>
+  <version>VERSION</version>
+  <url>https://torproject.org</url>
+  <description>Repo for building lyrebird for macOS.</description>
+  <licenses>
+   <license>
+     <name>BSD-3-clause</name>
+     <url>https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/lyrebird/-/blob/main/LICENSE</url>
+   </license>
+  </licenses>
+  <developers>
+    <developer>
+      <id>yawning</id>
+      <name>Yawning Angel</name>
+      <email>yawning at schwanenlied dot me</email>
+    </developer>
+    <developer>
+      <id>torproject</id>
+      <name>Tor Project</name>
+      <email>frontdesk@rt.torproject.org</email>
+    </developer>
+  </developers>
+  <scm>
+    <connection>scm:https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/lyrebird.git</connection>
+    <developerConnection>scm:git@gitlab.torproject.org:tpo/anti-censorship/pluggable-transports/lyrebird.git</developerConnection>
+    <url>scm:https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/lyrebird.git</url>
+  </scm>
+</project>
diff --git a/template-lyrebird-windows.pom b/template-lyrebird-windows.pom
new file mode 100644
index 0000000000000000000000000000000000000000..ddee6435282398d23148424e7c19dbba9ad742b8
--- /dev/null
+++ b/template-lyrebird-windows.pom
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.briarproject</groupId>
+  <artifactId>lyrebird-windows</artifactId>
+  <name>lyrebird-windows</name>
+  <version>VERSION</version>
+  <url>https://torproject.org</url>
+  <description>Repo for building lyrebird for Windows.</description>
+  <licenses>
+   <license>
+     <name>BSD-3-clause</name>
+     <url>https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/lyrebird/-/blob/main/LICENSE</url>
+   </license>
+  </licenses>
+  <developers>
+    <developer>
+      <id>yawning</id>
+      <name>Yawning Angel</name>
+      <email>yawning at schwanenlied dot me</email>
+    </developer>
+    <developer>
+      <id>torproject</id>
+      <name>Tor Project</name>
+      <email>frontdesk@rt.torproject.org</email>
+    </developer>
+  </developers>
+  <scm>
+    <connection>scm:https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/lyrebird.git</connection>
+    <developerConnection>scm:git@gitlab.torproject.org:tpo/anti-censorship/pluggable-transports/lyrebird.git</developerConnection>
+    <url>scm:https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/lyrebird.git</url>
+  </scm>
+</project>
diff --git a/utils.py b/utils.py
index c45e88dc4d28dbecad3622f9b6d8fa225fea6f3a..bf2740876ef95193b61b93465c425aee83ac2f57 100644
--- a/utils.py
+++ b/utils.py
@@ -31,6 +31,8 @@ def get_build_versions(tool, tag):
     versions[tool][tag]['tag'] = tag
     return tag, versions[tool][tag]
 
+def get_ld_flags(versions):
+    return versions['ld_flags'] if 'ld_flags' in versions else ''
 
 def check_go_version(versions):
     # Check if proper Go version is installed (trailing space, because 'go1.10' in 'go1.10.1')
diff --git a/versions.json b/versions.json
index 998786096e7ce2bae060867c7d9d9aaa3df0903d..99565d7589f5a965a354cca6c77bf941b3a68a7b 100644
--- a/versions.json
+++ b/versions.json
@@ -1,4 +1,23 @@
 {
+  "lyrebird": {
+    "0.5.0-2": {
+      "repo_url": "https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/lyrebird.git",
+      "revision": "297ae51866f56146f0523bcf2fd84e0b6ee8a88a",
+      "ld_flags": "-X main.lyrebirdVersion=0.5.0",
+      "build_path": "cmd/lyrebird",
+      "repo_dir": "lyrebird",
+      "go": {
+        "version": "go1.21.13",
+        "sha256": "71fb31606a1de48d129d591e8717a63e0c5565ffba09a24ea9f899a13214c34d"
+      },
+      "ndk": {
+        "url": "https://dl.google.com/android/repository/android-ndk-r23c-linux.zip",
+        "revision": "23.2.8568313",
+        "sha256": "6ce94604b77d28113ecd588d425363624a5228d9662450c48d2e4053f8039242"
+      },
+      "timestamp": "201001010000.00"
+    }
+  },
   "obfs4proxy": {
     "0.0.14-tor2": {
       "repo_url": "https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/obfs4.git",
@@ -177,4 +196,4 @@
       "timestamp": "201001010000.00"
     }
   }
-}
\ No newline at end of file
+}