diff --git a/src/docs/user/configuration/custom_fields.diviner b/src/docs/user/configuration/custom_fields.diviner
--- a/src/docs/user/configuration/custom_fields.diviner
+++ b/src/docs/user/configuration/custom_fields.diviner
@@ -103,6 +103,8 @@
     type. See below.
   - **instructions**: Optional block of remarkup text which will appear
     above the control when rendered on the edit view.
+  - **placeholder**: A placeholder text that appears on text boxes. Only
+    supported in text, int and remarkup fields (optional).
 
 The `strings` value supports different strings per control type. They are:
 
diff --git a/src/infrastructure/customfield/standard/PhabricatorStandardCustomField.php b/src/infrastructure/customfield/standard/PhabricatorStandardCustomField.php
--- a/src/infrastructure/customfield/standard/PhabricatorStandardCustomField.php
+++ b/src/infrastructure/customfield/standard/PhabricatorStandardCustomField.php
@@ -215,13 +215,18 @@
     return $this->getFieldConfigValue('instructions');
   }
 
+  public function getPlaceholder() {
+    return $this->getFieldConfigValue('placeholder', null);
+  }
+
   public function renderEditControl(array $handles) {
     return id(new AphrontFormTextControl())
       ->setName($this->getFieldKey())
       ->setCaption($this->getCaption())
       ->setValue($this->getFieldValue())
       ->setError($this->getFieldError())
-      ->setLabel($this->getFieldName());
+      ->setLabel($this->getFieldName())
+      ->setPlaceholder($this->getPlaceholder());
   }
 
   public function newStorageObject() {
diff --git a/src/view/form/control/AphrontFormTextControl.php b/src/view/form/control/AphrontFormTextControl.php
--- a/src/view/form/control/AphrontFormTextControl.php
+++ b/src/view/form/control/AphrontFormTextControl.php
@@ -4,18 +4,30 @@
 
   private $disableAutocomplete;
   private $sigil;
+  private $placeholder;
 
   public function setDisableAutocomplete($disable) {
     $this->disableAutocomplete = $disable;
     return $this;
   }
+
   private function getDisableAutocomplete() {
     return $this->disableAutocomplete;
   }
 
+  public function getPlaceholder() {
+    return $this->placeholder;
+  }
+
+  public function setPlaceholder($placeholder) {
+    $this->placeholder = $placeholder;
+    return $this;
+  }
+
   public function getSigil() {
     return $this->sigil;
   }
+
   public function setSigil($sigil) {
     $this->sigil = $sigil;
     return $this;
@@ -36,6 +48,7 @@
         'autocomplete' => $this->getDisableAutocomplete() ? 'off' : null,
         'id'           => $this->getID(),
         'sigil'        => $this->getSigil(),
+        'placeholder'  => $this->getPlaceholder()
       ));
   }
 
diff --git a/webroot/rsrc/css/phui/phui-form-view.css b/webroot/rsrc/css/phui/phui-form-view.css
--- a/webroot/rsrc/css/phui/phui-form-view.css
+++ b/webroot/rsrc/css/phui/phui-form-view.css
@@ -49,6 +49,20 @@
   width: 100%;
 }
 
+.aphront-form-input *::-webkit-input-placeholder {
+  color:{$greytext} !important;
+}
+
+.aphront-form-input *::-moz-placeholder {
+  color:{$greytext} !important;
+  opacity: 1; /* Firefox nudges the opacity to 0.4 */
+}
+
+.aphront-form-input *:-ms-input-placeholder  {
+  color:{$greytext} !important;
+}
+
+
 .aphront-form-error {
   width: 18%;
   float: right;