diff --git a/lib/quby/compiler/services/definition_validator.rb b/lib/quby/compiler/services/definition_validator.rb
index 6cf8c58efc859c6359fd11c4e2207b955d45a87e..7193874a4797587a192b067f0df9cd9255668612 100644
--- a/lib/quby/compiler/services/definition_validator.rb
+++ b/lib/quby/compiler/services/definition_validator.rb
@@ -15,8 +15,8 @@ module Quby
 
         def validate(definition)
           questionnaire = DSL.build_from_definition(definition)
+          validate_metadata(questionnaire)
           validate_fields(questionnaire)
-          validate_title(questionnaire)
           validate_questions(questionnaire)
           validate_scores(questionnaire)
           validate_table_edgecases(questionnaire)
@@ -32,6 +32,20 @@ module Quby
                                               backtrace: exception.backtrace[0..20]})
         end
 
+        def validate_metadata(questionnaire)
+          if questionnaire.title.blank?
+            fail "Questionnaire title is missing."
+          end
+
+          if questionnaire.short_description && questionnaire.short_description.size > 255
+            fail "Questionnaire short_description is too long."
+          end
+
+          if questionnaire.description && questionnaire.description.size > 255
+            fail "Questionnaire description is too long."
+          end
+        end
+
         def validate_fields(questionnaire)
           questionnaire.fields.input_keys
                               .find { |k| !k.is_a?(Symbol) }
@@ -41,12 +55,6 @@ module Quby
                              &.tap { |k| fail "Answer key #{k} is not a symbol" }
         end
 
-        def validate_title(questionnaire)
-          if questionnaire.title.blank?
-            fail "Questionnaire title is missing."
-          end
-        end
-
         def validate_questions(questionnaire)
           questionnaire.answer_keys.each do |key|
             validate_key_format(key)
diff --git a/spec/quby/compiler/services/definition_validator_spec.rb b/spec/quby/compiler/services/definition_validator_spec.rb
index 09a1aacefd2e589e03e1ae90b091f6023cc2c4f9..84d7efb2861b036174ef4895341373062a3bbe1f 100644
--- a/spec/quby/compiler/services/definition_validator_spec.rb
+++ b/spec/quby/compiler/services/definition_validator_spec.rb
@@ -58,6 +58,22 @@ module Quby::Compiler::Services
       end
     end
 
+    describe "questionnaire metadata cannot be too long" do
+      it "throws an error if the questionnaire short_description is too long" do
+        invalid_definition = make_definition("title 'foo'; short_description \"#{"x"*256}\"")
+        invalid_definition.valid?
+        expect(invalid_definition.errors[:sourcecode].first[:message])
+          .to include("Questionnaire short_description is too long.")
+      end
+
+      it "throws an error if the questionnaire description is too long" do
+        invalid_definition = make_definition("title 'foo'; description \"#{"x"*256}\"")
+        invalid_definition.valid?
+        expect(invalid_definition.errors[:sourcecode].first[:message])
+          .to include("Questionnaire description is too long.")
+      end
+    end
+
     describe 'questions with activemodel validation errors' do
       it "throws an error if the question to be hidden does not exist" do
         invalid_definition = make_definition(<<-END)
@@ -813,8 +829,8 @@ module Quby::Compiler::Services
     describe 'when using lookup tables' do
       it 'can validate an externally referenced table' do
         definition = Quby::Compiler::Entities::Definition.new(
-          key: 'test', 
-          sourcecode: "title 'foo'; import_lookup_tree 'bar'", 
+          key: 'test',
+          sourcecode: "title 'foo'; import_lookup_tree 'bar'",
           path: 'fake definition test',
           lookup_tables: {'bar' => ""}
         )