diff --git a/src/posts/0022-org-agenda-on-your-startup-page/agenda-html.png b/src/posts/0022-org-agenda-on-your-startup-page/agenda-html.png new file mode 100644 index 0000000..93eaecf Binary files /dev/null and b/src/posts/0022-org-agenda-on-your-startup-page/agenda-html.png differ diff --git a/src/posts/0022-org-agenda-on-your-startup-page/index.org b/src/posts/0022-org-agenda-on-your-startup-page/index.org new file mode 100644 index 0000000..ca52934 --- /dev/null +++ b/src/posts/0022-org-agenda-on-your-startup-page/index.org @@ -0,0 +1,232 @@ +#+title: Org agenda on your startup page +#+description: +#+keywords: blog static +#+author: Yann Esposito +#+email: yann@esposito.host +#+date: [2022-05-05 Thu] +#+lang: en +#+options: auto-id:t +#+startup: showeverything + +* Your org-agenda at your homepage :ATTACH: +:PROPERTIES: +:CUSTOM_ID: your-org-agenda-at-your-homepage +:ID: d88a1458-07bb-4c73-86c3-9f09b3d6a1ad +:END: + +During most of the day my emacs is open. +But I sometime forget to look at my org-agenda. +This is why I wanted to find another way to be exposed to it. + +And one thing I am mostly exposed to is my personal start page. +This is just the default page I see when I open my browser. + +Here is the end result: + +#+ATTR_ORG: :width 560 +#+ATTR_HTML: Generate HTML from the Agenda +#+CAPTION: The result inside my start page +#+NAME: fig:agenda-html +[[./agenda-html.png]] + + +My start page is named /mothership/. +And I just put the org-agenda at the top of the page inside an iframe. +I have a service that start a server on localhost and I configured my +browser to use it as startup page. +That's it. + +So now, here is how to sync my org-agenda on this start page. + +In my ~config.el~: + +#+begin_src elisp +(setq y/mothership "~/dev/mothership/") +(setq org-agenda-custom-commands + `(("g" "Plan Today" + ((agenda "" ((org-agenda-span 'day)))) + nil + ( ,(concat y/mothership "/agenda.html") )))) +#+end_src + +This provide a custom org agenda command and link that custom command to +the export file =~/dev/mothership/agenda.html=. + +And a shell script: + +#+begin_src bash +#!/usr/bin/env bash +emacs --batch \ + --load "$HOME/.emacs.d/init.el" \ + --eval '(org-batch-store-agenda-views)' \ + --kill +#+end_src + +#+begin_src bash +*/5 * * * * /Users/esposito/dev/mothership/export-agenda.sh +#+end_src + +And finally in my start-page html I just need to add an iframe like so: + +#+begin_src html + +#+end_src + +But as I also want to be able to toggle the agenda, and auto-resize the +iframe. +So I added a bit of js code: + +#+begin_src html +
[-]

+ + + + +#+end_src + +And that's it. +That's a neat trick, and so I'm glad to put a small post about it. +** Bonuses +:PROPERTIES: +:CUSTOM_ID: bonuses +:END: +*** auto-resize iframe +:PROPERTIES: +:CUSTOM_ID: auto-resize-iframe +:END: + +In order to auto-resize the iframe you must have a non =file:///= URL in the browser. +So you must serve your start page. +After a lot of different way to serve my pages, I finally use ~lighttpd~ +inside a ~nix-shell~. + +So I added the following to my startpage code: + +A [[./lighttpd.conf]] file + +#+begin_src conf :tangle lighttpd.conf +server.bind = "127.0.0.1" +server.port = 31337 +server.document-root = var.CWD + +index-file.names = ( "index.html" ) + +mimetype.assign = ( + ".css" => "text/css", + ".gif" => "image/gif", + ".htm" => "text/html", + ".html" => "text/html", + ".jpeg" => "image/jpeg", + ".jpg" => "image/jpeg", + ".js" => "text/javascript", + ".png" => "image/png", + ".swf" => "application/x-shockwave-flash", + ".txt" => "text/plain", + ".gmi" => "text/plain", + ".svg" => "image/svg+xml", + ".svgz" => "image/svg+xml" +) + +# Making sure file uploads above 64k always work when using IE or Safari +# For more information, see http://trac.lighttpd.net/trac/ticket/360 +$HTTP["useragent"] =~ "^(.*MSIE.*)|(.*AppleWebKit.*)$" { + server.max-keep-alive-requests = 0 +} +#+end_src + +With a + +#+begin_src bash :tangle serve.sh +#! /user/bin/env nix-shell +#! nix-shell shell.nix -i bash +webdir="_site" +port="$(grep server.port ./lighttpd.conf|sed 's/[^0-9]*//')" +echo "Serving: $webdir on http://localhost:$port" && \ +lighttpd -f ./lighttpd.conf -D +#+end_src + +I have a frozen nixpkgs dependencies via =niv=. +But you could probably simply replace the line by: + +#+begin_src +#! nix-shell -p lighttpd -i bash +#+end_src + +And it should work fine. + +*** Start your server at startup on macOS +:PROPERTIES: +:CUSTOM_ID: start-your-server-at-startup-on-macos +:END: + +Last but not least, starting this start page server when I login. + +So for that you should demonize with launchd. + +I created a [[./y.mothership.plist]] file to put in =~/Library/LauchAgents/=: + +#+begin_src xml :tangle y.mothership.plist + + + + + Label + mothership + ProgramArguments + + /bin/zsh + -c + $HOME/y/mothership/serve.sh + + StandardOutPath + /var/log/mothership.log + StandardErrorPath + /var/log/mothership.log + + +#+end_src + +Then to ensure that the executable ~nix-shell~ is present in the PATH for the +demon, I ran: + +#+begin_src +launchctl config user path "$PATH" +#+end_src + +This will affect the path of all users, but as I am the only user on my +computer this is fine for me. + +Then: + +#+begin_src +launchctl load ~/Library/LaunchAgents/y.mothership.plist +launchctl start mothership +#+end_src + + +And that's about it. diff --git a/src/posts/0022-org-agenda-on-your-startup-page/lighttpd.conf b/src/posts/0022-org-agenda-on-your-startup-page/lighttpd.conf new file mode 100644 index 0000000..f86c19f --- /dev/null +++ b/src/posts/0022-org-agenda-on-your-startup-page/lighttpd.conf @@ -0,0 +1,27 @@ +server.bind = "127.0.0.1" +server.port = 31337 +server.document-root = var.CWD + +index-file.names = ( "index.html" ) + +mimetype.assign = ( + ".css" => "text/css", + ".gif" => "image/gif", + ".htm" => "text/html", + ".html" => "text/html", + ".jpeg" => "image/jpeg", + ".jpg" => "image/jpeg", + ".js" => "text/javascript", + ".png" => "image/png", + ".swf" => "application/x-shockwave-flash", + ".txt" => "text/plain", + ".gmi" => "text/plain", + ".svg" => "image/svg+xml", + ".svgz" => "image/svg+xml" +) + +# Making sure file uploads above 64k always work when using IE or Safari +# For more information, see http://trac.lighttpd.net/trac/ticket/360 +$HTTP["useragent"] =~ "^(.*MSIE.*)|(.*AppleWebKit.*)$" { + server.max-keep-alive-requests = 0 +} diff --git a/src/posts/0022-org-agenda-on-your-startup-page/serve.sh b/src/posts/0022-org-agenda-on-your-startup-page/serve.sh new file mode 100644 index 0000000..ea88712 --- /dev/null +++ b/src/posts/0022-org-agenda-on-your-startup-page/serve.sh @@ -0,0 +1,6 @@ +#! /user/bin/env nix-shell +#! nix-shell shell.nix -i bash +webdir="_site" +port="$(grep server.port ./lighttpd.conf|sed 's/[^0-9]*//')" +echo "Serving: $webdir on http://localhost:$port" && \ +lighttpd -f ./lighttpd.conf -D diff --git a/src/posts/0022-org-agenda-on-your-startup-page/y.mothership.plist b/src/posts/0022-org-agenda-on-your-startup-page/y.mothership.plist new file mode 100644 index 0000000..9af9548 --- /dev/null +++ b/src/posts/0022-org-agenda-on-your-startup-page/y.mothership.plist @@ -0,0 +1,18 @@ + + + + + Label + mothership + ProgramArguments + + /bin/zsh + -c + $HOME/y/mothership/serve.sh + + StandardOutPath + /var/log/mothership.log + StandardErrorPath + /var/log/mothership.log + +