aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiguel Ángel Moreno <mail@migalmoreno.com>2024-05-29 12:24:24 +0200
committerMiguel Ángel Moreno <mail@migalmoreno.com>2024-05-29 12:24:24 +0200
commit68acd09e4aa653865038be6397cb73c3dc57ac68 (patch)
tree895adba51f6cd173dd47370d12f5b963f9ee8fc7
parent4c16155bd09907d7192464eb5f26e6ce21ede66e (diff)
feat: update projects
-rw-r--r--haunt.scm193
1 files changed, 109 insertions, 84 deletions
diff --git a/haunt.scm b/haunt.scm
index 1d836ed..1d5f990 100644
--- a/haunt.scm
+++ b/haunt.scm
@@ -18,7 +18,7 @@
;;
-;; Utilities
+;; Components/Utilities
;;
(define* (highlight-code code #:key (lang 'scheme))
@@ -52,6 +52,33 @@
'())))
,label))
+(define (bulleted-list entries)
+ `(ul (@ (class "list"))
+ ,@(map (lambda (i)
+ `(li (@ (class "list-item--type-bulleted")) ,i))
+ entries)))
+
+(define (post-entries site posts)
+ `(ul (@ (class "blog__wrapper"))
+ ,@(map (lambda (post)
+ `(a (@ (class "post-item")
+ (href ,(post-uri site post)))
+ (span (@ (class "post-item__title")) ,(post-ref post 'title))
+ (span (@ (class "post-item__date"))
+ ,(date->string* (post-date post)))))
+ posts)))
+
+(define* (stylesheet name #:key local?)
+ `(link (@ (rel "stylesheet")
+ (href ,(if local?
+ (string-append "/assets/css/" name ".css")
+ name)))))
+
+(define (script name)
+ `(script (@ (type "text/javascript")
+ (src ,(string-append "/assets/js/" name ".js")))))
+
+
(define (post-uri site post)
(string-append "/posts/" (site-post-slug site post) ".html"))
@@ -64,42 +91,39 @@
(define %email "mail@migalmoreno.com")
(define %username "migalmoreno")
(define %fullname "Miguel Ángel Moreno")
+
+(define (project-uri name)
+ (format #f "https://git.~a/~a" %domain name))
+
(define %projects
(list
(project
#:name "tubo"
#:synopsis "A libre streaming front-end for the web"
- #:link (format #f "https://github.com/~a/tubo" %username)
+ #:link (project-uri "tubo")
#:tags '("clojure" "clojurescript")
- #:license "GPL-3.0+"
+ #:license "AGPL-3.0"
#:description
- `((p "Tubo is a libre web front-end for some of the most popular
-streaming sites, including YouTube, SoundCloud, Bandcamp, among other.")
- (p "It acts like a privacy-friendly proxy that compiles all the content
-from the above sites and presents it to you in a distraction-free interface. It
-gathers the necessary data via "
- ,(anchor "NewPipeExtractor"
- "https://github.com/TeamNewPipe/NewPipeExtractor")
- ", the library that powers the popular "
- ,(anchor "NewPipe" "https://github.com/TeamNewPipe/NewPipe") " Android
-app, which means no official APIs are used. The ultimate goal behind this
-project is to offer a web-based alternative to NewPipe for desktop and
-non-Android users.")
- (p "Currently, it features search and watch functionality, audio-only
-playback, media queuing, bookmarks, and settings. Its roadmap includes feeds,
-downloads, offline mode, and more.")
- (figure
- (img (@ (src
- ,(format #f "https://files.~a/tubo_channel_dark_media_queue.jpg"
- %domain))
- (style "width:100%")
- (alt "Tubo channel page screenshot")
- (class "post__image")))
- (figcaption "Channel page view"))))
+ `((p "Tubo is a web front-end to many streaming platforms (YouTube,
+ SoundCloud, Bandcamp, etc.).")
+ (p "It acts like a privacy-friendly middleman that gathers the content
+from these sites and displays it to you in a distraction-free interface along
+with features that are usually locked behind premium subscriptions. Its ultimate
+goal is to offer a full-fledged web-based alternative to "
+ ,(anchor "Newpipe" "https://github.com/TeamNewPipe/NewPipe") ".")
+ (br)
+ (h3 "Tech Stack")
+ (p "Tubo is a Clojure(Script) full-stack application that interops with
+the " ,(anchor "NewPipeExtractor"
+ "https://github.com/TeamNewPipe/NewPipeExtractor") " library.
+Main tools include:")
+ ,(bulleted-list
+ (list "http-kit" "ring" "reitit" "re-frame" "reagent" "promesa"
+ "deps.edn" "shadow-cljs" "webpack" "tailwindcss" "docker"))))
(project
#:name "nx-router"
#:synopsis "A declarative URL routing extension for Nyxt"
- #:link (format #f "https://github.com/~a/nx-router" %username)
+ #:link (project-uri "nx-router")
#:tags '("common-lisp" "browser")
#:license "BSD 3-Clause"
#:description
@@ -112,13 +136,24 @@ openers with an easy and declarative syntax.")
(p "It aims to be simple while staying composable and flexible.
Routers are defined like this:")
,(highlight-code
- "(make-instance 'router:redirector
- :route \"https://([\\w'-]+)\\.fandom.com/wiki/(.*)\"
- :redirect \"https://breezewiki.com/\\1/wiki/\\2\")"
+ "(list
+ (make-instance 'router:redirector
+ :name 'fandom
+ :route \"https://([\\w'-]+)\\.fandom.com/wiki/(.*)\"
+ :redirect \"https://breezewiki.com/\\1/wiki/\\2\")
+ (make-instance 'router:blocker
+ :name 'fandom
+ :route (match-domain \"fandom.com\")
+ :instances-builder router:breezewiki-instances-builder
+ :blocklist \".*/search\")
+ (make-instance 'router:opener
+ :name 'fandom
+ :resource \"mpv --video=no ~a\"))"
#:lang 'lisp)
- (p "You can also set reverse redirects so that certain URLs get recorded
-with their original path, which is useful if you don't want to have to deal
-with unmaintained instances of privacy frontends.")
+ (p "A particular feature of the redirector router is support for reverse redirects
+so that certain URLs get recorded with their original path, which is useful if
+you don't want to record alternative frontends URLs and potentially deal with
+unmaintained instances in the future.")
,(highlight-code
"(make-instance 'router:redirector
:route (match-regex \"https://.*google.com/search.*\")
@@ -128,7 +163,7 @@ with unmaintained instances of privacy frontends.")
(project
#:name "nx-tailor"
#:synopsis "A theme manager for Nyxt"
- #:link (format #f "https://github.com/~a/nx-tailor" %username)
+ #:link (project-uri "nx-tailor")
#:tags '("common-lisp" "browser")
#:license "BSD 3-Clause"
#:description
@@ -136,64 +171,74 @@ with unmaintained instances of privacy frontends.")
,(anchor "Nyxt" "https://nyxt.atlas.engineer") " browser. It leverages
the built-in " (code "nyxt/theme") " library to allow defining multiple themes
to switch between at browser runtime.")
- (p "It also has a timer functionality to automatically change them
-depending on the time of the day.")
- (figure
- (video (@ (src ,(format #f "https://files.~a/nx_tailor.mp4" %domain))
- (style "width:100%")
- (autoplay "true")
- (controls "true")
- (class "post__image")))
- (figcaption "Changing the theme via the prompt buffer"))))
+ (p "I developed this extension because to this day there's no easy way
+to preview Nyxt themes without restarting the browser and I wanted to bring the
+same REPL-based interactivity to theme development.")
+ (p "Since then, the feature set has grown and it now also supports user-specified
+criteria for theme selection at launch and a timer functionality to
+automatically switch it based on the time of the day.")))
+ (project
+ #:name "nx-mosaic"
+ #:synopsis "A configurable new-buffer page for Nyxt"
+ #:link (project-uri "nx-mosaic")
+ #:tags '("common-lisp" "browser")
+ #:license "BSD 3-Clause"
+ #:description
+ `((p "nx-mosaic is a highly customizable new-buffer page (startpage) for
+the " ,(anchor "Nyxt" "https://nyxt.atlas.engineer") " browser. It's inspired
+by the " ,(anchor "Tabliss" "https://tabliss.io") " web extension, and aims to
+create a Nyxt-native startpage that you can control to your heart's content
+via a wide array of widgets.")))
(project
#:name "fdroid.el"
#:synopsis "An Emacs interface to the F-Droid package repository"
- #:link (format #f "https://github.com/~a/fdroid.el" %username)
+ #:link (project-uri "fdroid.el")
#:tags '("emacs-lisp" "fdroid")
#:license "GPL-3.0+"
#:description
`((p "fdroid.el is a completion-based interface to work with
F-Droid packages from Emacs.")
(p "Having to deal with Android emulators quite often and needing to
-install packages on initial setup, I developed this project to be able to
+install packages on initial setup, I developed this library to be able to
quickly manage F-Droid packages without having to resort to the F-Droid website
or having to download APKs manually.")))
(project
#:name "nyxt.el"
#:synopsis "A minimal API to interact with Nyxt from Emacs"
- #:link (format #f "https://github.com/~a/nyxt.el" %username)
+ #:link (project-uri "nyxt.el")
#:tags '("emacs-lisp" "nyxt")
#:license "GPL-3.0+"
#:description
- `((p "nyxt.el is a minimal API to interact with Nyxt from Emacs.")
- (p "It contains a useful helper " (code "nyxt-run") " to run a Nyxt
-process seamlessly from Emacs and provides optional integration with the
-Emacs X Window Manager (EXWM).")))
+ `((p "nyxt.el is a minimal API to interact with Nyxt from Emacs. I developed this
+library to make it easy for others to build their own Nyxt<->Emacs functionality.")
+ (p "For this, it contains a useful helper " (code "nyxt-run") " which launches
+or connects to an existing Nyxt process with a specified Nyxt command.")
+ (p "If you're interested in getting data from Nyxt without sending any commands
+through, you can use the " (code "nyxt--sly-eval") " function, and create your own
+interactive functions along these lines:")
+ ,(highlight-code
+ "(defun nyxt-insert-url ()
+ (interactive)
+ (insert (nyxt--sly-eval '(render-url (url (current-buffer))))))"
+ #:lang 'lisp)))
(project
#:name "guix-config"
#:synopsis "Personal Guix configuration"
- #:link (format #f "https://github.com/~a/guix-config" %username)
+ #:link (project-uri "guix-config")
#:tags '("scheme" "rde" "dotfiles")
#:license "GPL-3.0+"
#:description
`((p "My personal set of configuration files built on top of Guix and
-RDE. The project is focused on providing a central point to all my systems, from
-a home/system configuration in my local development machine to a self-hosted
-setup in my personal VPS.")
- (figure
- (img (@ (src ,(format #f "https://files.~a/guix_config_setup.jpg"
- %domain))
- (style "width:100%")
- (alt "Screenshot of my Guix configuration")
- (class "post__image")))
- (figcaption "Screenshot of my setup"))
- (p "Previously, I used to maintain this project as a personal Guix
+RDE. The goal is to provide a central point to all my systems, from a
+home/system configuration in my local development machine to a self-hosted setup
+in my personal VPS.")
+ (p "Previously, I used to maintain this repository as a personal Guix
channel, but over time I found this to be unsustainable, so I now contribute
packages, services, and features upstream as much as I can.")))
(project
#:name "blog"
#:synopsis "Personal site and blog"
- #:link (format #f "https://github.com/~a/blog" %username)
+ #:link (project-uri "blog")
#:tags '("scheme" "org-mode" "haunt")
#:license "GPL-3.0+"
#:description
@@ -211,29 +256,9 @@ describe my personal projects and contributions.")))))
;;
-;; Components
+;; Layouts
;;
-(define (post-entries site posts)
- `(ul (@ (class "blog__wrapper"))
- ,@(map (lambda (post)
- `(a (@ (class "post-item")
- (href ,(post-uri site post)))
- (span (@ (class "post-item__title")) ,(post-ref post 'title))
- (span (@ (class "post-item__date"))
- ,(date->string* (post-date post)))))
- posts)))
-
-(define* (stylesheet name #:key local?)
- `(link (@ (rel "stylesheet")
- (href ,(if local?
- (string-append "/assets/css/" name ".css")
- name)))))
-
-(define (script name)
- `(script (@ (type "text/javascript")
- (src ,(string-append "/assets/js/" name ".js")))))
-
(define navbar
`(header (@ (class "navbar"))
(input (@ (class "navbar__mobile-menu")