What's the best way to allow a user to save variables/options I have a user who wanted to save some configuration options for his site. I had initially created a content type of Options, then created a node for that user so they could edit it, and didn't allow them to delete or create any other nodes of this content type. But it feels like this isn't what content creation was created for!
Am I missing a trick in allowing users to save options, or should I just create a custom form and save it to db?
Yes, instead of content entities you can use config entities. But for only a few configuration options this is too much effort. In this case you can use the Simple Configuration API, either by creating your own form
https://www.drupal.org/docs/drupal-apis/configuration-api/working-with-configuration-forms
or by adding form values to existing admin forms in a form alter hook.
See for example how the core dblog module adds an option to /admin/config/development/logging when it is enabled:
/**
 * Implements hook_form_FORM_ID_alter() for system_logging_settings().
 */
function dblog_form_system_logging_settings_alter(&amp;$form, FormStateInterface $form_state) {
  $row_limits = [100, 1000, 10000, 100000, 1000000];
  $form['dblog_row_limit'] = [
    '#type' =&gt; 'select',
    '#title' =&gt; t('Database log messages to keep'),
    '#default_value' =&gt; \Drupal::configFactory()-&gt;getEditable('dblog.settings')-&gt;get('row_limit'),
    '#options' =&gt; [0 =&gt; t('All')] + array_combine($row_limits, $row_limits),
    '#description' =&gt; t('The maximum number of messages to keep in the database log. Requires a &lt;a href=&quot;:cron&quot;&gt;cron maintenance task&lt;/a&gt;.', [':cron' =&gt; Url::fromRoute('system.status')-&gt;toString()]),
  ];

  $form['#submit'][] = 'dblog_logging_settings_submit';
}

/**
 * Form submission handler for system_logging_settings().
 *
 * @see dblog_form_system_logging_settings_alter()
 */
function dblog_logging_settings_submit($form, FormStateInterface $form_state) {
  \Drupal::configFactory()-&gt;getEditable('dblog.settings')-&gt;set('row_limit', $form_state-&gt;getValue('dblog_row_limit'))-&gt;save();
}