Add help -a (to show all commands) and -h (to produce HTML output).
diff --git a/main.c b/main.c
index 8fe8e05..19600fc 100644
--- a/main.c
+++ b/main.c
@@ -162,6 +162,8 @@
 {
   if (CFG_TOYBOX_I18N) setlocale(LC_ALL, "");
 
+  toys.toycount = ARRAY_LEN(toy_list);
+
   if (CFG_TOYBOX) {
     // Trim path off of command name
     *argv = basename(*argv);
diff --git a/toys.h b/toys.h
index 8450b80..cd1755b 100644
--- a/toys.h
+++ b/toys.h
@@ -115,14 +115,15 @@
 
 extern struct toy_context {
   struct toy_list *which;  // Which entry in toy_list is this one?
-  int exitval;             // Value error_exit feeds to exit()
   char **argv;             // Original command line arguments
-  unsigned optflags;       // Command line option flags from get_optflags()
   char **optargs;          // Arguments left over from get_optflags()
+  jmp_buf *rebound;        // longjmp here instead of exit when do_rebound set
+  unsigned optflags;       // Command line option flags from get_optflags()
+  int exitval;             // Value error_exit feeds to exit()
   int optc;                // Count of optargs
   int exithelp;            // Should error_exit print a usage message first?
   int old_umask;           // Old umask preserved by TOYFLAG_UMASK
-  jmp_buf *rebound;        // longjmp here instead of exit when do_rebound set
+  int toycount;            // Total number of commands in this build
 } toys;
 
 // Two big temporary buffers: one for use by commands, one for library functions
diff --git a/toys/other/help.c b/toys/other/help.c
index e16abaa..15f8271 100644
--- a/toys/other/help.c
+++ b/toys/other/help.c
@@ -4,7 +4,7 @@
  *
  * Often a shell builtin.
 
-USE_HELP(NEWTOY(help, "<1", TOYFLAG_BIN))
+USE_HELP(NEWTOY(help, ""USE_HELP_EXTRAS("ah"), TOYFLAG_BIN))
 
 config HELP
   bool "help"
@@ -15,16 +15,62 @@
 
     Show usage information for toybox commands.
     Run "toybox" with no arguments for a list of available commands.
+
+config HELP_EXTRAS
+  bool "help -ah"
+  default y
+  depends on TOYBOX
+  depends on HELP
+  help
+    usage: help [-ah]
+
+    -a	All commands
+    -h	HTML output
 */
 
-
+#define FOR_help
 #include "toys.h"
 
+static void do_help(struct toy_list *t)
+{
+  if (toys.optflags & FLAG_h) 
+    xprintf("<a name=\"%s\"><h1>%s</h1><blockquote><pre>\n", t->name, t->name);
+
+  toys.which = t;
+  show_help();
+
+  if (toys.optflags & FLAG_h) xprintf("</blockquote></pre>\n");
+}
+
+// The simple help is just toys.which = toy_find("name"); show_help();
+// But iterating through html output and all commands is a big more 
+
 void help_main(void)
 {
-  struct toy_list *t = toy_find(*toys.optargs);
+  int i;
+  
+  if (!(toys.optflags & FLAG_a)) {
+    struct toy_list *t = toys.which;
 
-  if (!t) error_exit("Unknown command '%s'", *toys.optargs);
-  toys.which = t;
-  show_help();
+    if (*toys.optargs && !(t = toy_find(*toys.optargs)))
+      error_exit("Unknown command '%s'", *toys.optargs);
+    do_help(t);
+    return;
+  }
+
+  if (toys.optflags & FLAG_h) {
+    xprintf("<html>\n<title>Toybox command list</title>\n<body>\n<p>\n");
+    for (i=0; i < toys.toycount; i++)
+      xprintf("<a href=\"#%s\">%s</a>\n", toy_list[i].name,
+              toy_list[i].name);
+    xprintf("</p>\n");
+  }
+
+  for (i = 0; i < toys.toycount; i++) {
+    if (toys.optflags & FLAG_h) xprintf("<hr>\n<pre>\n");
+    do_help(toy_list+i);
+    if (toys.optflags & FLAG_h) xprintf("</pre>\n");
+  }
+
+  if (toys.optflags & FLAG_h) xprintf("</html>");
 }