How do I programmatically add text to a page? I am starting to write my first drupal module, but I need help on how to add content / text / data to the screen? I was able to add tabs and a url with hook menu, but I am unsure of how one goes about adding data you want to put there. If I wanted to say "hello world", what function / hook do I use to do that?

function sky_view_menu(){
    $items = [];
    $items['admin/skyview'] = array(
        'title' =&gt; 'Skyview Settings',
        'type' =&gt; MENU_NORMAL_ITEM,
        'access callback' =&gt; TRUE,
    );
    $items['admin/skyview/tab1'] = array(
        'title' =&gt; 'Skyview',
        'type' =&gt; MENU_DEFAULT_LOCAL_TASK,
        'access callback' =&gt; TRUE,
        'weight' =&gt; 0,
    );
    $items['admin/skyview/tab2'] = array(
        'title' =&gt; 'test1',
        'type' =&gt; MENU_LOCAL_TASK,
        'access callback' =&gt; TRUE,
        'weight' =&gt; 1,
    );
    $items['admin/skyview/tab3'] = array(
        'title' =&gt; 'test2',
        'type' =&gt; MENU_LOCAL_TASK,
        'access callback' =&gt; TRUE,
        'weight' =&gt; 2,
    );
    return $items;
}
You're looking for the page callback, which is:


  The function to call to display a web page when the user visits the path. If omitted, the parent menu item's callback will be used instead.


For example:

function sky_view_menu() {
  $items['admin/skyview'] = array(
    'title' =&gt; 'Skyview Settings',
    'type' =&gt; MENU_NORMAL_ITEM,
    'access callback' =&gt; TRUE,
    'page callback' =&gt; 'MYMODULE_skyview_admin_page',
  );

  $items['admin/skyview/tab1'] = array(
    'title' =&gt; 'Skyview',
    'type' =&gt; MENU_DEFAULT_LOCAL_TASK,
    'access callback' =&gt; TRUE,
    'weight' =&gt; 0,
    'page callback' =&gt; 'MYMODULE_skyview_admin_tab_1',
  );
  ...
  return $items;
}

function MYMODULE_skyview_admin_page() {
  return [
    '#markup' =&gt; t('Hello world'),
  ];
}

function MYMODULE_skyview_admin_tab_1() {
  return [
    '#markup' =&gt; t('Hello tab 1'),
  ];
}


The function name itself is arbitrary, but for the sake of sanity it's best to name it as something that represents the route behind it.