diff --git a/SDBD.Codec/Codec.cs b/SDBD.Codec/Codec.cs
index b03b0de..a9593c7 100644
--- a/SDBD.Codec/Codec.cs
+++ b/SDBD.Codec/Codec.cs
@@ -11,6 +11,34 @@ public class Codec : ICodec {
   }
 
   public byte[] Encode(Document document) {
-    return document.Data;
+    var dataLength = document.Data.Length;
+    var contentLength = new Dictionary<string, string> () {
+      { "content-length", dataLength.ToString() }
+    };
+    var headers = document.Metadata.Union(contentLength);
+
+    var packedHeaders = packHeaders(headers);
+    var headerLength = Convert.ToUInt16(packedHeaders.Length);
+
+    using var output = new MemoryStream();
+    output.WriteByte(0x01);
+    output.Write(BitConverter.GetBytes(headerLength));
+    output.Write(packedHeaders);
+    output.Write(document.Data);
+
+    return output.ToArray();
+  }
+
+  private byte[] packHeaders(IEnumerable<KeyValuePair<string, string>> headers) {
+    var encoder = new hpack.Encoder(0); //0 will disable dynamic table that we don't need anyways
+    
+    using var output = new MemoryStream();
+    using var writer = new BinaryWriter(output);
+
+    foreach(var (name, value) in headers) {
+      encoder.EncodeHeader(writer, name, value);
+    }
+
+    return output.ToArray();
   }
 }