Author SHA1 Message Date
dependabot[bot]andGitHub 356ee4c97f Bump sharp from 0.34.5 to 0.35.3
Bumps [sharp](https://github.com/lovell/sharp) from 0.34.5 to 0.35.3.
- [Release notes](https://github.com/lovell/sharp/releases)
- [Commits](https://github.com/lovell/sharp/compare/v0.34.5...v0.35.3)

---
updated-dependencies:
- dependency-name: sharp
  dependency-version: 0.35.3
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-25 19:44:47 +00:00
cupcakearmy 4817ccff2a updates 2026-06-28 19:09:30 +02:00
cupcakearmy 8b43e14dc7 Merge branch 'main' of github.com:cupcakearmy/nicco.io 2026-04-05 11:04:33 +02:00
cupcakearmy d6f3d6ba99 update deps 2026-04-05 11:02:21 +02:00
cupcakearmyandGitHub 24106ae025 Merge pull request #24 from cupcakearmy/dependabot/npm_and_yarn/astro-5.15.9
Bump astro from 5.13.5 to 5.15.9
2025-12-07 02:05:06 +01:00
dependabot[bot]andGitHub 92d4f7140f Bump astro from 5.13.5 to 5.15.9
Bumps [astro](https://github.com/withastro/astro/tree/HEAD/packages/astro) from 5.13.5 to 5.15.9.
- [Release notes](https://github.com/withastro/astro/releases)
- [Changelog](https://github.com/withastro/astro/blob/main/packages/astro/CHANGELOG.md)
- [Commits](https://github.com/withastro/astro/commits/astro@5.15.9/packages/astro)

---
updated-dependencies:
- dependency-name: astro
  dependency-version: 5.15.9
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-19 20:59:25 +00:00
cupcakearmy 7e889a6214 update about 2025-08-31 21:41:34 +02:00
cupcakearmy a7b072ebca update about 2025-08-31 21:40:03 +02:00
cupcakearmy a60c8b0fc3 remove old stuff 2025-08-31 21:35:06 +02:00
cupcakearmy 083a50910a glove80 guide 2025-08-31 21:30:00 +02:00
cupcakearmy 0facfa5a15 make code a bit smaller 2025-08-31 21:29:37 +02:00
cupcakearmy 51a03ae8e1 update packages 2025-08-31 21:29:30 +02:00
cupcakearmyandGitHub d75e29ff59 Merge pull request #21 from cupcakearmy/dependabot/npm_and_yarn/astro-5.13.1
Bump astro from 5.4.0 to 5.13.1
2025-08-31 13:48:32 +02:00
dependabot[bot]andGitHub bf2df9b951 Bump astro from 5.4.0 to 5.13.1
Bumps [astro](https://github.com/withastro/astro/tree/HEAD/packages/astro) from 5.4.0 to 5.13.1.
- [Release notes](https://github.com/withastro/astro/releases)
- [Changelog](https://github.com/withastro/astro/blob/main/packages/astro/CHANGELOG.md)
- [Commits](https://github.com/withastro/astro/commits/astro@5.13.1/packages/astro)

---
updated-dependencies:
- dependency-name: astro
  dependency-version: 5.13.1
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-20 13:55:38 +00:00
17 changed files with 2942 additions and 1915 deletions
+15 -13
View File
@@ -1,22 +1,24 @@
// @ts-check // @ts-check
import { rehypeHeadingIds } from '@astrojs/markdown-remark' import { unified } from "@astrojs/markdown-remark";
import mdx from '@astrojs/mdx' import mdx from "@astrojs/mdx";
import sitemap from '@astrojs/sitemap' import sitemap from "@astrojs/sitemap";
import svelte from '@astrojs/svelte' import svelte from "@astrojs/svelte";
import { defineConfig } from 'astro/config' import rehypeAutolinkHeadings from "rehype-autolink-headings";
import rehypeAutolinkHeadings from 'rehype-autolink-headings' import { defineConfig } from "astro/config";
import Icons from 'unplugin-icons/vite' import Icons from "unplugin-icons/vite";
import { remarkReadingTime } from './readingTime' import { remarkReadingTime } from "./readingTime";
// https://astro.build/config // https://astro.build/config
export default defineConfig({ export default defineConfig({
site: 'https://example.com', site: "https://example.com",
integrations: [mdx(), sitemap(), svelte()], integrations: [mdx(), sitemap(), svelte()],
markdown: { markdown: {
rehypePlugins: [rehypeHeadingIds, [rehypeAutolinkHeadings, { behavior: 'wrap' }]], processor: unified({
remarkPlugins: [remarkReadingTime], rehypePlugins: [[rehypeAutolinkHeadings, { behavior: "wrap" }]],
remarkPlugins: [remarkReadingTime],
}),
}, },
vite: { vite: {
plugins: [Icons({ compiler: 'astro' })], plugins: [Icons({ compiler: "astro" })],
}, },
}) });
+2
View File
@@ -0,0 +1,2 @@
[tools]
node = "25"
+17 -17
View File
@@ -9,26 +9,26 @@
"start": "astro dev" "start": "astro dev"
}, },
"devDependencies": { "devDependencies": {
"@astrojs/check": "^0.9.4", "@astrojs/check": "^0.9.9",
"@astrojs/markdown-remark": "^6.2.0", "@astrojs/markdown-remark": "^7.2.0",
"@astrojs/mdx": "^4.1.0", "@astrojs/mdx": "^7.0.0",
"@astrojs/rss": "^4.0.11", "@astrojs/rss": "^4.0.18",
"@astrojs/sitemap": "^3.2.1", "@astrojs/sitemap": "^3.7.3",
"@astrojs/svelte": "^7.0.5", "@astrojs/svelte": "^9.0.0",
"@fontsource-variable/jost": "^5.1.2", "@fontsource-variable/jost": "^5.2.8",
"@fontsource-variable/playfair-display": "^5.1.1", "@fontsource-variable/playfair-display": "^5.2.8",
"@iconify-json/ion": "^1.2.2", "@iconify-json/ion": "^1.2.7",
"astro": "^5.4.0", "astro": "^7.0.3",
"fuse.js": "^7.1.0", "fuse.js": "^7.4.2",
"mdast-util-to-string": "^4.0.0", "mdast-util-to-string": "^4.0.0",
"reading-time": "^1.5.0", "reading-time": "^1.5.0",
"rehype-autolink-headings": "^7.1.0", "rehype-autolink-headings": "^7.1.0",
"remark-toc": "^9.0.0", "remark-toc": "^9.0.0",
"sass": "^1.85.1", "sass": "^1.101.0",
"sharp": "^0.33.5", "sharp": "^0.35.2",
"svelte": "^5.20.5", "svelte": "^5.56.4",
"typescript": "^5.7.3", "typescript": "^6.0.3",
"unplugin-icons": "^22.1.0" "unplugin-icons": "^23.0.1"
}, },
"packageManager": "pnpm@9.14.4" "packageManager": "pnpm@11.9.0"
} }
+2785 -1848
View File
File diff suppressed because it is too large Load Diff
+4
View File
@@ -0,0 +1,4 @@
allowBuilds:
'@parcel/watcher': false
esbuild: true
sharp: true
+2
View File
@@ -1,5 +1,7 @@
--- ---
// @ts-expect-error -- no types
import '@fontsource-variable/jost' import '@fontsource-variable/jost'
// @ts-expect-error -- no types
import '@fontsource-variable/playfair-display' import '@fontsource-variable/playfair-display'
import '../styles/preflight.css' import '../styles/preflight.css'
+1 -1
View File
@@ -4,7 +4,7 @@ const { pathname } = Astro.url
const routes = [ const routes = [
{ name: 'About', href: '/about' }, { name: 'About', href: '/about' },
{ name: 'Projects', href: '/projects' }, // { name: 'Projects', href: '/projects' },
{ name: 'Blog', href: '/blog' }, { name: 'Blog', href: '/blog' },
{ name: 'Rest', href: '/rest' }, { name: 'Rest', href: '/rest' },
] ]
+1 -1
View File
@@ -13,7 +13,7 @@ const { posts } = Astro.props
{ {
posts.map((post) => ( posts.map((post) => (
<li> <li>
<a href={`/blog/${post.slug}`}> <a href={`/blog/${post.id}`}>
<PostPreview {post} /> <PostPreview {post} />
</a> </a>
</li> </li>
+2 -2
View File
@@ -1,6 +1,6 @@
--- ---
import { Picture } from 'astro:assets' import { Picture } from 'astro:assets'
import type { CollectionEntry } from 'astro:content' import { type CollectionEntry, render as renderEntry } from 'astro:content'
import PostAttributes from './PostAttributes.astro' import PostAttributes from './PostAttributes.astro'
import Tags from './Tags.astro' import Tags from './Tags.astro'
@@ -9,7 +9,7 @@ export type Props = {
} }
const { post } = Astro.props const { post } = Astro.props
const { remarkPluginFrontmatter } = await post.render() const { remarkPluginFrontmatter } = await renderEntry(post)
--- ---
<section class:list={{ without: !post.data.coverImage }}> <section class:list={{ without: !post.data.coverImage }}>
@@ -1,13 +1,13 @@
import { defineCollection, z } from 'astro:content' import { defineCollection } from 'astro:content'
import { z } from 'astro/zod'
import { glob } from 'astro/loaders'
const blog = defineCollection({ const blog = defineCollection({
type: 'content', loader: glob({ pattern: '**/*.{md,mdx}', base: './src/content/blog' }),
// Type-check frontmatter using a schema
schema: ({ image }) => schema: ({ image }) =>
z.object({ z.object({
title: z.string(), title: z.string(),
description: z.string().optional(), description: z.string().optional(),
// Transform string to Date object
date: z.coerce.date(), date: z.coerce.date(),
updatedDate: z.coerce.date().optional(), updatedDate: z.coerce.date().optional(),
coverImage: image().optional(), coverImage: image().optional(),
@@ -16,7 +16,7 @@ const blog = defineCollection({
}) })
const page = defineCollection({ const page = defineCollection({
type: 'content', loader: glob({ pattern: '**/*.{md,mdx}', base: './src/content/page' }),
schema: z.object({ schema: z.object({
title: z.string(), title: z.string(),
date: z.coerce.date(), date: z.coerce.date(),
+61
View File
@@ -0,0 +1,61 @@
---
title: "How to enable ZMK Studio for the Glove 80"
date: "2025-08-31"
categories:
- "coding"
tags:
- "keyboards"
- "zmk"
- "glove80"
- "zmk studio"
coverImage: "./images/ikhsan-hidayat-lL_xP4CEXaY-unsplash.jpg"
---
Out of the box I could not get the Glove80 to work out of the box with the amazing ZMK Studio because the default firmware that MoErgo provides does not have the necessary flag enabled.
# What is needed?
The documentation is quite clear on [what is needed for adding ZMK Studio support](https://zmk.dev/docs/features/studio#adding-zmk-studio-support-to-a-keyboard) to a given keyboard.
- We need to add the `studio-rpc-usb-uart` snippet
- setting `ZMK_STUDIO=y`
# Build your Glove80 firmware with Studio support
However being a bit lost on how and where to add it, I [searched GitHub](https://github.com/search?q=studio-rpc-usb-uart+glove&type=code) for inspiration. Luckily I found a config by [IevgeniiB](https://github.com/IevgeniiB/zmk-config/blob/64df48414176b9df78acc114aea0b6fa05238484/build.yaml#L9-L12). Thanks!
The official docs are quite good
1. Create your own ZMK repo ([official docs](https://zmk.dev/docs/user-setup), reduced version here).
1. Create a new github repo with the name `zmk-config`
2. Run `bash -c "$(curl -fsSL https://zmk.dev/setup.sh)"` and select `29` for Glove80, otherwise the default values.
2. Adjust your `build.yml`
```yaml
---
include:
- board: glove80_lh
snippet: studio-rpc-usb-uart
cmake-args: -DCONFIG_ZMK_STUDIO=y
```
3. Adjust your `west.yml`:
```yaml
manifest:
remotes:
- name: moergo-sc
url-base: https://github.com/moergo-sc
projects:
- name: zmk
remote: moergo-sc
revision: main
import: app/west.yml
self:
path: config
```
4. Assign `&studio_unlock` to an empty key. This is required to unlock once connected. I added mine to the magic layer in `glove80.keymap`.
5. Push and wait for the Github action. After the action executes you will have and artifact with 2 firmware files. One for the left and one for the right.
6. Flash the firmware to both sides. See the [official guide](https://docs.moergo.com/glove80-user-guide/customizing-key-layout/#loading-new-zmk-firmware-onto-your-glove80) on how to do it.
7. Profit 🎉 You can now edit and update your Keymap right from your browser.
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:4b9e945d1024288ab91231ae850b49246e8544e5be5b6ad6bc7d730cc44f6096
size 298478
+26 -14
View File
@@ -1,9 +1,10 @@
--- ---
title: 'About' title: "About"
date: '2020-09-21' date: "2020-09-21"
--- ---
import SkillBar from '../../components/SkillBar.astro'
import AboutImage from '../../components/AboutImage.astro' import SkillBar from "../../components/SkillBar.astro";
import AboutImage from "../../components/AboutImage.astro";
Hi, I'm Nicco Hi, I'm Nicco
@@ -11,9 +12,12 @@ I've been doing programming things and "You do computer science right? Can you f
My home is mainly the web, but I wander down many paths of computer science, wherever Ecosia and curiosity bring me that day. My home is mainly the web, but I wander down many paths of computer science, wherever Ecosia and curiosity bring me that day.
<div> <div>
<SkillBar progress={0.95} title="Skill bars are useless"/> <SkillBar progress={0.95} title="Skill bars are useless" />
<SkillBar progress={0.03} title="I think I know everything there is to know about X"/> <SkillBar
<SkillBar progress={0.85} title="I can teach myself stuff"/> progress={0.03}
title="I think I know everything there is to know about X"
/>
<SkillBar progress={0.85} title="I can teach myself stuff" />
</div> </div>
## Today ## Today
@@ -23,7 +27,7 @@ I do a lot of Typescript, but I always try new things that come up on the interw
**A list of some "skills" (Pros)** **A list of some "skills" (Pros)**
- Frontend - Frontend
- React, Vue & Svelte for Web apps, landing pages, etc. - React, Vue, Svelte, Solid for Web apps, landing pages, etc.
- Typescript lover - Typescript lover
- Electron multiplatform _macOS/Linux/Windows_ apps. - Electron multiplatform _macOS/Linux/Windows_ apps.
- Mobile apps for _iOS_ and _Android_, mostly in React Native. - Mobile apps for _iOS_ and _Android_, mostly in React Native.
@@ -32,19 +36,27 @@ I do a lot of Typescript, but I always try new things that come up on the interw
- Docker multi stage build, etc. - Docker multi stage build, etc.
- Pipelines for testing & deployments of various projects/apps - Pipelines for testing & deployments of various projects/apps
- Github actions - Github actions
- Package & Container registries
- Backend - Backend
- Serverless backends (in _AWS_) - Written backends in Typescript, Go, Python
- Postgres/Maria/Mysql/Mongo experience. - Serverless Services
- Python server - Postgres/Maria/Mysql/Mongo/SQLite experience.
- Go CLI utilities
- Web scraping - Web scraping
- Pub/Sub, DLQs
- Distributed systems, locks, queues, etc.
- Custom K8S operators
- gRPC
- Clouds I've deployed production services - Clouds I've deployed production services
- AWS - AWS
- GCP - GCP
- Other
- Built various CLI tools
- Emdedded projects in C
- Custom Protocols over TCP
- Monorepos
**And stuff I suck at (Cons)** **And stuff I suck at (Cons)**
- Testing, hate it.
- Love rewriting stuff from ground up. - Love rewriting stuff from ground up.
- Probably much more... - Probably much more...
@@ -60,4 +72,4 @@ Remember kids: before our friendly Docker whale was a thing and we all installed
The rest... well I have a bad memory 🐘 The rest... well I have a bad memory 🐘
<AboutImage/> <AboutImage />
+3 -3
View File
@@ -1,17 +1,17 @@
--- ---
import { getCollection } from 'astro:content' import { getCollection, render as renderEntry } from 'astro:content'
import PageWithTitle from '../layouts/PageWithTitle.astro' import PageWithTitle from '../layouts/PageWithTitle.astro'
export async function getStaticPaths() { export async function getStaticPaths() {
const posts = await getCollection('page') const posts = await getCollection('page')
return posts.map((post) => ({ return posts.map((post) => ({
params: { page: post.slug }, params: { page: post.id },
props: post, props: post,
})) }))
} }
const post = Astro.props const post = Astro.props
const { Content } = await post.render() const { Content } = await renderEntry(post)
--- ---
<PageWithTitle title={post.data.title}> <PageWithTitle title={post.data.title}>
+3 -3
View File
@@ -1,17 +1,17 @@
--- ---
import { getCollection } from 'astro:content' import { getCollection, render as renderEntry } from 'astro:content'
import BlogPost from '../../layouts/BlogPost.astro' import BlogPost from '../../layouts/BlogPost.astro'
export async function getStaticPaths() { export async function getStaticPaths() {
const posts = await getCollection('blog') const posts = await getCollection('blog')
return posts.map((post) => ({ return posts.map((post) => ({
params: { slug: post.slug }, params: { slug: post.id },
props: post, props: post,
})) }))
} }
const post = Astro.props const post = Astro.props
const { Content, headings, remarkPluginFrontmatter } = await post.render() const { Content, headings, remarkPluginFrontmatter } = await renderEntry(post)
--- ---
<BlogPost {...post.data} {headings} readingTime={remarkPluginFrontmatter.readingTime}> <BlogPost {...post.data} {headings} readingTime={remarkPluginFrontmatter.readingTime}>
+5 -5
View File
@@ -1,5 +1,5 @@
--- ---
import { getCollection } from 'astro:content' import { getCollection, render as renderEntry } from 'astro:content'
import PageSearch from '../components/PageSearch.svelte' import PageSearch from '../components/PageSearch.svelte'
import PageWithTitle from '../layouts/PageWithTitle.astro' import PageWithTitle from '../layouts/PageWithTitle.astro'
@@ -9,10 +9,10 @@ const entries: Entry[] = []
const posts = await getCollection('blog') const posts = await getCollection('blog')
for (const post of posts) { for (const post of posts) {
const rendered = await post.render() const rendered = await renderEntry(post)
const text = rendered.remarkPluginFrontmatter.text const text = rendered.remarkPluginFrontmatter.text
entries.push({ entries.push({
url: `/blog/${post.slug}`, url: `/blog/${post.id}`,
type: 'post', type: 'post',
title: post.data.title, title: post.data.title,
text, text,
@@ -22,10 +22,10 @@ for (const post of posts) {
const pages = await getCollection('page') const pages = await getCollection('page')
for (const page of pages) { for (const page of pages) {
const rendered = await page.render() const rendered = await renderEntry(page)
const text = rendered.remarkPluginFrontmatter.text const text = rendered.remarkPluginFrontmatter.text
entries.push({ entries.push({
url: `/${page.slug}`, url: `/${page.id}`,
type: 'page', type: 'page',
title: page.data.title, title: page.data.title,
text, text,
+6 -2
View File
@@ -5,8 +5,8 @@
} }
:root { :root {
--ff: 'Jost Variable', sans-serif; --ff: "Jost Variable", sans-serif;
--ff-alt: 'Playfair Display Variable', serif; --ff-alt: "Playfair Display Variable", serif;
--clr-light: #ffffff; --clr-light: #ffffff;
--clr-dark: #010101; --clr-dark: #010101;
--clr-primary: hsl(219, 90%, 80%); --clr-primary: hsl(219, 90%, 80%);
@@ -89,6 +89,10 @@ svg {
height: auto; height: auto;
} }
code {
font-size: 0.75em;
}
pre { pre {
padding: 1rem; padding: 1rem;
margin: 1rem 0; margin: 1rem 0;