Org-mode mailing list
 help / color / mirror / Atom feed
From: Matthew Lundin <mdl@imapmail.org>
To: Carsten Dominik <dominik@science.uva.nl>, emacs-orgmode@gnu.org
Subject: Re: POLL: the 40 variables project
Date: Thu, 29 Jan 2009 08:10:26 -0600
Message-ID: <m263jyqk31.fsf@fastmail.fm> (raw)
In-Reply-To: <FD50CA36-A385-4C80-8E86-E3BE9F352B0A@uva.nl> (Carsten Dominik's message of "Thu\, 29 Jan 2009 09\:49\:21 +0100")


Hi Carsten,

> Hi,
>
> yesterday I did this command in my org-mode git repo:
>
>   grep defcustom lisp/*el |wc -l
>
> and got 378 as an answer.  378 user-customizable variables,
> no kidding.

Yes, I'm afraid I've used a fair number of those myself at one point or
another.

I've attached my list of variables. Some of the settings are set to the
default, but their still in my .emacs file as a result of switching them
on and off. I certainly don't use a majority of the variables, but it's
nice to know they are there.

Perhaps in customization there could be a distinction between "basic"
(or "setup") and "advanced" variables. The basic variables could be
those that most org users adjust--the ones that have the most visible
consequences and are central to the core functionality of org
(org-directory, for instance). The advanced variables could then be for
those hopeless souls, like myself, who spend far too much time tweaking.

Best,

Matt

-------

(setq org-log-done 'time)
(setq org-log-repeat 'time)
;; If I want a note, I set it using LOGGING property

(setq org-global-properties '(("Effort_ALL" . "0:05 0:10 0:15 0:30 0:45 1:00 1:30 2:00 3:00 4:00 5:00 6:00 7:00 8:00")))
(setq org-columns-default-format "%50ITEM(Task) %8Effort(Estimate){:} %20SCHEDULED %20DEADLINE")
(setq org-agenda-columns-compute-summary-properties nil)

(setq org-blank-before-new-entry '((heading) (plain-list-item . auto)))
;; I like a blank line for plain lists, but not for headings

(setq org-clock-in-switch-to-state "STARTED")

(setq org-clock-remove-zero-time-clocks t)
      
;; shows only closed items in the agenda log 
;; I have some custom commands that show more
(setq org-agenda-log-mode-items '(closed))

(setq org-drawers '("PROPERTIES" "CLOCK" "HIDDEN" "INFO"))

;; puts footnotes at end of current outline section -- also with sorting
(setq org-footnote-section nil) 
(setq org-footnote-auto-label 'nil)

(setq org-archive-location (concat "~/mystuff/org/" (format-time-string "%Y") ".archive::* %s"))
;; puts archive in a single file, organized by file of origin

(setq org-archive-save-context-info '(olpath time itags))
;; other options include file, time, ltags (local tags), itags (inherited tags), category

(setq org-archive-mark-done nil)

(setq org-attach-method 'cp)
(setq org-attach-directory "~/mystuff/data")

(setq org-use-fast-todo-selection t)

(setq org-todo-keywords '((sequence "TODO(t)" "NOW(n)" "STARTED(s)" "|" "DONE(d)")
			  (sequence "PROJECT(p)" "SUBPROJ(u)" "HOLD(h)" "|" "SOMEDAY(y)" "COMPLETE(c)")
			  (sequence "GOAL(g)" "|" "ACHIEVED(a)")
			  (sequence "WAITING(w@/!)" "|" "RESOLVED(r@)")
 			  (sequence "BORROWED(1@)" "|" "RETURNED(2@)")
 			  (sequence "ORDERED(3@)" "|" "RECEIVED(4@)")
			  (sequence "LATER(l)" "|" "MAYBE(m)" "CANCELED(x@/!)")))

(setq org-todo-state-tags-triggers
      '(("NOW" ("NEXT" . t) ("DEFERRED" . nil))
	("TODO" ("NEXT" . nil) ("DEFERRED" . nil))
	("PROJECT" ("DEFERRED" . nil))
	("STARTED" ("NEXT" . t) ("DEFERRED"))
	("LATER" ("DEFERRED" . t) ("NEXT" . nil))
	("HOLD" ("DEFERRED" . t) ("NEXT" . nil))
	("" ("NEXT" . nil) ("DEFERRED" . nil))
	(done ("DEFERRED" . nil) ("NEXT" . nil))))
	
(add-to-list 'org-structure-template-alist '("d" "#+begin_ditaa \n?\n#+end_ditaa"))

(setq org-fast-tag-selection-single-key 'expert)

(setq org-tag-alist '((:startgroup . nil)
		      ("home" . ?h)
		      ("office" . ?o)
		      ("errands" . ?e)
		      ("library" . ?l)
		      ("travel" . ?t)
		      (:endgroup . nil)
		      (:startgroup . nil)
		      ("computer" . ?c)
		      ("rwb" . ?r)
		      ("phone" . ?p)
		      (:endgroup . nil)
		      (:endgroup . nil)
		      (:startgroup . nil)
		      ("prof" . ?1)
		      ("per" . ?2)
		      (:endgroup . nil)
		      ("noexport" . ?N)
		      (:startgroup . nil)
		      ("DEFERRED" . ?d)
		      ("NEXT" . ?n)
		      (:endgroup . nil)
		      ("DAILY" . ?.)))

(setq org-refile-targets '((org-agenda-files :maxlevel . 2)))
(setq org-goto-interface 'outline-path-completion)

(setq org-outline-path-complete-in-steps t)
(setq org-completion-use-ido nil)
(setq org-refile-use-outline-path 'file)  

(setq org-special-ctrl-k t)

(setq org-stuck-projects '("/!+PROJECT" ("TODO" "SUBPROJ" "NOW" "STARTED" "WAITING") nil ""))

(setq org-agenda-skip-unavailable-files t)

(setq org-agenda-time-grid nil)

(setq org-agenda-sorting-strategy 
      '((agenda time-up priority-down effort-down) 
	(todo todo-state-up priority-down category-up) 
	(tags priority-down category-up)))

(setq org-sort-agenda-noeffort-is-high nil)

(setq org-agenda-include-diary nil)

(setq org-agenda-ndays 1) ;; limit org-agenda to one day

(setq org-agenda-show-inherited-tags nil)

(setq org-agenda-window-setup 'other-window)
(setq org-agenda-restore-windows-after-quit t)

(setq org-agenda-start-on-weekday 1)

(setq org-show-entry-below '((default . nil) (isearch .t ) (agenda . t))) 
(setq org-show-siblings '((default . nil) (isearch . t) (agenda . t)))

(setq org-agenda-custom-commands
      '(("P" . "Printed agendas")			
	("Pg" "GTD agenda"
	 ((todo "NOW|STARTED")
	  (agenda "" ((org-agenda-ndays 1)
		       (org-deadline-warning-days 7)
		       (org-agenda-skip-function '(org-agenda-skip-entry-if 'deadline 'regexp "\\* \\(NOW\\|STARTED\\)"))
		       (org-agenda-sorting-strategy '(priority-down tag-up))
		       (org-agenda-todo-keyword-format "[ ]")
		       (org-agenda-scheduled-leaders '("" ""))
		       (org-agenda-prefix-format "%t%s")))
	  (tags-todo "office/!+TODO"
		     ((org-agenda-overriding-header "Office\n-------")))
          (tags-todo "computer/!+TODO"
		     ((org-agenda-overriding-header "Computer\n-------")))
	  (tags-todo "rwb/!+TODO"
		     ((org-agenda-overriding-header "RWB\n-------")))
          (tags-todo "phone/!+TODO"
		     ((org-agenda-overriding-header "Phone\n-------")))
          (tags-todo "home/!+TODO"
		     ((org-agenda-overriding-header "Home\n-------")))
          (tags-todo "errands/!+TODO"
		     ((org-agenda-overriding-header "Errands\n------"))))
	 ((org-agenda-with-colors nil)
	  (org-agenda-todo-ignore-with-date t)
	  (org-agenda-block-separator "------")
	  (org-agenda-prefix-format "")
	  (org-agenda-todo-keyword-format "[ ]")
	  (org-agenda-remove-tags t)))
	("Pc" "Calendar" agenda ""
	 ((org-agenda-ndays 30)
	  (org-agenda-start-on-weekday nil)
	  (org-agenda-repeating-timestamp-show-all t)
	  (org-agenda-with-colors nil)
	  (org-agenda-skip-function '(org-agenda-skip-entry-if 'deadline 'scheduled))))
	("p" . "Priorities")
	("pa" "A items" tags-todo "+PRIORITY=\"A\"")
	("pb" "B items" tags-todo "+PRIORITY=\"B\"")
	("pc" "C items" tags-todo "+PRIORITY=\"C\"")
	("pp" "A, B, & C"
	 tags-todo "PRIORITY=\"A\"|PRIORITY=\"B\"|PRIORITY=\"C\"")
	("g" . "GTD Contexts")
        ("go" "Office" tags-todo "office")
        ("gc" "Computer" tags-todo "computer")
        ("gp" "Phone" tags-todo "phone")
        ("gh" "Home" tags-todo "home")
        ("ge" "Errands" tags-todo "errands")
        ("gt" "Travel" tags-todo "travel")
        ("gb" "GTD Block Agenda"
         ((tags-todo "office")
          (tags-todo "computer")
          (tags-todo "phone")
          (tags-todo "home")
          (tags-todo "errands")))
	("S" . "Searches")
	("Sw" "Website search" search ""
	 ((org-agenda-files (file-expand-wildcards "~/mystuff/website/*.org"))))
	("A" "Agenda with todos" agenda ""
	 ((org-agenda-ndays 1)
	  (org-agenda-sorting-strategy '(time-up priority-down todo-state-down))
	  (org-agenda-todo-ignore-scheduled t)
	  (org-agenda-include-all-todo t)))
	("r" . "Reviews")
	("ra" "Agenda - Next seven days" agenda ""	    ;; this is after the daily review is done
	 ((org-agenda-repeating-timestamp-show-all t)
	  (org-agenda-ndays 7)
	  (org-agenda-start-on-weekday nil)))
	("rd" "Daily Review" 
	 ((stuck "")
	  (stuck "" ((org-stuck-projects '("/!+SUBPROJ" ("TODO" "NOW" "STARTED" "WAITING") nil ""))))
	  (todo "PROJECT|SUBPROJ")
	  (todo "TODO|NOW|STARTED")
	  (todo "WAITING|ORDERED|BORROWED" ((org-agenda-sorting-strategy '(priority-down category-up))))))
	("rw" "Weekly Review Block"
         ((stuck "" ((org-stuck-projects '("/!+GOAL" ("TODO" "PROJECT" "NOW" "STARTED" "WAITING") nil ""))))
	  (stuck "")
	  (stuck "" ((org-stuck-projects '("/!+SUBPROJ" ("TODO" "NOW" "STARTED" "WAITING") nil ""))))
	  (todo "GOAL")
	  (todo "PROJECT")
	  (todo "SUBPROJ")
	  (todo "HOLD") ;; Projects & goals on ice
	  (todo "LATER") ;; Review later items
	  (agenda "" ((org-agenda-ndays 7)
		      (org-agenda-time-grid nil)
		      (org-agenda-start-on-weekday nil))))) 
	("rm" "Monthly Review"
	 ((todo "SOMEDAY")
	  (todo "MAYBE")))
	("rl" "Daily log" 
	 ((agenda "" ((org-agenda-ndays 1) 
;;		      (org-agenda-start-day (format-time-string "%Y-%m-%d" (my-yesterday-time))) ;; starts with yesterday
		      (org-agenda-log-mode-items '(closed state))
		      (org-agenda-show-log t))))) ;; shows log
	("rz" "Without deadlines" agenda ""
	 ((org-agenda-ndays 1)
	  (org-agenda-skip-function '(org-agenda-skip-entry-if 'deadline))))
	("rp" "Project overview"
	 ((stuck "")
	  (todo "GOAL")
	  (todo "PROJECT")
	  (todo "SUBPROJ")
	  (todo "HOLD")))
	("rt" "Todo overview"
	 ((todo "STARTED")
	   (todo "TODO")
	   (todo "WAITING|ORDERED|BORROWED") ;; review waiting items
	   (todo "LATER"))) 
	("c" . "Calendars")
	("cc" "Weekly schedule" agenda ""
	 ((org-agenda-ndays 7)
	  (org-agenda-start-on-weekday 1)
	  (org-agenda-repeating-timestamp-show-all t)
	  (org-agenda-skip-function '(org-agenda-skip-entry-if 'deadline 'scheduled))))
	("cn" "Next 14 days" agenda ""
	 ((org-agenda-ndays 14)
	  (org-agenda-start-on-weekday nil)
	  (org-agenda-repeating-timestamp-show-all t)
	  (org-agenda-skip-function '(org-agenda-skip-entry-if 'deadline 'scheduled))))
	("cm" "Next 30 days" agenda ""
	 ((org-agenda-ndays 30)
	  (org-agenda-start-on-weekday nil)
	  (org-agenda-repeating-timestamp-show-all t)
	  (org-agenda-skip-function '(org-agenda-skip-entry-if 'deadline 'scheduled))))
	("u" . "Upcoming deadlines")
	("uw" "Upcoming deadlines (one week)" agenda ""
	 ((org-agenda-skip-function '(org-agenda-skip-entry-if 'scheduled))
	  (org-agenda-ndays 1)
	  (org-deadline-warning-days 7)
	  (org-agenda-time-grid nil)))
	("u2" "Upcoming deadlines (two weeks)" agenda ""
	 ((org-agenda-skip-function '(org-agenda-skip-entry-if 'scheduled))
	  (org-agenda-ndays 1)
	  (org-deadline-warning-days 14)
	  (org-agenda-time-grid nil)))
	("um" "Upcoming deadlines (one month)" agenda ""
	 ((org-agenda-skip-function '(org-agenda-skip-entry-if 'scheduled))
	  (org-agenda-ndays 1)
	  (org-deadline-warning-days 30)
	  (org-agenda-time-grid nil)))
	("uq" "Upcoming deadlines (three months)" agenda ""
	 ((org-agenda-skip-function '(org-agenda-skip-entry-if 'scheduled))
	  (org-agenda-ndays 1)
	  (org-deadline-warning-days 60)
	  (org-agenda-time-grid nil)))
	("uh" "Upcoming deadlines (half year)" agenda ""
	 ((org-agenda-skip-function '(org-agenda-skip-entry-if 'scheduled))
	  (org-agenda-ndays 1)
	  (org-deadline-warning-days 180)
	  (org-agenda-time-grid nil)))
	("uy" "Upcoming deadlines (1 year)" agenda ""
	 ((org-agenda-skip-function '(org-agenda-skip-entry-if 'scheduled))
	  (org-agenda-ndays 1)
	  (org-deadline-warning-days 365)
	  (org-agenda-time-grid nil)))
	("d" . "Next")
	("dd" "Today (all)" 
	  ((todo "NOW|STARTED")
	   (agenda "" ((org-agenda-ndays 1)
 		       (org-agenda-skip-function '(org-agenda-skip-entry-if 'regexp "\\* \\(NOW\\|STARTED\\)"))))
	   (todo "TODO" ((org-agenda-starting-strategy '(priority-down category-up))
			 (org-agenda-todo-ignore-with-date t)))
	   (todo "WAITING|ORDERED|BORROWED" ((org-agenda-sorting-strategy '(priority-down category-up))))))
	("dt" "Today" 
	  ((todo "NOW|STARTED")
	   (agenda "" ((org-agenda-ndays 1)
 		       (org-agenda-skip-function '(org-agenda-skip-entry-if 'regexp "\\* \\(NOW\\|STARTED\\)"))))))
;; if you want to skip daily tasks in the agenda view
;;		       (org-agenda-skip-function '(org-agenda-skip-entry-if 'regexp "\\* \\(NOW\\|STARTED\\)\\|:DAILY:"))))))
	("dn" "Now" todo "NOW|STARTED")
	("dh" "Daily habits" 
	 ((agenda ""))
	 ((org-agenda-show-log t)
	  (org-agenda-ndays 7)
	  (org-agenda-log-mode-items '(state))
	  (org-agenda-skip-function '(org-agenda-skip-entry-if 'notregexp ":DAILY:"))))
	("de" "Effort" 
	 ((todo "NOW|STARTED")
	  (agenda "" ((org-agenda-ndays 1)
		      (org-agenda-skip-function '(org-agenda-skip-entry-if 'regexp "\\* \\(NOW\\|STARTED\\|PROJECT\\|GOAL\\)")))))
	 ((org-agenda-view-columns-initially t)))
	("da" "Active" todo "GOAL|PROJECT|SUBPROJ|TODO|NOW|STARTED"
	 ((org-agenda-sorting-strategy '(category-up))))
	("dp" "Projects" todo "PROJECT|SUBPROJ")
	("dc" "Clock report" agenda ""
	 ((org-agenda-ndays 1)
	  (org-agenda-start-with-clockreport-mode t)
	  (org-agenda-time-grid nil)
	  (org-agenda-skip-function '(org-agenda-skip-entry-if 'notscheduled 'deadline 'scheduled))))))

(setq org-agenda-skip-scheduled-if-done t)
(setq org-agenda-skip-deadline-if-done t)

(setq org-agenda-repeating-timestamp-show-all nil)

(org-remember-insinuate)

(setq org-directory "~/mystuff/org/")
(setq org-default-notes-file (concat org-directory "index.org"))

(setq org-remember-store-without-prompt t)

;; Remember templates

(setq org-remember-templates
      '(
	(?t "* TODO %^{Todo} %^G\n %i\n %a\n %U\n")
	(?T "* TODO %^{Todo} %^G\n %i\n %U\n")
	(?a "* %^{Appt} %t%?\n %i\n %a\n")
	(?A "* %^{Appt} %t%?\n %i\n")
	(?n "* %^{Title}\n %i\n %a\n %U\n")
	(?N "* %^{Title}\n %i\n %U\n")
	(?w "* %a\n %?\n %i\n %U\n")
	(?W "* %a\n %? %i\n")))

(setq org-publish-project-alist
      '(
	("org-notes"
	 :base-directory "~/mystuff/website/"
	 :base-extension "org"
	 :publishing-directory "path/to/directory"
	 :section-numbers nil
	 :email "M&#97;t&#116;he&#119;&#46;&#76;u&#110;&#100;&#105;n&#64;&#118;al&#112;&#111;&#46;&#101;d&#117;"
	 :publishing-function org-publish-org-to-html
	 :table-of-contents nil
;;	 :auto-index t
;;	 :index-filename "pagelist.org"
;;	 :index-title "Page List"
	 :recursive t
	 :style "<link rel=\"stylesheet\" type=\"text/css\" href=\"css/stylesheet.css\" />"
	 ;;:style-include-default nil
	 :preamble "
<div id=\"wrapper\">
<div id=\"menu\">
<div id=\"sidemenu\">
<a href=\"index.html\">Home</a> &#124;
<a href=\"sitemap.html\">Site Map</a>
</div>
<div id=\"sidetitle\">
Matthew Lundin
</div>
</div>
<div id=\"content\">"
	 :postamble "</div>
</div>"
	 )
	("org-static"
	 :base-directory "~/mystuff/website/"
	 :publishing-directory "/path/to/directory"
	 :recursive t
	 :base-extension "css\\|js\\|png\\|jpg\\|gif\\|pdf\\|mp3\\|ogg\\|swf"
	 :publishing-function org-publish-attachment 
	 )
	("org" 
	 :components
	 ("org-notes" "org-static"))
	))

  parent reply	other threads:[~2009-01-29 14:10 UTC|newest]

Thread overview: 70+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-01-29  8:49 Carsten Dominik
2009-01-29 11:13 ` Friedrich Delgado Friedrichs
2009-01-29 13:02   ` Carsten Dominik
2009-01-29 13:40     ` Dan Griswold
2009-01-29 11:46 ` Womick, Don
2009-01-29 11:59 ` Tassilo Horn
2009-01-29 13:37   ` Sebastian Rose
2009-01-29 13:30 ` Bernt Hansen
2009-01-29 13:46 ` Chris Leyon
2009-01-29 14:10 ` Matthew Lundin [this message]
2009-01-29 14:49 ` Bernt Hansen
2009-01-29 14:55 ` srandby
2009-01-29 16:01 ` Eric S Fraga
2009-01-29 16:40 ` Dan Davison
2009-01-29 16:40 ` Michael Ekstrand
2009-01-29 17:24 ` Sivaram Neelakantan
2009-01-29 17:56 ` Manish
2009-01-29 21:02   ` Dan Davison
2009-01-29 23:07   ` Carsten Dominik
2009-01-30  7:46     ` Manish
2009-01-30  8:18       ` Carsten Dominik
2009-01-30  8:29         ` Manish
2009-01-30  8:38           ` Carsten Dominik
2009-01-30  8:52             ` Manish
2009-01-30  9:16               ` Carsten Dominik
2009-01-30 10:35                 ` Scot Becker
     [not found]                 ` <e7cdbe30902011255y680747e8vb8731a775a73dc73@mail.gmail.com>
2009-02-01 22:15                   ` Carsten Dominik
2009-02-02 10:36                   ` Carsten Dominik
     [not found]       ` <87ljstx71e.fsf@gollum.intra.norang.ca>
2009-01-30 13:50         ` Carsten Dominik
2009-01-30 15:27       ` Carsten Dominik
2009-01-29 18:02 ` William Henney
2009-01-29 19:07 ` Peter Jones
2009-01-29 19:44 ` Hsiu-Khuern Tang
2009-01-29 22:06 ` Steven E. Harris
2009-01-29 22:43 ` Oliver Charles
2009-01-30  3:32 ` Ross Patterson
2009-01-30 12:13   ` Sebastian Rose
2009-01-30  3:44 ` Dennis Groves
2009-01-30  4:12   ` Manish
2009-01-30  4:46 ` Austin Frank
2009-01-30  8:17 ` Ulf Stegemann
2009-01-30 12:26   ` Sebastian Rose
2009-01-30  8:26 ` Cameron Horsburgh
2009-01-30  8:43 ` R: " Giovanni Ridolfi
2009-01-30  9:21   ` Manish
2009-01-30 11:09 ` Shaun Johnson
2009-01-30 12:08 ` Rainer Stengele
2009-01-30 12:48 ` Mikael Fornius
2009-01-30 15:56 ` William Henney
2009-01-30 16:12 ` Christian Egli
2009-01-30 16:34 ` Manuel Hermenegildo
2009-02-01  0:34   ` Samuel Wales
2009-01-30 16:36 ` Eric Schulte
2009-01-31 13:06 ` Martin Stemplinger
2009-02-01 15:18 ` James TD Smith
2009-02-04 15:29 ` Charles Sebold
2009-02-05 14:55   ` Manish
2009-02-04 21:28 ` Mike Newman
2014-01-17 20:55 ` [Orgmode] " Manish
2014-01-19 15:54   ` Bastien
2014-01-20  2:18     ` M
2014-01-20 11:17       ` Bastien
2014-01-20 11:38         ` Rainer M Krug
2014-01-20 11:47           ` Bastien
2014-01-20 17:07           ` Eric S Fraga
2014-01-20  7:05     ` henry atting
2014-01-20 11:16       ` Bastien
2014-04-30 15:29   ` Sungmin
2014-04-30 15:50     ` Eric S Fraga
     [not found] <20090130091800.B54F32868C@mailhost.cs.tu-berlin.de>
2009-01-30 11:33 ` Stephan Schmitt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://orgmode.org

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=m263jyqk31.fsf@fastmail.fm \
    --to=mdl@imapmail.org \
    --cc=dominik@science.uva.nl \
    --cc=emacs-orgmode@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Org-mode mailing list

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://orgmode.org/list/0 list/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 list list/ https://orgmode.org/list \
		emacs-orgmode@gnu.org
	public-inbox-index list

Example config snippet for mirrors.
Newsgroups are available over NNTP:
	nntp://news.yhetil.org/yhetil.emacs.orgmode
	nntp://news.gmane.io/gmane.emacs.orgmode


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git