Creating a blog

28 min read Original article ↗

~9173 words. ~45 minutes.

Introduction

I have been blogging by manually exporting my org-mode files into HTML with a custom CSS file and then SCP-ing the generated HTML file into my SDF personal page. While this works fine, The page doesn't have any SSL certificate, which just makes my website look bad. So I have recently decided to switch my blog over to Codeberg and utilize their pages facility.

The implementation

After some research, I've found out that Codeberg pages doesn't have any support for static site generators like Github pages does, But I am not deterred by this. I have devised a plan to use Codeberg effectively.

Firstly, I have created a private repository with all my articles on it (in org-mode format of course), I also have the scripts necessary to perform this on there, which are

  • An Emacs lisp script, and
  • A shell script

Emacs Lisp script

The Emacs lisp script actually exports the Emacs Org-files into a HTML directory.

I will go over each (interesting) part one by one.

Cleaning public

(message "Cleaning public/")
(shell-command "rm public/*")
(message "Done!")

This block just removes the old public directory, this is done to ensure that no files that were "removed" or "drafted" stay public.

Customizing HTML output

(setq org-html-postamble t                          org-html-head-include-scripts nil             org-html-head-include-default-style nil       org-confirm-babel-evaluate nil                org-html-html5-fancy t
      org-html-htmlize-output-type 'css
      user-full-name "tusharhero"
      user-mail-address "tusharhero@sdf.org"
      org-html-with-latex 'verbatim
      )

I would say the most interesting part is the line where I disable prompt for asking permission before evaluating the babel source blocks, that is because, I am using emacs-lisp org-babel source blocks to generate text here and there, particularly I am using it right now to copy code from actual files during build time. I won't go over how exactly that is done, because I am still figuring it out.

Add setup.org to every page

(add-hook 'org-export-before-processing-hook
          #'(lambda (backend)
              (insert "#+INCLUDE: \"../setup.org\"\n")))

I currently use this to add a tag list to each page.

#+HTML_HEAD: <meta name="darkreader-lock">
#+HTML_HEAD: <link rel="stylesheet" href="style.css">
#+HTML_HEAD: <link rel="alternate" type="application/rss+xml" href="rss.xml" title="RSS 2.0">
#+HTML_HEAD: <meta name="fediverse:creator" content="@tusharhero@mathstodon.xyz">

#+name: word-count
#+begin_src elisp :results raw :exports results
  (let* ((word-count (save-excursion (search-forward "#+title:" nil nil 2)
                                   (forward-line 3)
                                   (count-words (point) (point-max))))
         (reading-speed 200)
         (reading-time (/ word-count reading-speed)))
    (format "/~%s words. ~%d minutes./" word-count reading-time))
#+end_src

#+name: tagging
#+begin_src elisp :results html :exports results
  (defun p/get-tags ()
    "Get the tags in buffer."
    (save-excursion 
      (goto-char (point-min))
      (search-forward "#+tags:" nil nil 2)
      (string-split
       (string-trim (thing-at-point 'line t) ".*tags:\s*")
       ":")))

  (let ((tags (delete "special" (p/get-tags))))
    (if (not (= (length tags) 0))
        (format "<div class=\"tagbar\"><span><a href=\"tags.html\">tags:</a></span> %s</div>"
                (string-join (mapcar (lambda (tag) (format "<span><a href=\"tags.html#%s\">%s</a></span>" tag tag)) tags) " "))
      ""))
#+end_src
#+OPTIONS: toc:nil
#+TOC: headlines 5

I also have a listing of all pages according to their tags here.

Defining publishing project

Now, all of this is pretty standard, I think you can just guess what each part does, but the most interesting part is :html-home/up-format option, it allows to put the navigation bar in the general HTML, even though I could have done by defining a completely new element, but I decided that reusing old functionality is probably best here.

CSS minifier at home

As you can see in Styling, my CSS is a bit too large (by my standards). So I decided to minify it a bit… and this is what I wrote

(message "Starting the minification of CSS...")
(save-excursion
  (find-file "public/style.css")

    (replace-regexp-buffer
   (rx "/*"
       (zero-or-more (or (not (any "*")) (seq "*" (not (any "/")))))
       (one-or-more "*") "/")
   "")

    (replace-regexp-buffer (rx "\n") "")

    (replace-regexp-buffer  (rx (>= 2 "\s")) " ")

    (dolist (symbol (list ?{ ?} ?\; ?, ?> ?~ ?-))
    (replace-regexp-buffer (format "%s " symbol) (format "%s" symbol))
    (replace-regexp-buffer (format " %s" symbol) (format "%s" symbol)))
  (replace-regexp-buffer  (rx ": ") ":")

  (save-buffer))

Here is the definition of replace-regexp-buffer.

(defun replace-regexp-buffer (regexp to-string)

It is a very basic minifer it doesn't really do anything complicated but I have managed to save up to 2.4KB using it, which is pretty good.

Full script

Here is the script, (It's licensed under the GPLv3 Copyright @ tusharhero 2024, although most of it has been taken from this tutorial.)

(message "Cleaning public/")
(shell-command "rm public/*")
(message "Done!")

(message "Getting dependencies, may take some time...")

(require 'package)
(setq package-user-dir (expand-file-name "./.packages"))

(package-initialize)
(unless package-archive-contents
  (package-refresh-contents))

(dolist (package '(htmlize
                   webfeeder
                   dash))
  (unless (package-installed-p package)
    (package-install package)))


(require 'dash)

(define-minor-mode unpackaged/org-export-html-with-useful-ids-mode
  "Attempt to export Org as HTML with useful link IDs.
Instead of random IDs like \"#orga1b2c3\", use heading titles,
made unique when necessary."
  :global t
  (if unpackaged/org-export-html-with-useful-ids-mode
      (advice-add #'org-export-get-reference :override #'unpackaged/org-export-get-reference)
    (advice-remove #'org-export-get-reference #'unpackaged/org-export-get-reference)))

(defun unpackaged/org-export-get-reference (datum info)
  "Like `org-export-get-reference', except uses heading titles instead of random numbers."
  (let ((cache (plist-get info :internal-references)))
    (or (car (rassq datum cache))
        (let* ((crossrefs (plist-get info :crossrefs))
               (cells (org-export-search-cells datum))
                                                                                                                                                                                                                  (new (or (cl-some
                         (lambda (cell)
                           (let ((stored (cdr (assoc cell crossrefs))))
                             (when stored
                               (let ((old (org-export-format-reference stored)))
                                 (and (not (assoc old cache)) stored)))))
                         cells)
                        (when (org-element-property :raw-value datum)
                                                    (unpackaged/org-export-new-title-reference datum cache))
                                                                        (org-export-format-reference
                         (org-export-new-reference cache))))
               (reference-string new))
                                        (dolist (cell cells) (push (cons cell new) cache))
                                        (push (cons reference-string datum) cache)
          (plist-put info :internal-references cache)
          reference-string))))

(defun unpackaged/org-export-new-title-reference (datum cache)
  "Return new reference for DATUM that is unique in CACHE."
  (cl-macrolet ((inc-suffixf (place)
                  `(progn
                     (string-match (rx bos
                                       (minimal-match (group (1+ anything)))
                                       (optional "--" (group (1+ digit)))
                                       eos)
                                   ,place)
                                          (-let* (((s1 suffix) (list (match-string 1 ,place)
                                                (match-string 2 ,place)))
                             (suffix (if suffix
                                         (string-to-number suffix)
                                       0)))
                       (setf ,place (format "%s--%s" s1 (cl-incf suffix)))))))
    (let* ((title (org-element-property :raw-value datum))
           (ref (url-hexify-string (substring-no-properties title)))
           (parent (org-element-property :parent datum)))
      (while (--any (equal ref (car it))
                    cache)
                (if parent
                        (setf title (concat (org-element-property :raw-value parent)
                                "--" title)
                  ref (url-hexify-string (substring-no-properties title))
                  parent (org-element-property :parent parent))
                    (inc-suffixf ref)))
      ref)))

(unpackaged/org-export-html-with-useful-ids-mode)

(require 'ox-publish)
(message "Done!")


(message "Setting customizations...")
(setq org-html-postamble t                          org-html-head-include-scripts nil             org-html-head-include-default-style nil       org-confirm-babel-evaluate nil                org-html-html5-fancy t
      org-html-htmlize-output-type 'css
      user-full-name "tusharhero"
      user-mail-address "tusharhero@sdf.org"
      org-html-with-latex 'verbatim
      )

(setq org-html-postamble-format
      `(("en" ,(concat
                "<p class=\"author\">Author: %a"
                "<details>"
                                "<summary>email</summary>"
                "replace [at] with @, and put the domain for username, and vice versa: "
                (string-join
                 (reverse (string-split user-mail-address "@")) " [at] ")
                "</details>"
                "</p>
<p class=\"license\">
© tusharhero 2024-2025, check <a href=\"/licenses.html\">licenses page</a> for details.
</p>
<p class=\"date\">Date: %d</p>
<p class=\"creator\">%c</p>"))))


(setq org-html-home/up-format
      "<div class=\"navbar\" id=\"org-div-home-and-up\">
<a accesskey=\"H\" %s href=\"%s\">tusharhero's pages</a>
<span class=\"craftering\">
  <a class=\"arrow\" href=\"https://craftering.systemcrafters.net/@tusharhero/previous\">←</a>
  <a href=\"https://craftering.systemcrafters.net/\">craftering</a>
  <a class=\"arrow\" href=\"https://craftering.systemcrafters.net/@tusharhero/next\">→</a>
</span>
</div>"
      )

(setopt org-export-global-macros (list (cons "video"
                                             "
#+BEGIN_EXPORT html
<div class=\"video-title\">$2</div>
<video controls title=\"$2\">
<source src=\"$1\">
<a href=\"$1\">$2</a>
</video>
#+END_EXPORT
")
                                       (cons "screenshot"
                                             "
#+BEGIN_EXPORT html
<div class=\"screenshot-title\">$2</div>
<img title=\"$2\" src=\"$1\">
#+END_EXPORT
")))

(add-hook 'org-export-before-processing-hook
          #'(lambda (backend)
              (insert "#+INCLUDE: \"../setup.org\"\n")))

(setq org-publish-project-alist
      (list
       (list "org-site:main"
             :recursive t
             :base-directory "./content"
             :publishing-function 'org-html-publish-to-html
             :publishing-directory "./public"
             :exclude-tags '("draft" "noexport")
             :exclude "draft*"
             :with-author  t
             :with-creator t
             :with-toc t
             :with-email t
             :html-link-home "/"
             :section-numbers nil
             :time-stamp-file nil)))

(message "Complete!")

(defun remove-org-element (string)
  "Delete the first element which contains STRING."
  (save-excursion
    (search-backward string nil t 2)
    (goto-char (match-beginning 0))
    (org-mark-element)
    (delete-region (region-beginning) (region-end))))

(defun replace-org-element (string new-string)
  "Replace the first element which contains STRING with NEW-STRING."
  (save-excursion
    (search-backward string nil t 2)
    (goto-char (match-beginning 0))
    (org-mark-element)
    (replace-region-contents (region-beginning) (region-end) new-string))
  nil)

(message "Actually building the files...")
(org-publish-all t)
(message "Complete!")

(message "Copying CSS file over to public directory...")
(copy-file "style.css" "public/style.css")
(message "Done!")

(message "Copying favicon file over to public directory...")
(copy-file "favicon.ico" "public/favicon.ico")
(message "Done!")

(message "Copying domains file over to public directory...")
(copy-file ".domains" "public/.domains" t)
(message "Done!")

(defun replace-regexp-buffer (regexp to-string)
  "Replace things macthing REGEXP with TO-STRING in all of the buffer."
  (goto-char (point-min))
  (while (re-search-forward regexp nil t)
    (replace-match to-string nil nil)))

(defmacro get-file-size (filename)
  "Get the size of FILENAME."
  (file-attribute-size (file-attributes filename)))

(message "Starting the minification of CSS...")
(save-excursion
  (find-file "public/style.css")

    (replace-regexp-buffer
   (rx "/*"
       (zero-or-more (or (not (any "*")) (seq "*" (not (any "/")))))
       (one-or-more "*") "/")
   "")

    (replace-regexp-buffer (rx "\n") "")

    (replace-regexp-buffer  (rx (>= 2 "\s")) " ")

    (dolist (symbol (list ?{ ?} ?\; ?, ?> ?~ ?-))
    (replace-regexp-buffer (format "%s " symbol) (format "%s" symbol))
    (replace-regexp-buffer (format " %s" symbol) (format "%s" symbol)))
  (replace-regexp-buffer  (rx ": ") ":")

  (save-buffer))

(message "Done, saved %s in the CSS!"
         (file-size-human-readable
          (- (get-file-size "style.css") (get-file-size "public/style.css"))))

(org-babel-load-file (expand-file-name "tags.org" "content"))
(webfeeder-build
 "rss.xml"
 "./public"
 "https://tusharhero.codeberg.page/"
 (let ((filenames (directory-files "./public" t directory-files-no-dot-files-regexp)))
   (dolist (filename
            (append (mapcar (lambda (file) (expand-file-name file "public"))
                            (list ".git" "favicon.ico" "style.css" "style.css~" ".domains"))
                    (delq nil (mapcar (lambda (article)
                                        (when-let* ((tags (nth 2 article))
                                                    ((member "special" tags))
                                                    (filename (car article))
                                                    (webpage (expand-file-name
                                                              (file-name-with-extension
                                                               (file-name-nondirectory filename)
                                                               "html")
                                                              "public")))
                                          webpage))
                                      (p/tags-table)))))
     (setq filenames (delete filename filenames)))
   (mapcar (lambda (filename)
             (file-name-nondirectory filename))
           filenames))
 :title "tusharhero's pages"
 :description "Articles written by tusharhero (and some other stuff)!"
 :builder 'webfeeder-make-rss)

(webfeeder-build
 "emacs.xml"
 "./public"
 "https://tusharhero.codeberg.page/"
 (delq nil (mapcar (lambda (article)
                     (when-let* ((tags (nth 2 article))
                                 ((member "emacs" tags))
                                 (filename (car article))
                                 (webpage (file-name-with-extension
                                           (file-name-nondirectory filename)
                                           "html")))
                       webpage))
                   (p/tags-table)))
 :title "tusharhero's pages about Emacs"
 :description "Emacs related articles"
 :builder 'webfeeder-make-rss)

(provide 'build-site)

The shell script

But commit-pushing twice is a bit repetitive, and things that are repetitive should be scripted away. So here is the script, It's licensed under the GPLv3 Copyright @ tusharhero 2024

This script checks if there are any new changes in the remote (in this case my private repository containing the sources of all the articles in org format), if there are it runs the build.sh script after which it makes a commit in the pages repository and pushes it.

shgit fetch
DIFFNUMBER=$(git diff origin/master | wc -l | sed -e 's/ .*//')
echo $DIFFNUMBER

if [ $DIFFNUMBER = 0 ]
then echo "Nope! Nothing on the remote!"
     exit
fi

echo "We seem to have new content!"
git pull

./build.sh

cd public
git add .
git commit -am "Automated Content Update"
git push

Web hook

I run this web hook script every time there is a push to my repository.

bash
http_response="HTTP/1.1 202 Accepted\nContent-Type: text/plain\nContent-Length: 4\r\n\nOkay"

while true;
do
    nc -l -p $WEBHOOK_PORT -c "echo \"$http_response\""
    ./buildauto.sh
done

Styling

For styling I have this custom CSS file, its not really anything super interesting so I won't bother explaining anything.



@media (prefers-color-scheme: light) {
    html {
        filter: invert(100%);
    }

    .org-diff-added,
    .org-diff-indicator-added,
    .org-diff-removed,
    .org-diff-indicator-removed,
    video,
    img {
        filter: invert(100%);
    }

    .creator::after {
        font-weight: bold;
        content: '; light mode is experimental, please switch to dark mode.';
    }

}

* {
    box-sizing: border-box;
}

html,
body {
    height: 100%;
    width: 100%;
}

div#content {
    overflow: auto;
    min-height: 80vh;
}

body {
    margin: auto;
    width: 50rem; max-width: 98%;
    padding-top: 1.5rem;
    background: black;
    color: lawngreen;
    font-size: 1.4rem;
}

.tagbar  {
    color: lightgreen;
    background: #171717;
    padding: 0.2em;
    border: outset 0.1em green; border-radius: 0.1em;
}

html::-webkit-scrollbar-track,
pre::-webkit-scrollbar-track {
    background-color: black;
}

html::-webkit-scrollbar,
pre::-webkit-scrollbar {
    width: 0.5rem;
}

html::-webkit-scrollbar-thumb,
pre::-webkit-scrollbar-thumb {
    border-radius: 0.2rem;
    background-color: darkgreen;
}

hr {
  color: green;
  width: 60%;
}

.title {
    font-weight: bold;
    color: mediumspringgreen;
}

:is(h1, h2, h3, h4, h5, h6) {
    margin-top: 2rem;
    font-weight: bold;
    color: springgreen;
}

a {
    display-inline: block;
    text-decoration: darkgreen wavy underline;
    color: lightgreen;
    position: relative;
    z-index: 1;
}

a:hover {
    color: #000;
    background: lightgreen;
    text-decoration: underline;
}

.gifbanner:hover {
    font-size: 1em;
    padding: 0em;
    background-color: unset;
}

::selection {
    color: salmon;
}

p.verse {
    font-size: 1em;
    font-style: italic;
    margin-bottom: 10px;
}

code {
    color: lightgreen;
    background: #171717;
    border: outset 0.01em green; border-radius: 0.2em;
}

img,
video {
    overflow-x: scroll;
    scrollbar-width: none;
    max-width: 100%;
    height: auto;
    margin: 20px 0;
}

.video-title,
.screenshot-title {
    position: relative;
    overflow: auto;
    padding: 1pt;
    font-family: monospace;
    margin-left: 3%;
    font-size: 0.8em;
}

.navbar {
    position: fixed; top: 0; 
    width: inherit; max-width: inherit;
    padding-top: 0em; padding-bottom: 0.2em;
    background: #171717;
    border-bottom: solid lime 0.1em; border-radius: 0 0 0.2em 0.2em;
    list-style-type: none;
    display: flex;
    flex-direction: row;
    justify-content: space-between;
    align-items: baseline;
    z-index: 2;
}

.navbar > a
{
    font-size: 0.8em;
}

.craftering
{
    display: flex;
    align-items: baseline;
}

.craftering > .arrow
{
    font-size: 1em;
}


.status {
    margin-top: auto;
    padding: 0.1em;
    border: outset lime 0.1em; border-radius: 0.1em;
    font-family: monospace;
}



#content { max-width: 60em; margin: auto; }
.title  { text-align: center;
          margin-bottom: .2em; }
.subtitle { text-align: center;
            font-size: medium;
            font-weight: bold;
            margin-top:0; }
.todo   { font-family: monospace; color: #f00; }
.done   { font-family: monospace; color: #008000; }
.priority { font-family: monospace; color: #ffa500; }
.tag    { background-color: #eee; font-family: monospace;
          padding: 2px; font-size: 80%; font-weight: normal; }
.timestamp { color: #bebebe; }
.timestamp-kwd { color: #5f9ea0; }
.org-right  { margin-left: auto; margin-right: 0px;  text-align: right; }
.org-left   { margin-left: 0px;  margin-right: auto; text-align: left; }
.org-center { margin-left: auto; margin-right: auto; text-align: center; }
.underline { text-decoration: underline; }
#postamble p, #preamble p { font-size: 90%; margin: .2em; }
p.verse { margin-left: 3%; }
pre {
    border: 1px outset #e6e6e6;
    border-radius: 3px;
    padding: 8pt;
    font-family: monospace;
    overflow: auto;
    margin: 1.2em;
}
pre.src {
    position: relative;
    overflow: auto;
}
.org-src-container:before {
    position: relative;
    overflow: auto;
    padding: 1pt;
    font-family: monospace;
    margin-left: 3%;
    font-size: 0.8em;
    opacity: 50%;
}

.org-src-container:has(pre.src-diff):before { content: 'diff'; }


.org-src-container:has(pre.src-asymptote):before { content: 'Asymptote'; }
.org-src-container:has(pre.src-awk):before { content: 'Awk'; }
.org-src-container:has(pre.src-authinfo)::before { content: 'Authinfo'; }
.org-src-container:has(pre.src-C):before { content: 'C'; }

.org-src-container:has(pre.src-clojure):before { content: 'Clojure'; }
.org-src-container:has(pre.src-css):before { content: 'CSS'; }
.org-src-container:has(pre.src-D):before { content: 'D'; }
.org-src-container:has(pre.src-ditaa):before { content: 'ditaa'; }
.org-src-container:has(pre.src-dot):before { content: 'Graphviz'; }
.org-src-container:has(pre.src-calc):before { content: 'Emacs Calc'; }
.org-src-container:has(pre.src-emacs-lisp):before { content: 'Emacs Lisp'; }
.org-src-container:has(pre.src-elisp):before { content: 'Emacs Lisp'; }
.org-src-container:has(pre.src-fortran):before { content: 'Fortran'; }
.org-src-container:has(pre.src-gnuplot):before { content: 'gnuplot'; }
.org-src-container:has(pre.src-haskell):before { content: 'Haskell'; }
.org-src-container:has(pre.src-hledger):before { content: 'hledger'; }
.org-src-container:has(pre.src-java):before { content: 'Java'; }
.org-src-container:has(pre.src-js):before { content: 'Javascript'; }
.org-src-container:has(pre.src-latex):before { content: 'LaTeX'; }
.org-src-container:has(pre.src-ledger):before { content: 'Ledger'; }
.org-src-container:has(pre.src-lisp):before { content: 'Lisp'; }
.org-src-container:has(pre.src-lilypond):before { content: 'Lilypond'; }
.org-src-container:has(pre.src-lua):before { content: 'Lua'; }
.org-src-container:has(pre.src-matlab):before { content: 'MATLAB'; }
.org-src-container:has(pre.src-mscgen):before { content: 'Mscgen'; }
.org-src-container:has(pre.src-ocaml):before { content: 'Objective Caml'; }
.org-src-container:has(pre.src-octave):before { content: 'Octave'; }
.org-src-container:has(pre.src-org):before { content: 'Org mode'; }
.org-src-container:has(pre.src-oz):before { content: 'OZ'; }
.org-src-container:has(pre.src-plantuml):before { content: 'Plantuml'; }
.org-src-container:has(pre.src-processing):before { content: 'Processing.js'; }
.org-src-container:has(pre.src-python):before { content: 'Python'; }
.org-src-container:has(pre.src-R):before { content: 'R'; }
.org-src-container:has(pre.src-ruby):before { content: 'Ruby'; }
.org-src-container:has(pre.src-sass):before { content: 'Sass'; }
.org-src-container:has(pre.src-scheme):before { content: 'Scheme'; }
.org-src-container:has(pre.src-screen):before { content: 'Gnu Screen'; }
.org-src-container:has(pre.src-sed):before { content: 'Sed'; }
.org-src-container:has(pre.src-sh):before { content: 'shell'; }
.org-src-container:has(pre.src-sql):before { content: 'SQL'; }
.org-src-container:has(pre.src-sqlite):before { content: 'SQLite'; }

.org-src-container:has(pre.src-forth):before { content: 'Forth'; }
.org-src-container:has(pre.src-io):before { content: 'IO'; }
.org-src-container:has(pre.src-J):before { content: 'J'; }
.org-src-container:has(pre.src-makefile):before { content: 'Makefile'; }
.org-src-container:has(pre.src-maxima):before { content: 'Maxima'; }
.org-src-container:has(pre.src-perl):before { content: 'Perl'; }
.org-src-container:has(pre.src-picolisp):before { content: 'Pico Lisp'; }
.org-src-container:has(pre.src-scala):before { content: 'Scala'; }
.org-src-container:has(pre.src-shell):before { content: 'Shell Script'; }
.org-src-container:has(pre.src-ebnf2ps):before { content: 'ebfn2ps'; }

.org-src-container:has(pre.src-cpp):before  { content: 'C++'; }
.org-src-container:has(pre.src-abc):before  { content: 'ABC'; }
.org-src-container:has(pre.src-coq):before  { content: 'Coq'; }
.org-src-container:has(pre.src-groovy):before  { content: 'Groovy'; }

.org-src-container:has(pre.src-bash):before  { content: 'bash'; }
.org-src-container:has(pre.src-csh):before  { content: 'csh'; }
.org-src-container:has(pre.src-ash):before  { content: 'ash'; }
.org-src-container:has(pre.src-dash):before  { content: 'dash'; }
.org-src-container:has(pre.src-ksh):before  { content: 'ksh'; }
.org-src-container:has(pre.src-mksh):before  { content: 'mksh'; }
.org-src-container:has(pre.src-posh):before  { content: 'posh'; }

.org-src-container:has(pre.src-ada):before { content: 'Ada'; }
.org-src-container:has(pre.src-asm):before { content: 'Assembler'; }
.org-src-container:has(pre.src-caml):before { content: 'Caml'; }
.org-src-container:has(pre.src-delphi):before { content: 'Delphi'; }
.org-src-container:has(pre.src-html):before { content: 'HTML'; }
.org-src-container:has(pre.src-idl):before { content: 'IDL'; }
.org-src-container:has(pre.src-mercury):before { content: 'Mercury'; }
.org-src-container:has(pre.src-metapost):before { content: 'MetaPost'; }
.org-src-container:has(pre.src-modula-2):before { content: 'Modula-2'; }
.org-src-container:has(pre.src-pascal):before { content: 'Pascal'; }
.org-src-container:has(pre.src-ps):before { content: 'PostScript'; }
.org-src-container:has(pre.src-prolog):before { content: 'Prolog'; }
.org-src-container:has(pre.src-simula):before { content: 'Simula'; }
.org-src-container:has(pre.src-tcl):before { content: 'tcl'; }
.org-src-container:has(pre.src-tex):before { content: 'TeX'; }
.org-src-container:has(pre.src-plain-tex):before { content: 'Plain TeX'; }
.org-src-container:has(pre.src-verilog):before { content: 'Verilog'; }
.org-src-container:has(pre.src-vhdl):before { content: 'VHDL'; }
.org-src-container:has(pre.src-xml):before { content: 'XML'; }
.org-src-container:has(pre.src-nxml):before { content: 'XML'; }

.org-src-container:has(pre.src-conf):before { content: 'Configuration File'; }
.org-src-container:has(pre.src-conf-toml):before { content: 'TOML Configuration File'; }

table { border-collapse:collapse; }
caption.t-above { caption-side: top; }
caption.t-bottom { caption-side: bottom; }
td, th { vertical-align:top;  }
th.org-right  { text-align: center;  }
th.org-left   { text-align: center;   }
th.org-center { text-align: center; }
td.org-right  { text-align: right;  }
td.org-left   { text-align: left;   }
td.org-center { text-align: center; }
dt { font-weight: bold; }
.footpara { display: inline; }
.footdef  { margin-bottom: 1em; }
.figure { padding: 1em; }
.figure p { text-align: center; }
.equation-container {
    display: table;
    text-align: center;
    width: 100%;
}
.equation {
    vertical-align: middle;
}
.equation-label {
    display: table-cell;
    text-align: right;
    vertical-align: middle;
}
.inlinetask {
    padding: 10px;
    border: 2px outset #808080;
    margin: 10px;
    background: #ffffcc;
}
textarea { overflow-x: auto; }
.linenr { font-size: smaller }
.code-highlighted { background-color: #ffff00; }
.org-info-js_info-navigation { border-style: none; }
#org-info-js_console-label
{ font-size: 10px; font-weight: bold; white-space: nowrap; }
.org-info-js_search-highlight
{ background-color: #ffff00; color: #000000; font-weight: bold; }
.org-svg { }



.org-abbrev-table-name {
    
    color: #7fc500;
}
.org-ansi-color-black {
    
    color: #000000;
    background-color: #000000;
}
.org-ansi-color-blue {
    
    color: #37aff6;
    background-color: #37aff6;
}
.org-ansi-color-bold {
    
    font-weight: bold;
}
.org-ansi-color-bright-black {
    
    color: #595959;
    background-color: #595959;
}
.org-ansi-color-bright-blue {
    
    color: #78afff;
    background-color: #78afff;
}
.org-ansi-color-bright-cyan {
    
    color: #5dc0aa;
    background-color: #5dc0aa;
}
.org-ansi-color-bright-green {
    
    color: #7fc500;
    background-color: #7fc500;
}
.org-ansi-color-bright-magenta {
    
    color: #af9fff;
    background-color: #af9fff;
}
.org-ansi-color-bright-red {
    
    color: #f47360;
    background-color: #f47360;
}
.org-ansi-color-bright-white {
    
    color: #ffffff;
    background-color: #ffffff;
}
.org-ansi-color-bright-yellow {
    
    color: #e09a0f;
    background-color: #e09a0f;
}
.org-ansi-color-cyan {
    
    color: #6fc5ef;
    background-color: #6fc5ef;
}
.org-ansi-color-faint {
}
.org-ansi-color-fast-blink {
}
.org-ansi-color-green {
    
    color: #3fb83f;
    background-color: #3fb83f;
}
.org-ansi-color-inverse {
}
.org-ansi-color-italic {
    
    font-style: italic;
}
.org-ansi-color-magenta {
    
    color: #d38faf;
    background-color: #d38faf;
}
.org-ansi-color-red {
    
    color: #ef6560;
    background-color: #ef6560;
}
.org-ansi-color-slow-blink {
}
.org-ansi-color-underline {
    
    text-decoration: underline;
}
.org-ansi-color-white {
    
    color: #a6a6a6;
    background-color: #a6a6a6;
}
.org-ansi-color-yellow {
    
    color: #d4aa02;
    background-color: #d4aa02;
}
.org-blink-matching-paren-offscreen {
    
    background-color: #664950;
}
.org-bold {
    
    font-weight: bold;
}
.org-border {
}
.org-bracket {
}
.org-browse-url-button {
    
    color: #00c089;
    text-decoration: underline;
}
.org-buffer-menu-buffer {
    
    font-weight: bold;
}
.org-builtin {
    
    color: #3fb83f;
    font-weight: bold;
}
.org-button {
    
    color: #00c089;
    text-decoration: underline;
}
.org-c-annotation {
    
    color: #37aff6;
}
.org-calendar-month-header {
    
    font-weight: bold;
}
.org-calendar-today {
    
    font-weight: bold;
    text-decoration: underline;
}
.org-calendar-weekday-header {
    
    color: #6fc5ef;
}
.org-calendar-weekend-header {
    
    color: #d56f72;
}
.org-child-frame-border {
    
    background-color: #525959;
}
.org-comint-highlight-input {
    
    font-weight: bold;
}
.org-comint-highlight-prompt {
    
    color: #5dc0aa;
}
.org-comment {
    
    color: #b7a07f;
    font-style: italic;
}
.org-comment-delimiter {
    
    color: #b7a07f;
    font-style: italic;
}
.org-completions-annotations {
    
    color: #7fc07f;
    font-style: italic;
}
.org-completions-common-part {
    
    color: #00c089;
    font-weight: bold;
}
.org-completions-first-difference {
    
    color: #78afff;
    font-weight: bold;
}
.org-completions-group-separator {
    
    color: #808f80;
    text-decoration: line-through;
}
.org-completions-group-title {
    
    color: #3fb83f;
    font-weight: bold;
}
.org-completions-highlight {
    
    background-color: #0f3c2f;
}
.org-confusingly-reordered {
    
    text-decoration: underline;
}
.org-constant {
    
    color: #37aff6;
}
.org-css-property {
    
    color: #00c089;
    font-weight: bold;
}
.org-css-selector {
    
    color: #7fc500;
}
.org-cursor {
    
    background-color: #35f038;
}
.org-default {
    
    color: #cfdfd5;
    background-color: #111111;
}
.org-delimiter {
}
.org-diary {
    
    color: #5dc0aa;
}
.org-diff-added {
    
    color: #a0e0a0;
    background-color: #003b1f;
}
.org-diff-changed {
    
    color: #efef80;
    background-color: #363300;
}
.org-diff-changed-unspecified {
    
    color: #efef80;
    background-color: #363300;
}
.org-diff-context {
}
.org-diff-error {
    
    color: #ef6560;
    font-weight: bold;
}
.org-diff-file-header {
    
    font-weight: bold;
}
.org-diff-function {
    
    background-color: #303230;
}
.org-diff-header {
}
.org-diff-hunk-header {
    
    background-color: #303230;
    font-weight: bold;
}
.org-diff-index {
    
    font-style: italic;
}
.org-diff-indicator-added {
    
    color: #a0e0a0;
    background-color: #003b1f;
}
.org-diff-indicator-changed {
    
    color: #efef80;
    background-color: #363300;
}
.org-diff-indicator-removed {
    
    color: #ffbfbf;
    background-color: #4e1119;
}
.org-diff-nonexistent {
    
    font-weight: bold;
}
.org-diff-refine-added {
    
    color: #a0e0a0;
    background-color: #03512f;
}
.org-diff-refine-changed {
    
    color: #efef80;
    background-color: #4a4a00;
}
.org-diff-refine-removed {
    
    color: #ffbfbf;
    background-color: #751a1f;
}
.org-diff-removed {
    
    color: #ffbfbf;
    background-color: #4e1119;
}
.org-dired-directory {
    
    color: #00c089;
}
.org-dired-flagged {
    
    color: #ef6560;
    background-color: #48100f;
    font-weight: bold;
}
.org-dired-header {
    
    font-weight: bold;
}
.org-dired-ignored {
    
    color: #808f80;
}
.org-dired-mark {
    
    color: #ffffff;
}
.org-dired-marked {
    
    color: #3fb83f;
    background-color: #1a3b0f;
    font-weight: bold;
}
.org-dired-perm-write {
    
    color: #b7a07f;
    font-style: italic;
}
.org-dired-set-id {
    
    color: #cfc04f;
}
.org-dired-special {
    
    color: #78afff;
}
.org-dired-symlink {
    
    color: #00c089;
    text-decoration: underline;
}
.org-dired-warning {
    
    color: #cfc04f;
    font-weight: bold;
}
.org-doc {
    
    color: #7fc07f;
    font-style: italic;
}
.org-doc-markup {
    
    color: #37aff6;
}
.org-doc-view-svg {
    
    color: #000000;
    background-color: #ffffff;
}
.org-ef-themes-button {
    
    color: #ffffff;
    background-color: #505250;
}
.org-ef-themes-fixed-pitch {
}
.org-ef-themes-heading-0 {
    
    color: #00c089;
    font-weight: bold;
}
.org-ef-themes-heading-1 {
    
    color: #7fc500;
    font-weight: bold;
}
.org-ef-themes-heading-2 {
    
    color: #5dc0aa;
    font-weight: bold;
}
.org-ef-themes-heading-3 {
    
    color: #af9fff;
    font-weight: bold;
}
.org-ef-themes-heading-4 {
    
    color: #7fcfdf;
    font-weight: bold;
}
.org-ef-themes-heading-5 {
    
    color: #cfc04f;
    font-weight: bold;
}
.org-ef-themes-heading-6 {
    
    color: #37aff6;
    font-weight: bold;
}
.org-ef-themes-heading-7 {
    
    color: #6fc5ef;
    font-weight: bold;
}
.org-ef-themes-heading-8 {
    
    color: #d38faf;
    font-weight: bold;
}
.org-ef-themes-mark-delete {
    
    color: #ef6560;
    background-color: #48100f;
    font-weight: bold;
}
.org-ef-themes-mark-other {
    
    color: #cfc04f;
    background-color: #3b3400;
    font-weight: bold;
}
.org-ef-themes-mark-select {
    
    color: #3fb83f;
    background-color: #1a3b0f;
    font-weight: bold;
}
.org-ef-themes-reset-soft {
    
    color: #cfdfd5;
    background-color: #111111;
}
.org-ef-themes-search-current {
    
    color: #ffffff;
    background-color: #8f5040;
}
.org-ef-themes-search-lazy {
    
    color: #ffffff;
    background-color: #4648d0;
}
.org-ef-themes-search-match {
    
    background-color: #3b3400;
}
.org-ef-themes-search-replace {
    
    color: #ffffff;
    background-color: #b02930;
}
.org-ef-themes-search-rx-group-0 {
    
    color: #ffffff;
    background-color: #a04fc5;
}
.org-ef-themes-search-rx-group-1 {
    
    color: #ffffff;
    background-color: #407430;
}
.org-ef-themes-search-rx-group-2 {
    
    color: #ffffff;
    background-color: #65201a;
}
.org-ef-themes-search-rx-group-3 {
    
    color: #ffffff;
    background-color: #113e57;
}
.org-ef-themes-ui-variable-pitch {
}
.org-ef-themes-underline-error {
    
    text-decoration: underline;
}
.org-ef-themes-underline-info {
    
    text-decoration: underline;
}
.org-ef-themes-underline-warning {
    
    text-decoration: underline;
}
.org-eldoc-highlight-function-argument {
    
    color: #cfc04f;
    background-color: #3b3400;
    font-weight: bold;
}
.org-epa-field-body {
}
.org-epa-field-name {
    
    color: #808f80;
    font-weight: bold;
}
.org-epa-mark {
    
    font-weight: bold;
}
.org-epa-string {
    
    color: #af9fff;
}
.org-epa-validity-disabled {
    
    color: #ef6560;
}
.org-epa-validity-high {
    
    color: #3fb83f;
    font-weight: bold;
}
.org-epa-validity-low {
    
    color: #808f80;
}
.org-epa-validity-medium {
    
    color: #3fb83f;
}
.org-error {
    
    color: #ef6560;
    font-weight: bold;
}
.org-escape {
    
    color: #cfc04f;
}
.org-escape-glyph {
    
    color: #cfc04f;
}
.org-eww-form-checkbox {
    
    color: #cfdfd5;
    background-color: #303230;
}
.org-eww-form-file {
    
    color: #ffffff;
    background-color: #505250;
}
.org-eww-form-select {
    
    color: #ffffff;
    background-color: #505250;
}
.org-eww-form-submit {
    
    color: #ffffff;
    background-color: #505250;
}
.org-eww-form-text {
    
    color: #cfdfd5;
    background-color: #303230;
}
.org-eww-form-textarea {
    
    color: #cfdfd5;
    background-color: #303230;
}
.org-eww-invalid-certificate {
    
    color: #ef6560;
}
.org-eww-valid-certificate {
    
    color: #3fb83f;
}
.org-ffap {
    
    color: #ffffff;
    background-color: #4f3f9a;
}
.org-file-name-shadow {
    
    color: #808f80;
}
.org-fill-column-indicator {
    
    color: #303230;
    background-color: #303230;
}
.org-fixed-pitch {
}
.org-fixed-pitch-serif {
}
.org-fringe {
}
.org-function-call {
    
    color: #7fc500;
}
.org-function-name {
    
    color: #7fc500;
}
.org-glyphless-char {
    
    font-size: 60%;
}
.org-gnus-button {
    
    color: #00c089;
}
.org-gnus-emphasis-bold {
    
    font-weight: bold;
}
.org-gnus-emphasis-bold-italic {
    
    font-weight: bold;
    font-style: italic;
}
.org-gnus-emphasis-highlight-words {
    
    color: #cfc04f;
    font-weight: bold;
}
.org-gnus-emphasis-italic {
    
    font-style: italic;
}
.org-gnus-emphasis-strikethru {
    
    text-decoration: line-through;
}
.org-gnus-emphasis-underline {
    
    text-decoration: underline;
}
.org-gnus-emphasis-underline-bold {
    
    font-weight: bold;
    text-decoration: underline;
}
.org-gnus-emphasis-underline-bold-italic {
    
    font-weight: bold;
    font-style: italic;
    text-decoration: underline;
}
.org-gnus-emphasis-underline-italic {
    
    font-style: italic;
    text-decoration: underline;
}
.org-gnus-group-mail-1 {
    
    color: #7fc500;
    font-weight: bold;
}
.org-gnus-group-mail-1-empty {
    
    color: #7fc500;
}
.org-gnus-group-mail-2 {
    
    color: #5dc0aa;
    font-weight: bold;
}
.org-gnus-group-mail-2-empty {
    
    color: #5dc0aa;
}
.org-gnus-group-mail-3 {
    
    color: #af9fff;
    font-weight: bold;
}
.org-gnus-group-mail-3-empty {
    
    color: #af9fff;
}
.org-gnus-group-mail-low {
    
    color: #8fcfaf;
    font-weight: bold;
}
.org-gnus-group-mail-low-empty {
    
    color: #8fcfaf;
}
.org-gnus-group-news-1 {
    
    color: #7fc500;
    font-weight: bold;
}
.org-gnus-group-news-1-empty {
    
    color: #7fc500;
}
.org-gnus-group-news-2 {
    
    color: #5dc0aa;
    font-weight: bold;
}
.org-gnus-group-news-2-empty {
    
    color: #5dc0aa;
}
.org-gnus-group-news-3 {
    
    color: #af9fff;
    font-weight: bold;
}
.org-gnus-group-news-3-empty {
    
    color: #af9fff;
}
.org-gnus-group-news-4 {
    
    color: #7fcfdf;
    font-weight: bold;
}
.org-gnus-group-news-4-empty {
    
    color: #7fcfdf;
}
.org-gnus-group-news-5 {
    
    color: #cfc04f;
    font-weight: bold;
}
.org-gnus-group-news-5-empty {
    
    color: #cfc04f;
}
.org-gnus-group-news-6 {
    
    color: #37aff6;
    font-weight: bold;
}
.org-gnus-group-news-6-empty {
    
    color: #37aff6;
}
.org-gnus-group-news-low {
    
    color: #8fcfaf;
    font-weight: bold;
}
.org-gnus-group-news-low-empty {
    
    color: #8fcfaf;
}
.org-gnus-header {
    
    font-size: 110%;
}
.org-gnus-header-content {
    
    color: #7fc500;
}
.org-gnus-header-from {
    
    color: #3fb83f;
    font-weight: bold;
}
.org-gnus-header-name {
    
    font-weight: bold;
}
.org-gnus-header-newsgroups {
    
    color: #7fc500;
}
.org-gnus-header-subject {
    
    color: #37aff6;
    font-weight: bold;
}
.org-gnus-signature {
    
    font-style: italic;
}
.org-gnus-splash {
    
    color: #cccccc;
}
.org-gnus-summary-cancelled {
    
    color: #cfc04f;
    background-color: #3b3400;
}
.org-gnus-summary-high-ancient {
    
    color: #8fcfaf;
    font-weight: bold;
}
.org-gnus-summary-high-read {
    
    color: #808f80;
    font-weight: bold;
}
.org-gnus-summary-high-ticked {
    
    color: #ef6560;
    font-weight: bold;
}
.org-gnus-summary-high-undownloaded {
    
    color: #cfc04f;
    font-weight: bold;
    font-style: italic;
}
.org-gnus-summary-high-unread {
    
    font-weight: bold;
}
.org-gnus-summary-low-ancient {
    
    font-style: italic;
}
.org-gnus-summary-low-ticked {
    
    color: #ef6560;
    font-style: italic;
}
.org-gnus-summary-low-undownloaded {
    
    color: #cfc04f;
    font-style: italic;
}
.org-gnus-summary-low-unread {
    
    font-style: italic;
}
.org-gnus-summary-normal-ancient {
    
    color: #808f80;
}
.org-gnus-summary-normal-read {
    
    color: #808f80;
}
.org-gnus-summary-normal-ticked {
    
    color: #ef6560;
}
.org-gnus-summary-normal-undownloaded {
    
    color: #cfc04f;
}
.org-gnus-summary-normal-unread {
}
.org-gnus-summary-selected {
    
    color: #ffffff;
    background-color: #4f3f9a;
}
.org-header-line {
    
    background-color: #222522;
}
.org-header-line-active {
    
    background-color: #222522;
}
.org-header-line-highlight {
    
    color: #ffffff;
    background-color: #4f3f9a;
}
.org-header-line-inactive {
    
    background-color: #222522;
}
.org-help-argument-name {
    
    color: #00c089;
}
.org-help-for-help-header {
    
    font-size: 126%;
}
.org-highlight {
    
    color: #ffffff;
    background-color: #4f3f9a;
}
.org-holiday {
    
    color: #e490df;
}
.org-homoglyph {
    
    color: #00ffff;
}
.org-icon {
}
.org-icon-button {
    
    color: #ffffff;
    background-color: #505250;
}
.org-info-header-xref {
    
    color: #00c089;
    text-decoration: underline;
}
.org-info-index-match {
    
    background-color: #3b3400;
}
.org-info-menu-header {
    
    font-weight: bold;
}
.org-info-menu-star {
    
    color: #ef6560;
}
.org-info-node {
    
    font-weight: bold;
}
.org-info-quoted {
    
    color: #00c089;
}
.org-info-title-1 {
    
    color: #7fc500;
    font-weight: bold;
}
.org-info-title-2 {
    
    color: #5dc0aa;
    font-weight: bold;
}
.org-info-title-3 {
    
    color: #af9fff;
    font-weight: bold;
}
.org-info-title-4 {
    
    color: #7fcfdf;
    font-weight: bold;
}
.org-info-xref {
    
    color: #00c089;
    text-decoration: underline;
}
.org-internal-border {
}
.org-isearch {
    
    color: #ffffff;
    background-color: #8f5040;
}
.org-isearch-fail {
    
    color: #ef6560;
    background-color: #48100f;
    font-weight: bold;
}
.org-isearch-group-1 {
    
    color: #ffffff;
    background-color: #a04fc5;
}
.org-isearch-group-2 {
    
    color: #ffffff;
    background-color: #407430;
}
.org-italic {
    
    font-style: italic;
}
.org-keyword {
    
    color: #00c089;
    font-weight: bold;
}
.org-lazy-highlight {
    
    color: #ffffff;
    background-color: #4648d0;
}
.org-link {
    
    color: #00c089;
    text-decoration: underline;
}
.org-link-visited {
    
    color: #d38faf;
    text-decoration: underline;
}
.org-match {
    
    background-color: #3b3400;
}
.org-menu {
    
    color: #cfdfd5;
    background-color: #222522;
}
.org-message-cited-text-1 {
    
    color: #00c089;
}
.org-message-cited-text-2 {
    
    color: #78afff;
}
.org-message-cited-text-3 {
    
    color: #7fc500;
}
.org-message-cited-text-4 {
    
    color: #af9fff;
}
.org-message-header-cc {
    
    color: #3fb83f;
}
.org-message-header-name {
    
    font-weight: bold;
}
.org-message-header-newsgroups {
    
    color: #7fc500;
}
.org-message-header-other {
    
    color: #7fc500;
}
.org-message-header-subject {
    
    color: #37aff6;
    font-weight: bold;
}
.org-message-header-to {
    
    color: #3fb83f;
    font-weight: bold;
}
.org-message-header-xheader {
    
    color: #7fc500;
}
.org-message-mml {
    
    color: #7fc07f;
}
.org-message-separator {
    
    color: #cfdfd5;
    background-color: #222522;
}
.org-message-signature-separator {
    
    font-weight: bold;
}
.org-minibuffer-prompt {
    
    color: #5dc0aa;
}
.org-misc-punctuation {
}
.org-mm-command-output {
    
    color: #7fc07f;
}
.org-mm-uu-extract {
    
    color: #7fc07f;
}
.org-mode-line {
    
    color: #d0ffe0;
    background-color: #00552f;
}
.org-mode-line-active {
    
    color: #d0ffe0;
    background-color: #00552f;
}
.org-mode-line-buffer-id {
    
    font-weight: bold;
}
.org-mode-line-emphasis {
    
    color: #7fdfff;
    font-weight: bold;
}
.org-mode-line-highlight {
    
    color: #ffffff;
    background-color: #4f3f9a;
}
.org-mode-line-inactive {
    
    color: #808f80;
    background-color: #303230;
}
.org-mouse {
}
.org-mouse-drag-and-drop-region {
    
    background-color: #3a3027;
}
.org-negation-char {
    
    font-weight: bold;
}
.org-next-error {
    
    background-color: #3a3027;
}
.org-next-error-message {
    
    color: #ffffff;
    background-color: #4f3f9a;
}
.org-nobreak-hyphen {
    
    color: #00ffff;
}
.org-nobreak-space {
    
    color: #cfc04f;
    text-decoration: underline;
}
.org-number {
}
.org-operator {
}
.org-org-agenda-calendar-daterange {
    
    color: #8fcfaf;
}
.org-org-agenda-calendar-event {
    
    color: #8fcfaf;
}
.org-org-agenda-clocking {
    
    color: #cfc04f;
    background-color: #3b3400;
}
.org-org-agenda-column-dateline {
    
    background-color: #303230;
}
.org-org-agenda-current-time {
    
    color: #cfdfd5;
}
.org-org-agenda-date {
    
    color: #6fc5ef;
    font-weight: bold;
}
.org-org-agenda-date-today {
    
    color: #6fc5ef;
    font-weight: bold;
    text-decoration: underline;
}
.org-org-agenda-date-weekend {
    
    color: #d56f72;
    font-weight: bold;
}
.org-org-agenda-date-weekend-today {
    
    color: #d56f72;
    font-weight: bold;
    text-decoration: underline;
}
.org-org-agenda-diary {
    
    color: #8fcfaf;
    font-style: italic;
}
.org-org-agenda-dimmed-todo {
    
    color: #808f80;
}
.org-org-agenda-done {
    
    color: #3fb83f;
}
.org-org-agenda-filter-category {
    
    color: #ff9fbf;
    font-weight: bold;
}
.org-org-agenda-filter-effort {
    
    color: #ff9fbf;
    font-weight: bold;
}
.org-org-agenda-filter-regexp {
    
    color: #ff9fbf;
    font-weight: bold;
}
.org-org-agenda-filter-tags {
    
    color: #ff9fbf;
    font-weight: bold;
}
.org-org-agenda-restriction-lock {
    
    color: #808f80;
    background-color: #222522;
}
.org-org-agenda-structure {
    
    color: #8fcfaf;
    font-weight: bold;
}
.org-org-agenda-structure-filter {
    
    color: #cfc04f;
    font-weight: bold;
}
.org-org-agenda-structure-secondary {
    
    color: #7fc07f;
    font-style: italic;
}
.org-org-archived {
    
    color: #cfdfd5;
    background-color: #303230;
}
.org-org-block {
    
    background-color: #161916;
}
.org-org-block-end-line {
    
    color: #808f80;
    background-color: #222522;
}
.org-org-checkbox {
    
    color: #cfc04f;
}
.org-org-checkbox-statistics-done {
    
    color: #3fb83f;
}
.org-org-checkbox-statistics-todo {
    
    color: #ef6560;
}
.org-org-cite {
    
    color: #00c089;
    text-decoration: underline;
}
.org-org-cite-key {
    
    color: #00c089;
    text-decoration: underline;
}
.org-org-clock-overlay {
    
    background-color: #003e5f;
}
.org-org-code {
    
    color: #78afff;
}
.org-org-column {
    
    color: #cfdfd5;
    background-color: #303230;
}
.org-org-date {
    
    color: #5dc0aa;
}
.org-org-date-selected {
    
    color: #5dc0aa;
}
.org-org-default {
    
    color: #cfdfd5;
    background-color: #111111;
}
.org-org-dispatcher-highlight {
    
    color: #cfc04f;
    background-color: #3b3400;
    font-weight: bold;
}
.org-org-document-info {
    
    color: #8fcfaf;
}
.org-org-document-info-keyword {
    
    color: #808f80;
}
.org-org-document-title {
    
    color: #00c089;
    font-weight: bold;
}
.org-org-done {
    
    color: #3fb83f;
}
.org-org-drawer {
    
    color: #808f80;
}
.org-org-ellipsis {
}
.org-org-footnote {
    
    color: #00c089;
    text-decoration: underline;
}
.org-org-formula {
    
    color: #cfc04f;
}
.org-org-headline-done {
    
    color: #3fb83f;
}
.org-org-headline-todo {
    
    color: #ef6560;
}
.org-org-hide {
    
    color: #111111;
}
.org-org-imminent-deadline {
    
    color: #ff778f;
    font-weight: bold;
}
.org-org-inline-src-block {
    
    background-color: #161916;
}
.org-org-latex-and-related {
    
    color: #7fcfdf;
}
.org-org-level-1 {
    
    color: #7fc500;
    font-weight: bold;
}
.org-org-level-2 {
    
    color: #5dc0aa;
    font-weight: bold;
}
.org-org-level-3 {
    
    color: #af9fff;
    font-weight: bold;
}
.org-org-level-4 {
    
    color: #7fcfdf;
    font-weight: bold;
}
.org-org-level-5 {
    
    color: #cfc04f;
    font-weight: bold;
}
.org-org-level-6 {
    
    color: #37aff6;
    font-weight: bold;
}
.org-org-level-7 {
    
    color: #6fc5ef;
    font-weight: bold;
}
.org-org-level-8 {
    
    color: #d38faf;
    font-weight: bold;
}
.org-org-link {
    
    color: #00c089;
    text-decoration: underline;
}
.org-org-list-dt {
    
    font-weight: bold;
}
.org-org-macro {
    
    color: #e490df;
}
.org-org-meta-line {
    
    color: #808f80;
}
.org-org-mode-line-clock {
}
.org-org-mode-line-clock-overrun {
    
    color: #ff9fbf;
    font-weight: bold;
}
.org-org-priority {
    
    color: #b7a07f;
}
.org-org-property-value {
    
    color: #8fcfaf;
}
.org-org-quote {
    
    background-color: #161916;
}
.org-org-scheduled {
    
    color: #b7a07f;
}
.org-org-scheduled-today {
    
    color: #cfc04f;
}
.org-org-sexp-date {
    
    color: #5dc0aa;
}
.org-org-table {
    
    color: #8fcfaf;
}
.org-org-table-row {
    
    color: #8fcfaf;
}
.org-org-tag {
    
    color: #b7a07f;
}
.org-org-target {
    
    text-decoration: underline;
}
.org-org-time-grid {
    
    color: #808f80;
}
.org-org-todo {
    
    color: #ef6560;
}
.org-org-upcoming-deadline {
    
    color: #d56f72;
}
.org-org-upcoming-distant-deadline {
    
    color: #cfdfd5;
}
.org-org-verbatim {
    
    color: #00c089;
}
.org-org-verse {
    
    background-color: #161916;
}
.org-org-warning {
    
    color: #cfc04f;
    font-weight: bold;
}
.org-outline-1 {
    
    color: #7fc500;
    font-weight: bold;
}
.org-outline-2 {
    
    color: #5dc0aa;
    font-weight: bold;
}
.org-outline-3 {
    
    color: #af9fff;
    font-weight: bold;
}
.org-outline-4 {
    
    color: #7fcfdf;
    font-weight: bold;
}
.org-outline-5 {
    
    color: #cfc04f;
    font-weight: bold;
}
.org-outline-6 {
    
    color: #37aff6;
    font-weight: bold;
}
.org-outline-7 {
    
    color: #6fc5ef;
    font-weight: bold;
}
.org-outline-8 {
    
    color: #d38faf;
    font-weight: bold;
}
.org-package-description {
    
    color: #7fc07f;
}
.org-package-help-section-name {
    
    font-weight: bold;
}
.org-package-name {
    
    color: #00c089;
    text-decoration: underline;
}
.org-package-status-avail-obso {
    
    color: #ef6560;
    font-weight: bold;
}
.org-package-status-available {
    
    color: #5dc0aa;
}
.org-package-status-built-in {
    
    color: #3fb83f;
}
.org-package-status-dependency {
    
    color: #cfc04f;
}
.org-package-status-disabled {
    
    color: #ef6560;
    font-weight: bold;
    text-decoration: line-through;
}
.org-package-status-external {
    
    color: #3fb83f;
}
.org-package-status-from-source {
    
    color: #7fcfdf;
}
.org-package-status-held {
    
    color: #cfc04f;
}
.org-package-status-incompat {
    
    color: #cfc04f;
    font-weight: bold;
}
.org-package-status-installed {
    
    color: #8fcfaf;
}
.org-package-status-new {
    
    color: #3fb83f;
    font-weight: bold;
}
.org-package-status-unsigned {
    
    color: #ef6560;
    font-weight: bold;
}
.org-preprocessor {
    
    color: #5dc0aa;
}
.org-property-name {
    
    color: #78afff;
}
.org-property-use {
    
    color: #78afff;
}
.org-punctuation {
}
.org-query-replace {
    
    color: #ffffff;
    background-color: #b02930;
}
.org-read-multiple-choice {
    
    color: #cfc04f;
    background-color: #3b3400;
    font-weight: bold;
}
.org-regexp {
    
    color: #af9fff;
}
.org-regexp-grouping-backslash {
    
    color: #cfc04f;
}
.org-regexp-grouping-construct {
    
    color: #3fb83f;
}
.org-region {
    
    background-color: #3a3027;
}
.org-scroll-bar {
    
    color: #808f80;
    background-color: #222522;
}
.org-secondary-selection {
    
    color: #ffffff;
    background-color: #003e5f;
}
.org-separator-line {
    
    background-color: #505050;
    font-size: 10%;
}
.org-sgml-namespace {
    
    color: #3fb83f;
    font-weight: bold;
}
.org-sh-escaped-newline {
    
    color: #af9fff;
}
.org-sh-heredoc {
    
    color: #7fc07f;
    font-style: italic;
}
.org-sh-quoted-exec {
    
    color: #3fb83f;
    font-weight: bold;
}
.org-shadow {
    
    color: #808f80;
}
.org-show-paren-match {
    
    color: #ffffff;
    background-color: #664950;
}
.org-show-paren-match-expression {
    
    background-color: #303230;
}
.org-show-paren-mismatch {
    
    color: #ffffff;
    background-color: #b02930;
}
.org-shr-abbreviation {
    
    text-decoration: underline;
}
.org-shr-code {
    
    color: #78afff;
}
.org-shr-h1 {
    
    color: #7fc500;
    font-weight: bold;
}
.org-shr-h2 {
    
    color: #5dc0aa;
    font-weight: bold;
}
.org-shr-h3 {
    
    color: #af9fff;
    font-weight: bold;
}
.org-shr-h4 {
    
    color: #7fcfdf;
    font-weight: bold;
}
.org-shr-h5 {
    
    color: #cfc04f;
    font-weight: bold;
}
.org-shr-h6 {
    
    color: #37aff6;
    font-weight: bold;
}
.org-shr-link {
    
    color: #00c089;
    text-decoration: underline;
}
.org-shr-mark {
    
    background-color: #3b3400;
}
.org-shr-selected-link {
    
    color: #00c089;
    background-color: #222522;
    text-decoration: underline;
}
.org-shr-sliced-image {
}
.org-shr-strike-through {
    
    text-decoration: line-through;
}
.org-shr-sup {
    
    font-size: 80%;
}
.org-shr-text {
    
    font-size: 110%;
}
.org-smerge-base {
    
    color: #efef80;
    background-color: #363300;
}
.org-smerge-lower {
    
    color: #a0e0a0;
    background-color: #003b1f;
}
.org-smerge-markers {
}
.org-smerge-refined-added {
    
    color: #a0e0a0;
    background-color: #03512f;
}
.org-smerge-refined-changed {
}
.org-smerge-refined-removed {
    
    color: #ffbfbf;
    background-color: #751a1f;
}
.org-smerge-upper {
    
    color: #ffbfbf;
    background-color: #4e1119;
}
.org-string {
    
    color: #af9fff;
}
.org-success {
    
    color: #3fb83f;
    font-weight: bold;
}
.org-tab-bar {
    
    background-color: #303230;
}
.org-tab-bar-tab {
    
    background-color: #111111;
    font-weight: bold;
}
.org-tab-bar-tab-group-current {
    
    color: #8fcfaf;
    background-color: #111111;
    font-weight: bold;
}
.org-tab-bar-tab-group-inactive {
    
    color: #8fcfaf;
    background-color: #303230;
}
.org-tab-bar-tab-highlight {
    
    color: #000000;
    background-color: #d9d9d9;
}
.org-tab-bar-tab-inactive {
    
    background-color: #505250;
}
.org-tab-bar-tab-ungrouped {
    
    background-color: #505250;
}
.org-tab-line {
    
    background-color: #303230;
    font-size: 95%;
}
.org-table-cell {
    
    color: #e5e5e5;
    background-color: #0000ff;
}
.org-tabulated-list-fake-header {
    
    font-weight: bold;
    text-decoration: underline;
    text-decoration: overline;
}
.org-tool-bar {
    
    color: #cfdfd5;
    background-color: #222522;
}
.org-tooltip {
    
    color: #ffffff;
    background-color: #303230;
}
.org-trailing-whitespace {
    
    color: #ffffff;
    background-color: #b02930;
}
.org-treesit-explorer-anonymous-node {
    
    color: #808f80;
}
.org-treesit-explorer-field-name {
}
.org-tty-menu-disabled {
    
    color: #808f80;
    background-color: #303230;
}
.org-tty-menu-enabled {
    
    color: #ffffff;
    background-color: #303230;
}
.org-tty-menu-selected {
    
    color: #ffffff;
    background-color: #4f3f9a;
}
.org-type {
    
    color: #7fcfdf;
}
.org-underline {
    
    text-decoration: underline;
}
.org-variable-name {
    
    color: #78afff;
}
.org-variable-pitch {
}
.org-variable-pitch-text {
    
    font-size: 110%;
}
.org-variable-use {
    
    color: #78afff;
}
.org-vc-conflict-state {
    
    color: #ef6560;
    font-weight: bold;
}
.org-vc-edited-state {
    
    font-style: italic;
}
.org-vc-git-log-edit-summary-max-warning {
    
    color: #ef6560;
}
.org-vc-git-log-edit-summary-target-warning {
    
    color: #cfc04f;
}
.org-vc-ignored-state {
}
.org-vc-locally-added-state {
    
    font-style: italic;
}
.org-vc-locked-state {
    
    color: #3fb83f;
    font-weight: bold;
}
.org-vc-missing-state {
    
    color: #ef6560;
    font-weight: bold;
}
.org-vc-needs-update-state {
    
    color: #ef6560;
    font-weight: bold;
}
.org-vc-removed-state {
    
    color: #ef6560;
    font-weight: bold;
}
.org-vc-state-base {
}
.org-vc-up-to-date-state {
}
.org-vertical-border {
    
    color: #525959;
}
.org-vtable {
}
.org-warning {
    
    color: #cfc04f;
    font-weight: bold;
}
.org-warning-1 {
    
    color: #cfc04f;
}
.org-widget-button {
    
    color: #00c089;
    font-weight: bold;
}
.org-widget-button-pressed {
    
    color: #d38faf;
    font-weight: bold;
}
.org-widget-documentation {
    
    color: #7fc07f;
    font-style: italic;
}
.org-widget-field {
    
    color: #cfdfd5;
    background-color: #303230;
}
.org-widget-inactive {
    
    color: #808f80;
    background-color: #222522;
}
.org-widget-single-line-field {
    
    color: #cfdfd5;
    background-color: #303230;
}
.org-widget-unselected {
    
    color: #808f80;
    background-color: #222522;
}
.org-window-divider {
    
    color: #525959;
}
.org-window-divider-first-pixel {
    
    color: #161916;
}
.org-window-divider-last-pixel {
    
    color: #161916;
}





Future plans

These are the future plans:

  • [X] Rewrite the style sheet
  • [ ] Make the index "interesting"
  • [ ] Tag based searching
  • [X] Show tags on each page
  • [X] RSS feeds
emailreplace [at] with @, and put the domain for username, and vice versa: sdf.org [at] tusharhero

© tusharhero 2024-2025, check licenses page for details.

Date: 2025-04-25 Fri 00:00

Emacs 31.0.50 (Org mode 9.7.11)