diff --git a/hmml_to_html/hmml_to_html.c b/hmml_to_html/hmml_to_html.c
index 5983101..4ef0b44 100644
--- a/hmml_to_html/hmml_to_html.c
+++ b/hmml_to_html/hmml_to_html.c
@@ -127,81 +127,25 @@ category_medium CategoryMedium[] =
 
 #define ArrayCount(A) sizeof(A)/sizeof(*(A))
 
-#define ClaimBuffer(MemoryArena, ClaimedMemory, Buffer, ID, Size) if(__ClaimBuffer(MemoryArena, ClaimedMemory, Buffer, ID, Size))\
-{\
-    fprintf(stderr, "%s:%d: MemoryArena cannot contain %s of size %d\n", __FILE__, __LINE__, ID, Size);\
-    hmml_free(&HMML);\
-    FreeBuffer(MemoryArena);\
-    return 1;\
-};
-
+__attribute__ ((format (printf, 2, 3)))
 void
-FreeBuffer(buffer *Buffer)
+CopyString(char Dest[], char *Format, ...)
 {
-    free(Buffer->Location);
+    va_list Args;
+    va_start(Args, Format);
+    vsprintf(Dest, Format, Args);
+    va_end(Args);
 }
 
 int
-__ClaimBuffer(buffer *MemoryArena, int *ClaimedMemory, buffer *Buffer, char *ID, int Size)
+StringLength(char *String)
 {
-    if(*ClaimedMemory + Size > MemoryArena->Size)
+    int i = 0;
+    while(String[i])
     {
-        return 1;
+        ++i;
     }
-    Buffer->Location = MemoryArena->Location + *ClaimedMemory;
-    Buffer->Size = Size;
-    Buffer->ID = ID;
-    *ClaimedMemory += Buffer->Size;
-    *Buffer->Location = '\0';
-    Buffer->Ptr = Buffer->Location;
-#if DEBUG
-    printf("  Claimed: %s: %d\n"
-           "    Total ClaimedMemory: %d\n\n", Buffer->ID, Buffer->Size, *ClaimedMemory);
-#endif
-    return 0;
-}
-
-void
-DeclaimBuffer(buffer *Buffer, int *ClaimedMemory)
-{
-    *Buffer->Location = '\0';
-    *ClaimedMemory -= Buffer->Size;
-#if DEBUG
-    printf("Declaimed: %s\n"
-           "    Total ClaimedMemory: %d\n\n", Buffer->ID, *ClaimedMemory);
-#endif
-}
-
-int
-TimecodeToSeconds(char *Timecode)
-{
-    int HMS[3] = { 0, 0, 0 }; // 0 == Seconds; 1 == Minutes; 2 == Hours
-    int Colons = 0;
-    while(*Timecode)
-    {
-        //if((*Timecode < '0' || *Timecode > '9') && *Timecode != ':') { return FALSE; }
-
-        if(*Timecode == ':')
-        {
-            ++Colons;
-            //if(Colons > 2) { return FALSE; }
-            for(int i = 0; i < Colons; ++i)
-            {
-                HMS[Colons - i] = HMS[Colons - (i + 1)];
-            }
-            HMS[0] = 0;
-        }
-        else
-        {
-            HMS[0] = HMS[0] * 10 + *Timecode - '0';
-        }
-
-        ++Timecode;
-    }
-
-    //if(HMS[0] > 59 || HMS[1] > 59 || Timecode[-1] == ':') { return FALSE; }
-
-    return HMS[2] * 60 * 60 + HMS[1] * 60 + HMS[0];
+    return i;
 }
 
 void
@@ -223,16 +167,6 @@ CopyBuffer(buffer *Dest, buffer *Src)
     *Dest->Ptr = '\0';
 }
 
-__attribute__ ((format (printf, 2, 3)))
-void
-CopyString(char Dest[], char *Format, ...)
-{
-    va_list Args;
-    va_start(Args, Format);
-    vsprintf(Dest, Format, Args);
-    va_end(Args);
-}
-
 int
 CopyStringNoFormat(char *Dest, char *String)
 {
@@ -259,17 +193,6 @@ CopyStringNoFormatT(char *Dest, char *String, char Terminator)
     return Length;
 }
 
-int
-StringLength(char *String)
-{
-    int i = 0;
-    while(String[i])
-    {
-        ++i;
-    }
-    return i;
-}
-
 __attribute__ ((format (printf, 2, 3)))
 void
 CopyStringToBuffer(buffer *Dest, char *Format, ...)
@@ -402,6 +325,153 @@ StringsDifferT(char *A, // NOTE(matt): Null-terminated string
     }
 }
 
+int
+MakeDir(char *Path)
+{
+    int i = StringLength(Path);
+    int Ancestors = 0;
+    while(mkdir(Path, 00755) == -1)
+    {
+        while(Path[i] != '/' && i > 0)
+        {
+            --i;
+        }
+        ++Ancestors;
+        Path[i] = '\0';
+        if(i == 0) { return 1; }
+    }
+    while(Ancestors > 0)
+    {
+        while(Path[i] != '\0')
+        {
+            ++i;
+        }
+        Path[i] = '/';
+        --Ancestors;
+        if((mkdir(Path, 00755)) == -1)
+        {
+            return 1;
+        }
+    }
+    return 0;
+}
+
+void
+FreeBuffer(buffer *Buffer)
+{
+    free(Buffer->Location);
+}
+
+#define ClaimBuffer(MemoryArena, ClaimedMemory, Buffer, ID, Size) if(__ClaimBuffer(MemoryArena, ClaimedMemory, Buffer, ID, Size))\
+{\
+    fprintf(stderr, "%s:%d: MemoryArena cannot contain %s of size %d\n", __FILE__, __LINE__, ID, Size);\
+    hmml_free(&HMML);\
+    FreeBuffer(MemoryArena);\
+    return 1;\
+};
+
+int
+__ClaimBuffer(buffer *MemoryArena, int *ClaimedMemory, buffer *Buffer, char *ID, int Size)
+{
+    if(*ClaimedMemory + Size > MemoryArena->Size)
+    {
+        return 1;
+    }
+    Buffer->Location = MemoryArena->Location + *ClaimedMemory;
+    Buffer->Size = Size;
+    Buffer->ID = ID;
+    *ClaimedMemory += Buffer->Size;
+    *Buffer->Location = '\0';
+    Buffer->Ptr = Buffer->Location;
+#if DEBUG
+    printf("  Claimed: %s: %d\n"
+           "    Total ClaimedMemory: %d\n\n", Buffer->ID, Buffer->Size, *ClaimedMemory);
+#endif
+    return 0;
+}
+
+void
+LogUsage(buffer Buffer, char *CacheDir)
+{
+    char LogPath[255];
+    CopyString(LogPath, "%s/%s", CacheDir, "buffers.log");
+    FILE *LogFile;
+    if(!(LogFile = fopen(LogPath, "a+")))
+    {
+        MakeDir(CacheDir);
+        if(!(LogFile = fopen(LogPath, "a+")))
+        {
+            perror("LogUsage");
+            return;
+        }
+    }
+
+    fprintf(LogFile, "%s,%ld,%d\n",
+            Buffer.ID,
+            Buffer.Ptr - Buffer.Location,
+            Buffer.Size);
+    fclose(LogFile);
+}
+
+#define DeclaimBuffer(Buffer, ClaimedMemory) __DeclaimBuffer(Buffer, ClaimedMemory, CacheDir)
+
+void
+__DeclaimBuffer(buffer *Buffer, int *ClaimedMemory, char *CacheDir)
+{
+    *Buffer->Location = '\0';
+    *ClaimedMemory -= Buffer->Size;
+    float PercentageUsed = (float)(Buffer->Ptr - Buffer->Location) / Buffer->Size * 100;
+#if DEBUG
+    printf("Declaimed: %s\n"
+           "    Used: %ld / %d (%.2f%%)\n"
+           "\n"
+           "    Total ClaimedMemory: %d\n\n",
+           Buffer->ID,
+           Buffer->Ptr - Buffer->Location,
+           Buffer->Size,
+           PercentageUsed,
+           *ClaimedMemory);
+#endif
+    LogUsage(*Buffer, CacheDir);
+    if(PercentageUsed >= 80.0f)
+    {
+        // TODO(matt): Implement either dynamically growing buffers, or phoning home to matt@handmadedev.org
+        fprintf(stderr, "Warning: %s used %.2f%% of its allotted memory\n", Buffer->ID, PercentageUsed);
+    }
+}
+
+int
+TimecodeToSeconds(char *Timecode)
+{
+    int HMS[3] = { 0, 0, 0 }; // 0 == Seconds; 1 == Minutes; 2 == Hours
+    int Colons = 0;
+    while(*Timecode)
+    {
+        //if((*Timecode < '0' || *Timecode > '9') && *Timecode != ':') { return FALSE; }
+
+        if(*Timecode == ':')
+        {
+            ++Colons;
+            //if(Colons > 2) { return FALSE; }
+            for(int i = 0; i < Colons; ++i)
+            {
+                HMS[Colons - i] = HMS[Colons - (i + 1)];
+            }
+            HMS[0] = 0;
+        }
+        else
+        {
+            HMS[0] = HMS[0] * 10 + *Timecode - '0';
+        }
+
+        ++Timecode;
+    }
+
+    //if(HMS[0] > 59 || HMS[1] > 59 || Timecode[-1] == ':') { return FALSE; }
+
+    return HMS[2] * 60 * 60 + HMS[1] * 60 + HMS[0];
+}
+
 typedef struct
 {
     unsigned int Hue:16;
@@ -853,37 +923,6 @@ StringToInt(char *String)
     return Result;
 }
 
-int
-MakeDir(char *Path)
-{
-    int i = StringLength(Path);
-    int Ancestors = 0;
-    while(mkdir(Path, 00755) == -1)
-    {
-        while(Path[i] != '/' && i > 0)
-        {
-            --i;
-        }
-        ++Ancestors;
-        Path[i] = '\0';
-        if(i == 0) { return 1; }
-    }
-    while(Ancestors > 0)
-    {
-        while(Path[i] != '\0')
-        {
-            ++i;
-        }
-        Path[i] = '/';
-        --Ancestors;
-        if((mkdir(Path, 00755)) == -1)
-        {
-            return 1;
-        }
-    }
-    return 0;
-}
-
 size_t
 CurlIntoBuffer(char *InPtr, size_t CharLength, size_t Chars, char **OutputPtr)
 {
@@ -1052,7 +1091,7 @@ BuildQuote(quote_info *Info, char *Speaker, int ID, char *CacheDir)
 }
 
 void
-GenerateTopicColours(buffer *Colour, char *Topic, char *TopicsDir)
+GenerateTopicColours(char *Topic, char *TopicsDir)
 {
     for(int i = 0; i < ArrayCount(CategoryMedium); ++i)
     {
@@ -1759,7 +1798,6 @@ main(int ArgC, char **Args)
     //             FilterMedia
     //         CreditsMenu
     //     Player
-    //         Colour
     //         Annotation
     //             AnnotationHeader
     //                 AnnotationClass
@@ -1781,7 +1819,6 @@ main(int ArgC, char **Args)
     buffer CreditsMenu;
 
     buffer Player;
-    buffer Colour;
     buffer Annotation;
     buffer AnnotationHeader;
     buffer AnnotationClass;
@@ -1830,8 +1867,6 @@ main(int ArgC, char **Args)
             //             FilterMedia
             //          CreditsMenu
             //     Player
-            //         Colour
-            //         Annotation
             //     Script
             //         FilterState
 
@@ -1847,8 +1882,6 @@ main(int ArgC, char **Args)
             ClaimBuffer(&MemoryArena, &ClaimedMemory, &CreditsMenu, "CreditsMenu", Kilobytes(8));
 
             ClaimBuffer(&MemoryArena, &ClaimedMemory, &Player, "Player", Kilobytes(256));
-            ClaimBuffer(&MemoryArena, &ClaimedMemory, &Colour, "Colour", 32);
-            ClaimBuffer(&MemoryArena, &ClaimedMemory, &Annotation, "Annotation", Kilobytes(8));
 
             ClaimBuffer(&MemoryArena, &ClaimedMemory, &Script, "Script", Kilobytes(8));
             ClaimBuffer(&MemoryArena, &ClaimedMemory, &FilterState, "FilterState", Kilobytes(4));
@@ -1914,12 +1947,14 @@ goto Cleanup;
                 quote_info QuoteInfo = { 0 };
 
                 // NOTE(matt): Tree structure of "annotation local" buffer dependencies
-                // AnnotationHeader
-                //     AnnotationClass
-                //     AnnotationData
-                // Text
-                //     TopicDots
+                // Annotation
+                //     AnnotationHeader
+                //         AnnotationClass
+                //         AnnotationData
+                //     Text
+                //         TopicDots
 
+                ClaimBuffer(&MemoryArena, &ClaimedMemory, &Annotation, "Annotation", Kilobytes(8));
                 ClaimBuffer(&MemoryArena, &ClaimedMemory, &AnnotationHeader, "AnnotationHeader", 512);
                 ClaimBuffer(&MemoryArena, &ClaimedMemory, &AnnotationClass, "AnnotationClass", 256);
                 ClaimBuffer(&MemoryArena, &ClaimedMemory, &AnnotationData, "AnnotationData", 512);
@@ -2031,7 +2066,7 @@ goto Cleanup;
                         }
                         else if(Anno->markers[MarkerIndex].type == HMML_CATEGORY)
                         {
-                            GenerateTopicColours(&Colour, Anno->markers[MarkerIndex].marker, CSSDir);
+                            GenerateTopicColours(Anno->markers[MarkerIndex].marker, CSSDir);
                             if(!HasFilterMenu)
                             {
                                 HasFilterMenu = TRUE;
@@ -2293,7 +2328,7 @@ goto Cleanup;
 
                 while(MarkerIndex < Anno->marker_count)
                 {
-                    GenerateTopicColours(&Colour, Anno->markers[MarkerIndex].marker, CSSDir);
+                    GenerateTopicColours(Anno->markers[MarkerIndex].marker, CSSDir);
                     if(!HasFilterMenu)
                     {
                         HasFilterMenu = TRUE;
@@ -2356,18 +2391,19 @@ goto Cleanup;
                 CopyBuffer(&Player, &Annotation);
 
                 // NOTE(matt): Tree structure of "annotation local" buffer dependencies
-                //     TopicDots
-                // Text
-                //     AnnotationData
-                //     AnnotationClass
-                // AnnotationHeader
+                //         TopicDots
+                //     Text
+                //         AnnotationData
+                //         AnnotationClass
+                //     AnnotationHeader
+                // Annotation
 
                 DeclaimBuffer(&TopicDots, &ClaimedMemory);
                 DeclaimBuffer(&Text, &ClaimedMemory);
                 DeclaimBuffer(&AnnotationData, &ClaimedMemory);
                 DeclaimBuffer(&AnnotationClass, &ClaimedMemory);
                 DeclaimBuffer(&AnnotationHeader, &ClaimedMemory);
-                Annotation.Ptr = Annotation.Location;
+                DeclaimBuffer(&Annotation, &ClaimedMemory);
             }
 
 #if DEBUG
@@ -3193,26 +3229,22 @@ goto Cleanup;
             }
 
             // NOTE(matt): Tree structure of "global" buffer dependencies
-            //      FilterState
-            //  Script
-            //      Annotation
-            //      Colour
-            //  Player
-            //      CreditsMenu
-            //          FilterMedia
-            //          FilterTopics
-            //      FilterMenu
-            //      ReferenceMenu
-            //      QuoteMenu
-            //  Menus
+            //          FilterState
+            //      Script
+            //      Player
+            //          CreditsMenu
+            //              FilterMedia
+            //              FilterTopics
+            //          FilterMenu
+            //          ReferenceMenu
+            //          QuoteMenu
+            //      Menus
             //      Includes
             //  Master
 
 Cleanup:
             DeclaimBuffer(&FilterState, &ClaimedMemory);
             DeclaimBuffer(&Script, &ClaimedMemory);
-            DeclaimBuffer(&Annotation, &ClaimedMemory);
-            DeclaimBuffer(&Colour, &ClaimedMemory);
             DeclaimBuffer(&Player, &ClaimedMemory);
 
             DeclaimBuffer(&CreditsMenu, &ClaimedMemory);