mirror of
https://github.com/apricote/apricote.de.git
synced 2026-02-07 10:16:59 +00:00
Compare commits
No commits in common. "fd208a75518a1f2f6b52093404adcb69eee6faf6" and "160290f97238596b1ec710d3bea0f4bcf26a96e2" have entirely different histories.
fd208a7551
...
160290f972
12 changed files with 233 additions and 157 deletions
2
.github/workflows/redeploy.yaml
vendored
2
.github/workflows/redeploy.yaml
vendored
|
|
@ -10,7 +10,7 @@ on:
|
|||
|
||||
jobs:
|
||||
redeploy:
|
||||
runs-on: ubuntu-24.04
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- env:
|
||||
DEPLOY_HOOK: ${{ secrets.DEPLOY_HOOK }}
|
||||
|
|
|
|||
21
config.yaml
21
config.yaml
|
|
@ -4,9 +4,10 @@ languageCode: "en-us"
|
|||
|
||||
theme: PaperMod
|
||||
|
||||
params:
|
||||
author: Julian Tölle
|
||||
author:
|
||||
name: Julian Tölle
|
||||
|
||||
params:
|
||||
DateFormat: "2006-01-02"
|
||||
|
||||
keywords: ["cv", "resume", "julian tölle", "personal site"]
|
||||
|
|
@ -27,6 +28,8 @@ params:
|
|||
buttons:
|
||||
- name: "About Me"
|
||||
url: "about-me"
|
||||
- name: "Favorite Music"
|
||||
url: listory
|
||||
|
||||
socialIcons:
|
||||
- name: github
|
||||
|
|
@ -40,25 +43,17 @@ params:
|
|||
- name: mastodon
|
||||
url: "https://hachyderm.io/@apricote"
|
||||
|
||||
assets:
|
||||
# Use hugo native highlighter for Nord theme
|
||||
disableHLJS: true
|
||||
|
||||
menu:
|
||||
main:
|
||||
- identifier: about
|
||||
name: About Me
|
||||
url: about-me
|
||||
- identifier: posts
|
||||
name: Blog
|
||||
url: posts
|
||||
- identifier: work
|
||||
name: Work
|
||||
url: work
|
||||
- identifier: projects
|
||||
name: Projects
|
||||
url: projects
|
||||
|
||||
markup:
|
||||
highlight:
|
||||
style: nord
|
||||
- identifier: listory
|
||||
name: Favorite Music
|
||||
url: listory
|
||||
|
|
|
|||
18
content/listory.md
Normal file
18
content/listory.md
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
---
|
||||
title: "My Favorite Music"
|
||||
type: listory
|
||||
---
|
||||
|
||||
Last Update: {{< current-day >}}
|
||||
|
||||
The data on this page reflects my listens from Spotify. I track the data using a
|
||||
self-hosted instance of [Listory](https://github.com/apricote/listory). All data
|
||||
is coming from the listens of the 180 days prior to the last update time.
|
||||
|
||||
## My favorite genres
|
||||
|
||||
{{< listory-genres >}}
|
||||
|
||||
## My favorite albums
|
||||
|
||||
{{< listory-albums >}}
|
||||
|
|
@ -1,97 +0,0 @@
|
|||
---
|
||||
title: "hcloud-upload-image - qcow2 Support, Smaller Snapshots"
|
||||
date: 2025-05-10T15:28:01+02:00
|
||||
|
||||
summary: |
|
||||
New releases of hcloud-upload-image bring major upgrades: support for uploading qcow2 images and significantly smaller snapshot sizes. Plus, container image and docs site!
|
||||
|
||||
ShowToc: true
|
||||
ShowReadingTime: true
|
||||
ShowBreadCrumbs: true
|
||||
---
|
||||
|
||||
I released versions v1.0.0 and v1.1.0 of [**hcloud-upload-image**](https://github.com/apricote/hcloud-upload-image) in the past week, and they come with two major new features:
|
||||
|
||||
* ✅ Support for uploading images in **qcow2 format**
|
||||
* ✅ **Smaller snapshot sizes** thanks to improved disk handling
|
||||
|
||||
## 🎉 qcow2 Image Support
|
||||
|
||||
You can now upload disk images in qcow2 format. Internally, I’m using `qemu-img dd` to convert the qcow2 to a raw image and stream it directly to the root disk.
|
||||
|
||||
The main catch is that qemu-img needs a seekable source file. For raw images, that wasn’t an issue because they could just be piped. But for qcow2, I now have to store the image file on the server before writing it to disk.
|
||||
|
||||
The rescue system only has a ramdisk with 960 MiB available by default, so that’s the maximum size for qcow2 images at the moment. The CLI and library try to validate and warn you if your image is too large.
|
||||
|
||||
It would be feasible to increase the size of the ramdisk or mount a volume. But most users have requested this feature for OpenSUSE MicroOS images, which comfortably fit under 960 MiB.
|
||||
|
||||
📌 [Pull Request #69](https://github.com/apricote/hcloud-upload-image/pull/69)
|
||||
📘 [CLI Reference: Image Size](https://apricote.github.io/hcloud-upload-image/reference/cli/hcloud-upload-image_upload.html#image-size)
|
||||
|
||||
## 📦 Smaller Minimal Snapshot Sizes
|
||||
|
||||
To upload the image, hcloud-upload-image first creates a temporary server in Hetzner Cloud with `ubuntu-24.04`. While Ubuntu is never booted, the root disk still contains all the bytes from the image.
|
||||
|
||||
Previously, the upload would just write the image to disk, leaving behind whatever bytes weren’t overwritten. This is not a problem for the functionality because these bytes are outside the specified ranges in the partition table.
|
||||
|
||||
But Hetzner snapshots don’t look at partition tables — they snapshot the entire raw disk, including any leftover bytes from a previous OS installation. Because of this, the minimum (compressed) size of the uploaded images was ~0.42GiB.
|
||||
|
||||
[Zargony](https://github.com/zargony) suggested zeroing the disk first with `dd if=/dev/zero` first to get rid of these bytes and make the images as small as possible. That worked — but took a full minute for the default 40GiB root disk. Not great UX, and pretty annoying if your image is larger anyway, and you do not even benefit from it.
|
||||
|
||||
Luckily I found `blkdiscard /dev/sda` to have the same effect on the image size, but completes in ~5 seconds. I think it's reasonable to make the process 5 seconds slower for everyone to avoid the additional complexity and heuristics to decide if its worth it to zero out the disk first.
|
||||
|
||||
With these changes, the (compressed) size of an example Talos x86 image was reduced from 0.42GiB to 0.20GiB.
|
||||
|
||||
### Benefits:
|
||||
|
||||
1. **Smaller image size** → slightly lower Hetzner bills. For Talos, that’s about €0.0024/month (excl. VAT) — not life-changing, but hey.
|
||||
|
||||
2. **Faster provisioning**. When you create a new server from a custom image, the image first needs to be copied from the image storage onto the server hosting your VM. In my testing, I found that it takes roughly 2 minutes per GiB. With the smaller image, Talos servers come online ~25 seconds faster.
|
||||
|
||||
## Minor Features
|
||||
|
||||
### 📚 Docs Website
|
||||
|
||||
There’s now a documentation website with the CLI references and links to the official guides from the Talos, Fedora CoreOS, and Flatcar docs:
|
||||
|
||||
👉 [apricote.github.io/hcloud-upload-image](https://apricote.github.io/hcloud-upload-image/)
|
||||
|
||||
### 🐳 Container Image
|
||||
|
||||
There’s now a **container image** published at `ghcr.io/apricote/hcloud-upload-image`, great for local use or CI pipelines:
|
||||
|
||||
```bash
|
||||
docker run --rm -e HCLOUD_TOKEN="<your token>" \
|
||||
ghcr.io/apricote/hcloud-upload-image:latest \
|
||||
upload <flags>
|
||||
```
|
||||
|
||||
Thanks to [PRIHLOP](https://github.com/PRIHLOP) for suggesting the feature and implementing the first version.
|
||||
|
||||
This is implemented with [ko](https://ko.build). I really like how simple it is to build a container for Go with it. No need to have a Docker daemon installed; no need to wrangle `Dockerfiles`, cache mounts or multiple stages to have a small and efficient image; no need for complicated cross-compiling setups, buildx and qemu for multi-arch images.
|
||||
|
||||
## 🧪 Testing, Bugs & Shell Pipelines
|
||||
|
||||
There were also a number of bugs that came with the qcow2 support and some other smaller improvements made in v1.0.0.
|
||||
|
||||
That is one of the downsides of not having proper testing. As I work on this on my own time and mostly for my own purposes, testing is limited to what I need for myself.
|
||||
|
||||
I did end up at least [adding some unit tests](https://github.com/apricote/hcloud-upload-image/pull/98/files#diff-b0d3df197c7b8434f621a9b55218097dcaadb57ba673d32f9fad068bb79a22a4R17) for the code that builds the shell pipeline that decompresses and writes the image on the server.
|
||||
|
||||
Concatenating shell commands like `wget ... |`, `xz -cd | `, `dd of=/dev/sda bs=4M` is error-prone. Especially if every single one of them depends on some input flag to support:
|
||||
|
||||
- **file sources**: remote URL vs upload from local file
|
||||
- **compression**: none, xz, bz2
|
||||
- **image format**: raw, qcow2
|
||||
|
||||
Not sure what the best alternative to this is. I could make a shell script and use `mkfifo` to pass around the data, upload that to the server, and run it. But I have never used mkfifo before, and shell scripts frustrate me.
|
||||
|
||||
Or I could implement all of this in a separate Go binary that is uploaded to the server, making it easier to handle the pipes there. But I would need to figure out the build process and embedding this binary in the library.
|
||||
|
||||
Let's just hope that the current version is bug-free, and all users are happy with the provided feature set, and I never have to touch that part of the code again 🥲
|
||||
|
||||
---
|
||||
|
||||
Thanks to everyone who's tried out **hcloud-upload-image** so far and provided feedback.
|
||||
|
||||
If you have any comments or want to leave some feedback, feel free to drop them on the [Mastodon thread](https://hachyderm.io/@apricote/114483565536111800) or on the [GitHub repository](https://github.com/apricote/hcloud-upload-image/issues/new).
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
# yaml-language-server: $schema=https://raw.githubusercontent.com/jsonresume/resume-schema/v1.0.0/schema.json
|
||||
basics:
|
||||
name: Julian Tölle
|
||||
label: Kubernetes & Cloud Infrastructure
|
||||
label: Infrastructure & Backend
|
||||
image: https://www.gravatar.com/avatar/bd55c8a01a6dd038f86c8e9fd60674b5?s=800
|
||||
email: julian.toelle97@gmail.com
|
||||
location:
|
||||
|
|
@ -29,8 +29,11 @@ skills:
|
|||
- Operators
|
||||
- GitOps
|
||||
|
||||
- name: Go
|
||||
level: advanced
|
||||
- name: Node.js
|
||||
level: expert
|
||||
keywords:
|
||||
- Typescript
|
||||
- Nest.js
|
||||
|
||||
- name: CI/CD
|
||||
level: advanced
|
||||
|
|
@ -39,13 +42,6 @@ skills:
|
|||
- GitLab CI
|
||||
- Jenkins
|
||||
|
||||
- name: Cloud
|
||||
level: advanced
|
||||
keywords:
|
||||
- Hetzner Cloud
|
||||
- AWS
|
||||
- OpenStack
|
||||
|
||||
- name: Infrastructure as Code
|
||||
level: advanced
|
||||
keywords:
|
||||
|
|
@ -57,11 +53,12 @@ skills:
|
|||
keywords:
|
||||
- REST APIs
|
||||
|
||||
- name: Node.js
|
||||
- name: Cloud
|
||||
level: advanced
|
||||
keywords:
|
||||
- Typescript
|
||||
- Nest.js
|
||||
- Hetzner Cloud
|
||||
- AWS
|
||||
- OpenStack
|
||||
|
||||
- name: Databases
|
||||
level: advanced
|
||||
|
|
@ -71,9 +68,14 @@ skills:
|
|||
- MySQL
|
||||
- etcd
|
||||
|
||||
- name: Go
|
||||
level: intermediate
|
||||
keywords:
|
||||
- kubebuilder
|
||||
|
||||
work:
|
||||
- name: Hetzner Cloud GmbH
|
||||
position: Team Lead Open Source Integrations
|
||||
position: Software Developer Open Source Integrations
|
||||
website: https://hetzner.com/cloud
|
||||
startDate: "2022-11"
|
||||
keywords:
|
||||
|
|
@ -313,23 +315,18 @@ education:
|
|||
- LK Physik
|
||||
|
||||
projects:
|
||||
- name: releaser-pleaser
|
||||
summary:
|
||||
Automate versioning and changelog management for GitHub and GitLab projects.
|
||||
startDate: 2024-07
|
||||
url: https://apricote.github.io/releaser-pleaser/
|
||||
- name: Listory
|
||||
summary: |
|
||||
Self-hosted app to track all your Spotify listens and show interesting
|
||||
insights that I develop to fill my own needs.
|
||||
startDate: 2020-01
|
||||
url: https://github.com/apricote/Listory
|
||||
type: application
|
||||
keywords:
|
||||
- Go
|
||||
|
||||
- name: hcloud-upload-image
|
||||
summary:
|
||||
CLI and Go Library to upload OS images to Hetzner Cloud.
|
||||
startDate: 2024-04
|
||||
url: https://apricote.github.io/hcloud-upload-image/
|
||||
type: application
|
||||
keywords:
|
||||
- Go
|
||||
- Node.js
|
||||
- Nest.js
|
||||
- Helm
|
||||
- React
|
||||
|
||||
- name: Streaming on Twitch
|
||||
summary: |
|
||||
|
|
@ -345,21 +342,6 @@ projects:
|
|||
- AV production
|
||||
- Public Talking
|
||||
|
||||
|
||||
- name: Listory
|
||||
summary: |
|
||||
Self-hosted app to track all your Spotify listens and show interesting
|
||||
insights that I develop to fill my own needs.
|
||||
startDate: 2020-01
|
||||
endDate: 2023-10
|
||||
url: https://github.com/apricote/Listory
|
||||
type: application
|
||||
keywords:
|
||||
- Node.js
|
||||
- Nest.js
|
||||
- Helm
|
||||
- React
|
||||
|
||||
- name: cluster-api-provider-openstack
|
||||
summary: |
|
||||
I was a reviewer of the project and actively contributed new features.
|
||||
|
|
|
|||
43
layouts/partials/extend_head.html
Normal file
43
layouts/partials/extend_head.html
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
<script async>
|
||||
// When document is ready, find relative-date elements and use relative date format
|
||||
document.addEventListener("readystatechange", (event) => {
|
||||
if (event.target.readyState !== "complete") {
|
||||
return;
|
||||
}
|
||||
|
||||
const formatter = new Intl.RelativeTimeFormat("en-US", {
|
||||
numeric: "auto",
|
||||
});
|
||||
|
||||
const elements = document.querySelectorAll(".relative-date");
|
||||
|
||||
elements.forEach((element) => {
|
||||
let date;
|
||||
try {
|
||||
date = new Date(element.innerText);
|
||||
} catch (err) {
|
||||
console.error("Element does not have a proper date");
|
||||
return;
|
||||
}
|
||||
|
||||
const diffMs = new Date() - date;
|
||||
const hoursSince = diffMs / 1000 / 60 / 60;
|
||||
const daysSince = hoursSince / 24;
|
||||
|
||||
let formatted = "";
|
||||
|
||||
if (daysSince > 1) {
|
||||
formatted = formatter.format(-Math.round(daysSince), "days");
|
||||
} else if (hoursSince > 1) {
|
||||
formatted = formatter.format(-Math.round(hoursSince), "hours");
|
||||
} else {
|
||||
formatted = "Just Now!";
|
||||
}
|
||||
|
||||
const capitalized =
|
||||
formatted.charAt(0).toUpperCase() + formatted.slice(1);
|
||||
|
||||
element.innerText = capitalized;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
2
layouts/shortcodes/current-day.html
Normal file
2
layouts/shortcodes/current-day.html
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
<!-- If JS is available, this will be formated in a relative way, see layouts/partials/extend_head.html -->
|
||||
<span class="relative-date">{{ now.Format "2006-01-02T15:04:05Z" }}</span>
|
||||
33
layouts/shortcodes/listory-albums.html
Normal file
33
layouts/shortcodes/listory-albums.html
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
{{ $listoryApi := getenv "HUGO_LISTORY_HOST" }}{{ $listoryToken := getenv
|
||||
"HUGO_LISTORY_TOKEN" }} {{ $res := getJSON
|
||||
"https://listory.apricote.de/api/v1/reports/top-albums?timePreset=last_180_days"
|
||||
(dict "Authorization" (printf "Bearer %s" $listoryToken) ) }}
|
||||
|
||||
<ol>
|
||||
{{ range first 5 $res.items }}
|
||||
<li style="margin-bottom: 1em">
|
||||
<div style="display: flex">
|
||||
<div style="width: 80%">
|
||||
<span style="font-weight: 600;">{{ .album.name | title }}</span> - {{ range .album.artists }}<span style="font-size: 0.9em; padding-right: 0.2em"
|
||||
>{{.name}}</span
|
||||
>{{ end }}
|
||||
</div>
|
||||
<div style="width: 20%; text-align: right">
|
||||
{{ .count }}<img
|
||||
src="/listen.svg"
|
||||
alt="Listens"
|
||||
style="
|
||||
height: 1em;
|
||||
width: 1em;
|
||||
display: inline;
|
||||
margin: 0 0;
|
||||
margin-left: 0.2em;
|
||||
vertical-align: middle;
|
||||
"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div style="font-size: 0.9em"></div>
|
||||
</li>
|
||||
{{ end }}
|
||||
</ol>
|
||||
32
layouts/shortcodes/listory-genres.html
Normal file
32
layouts/shortcodes/listory-genres.html
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
{{ $listoryApi := getenv "HUGO_LISTORY_HOST" }}{{ $listoryToken := getenv
|
||||
"HUGO_LISTORY_TOKEN" }} {{ $res := getJSON
|
||||
"https://listory.apricote.de/api/v1/reports/top-genres?timePreset=last_180_days"
|
||||
(dict "Authorization" (printf "Bearer %s" $listoryToken) ) }}
|
||||
|
||||
<ol>
|
||||
{{ range first 5 $res.items }}
|
||||
<li style="margin-bottom: 1em">
|
||||
<div style="display: flex">
|
||||
<div style="font-weight: 600; width: 80%">{{ .genre.name | title }}</div>
|
||||
<div style="width: 20%; text-align: right">
|
||||
{{ .count }}<img
|
||||
src="/listen.svg"
|
||||
alt="Listens"
|
||||
style="
|
||||
height: 1em;
|
||||
width: 1em;
|
||||
display: inline;
|
||||
margin: 0 0;
|
||||
margin-left: 0.2em;
|
||||
vertical-align: middle;
|
||||
"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div style="font-size: 0.9em">
|
||||
{{ range first 3 .artists }}<code alt="foobar">{{.artist.name}}</code> {{
|
||||
end }}
|
||||
</div>
|
||||
</li>
|
||||
{{ end }}
|
||||
</ol>
|
||||
68
static/listen.svg
Normal file
68
static/listen.svg
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||
sodipodi:docname="logo.svg"
|
||||
id="svg8"
|
||||
version="1.1"
|
||||
viewBox="0 0 256 256"
|
||||
height="256"
|
||||
width="256">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<sodipodi:namedview
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-height="1392"
|
||||
inkscape:window-width="1280"
|
||||
borderlayer="false"
|
||||
inkscape:pagecheckerboard="false"
|
||||
fit-margin-bottom="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-top="0"
|
||||
lock-margins="true"
|
||||
units="px"
|
||||
showgrid="false"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:document-units="px"
|
||||
inkscape:cy="43.328855"
|
||||
inkscape:cx="82.530037"
|
||||
inkscape:zoom="1"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Layer 1">
|
||||
<path
|
||||
style="stroke-width:0.867684"
|
||||
sodipodi:nodetypes="cccccccccccccccccccccccccccccccc"
|
||||
d="m 203.80288,51.920648 c -13.62502,3.672705 -4.77407,2.063581 -17.99743,6.737838 -16.24762,7.952561 -52.06559,25.532517 -69.50226,30.736893 -16.604412,5.549743 -33.257978,11.328241 -48.54131,19.811081 3.183919,7.36904 13.540094,-3.16437 19.55362,-3.56011 0.56951,-0.20947 1.145001,-0.41134 1.715433,-0.61952 0.826748,15.91164 3.776877,44.8498 0.98496,60.43848 -0.05189,0.31496 -0.09144,0.64273 -0.13329,0.96852 -5.932771,-0.64632 -12.278895,1.42766 -18.071863,2.29437 -0.379099,0.17143 -0.82163,0.33572 -1.287884,0.49761 -2.303034,0.42419 -4.517651,1.10581 -6.564034,2.06393 -2.271961,0.82124 -4.290533,1.85283 -5.165365,3.35473 -2.387274,2.10356 -4.288876,4.78363 -5.466568,8.08707 -3.922928,6.20414 0.75935,16.25548 9.08613,19.72591 13.79965,4.2939 21.116752,-0.26767 30.704861,-9.79699 1.946838,-1.61942 3.527698,-3.74181 4.666838,-6.08994 0.0513,0.0233 2.536152,-7.70921 4.325372,-16.63128 1.78922,-8.92208 0.9202,-49.83403 -1.00952,-68.14554 21.00162,-7.369589 46.52658,-17.343832 66.08081,-27.719174 5.59985,-2.802261 10.95333,-5.825639 16.30276,-8.916987 -0.47961,22.364456 -3.04286,50.066961 -3.41692,72.443531 -17.56725,2.37223 -33.57165,0.78785 -40.1477,17.75164 -5.47069,9.69478 6.50345,20.88581 15.15336,20.20683 13.58436,2.40436 24.20333,-3.84339 30.54902,-16.21436 1.56095,-3.43781 2.71345,-6.61096 3.28576,-10.65207 1.63032,-2.54328 3.57478,-85.331219 3.96781,-86.941404 1.71127,-14.091744 -12.76285,11.454996 11.20437,-6.83869 z m -30.10233,89.323782 c -0.003,0.0102 0.003,-0.0102 0,0 -0.0226,0.002 0.0226,-0.002 0,0 0.0258,-0.013 -0.0259,0.013 0,0 z"
|
||||
id="note" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.4 KiB |
|
|
@ -1 +1 @@
|
|||
Subproject commit 7cf752f8644fea1fc3dc7299352718d492c55182
|
||||
Subproject commit 60984fd13658db175e8945467d3dd799f2fdcc32
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"build": {
|
||||
"env": {
|
||||
"HUGO_VERSION": "0.147.1"
|
||||
"HUGO_VERSION": "0.121.1"
|
||||
}
|
||||
},
|
||||
"headers": [
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue