diff options
Diffstat (limited to 'users/tazjin/homepage')
17 files changed, 377 insertions, 0 deletions
diff --git a/users/tazjin/homepage/default.nix b/users/tazjin/homepage/default.nix new file mode 100644 index 000000000000..b46f9d4917f4 --- /dev/null +++ b/users/tazjin/homepage/default.nix @@ -0,0 +1,97 @@ +# Assembles the website index and configures an nginx instance to +# serve it. +# +# The website is made up of a simple header&footer and content +# elements for things such as blog posts and projects. +# +# Content for the blog is in //users/tazjin/blog instead of here. +{ depot, lib, pkgs, ... }@args: + +with depot; +with nix.yants; + +let + inherit (builtins) readFile replaceStrings sort; + inherit (pkgs) writeFile runCommand; + + # The different types of entries on the homepage. + entryClass = enum "entryClass" [ + "blog" + "project" + "note" + "misc" + ]; + + # The definition of a single entry. + entry = struct "entry" { + class = entryClass; + title = option string; + url = option string; + date = int; # epoch + description = option string; + }; + + escape = replaceStrings [ "<" ">" "&" "'" ] [ "<" ">" "&" "'" ]; + + postToEntry = defun [ web.blog.post entry ] (post: { + class = "blog"; + title = post.title; + url = "/blog/${post.key}"; + date = post.date; + description = post.description or "Blog post from ${formatDate post.date}"; + }); + + formatDate = defun [ int string ] (date: readFile (runCommand "date" { } '' + date --date='@${toString date}' '+%Y-%m-%d' | tr -d '\n' > $out + '')); + + entryUrl = defun [ entry string ] (entry: + if entry.class == "note" + then "#${toString entry.date}" + else entry.url + ); + + hasDescription = defun [ entry bool ] (entry: + ((entry ? description) && (entry.description != null)) + ); + + entryTitle = defun [ entry string ] (entry: + let + optionalColon = lib.optionalString (hasDescription entry) ":"; + titleText = + if (!(entry ? title) && (entry.class == "note")) + then "[${formatDate entry.date}]" + else lib.optionalString (entry ? title) ((escape entry.title) + optionalColon); + in + lib.optionalString (titleText != "") + ''<span class="entry-title ${entry.class}">${titleText}</span>'' + ); + + entryToDiv = defun [ entry string ] (entry: '' + <a href="${entryUrl entry}" id="${toString entry.date}" class="entry"> + ${entryTitle entry} + ${ + lib.optionalString (hasDescription entry) + "<span class=\"entry-description\">${escape entry.description}</span>" + } + </a> + ''); + + index = entries: pkgs.writeText "index.html" (lib.concatStrings ( + [ (builtins.readFile ./header.html) ] + ++ (map entryToDiv (sort (a: b: a.date > b.date) entries)) + ++ [ (builtins.readFile ./footer.html) ] + )); + + pageEntries = import ./entries.nix; + homepage = index ((map postToEntry users.tazjin.blog.posts) ++ pageEntries); + atomFeed = import ./feed.nix (args // { inherit entry pageEntries; }); +in +runCommand "website" { } '' + mkdir $out + cp ${homepage} $out/index.html + cp ${atomFeed} $out/feed.atom + mkdir $out/static + cp -r ${depot.web.static}/* $out/static + cp -rf ${./static}/* $out/static +'' diff --git a/users/tazjin/homepage/entries.nix b/users/tazjin/homepage/entries.nix new file mode 100644 index 000000000000..fbd67f4d00ac --- /dev/null +++ b/users/tazjin/homepage/entries.nix @@ -0,0 +1,149 @@ +let + note = date: description: { + class = "note"; + inherit description date; + }; +in +[ + { + class = "misc"; + title = "@tazlog on Telegram"; + url = "https://t.me/tazlog"; + date = 1643321164; + description = '' + My Telegram channel with occasional random life updates and musings. + ''; + } + { + class = "project"; + title = "Ship It! #37"; + url = "https://changelog.com/shipit/37"; + date = 1641819600; + description = '' + Podcast episode about TVL, Nix, monorepos and all sorts of related things. + ''; + } + { + class = "project"; + title = "Tvix"; + url = "https://tvl.fyi/blog/rewriting-nix"; + date = 1638381387; + description = "TVL is rewriting Nix with funding from NLNet."; + } + { + class = "misc"; + title = "Interview with Joscha Bach"; + url = "https://www.youtube.com/watch?v=P-2P3MSZrBM"; + date = 1594594800; + description = '' + Mind-bending discussion with philosopher Joscha Bach. + ''; + } + { + class = "misc"; + title = "The Virus Lounge"; + url = "https://tvl.fyi"; + date = 1587435629; + description = "A community around Nix, monorepos, build tooling and more!"; + } + { + class = "project"; + title = "depot"; + url = "https://code.tvl.fyi/about"; + date = 1576800000; + description = "Merging all of my projects into a single, Nix-based monorepo"; + } + { + class = "project"; + title = "Nixery"; + url = "https://github.com/google/nixery"; + date = 1565132400; + description = "A Nix-backed container registry that builds container images on demand"; + } + { + class = "project"; + title = "kontemplate"; + url = "https://code.tvl.fyi/about/ops/kontemplate"; + date = 1486550940; + description = "Simple file templating tool built for Kubernetes resources"; + } + { + class = "misc"; + title = "dottime"; + url = "https://dotti.me/"; + date = 1560898800; + description = "A universal convention for conveying time"; + } + { + class = "project"; + title = "journaldriver"; + url = "https://code.tvl.fyi/about/ops/journaldriver"; + date = 1527375600; + description = "Small daemon to forward logs from journald to Stackdriver Logging"; + } + { + class = "misc"; + title = "Principia Discordia"; + url = "https://principiadiscordia.com/book/1.php"; + date = 1495494000; + description = '' + A short book about everything that everyone should read. + ''; + } + { + class = "misc"; + title = "Nix — не только пакетный менеджер"; + date = 1663923600; + url = "https://www.youtube.com/watch?v=0Lhahzs-Wos"; + description = "Двухчасовой (!) разговор с введением в Nix, NixOS и так далее"; + } + { + class = "project"; + title = "yandex-cloud-rs"; + date = 1650877200; + url = "https://docs.rs/yandex-cloud"; + description = "Простой SDK на Rust для работы с API Yandex Cloud."; + } + { + class = "project"; + title = "nix-1p"; + date = 1564650000; + url = "https://code.tvl.fyi/about/nix/nix-1p"; + description = "A (more or less) one-page introduction to the Nix language."; + } + { + class = "misc"; + title = "Ставим NixOS!"; + date = 1678784400; + url = "https://progmsk.timepad.ru/event/2358560/"; + description = "Встреча в undef.space для помощи в начале работы с Nix/NixOS"; + } + { + class = "misc"; + title = "Tvix - September '22"; + date = 1662973200; + url = "https://tvl.fyi/blog/tvix-status-september-22"; + description = "Tvix update blog post over on TVL"; + } + { + class = "project"; + title = "Tvixbolt"; + date = 1667293200; + url = "https://tvixbolt.tvl.su/"; + description = "In-browser language evaluator for Nix, based on Tvix"; + } + { + class = "project"; + title = "ООО ТВЛ"; + date = 1609491600; + url = "https://tvl.su/ru/"; + description = "Официальный сайт моей компании по IT-консалтингу."; + } + + # Notes. + (note 1676106000 "If you have a Huawei device that sometimes struggles on public Wi-Fi networks, try enabling MAC-address randomisation. Huawei devices often get pushed onto management networks!") + (note 1686868637 "I moved some of my pages (including this one) to a machine in my flat in Moscow. If you end up having access trouble because your ISP blocks Russian resources, please let me know.") + (note 1686868636 "Protip: Use the Reddit blackout to click the 'Logout' button, and never come back.") + (note 1486550941 "↓ I no longer recommend people to use this. Generate your configuration from a language like Nix instead.") + (note 1576800001 "↓ No longer just my projects, it's all of TVL! Go check it out.") +] diff --git a/users/tazjin/homepage/feed.nix b/users/tazjin/homepage/feed.nix new file mode 100644 index 000000000000..8043d7ff308a --- /dev/null +++ b/users/tazjin/homepage/feed.nix @@ -0,0 +1,43 @@ +# Creates the Atom feed for my homepage. +{ depot, lib, pkgs, entry, pageEntries, ... }: + +with depot.nix.yants; + +let + inherit (builtins) filter map readFile; + inherit (lib) max singleton; + inherit (pkgs) writeText; + inherit (depot.web) blog atom-feed; + + pageEntryToEntry = defun [ entry atom-feed.entry ] (e: { + id = "tazjin:${e.class}:${toString e.date}"; + updated = e.date; + published = e.date; + title = e.title; + summary = e.description; + + links = singleton { + rel = "alternate"; + href = e.url; + }; + }); + + allEntries = (with depot.users.tazjin.blog; map (blog.toFeedEntry config) posts) + ++ (map pageEntryToEntry (filter (e: e.class != "note") pageEntries)); + + feed = { + id = "https://tazj.in/"; + title = "tazjin's interblag"; + subtitle = "my posts, projects and other interesting things"; + rights = "© 2020 tazjin"; + authors = [ "tazjin" ]; + + links = singleton { + rel = "self"; + href = "https://tazjin/feed.atom"; + }; + + entries = allEntries; + }; +in +writeText "feed.atom" (atom-feed.renderFeed feed) diff --git a/users/tazjin/homepage/footer.html b/users/tazjin/homepage/footer.html new file mode 100644 index 000000000000..2f17135066e8 --- /dev/null +++ b/users/tazjin/homepage/footer.html @@ -0,0 +1,2 @@ + </div> +</body> diff --git a/users/tazjin/homepage/header.html b/users/tazjin/homepage/header.html new file mode 100644 index 000000000000..320b5ded8c74 --- /dev/null +++ b/users/tazjin/homepage/header.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<head><meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <meta name="description" content="tazjin's blog"> + <link rel="stylesheet" type="text/css" href="static/tvl.css" media="all"> + <link rel="stylesheet" type="text/css" href="static/tazjin.css" media="all"> + <link rel="icon" type="image/webp" href="/static/favicon.webp"> + <link rel="alternate" type="application/atom+xml" href="/feed.atom"> + <title>tazjin's interblag</title> +</head> +<body class="dark"> + <header> + <h1> + <a class="interblag-title" href="/">tazjin's interblag</a> + </h1> + <hr> + </header> + <div class="introduction"> + <p> + Below are some of + my <span class="project">projects</span>, <span class="blog">blog + posts</span>, <span class="note">notes</span> and some + other <span class="misc">random things</span>. If you'd like to + get in touch, email me at mail@[this domain] or ping me + on <a class="dark-link" href="https://tvl.fyi">TVL</a> IRC. + </p> + <hr> + </div> + <div class="entry-container"> diff --git a/users/tazjin/homepage/static/favicon.webp b/users/tazjin/homepage/static/favicon.webp new file mode 100644 index 000000000000..f99c9085340b --- /dev/null +++ b/users/tazjin/homepage/static/favicon.webp Binary files differdiff --git a/users/tazjin/homepage/static/img/nixery/dominator.webp b/users/tazjin/homepage/static/img/nixery/dominator.webp new file mode 100644 index 000000000000..2d8569a6ca21 --- /dev/null +++ b/users/tazjin/homepage/static/img/nixery/dominator.webp Binary files differdiff --git a/users/tazjin/homepage/static/img/nixery/example_extra.webp b/users/tazjin/homepage/static/img/nixery/example_extra.webp new file mode 100644 index 000000000000..101f0f633aef --- /dev/null +++ b/users/tazjin/homepage/static/img/nixery/example_extra.webp Binary files differdiff --git a/users/tazjin/homepage/static/img/nixery/example_plain.webp b/users/tazjin/homepage/static/img/nixery/example_plain.webp new file mode 100644 index 000000000000..a2b90b3e21d5 --- /dev/null +++ b/users/tazjin/homepage/static/img/nixery/example_plain.webp Binary files differdiff --git a/users/tazjin/homepage/static/img/nixery/ideal_layout.webp b/users/tazjin/homepage/static/img/nixery/ideal_layout.webp new file mode 100644 index 000000000000..0e9f74556682 --- /dev/null +++ b/users/tazjin/homepage/static/img/nixery/ideal_layout.webp Binary files differdiff --git a/users/tazjin/homepage/static/img/watchblob_1.webp b/users/tazjin/homepage/static/img/watchblob_1.webp new file mode 100644 index 000000000000..27e588e1a145 --- /dev/null +++ b/users/tazjin/homepage/static/img/watchblob_1.webp Binary files differdiff --git a/users/tazjin/homepage/static/img/watchblob_2.webp b/users/tazjin/homepage/static/img/watchblob_2.webp new file mode 100644 index 000000000000..b2dea98b4fb4 --- /dev/null +++ b/users/tazjin/homepage/static/img/watchblob_2.webp Binary files differdiff --git a/users/tazjin/homepage/static/img/watchblob_3.webp b/users/tazjin/homepage/static/img/watchblob_3.webp new file mode 100644 index 000000000000..99b49373b5b4 --- /dev/null +++ b/users/tazjin/homepage/static/img/watchblob_3.webp Binary files differdiff --git a/users/tazjin/homepage/static/img/watchblob_4.webp b/users/tazjin/homepage/static/img/watchblob_4.webp new file mode 100644 index 000000000000..41dbdb6be1cf --- /dev/null +++ b/users/tazjin/homepage/static/img/watchblob_4.webp Binary files differdiff --git a/users/tazjin/homepage/static/img/watchblob_5.webp b/users/tazjin/homepage/static/img/watchblob_5.webp new file mode 100644 index 000000000000..c42a4ce1bc0f --- /dev/null +++ b/users/tazjin/homepage/static/img/watchblob_5.webp Binary files differdiff --git a/users/tazjin/homepage/static/img/watchblob_6.webp b/users/tazjin/homepage/static/img/watchblob_6.webp new file mode 100644 index 000000000000..1440761859dd --- /dev/null +++ b/users/tazjin/homepage/static/img/watchblob_6.webp Binary files differdiff --git a/users/tazjin/homepage/static/tazjin.css b/users/tazjin/homepage/static/tazjin.css new file mode 100644 index 000000000000..f921b562ee6c --- /dev/null +++ b/users/tazjin/homepage/static/tazjin.css @@ -0,0 +1,57 @@ +/* Homepage styling */ + +.dark { + background-color: #181818; + color: #e4e4ef; +} + +.dark-link, .interblag-title { + color: #96a6c8; +} + + +.interblag-title { + text-decoration: none; +} + +.entry-container { + display: flex; + flex-direction: column; + flex-wrap: nowrap; + justify-content: flex-start; +} + +.entry { + margin-top: 5px; + margin-bottom: 5px; + padding-left: 5px; + text-decoration: none; +} + +.entry:nth-child(odd) { + background: #282828; +} + +.entry-description { + color: #e4e4ef; +} + +.misc { + color: #73c936; + border-color: #73c936; +} + +.blog { + color: #268bd2; + border-color: #268bd2; +} + +.project { + color: #ff4f58; + border-color: #ff4f58; +} + +.note { + color: #ffdd33; + border-color: #ffdd33; +} |