Compare commits

..

13 Commits

Author SHA1 Message Date
322a90d73c added more to the c-fun article 2026-06-05 00:02:26 +12:00
e0521c8bd4 fixed hero image 2026-05-23 19:33:32 +12:00
be6d35c410 another new article 2026-05-23 19:31:27 +12:00
b5a8a9a4fc added the deploy command so i dont forget it 2026-05-22 09:21:49 +12:00
5c300ba53d bump 2026-05-22 01:21:59 +12:00
886361053d new article ?! 2026-05-22 01:21:51 +12:00
9f91e1d9c4 slimmed down 2026-05-22 01:21:17 +12:00
sirlilpanda
1d685a0a0c link to cerns open source hardware website 2026-05-13 10:40:23 +12:00
sirlilpanda
8bbd0cfec5 updated to latest 2026-04-28 14:07:14 +12:00
sirlilpanda
1762c5c12b added notes field to bom 2026-04-28 13:07:31 +12:00
sirlilpanda
df72b76af2 temp bom 2026-04-28 12:30:54 +12:00
sirlilpanda
0c815df022 added useful document section with ATX pc specs 2026-04-20 12:22:56 +12:00
sirlilpanda
eced17af4c new article 2026-04-20 01:27:37 +12:00
19 changed files with 5243 additions and 213 deletions

View File

@@ -1,44 +1,6 @@
# Astro Starter Kit: Blog
# My website
```sh
npm create astro@latest -- --template blog
```
> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun!
Features:
- ✅ Minimal styling (make it your own!)
- ✅ 100/100 Lighthouse performance
- ✅ SEO-friendly with canonical URLs and Open Graph data
- ✅ Sitemap support
- ✅ RSS Feed support
- ✅ Markdown & MDX support
## 🚀 Project Structure
Inside of your Astro project, you'll see the following folders and files:
```text
├── public/
├── src/
│   ├── components/
│   ├── content/
│   ├── layouts/
│   └── pages/
├── astro.config.mjs
├── README.md
├── package.json
└── tsconfig.json
```
Astro looks for `.astro` or `.md` files in the `src/pages/` directory. Each page is exposed as a route based on its file name.
There's nothing special about `src/components/`, but that's where we like to put any Astro/React/Vue/Svelte/Preact components.
The `src/content/` directory contains "collections" of related Markdown and MDX documents. Use `getCollection()` to retrieve posts from `src/content/blog/`, and type-check your frontmatter using an optional schema. See [Astro's Content Collections docs](https://docs.astro.build/en/guides/content-collections/) to learn more.
Any static assets, like images, can be placed in the `public/` directory.
theres nothing here look at my website
## 🧞 Commands
@@ -53,10 +15,8 @@ All commands are run from the root of the project, from a terminal:
| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` |
| `npm run astro -- --help` | Get help using the Astro CLI |
## 👀 Want to learn more?
Check out [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat).
## Credit
This theme is based off of the lovely [Bear Blog](https://github.com/HermanMartinus/bearblog/).
## to deploy to cloudflare:
```
npx astro build && npx wrangler deploy
```

388
package-lock.json generated
View File

@@ -8,7 +8,7 @@
"name": "tested-telescope",
"version": "0.0.1",
"dependencies": {
"@astrojs/cloudflare": "^13.1.1",
"@astrojs/cloudflare": "^13.5.2",
"@astrojs/mdx": "^5.0.0",
"@astrojs/rss": "^4.0.17",
"@astrojs/sitemap": "^3.7.1",
@@ -17,41 +17,50 @@
"rehype-katex": "^7.0.1",
"remark-math": "^6.0.0",
"remark-toc": "^9.0.0",
"sharp": "^0.34.3",
"wrangler": "^4.73.0"
"sharp": "^0.34.3"
},
"devDependencies": {
"@types/node": "^25.5.0",
"better-sqlite3": "^12.8.0",
"cross-env": "^10.1.0",
"drizzle-kit": "^0.31.9"
"drizzle-kit": "^0.31.9",
"wrangler": "^4.93.0"
},
"engines": {
"node": ">=22.12.0"
}
},
"node_modules/@astrojs/cloudflare": {
"version": "13.1.1",
"resolved": "https://registry.npmjs.org/@astrojs/cloudflare/-/cloudflare-13.1.1.tgz",
"integrity": "sha512-Bx2Sr/cLi9VUA0iArMYc/O6wsKZdC2W6prE8dzMGbJqaF5oEBVBG6UclKe1T95SISrDIysuLlFNvVWL6htqnuA==",
"version": "13.5.2",
"resolved": "https://registry.npmjs.org/@astrojs/cloudflare/-/cloudflare-13.5.2.tgz",
"integrity": "sha512-crtYJtsQCE5LvGRCEiuWK3w64h4Er+Yw5XW8mVEFtgbzAGuLs7a38SjJniZTP9gw2awaJ1rRQOjceJU8jcR6hQ==",
"license": "MIT",
"dependencies": {
"@astrojs/internal-helpers": "0.8.0",
"@astrojs/underscore-redirects": "1.0.1",
"@cloudflare/vite-plugin": "^1.25.6",
"@astrojs/internal-helpers": "0.9.1",
"@astrojs/underscore-redirects": "1.0.3",
"@cloudflare/vite-plugin": "^1.32.3",
"piccolore": "^0.1.3",
"tinyglobby": "^0.2.15",
"vite": "^7.3.1"
"vite": "^7.3.2"
},
"peerDependencies": {
"astro": "^6.0.0-alpha.0",
"wrangler": "^4.61.1"
"astro": "^6.3.0",
"wrangler": "^4.83.0"
}
},
"node_modules/@astrojs/cloudflare/node_modules/@astrojs/internal-helpers": {
"version": "0.9.1",
"resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.9.1.tgz",
"integrity": "sha512-1pWuARqYom/TzuU3+0ZugsTrKlUydWKuULmDqSMTuonY+9IRDUEGKX/8PXQ1nBxRq3w85uGtd9q9SXfqEldMIQ==",
"license": "MIT",
"dependencies": {
"picomatch": "^4.0.4"
}
},
"node_modules/@astrojs/compiler": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-3.0.0.tgz",
"integrity": "sha512-MwAbDE5mawZ1SS+D8qWiHdprdME5Tlj2e0YjxnEICvcOpbSukNS7Sa7hA5PK+6RrmUr/t6Gi5YgrdZKjbO/WPQ==",
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-4.0.0.tgz",
"integrity": "sha512-eouss7G8ygdZqHuke033VMcVw5HTZUu+PXd/h06DGDUg/jt5btPYPqh66ENWw/mU78rBrf/oeC4oqoBwMtDMNA==",
"license": "MIT"
},
"node_modules/@astrojs/internal-helpers": {
@@ -153,17 +162,15 @@
}
},
"node_modules/@astrojs/telemetry": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.0.tgz",
"integrity": "sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==",
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.2.tgz",
"integrity": "sha512-j8DNruA8ors99Al39RYZPJK4DC1bKkoNm93mAMuBhY9TCNC4R8n1q7ovFnJ5qhGh5Lsh7pa1gpQVpYpsJPeTHQ==",
"license": "MIT",
"dependencies": {
"ci-info": "^4.2.0",
"debug": "^4.4.0",
"dlv": "^1.1.3",
"ci-info": "^4.4.0",
"dset": "^3.1.4",
"is-docker": "^3.0.0",
"is-wsl": "^3.1.0",
"is-docker": "^4.0.0",
"is-wsl": "^3.1.1",
"which-pm-runs": "^1.1.0"
},
"engines": {
@@ -171,9 +178,9 @@
}
},
"node_modules/@astrojs/underscore-redirects": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@astrojs/underscore-redirects/-/underscore-redirects-1.0.1.tgz",
"integrity": "sha512-iSImJzW8m7MjA+15oJZAbSqSWu6ApQ0N8A0SaWV9yLzKYjzxWm/tZKbRSLRv94OE/rXuM25ZG7R8TepkhH7ahA==",
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@astrojs/underscore-redirects/-/underscore-redirects-1.0.3.tgz",
"integrity": "sha512-cxnGSw+sJigBLdX4TMSZKkzV6C3gMLJMucDk2W+n281Xhie68T2/9f1+1NMNDCZsc5i0FED7Qt5I10g2O9wtZg==",
"license": "MIT"
},
"node_modules/@babel/helper-string-parser": {
@@ -254,22 +261,22 @@
}
},
"node_modules/@cloudflare/kv-asset-handler": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.2.tgz",
"integrity": "sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ==",
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.5.0.tgz",
"integrity": "sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg==",
"license": "MIT OR Apache-2.0",
"engines": {
"node": ">=18.0.0"
"node": ">=22.0.0"
}
},
"node_modules/@cloudflare/unenv-preset": {
"version": "2.15.0",
"resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.15.0.tgz",
"integrity": "sha512-EGYmJaGZKWl+X8tXxcnx4v2bOZSjQeNI5dWFeXivgX9+YCT69AkzHHwlNbVpqtEUTbew8eQurpyOpeN8fg00nw==",
"version": "2.16.1",
"resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.16.1.tgz",
"integrity": "sha512-ECxObrMfyTl5bhQf/lZCXwo5G6xX9IAUo+nDMKK4SZ8m4Jvvxp52vilxyySSWh2YTZz8+HQ07qGH/2rEom1vDw==",
"license": "MIT OR Apache-2.0",
"peerDependencies": {
"unenv": "2.0.0-rc.24",
"workerd": "1.20260301.1 || ~1.20260302.1 || ~1.20260303.1 || ~1.20260304.1 || >1.20260305.0 <2.0.0-0"
"workerd": ">1.20260305.0 <2.0.0-0"
},
"peerDependenciesMeta": {
"workerd": {
@@ -278,26 +285,26 @@
}
},
"node_modules/@cloudflare/vite-plugin": {
"version": "1.28.0",
"resolved": "https://registry.npmjs.org/@cloudflare/vite-plugin/-/vite-plugin-1.28.0.tgz",
"integrity": "sha512-h2idr5fZ5GojyWZOZ506NHaDAVq3zpvcKgk8ZzDLlnHHvOwXZlFDPRf9Kkffv0fe+J6GPn7gVjJxgT0YRXAbew==",
"version": "1.37.2",
"resolved": "https://registry.npmjs.org/@cloudflare/vite-plugin/-/vite-plugin-1.37.2.tgz",
"integrity": "sha512-+QSQVdRcaRp63R3PqPHuIxqZUJnp1wJI2C+Un3DuwYAy2rjiHXKHwAvPWeUWIB8u04sydPFEuOwa0RaZA/hsJQ==",
"license": "MIT",
"dependencies": {
"@cloudflare/unenv-preset": "2.15.0",
"miniflare": "4.20260312.0",
"@cloudflare/unenv-preset": "2.16.1",
"miniflare": "4.20260518.0",
"unenv": "2.0.0-rc.24",
"wrangler": "4.73.0",
"wrangler": "4.93.0",
"ws": "8.18.0"
},
"peerDependencies": {
"vite": "^6.1.0 || ^7.0.0",
"wrangler": "^4.73.0"
"vite": "^6.1.0 || ^7.0.0 || ^8.0.0",
"wrangler": "^4.93.0"
}
},
"node_modules/@cloudflare/workerd-darwin-64": {
"version": "1.20260312.1",
"resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20260312.1.tgz",
"integrity": "sha512-HUAtDWaqUduS6yasV6+NgsK7qBpP1qGU49ow/Wb117IHjYp+PZPUGReDYocpB4GOMRoQlvdd4L487iFxzdARpw==",
"version": "1.20260518.1",
"resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20260518.1.tgz",
"integrity": "sha512-IhZEf5kDd0CLRtFxGS9AUqfM5SY3EFScqqCY1VF9twNMdYpJDYrDZDJAkQitHF8sF/sPVVHYR4Aifpdq6tzmaA==",
"cpu": [
"x64"
],
@@ -311,9 +318,9 @@
}
},
"node_modules/@cloudflare/workerd-darwin-arm64": {
"version": "1.20260312.1",
"resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20260312.1.tgz",
"integrity": "sha512-DOn7TPTHSxJYfi4m4NYga/j32wOTqvJf/pY4Txz5SDKWIZHSTXFyGz2K4B+thoPWLop/KZxGoyTv7db0mk/qyw==",
"version": "1.20260518.1",
"resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20260518.1.tgz",
"integrity": "sha512-uqlNP1psd8SWfN1Lg5p8ePv8/piOOXt+ycvb8+NQopXECGeh9+PQ/yr/IQjpurxBhYpvSaMC+vEeihejahjkJg==",
"cpu": [
"arm64"
],
@@ -327,9 +334,9 @@
}
},
"node_modules/@cloudflare/workerd-linux-64": {
"version": "1.20260312.1",
"resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20260312.1.tgz",
"integrity": "sha512-TdkIh3WzPXYHuvz7phAtFEEvAxvFd30tHrm4gsgpw0R0F5b8PtoM3hfL2uY7EcBBWVYUBtkY2ahDYFfufnXw/g==",
"version": "1.20260518.1",
"resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20260518.1.tgz",
"integrity": "sha512-D9p8Hl0lIQ46nYs4fQZp5F+9hhvgOcQJTF1SMQWpAxQSS5f8oX+vL5YdCrETUYnyoaoyEQETtkRrWYKJkPTFeg==",
"cpu": [
"x64"
],
@@ -343,9 +350,9 @@
}
},
"node_modules/@cloudflare/workerd-linux-arm64": {
"version": "1.20260312.1",
"resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20260312.1.tgz",
"integrity": "sha512-kNauZhL569Iy94t844OMwa1zP6zKFiL3xiJ4tGLS+TFTEfZ3pZsRH6lWWOtkXkjTyCmBEOog0HSEKjIV4oAffw==",
"version": "1.20260518.1",
"resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20260518.1.tgz",
"integrity": "sha512-+vNRkuOp9E/uRKHgQXVDUBPF5cwtTeXK6+ucLK50QUFzMYycqVl8kTFN2b//BX2H5BI4bjMRhXoBpe/zAlGRWQ==",
"cpu": [
"arm64"
],
@@ -359,9 +366,9 @@
}
},
"node_modules/@cloudflare/workerd-windows-64": {
"version": "1.20260312.1",
"resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20260312.1.tgz",
"integrity": "sha512-5dBrlSK+nMsZy5bYQpj8t9iiQNvCRlkm9GGvswJa9vVU/1BNO4BhJMlqOLWT24EmFyApZ+kaBiPJMV8847NDTg==",
"version": "1.20260518.1",
"resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20260518.1.tgz",
"integrity": "sha512-tnqofUq+ZvKliQHhboygbH7iy/Zm/MaCCotIlrqVj5a988+tPtndxyLM0r4vaAIC10iy/2LWCkwnE67VFTFiUA==",
"cpu": [
"x64"
],
@@ -2432,9 +2439,9 @@
}
},
"node_modules/anymatch/node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
"integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
"license": "MIT",
"engines": {
"node": ">=8.6"
@@ -2484,17 +2491,17 @@
}
},
"node_modules/astro": {
"version": "6.0.4",
"resolved": "https://registry.npmjs.org/astro/-/astro-6.0.4.tgz",
"integrity": "sha512-1piLJCPTL/x7AMO2cjVFSTFyRqKuC3W8sSEySCt1aJio+p/wGs5H3K+Xr/rE9ftKtknLUtjxCqCE7/0NsXfGpQ==",
"version": "6.3.5",
"resolved": "https://registry.npmjs.org/astro/-/astro-6.3.5.tgz",
"integrity": "sha512-gU+4KedkbTuVgz7YoVAN+9Ftnq0GaYwejxK2NbqDzB0M9dWd0f3kXZBuaM9hzbchRFoRAJfJjFtdX9LK6Ir7ZA==",
"license": "MIT",
"dependencies": {
"@astrojs/compiler": "^3.0.0",
"@astrojs/internal-helpers": "0.8.0",
"@astrojs/markdown-remark": "7.0.0",
"@astrojs/telemetry": "3.3.0",
"@astrojs/compiler": "^4.0.0",
"@astrojs/internal-helpers": "0.9.1",
"@astrojs/markdown-remark": "7.1.2",
"@astrojs/telemetry": "3.3.2",
"@capsizecss/unpack": "^4.0.0",
"@clack/prompts": "^1.0.1",
"@clack/prompts": "^1.1.0",
"@oslojs/encoding": "^1.1.0",
"@rollup/pluginutils": "^5.3.0",
"aria-query": "^5.3.2",
@@ -2505,16 +2512,17 @@
"cookie": "^1.1.1",
"devalue": "^5.6.3",
"diff": "^8.0.3",
"dlv": "^1.1.3",
"dset": "^3.1.4",
"es-module-lexer": "^2.0.0",
"esbuild": "^0.27.3",
"flattie": "^1.1.1",
"fontace": "~0.4.1",
"get-tsconfig": "5.0.0-beta.4",
"github-slugger": "^2.0.0",
"html-escaper": "3.0.3",
"http-cache-semantics": "^4.2.0",
"js-yaml": "^4.1.1",
"jsonc-parser": "^3.3.1",
"magic-string": "^0.30.21",
"magicast": "^0.5.2",
"mrmime": "^2.0.1",
@@ -2524,22 +2532,21 @@
"p-queue": "^9.1.0",
"package-manager-detector": "^1.6.0",
"piccolore": "^0.1.3",
"picomatch": "^4.0.3",
"picomatch": "^4.0.4",
"rehype": "^13.0.2",
"semver": "^7.7.4",
"shiki": "^4.0.0",
"shiki": "^4.0.2",
"smol-toml": "^1.6.0",
"svgo": "^4.0.0",
"tinyclip": "^0.1.6",
"tinyexec": "^1.0.2",
"svgo": "^4.0.1",
"tinyclip": "^0.1.12",
"tinyexec": "^1.0.4",
"tinyglobby": "^0.2.15",
"tsconfck": "^3.1.6",
"ultrahtml": "^1.6.0",
"unifont": "~0.7.4",
"unist-util-visit": "^5.1.0",
"unstorage": "^1.17.4",
"unstorage": "^1.17.5",
"vfile": "^6.0.3",
"vite": "^7.3.1",
"vite": "^7.3.2",
"vitefu": "^1.1.2",
"xxhash-wasm": "^1.1.0",
"yargs-parser": "^22.0.0",
@@ -2549,7 +2556,7 @@
"astro": "bin/astro.mjs"
},
"engines": {
"node": "^20.19.1 || >=22.12.0",
"node": ">=22.12.0",
"npm": ">=9.6.5",
"pnpm": ">=7.1.0"
},
@@ -2561,6 +2568,71 @@
"sharp": "^0.34.0"
}
},
"node_modules/astro/node_modules/@astrojs/internal-helpers": {
"version": "0.9.1",
"resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.9.1.tgz",
"integrity": "sha512-1pWuARqYom/TzuU3+0ZugsTrKlUydWKuULmDqSMTuonY+9IRDUEGKX/8PXQ1nBxRq3w85uGtd9q9SXfqEldMIQ==",
"license": "MIT",
"dependencies": {
"picomatch": "^4.0.4"
}
},
"node_modules/astro/node_modules/@astrojs/markdown-remark": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-7.1.2.tgz",
"integrity": "sha512-caXZ4Dc2St2dW8luEg22GlP0gupLdztCTQE4EzZOxW1pqWXz9mbeJEuHUkgDYcKWW8tjIHkydYDhWLVoxJ327Q==",
"license": "MIT",
"dependencies": {
"@astrojs/internal-helpers": "0.9.1",
"@astrojs/prism": "4.0.2",
"github-slugger": "^2.0.0",
"hast-util-from-html": "^2.0.3",
"hast-util-to-text": "^4.0.2",
"js-yaml": "^4.1.1",
"mdast-util-definitions": "^6.0.0",
"rehype-raw": "^7.0.0",
"rehype-stringify": "^10.0.1",
"remark-gfm": "^4.0.1",
"remark-parse": "^11.0.0",
"remark-rehype": "^11.1.2",
"remark-smartypants": "^3.0.2",
"retext-smartypants": "^6.2.0",
"shiki": "^4.0.0",
"smol-toml": "^1.6.0",
"unified": "^11.0.5",
"unist-util-remove-position": "^5.0.0",
"unist-util-visit": "^5.1.0",
"unist-util-visit-parents": "^6.0.2",
"vfile": "^6.0.3"
}
},
"node_modules/astro/node_modules/@astrojs/prism": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-4.0.2.tgz",
"integrity": "sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==",
"license": "MIT",
"dependencies": {
"prismjs": "^1.30.0"
},
"engines": {
"node": ">=22.12.0"
}
},
"node_modules/astro/node_modules/get-tsconfig": {
"version": "5.0.0-beta.4",
"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-5.0.0-beta.4.tgz",
"integrity": "sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ==",
"license": "MIT",
"dependencies": {
"resolve-pkg-maps": "^1.0.0"
},
"engines": {
"node": ">=20.20.0"
},
"funding": {
"url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
}
},
"node_modules/axobject-query": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
@@ -2830,9 +2902,9 @@
}
},
"node_modules/cookie-es": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.2.tgz",
"integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==",
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.3.tgz",
"integrity": "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==",
"license": "MIT"
},
"node_modules/cross-env": {
@@ -3008,9 +3080,9 @@
}
},
"node_modules/defu": {
"version": "6.1.4",
"resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz",
"integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==",
"version": "6.1.7",
"resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz",
"integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==",
"license": "MIT"
},
"node_modules/dequal": {
@@ -3065,12 +3137,6 @@
"node": ">=0.3.1"
}
},
"node_modules/dlv": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
"integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
"license": "MIT"
},
"node_modules/dom-serializer": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
@@ -4156,14 +4222,14 @@
"license": "ISC"
},
"node_modules/h3": {
"version": "1.15.6",
"resolved": "https://registry.npmjs.org/h3/-/h3-1.15.6.tgz",
"integrity": "sha512-oi15ESLW5LRthZ+qPCi5GNasY/gvynSKUQxgiovrY63bPAtG59wtM+LSrlcwvOHAXzGrXVLnI97brbkdPF9WoQ==",
"version": "1.15.11",
"resolved": "https://registry.npmjs.org/h3/-/h3-1.15.11.tgz",
"integrity": "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==",
"license": "MIT",
"dependencies": {
"cookie-es": "^1.2.2",
"cookie-es": "^1.2.3",
"crossws": "^0.3.5",
"defu": "^6.1.4",
"defu": "^6.1.6",
"destr": "^2.0.5",
"iron-webcrypto": "^1.2.1",
"node-mock-http": "^1.0.4",
@@ -4542,15 +4608,15 @@
}
},
"node_modules/is-docker": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
"integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-4.0.0.tgz",
"integrity": "sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==",
"license": "MIT",
"bin": {
"is-docker": "cli.js"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
"node": ">=20"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@@ -4584,6 +4650,21 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-inside-container/node_modules/is-docker": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
"integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
"license": "MIT",
"bin": {
"is-docker": "cli.js"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-plain-obj": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
@@ -4630,6 +4711,12 @@
"js-yaml": "bin/js-yaml.js"
}
},
"node_modules/jsonc-parser": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz",
"integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==",
"license": "MIT"
},
"node_modules/katex": {
"version": "0.16.38",
"resolved": "https://registry.npmjs.org/katex/-/katex-0.16.38.tgz",
@@ -4675,9 +4762,9 @@
}
},
"node_modules/lru-cache": {
"version": "11.2.7",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz",
"integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==",
"version": "11.5.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.0.tgz",
"integrity": "sha512-5YgH9UJd7wVb9hIouI2adWpgqrrICkt070Dnj8EUY1+B4B2P9eRLPAkAAo6NICA7CEhOIeBHl46u9zSNpNu7zA==",
"license": "BlueOak-1.0.0",
"engines": {
"node": "20 || >=22"
@@ -5821,15 +5908,15 @@
}
},
"node_modules/miniflare": {
"version": "4.20260312.0",
"resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20260312.0.tgz",
"integrity": "sha512-pieP2rfXynPT6VRINYaiHe/tfMJ4c5OIhqRlIdLF6iZ9g5xgpEmvimvIgMpgAdDJuFlrLcwDUi8MfAo2R6dt/w==",
"version": "4.20260518.0",
"resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20260518.0.tgz",
"integrity": "sha512-jbvp43zWa66tuQ+P7bl7s25VJWzGMv4mVhxEEZEEATPvuqAQhGn2wj3rQViVZkZZBZmXQtZ5ZV5kX9VtmWGzuA==",
"license": "MIT",
"dependencies": {
"@cspotcode/source-map-support": "0.8.1",
"sharp": "^0.34.5",
"undici": "7.18.2",
"workerd": "1.20260312.1",
"undici": "7.24.8",
"workerd": "1.20260518.1",
"ws": "8.18.0",
"youch": "4.1.0-beta.10"
},
@@ -5837,7 +5924,7 @@
"miniflare": "bootstrap.js"
},
"engines": {
"node": ">=18.0.0"
"node": ">=22.0.0"
}
},
"node_modules/minimist": {
@@ -6173,9 +6260,9 @@
"license": "ISC"
},
"node_modules/picomatch": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
"integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
"license": "MIT",
"engines": {
"node": ">=12"
@@ -6635,7 +6722,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
"integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
@@ -7219,26 +7305,6 @@
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/tsconfck": {
"version": "3.1.6",
"resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz",
"integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==",
"license": "MIT",
"bin": {
"tsconfck": "bin/tsconfck.js"
},
"engines": {
"node": "^18 || >=20"
},
"peerDependencies": {
"typescript": "^5.0.0"
},
"peerDependenciesMeta": {
"typescript": {
"optional": true
}
}
},
"node_modules/tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
@@ -7278,9 +7344,9 @@
"license": "MIT"
},
"node_modules/undici": {
"version": "7.18.2",
"resolved": "https://registry.npmjs.org/undici/-/undici-7.18.2.tgz",
"integrity": "sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==",
"version": "7.24.8",
"resolved": "https://registry.npmjs.org/undici/-/undici-7.24.8.tgz",
"integrity": "sha512-6KQ/+QxK49Z/p3HO6E5ZCZWNnCasyZLa5ExaVYyvPxUwKtbCPMKELJOqh7EqOle0t9cH/7d2TaaTRRa6Nhs4YQ==",
"license": "MIT",
"engines": {
"node": ">=20.18.1"
@@ -7468,16 +7534,16 @@
}
},
"node_modules/unstorage": {
"version": "1.17.4",
"resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.4.tgz",
"integrity": "sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==",
"version": "1.17.5",
"resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.5.tgz",
"integrity": "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==",
"license": "MIT",
"dependencies": {
"anymatch": "^3.1.3",
"chokidar": "^5.0.0",
"destr": "^2.0.5",
"h3": "^1.15.5",
"lru-cache": "^11.2.0",
"h3": "^1.15.10",
"lru-cache": "^11.2.7",
"node-fetch-native": "^1.6.7",
"ofetch": "^1.5.1",
"ufo": "^1.6.3"
@@ -7613,9 +7679,9 @@
}
},
"node_modules/vite": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz",
"integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==",
"version": "7.3.3",
"resolved": "https://registry.npmjs.org/vite/-/vite-7.3.3.tgz",
"integrity": "sha512-/4XH147Ui7OGTjg3HbdWe5arnZQSbfuRzdr9Ec7TQi5I7R+ir0Rlc9GIvD4v0XZurELqA035KVXJXpR61xhiTA==",
"license": "MIT",
"dependencies": {
"esbuild": "^0.27.0",
@@ -7741,9 +7807,9 @@
}
},
"node_modules/workerd": {
"version": "1.20260312.1",
"resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20260312.1.tgz",
"integrity": "sha512-nNpPkw9jaqo79B+iBCOiksx+N62xC+ETIfyzofUEdY3cSOHJg6oNnVSHm7vHevzVblfV76c8Gr0cXHEapYMBEg==",
"version": "1.20260518.1",
"resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20260518.1.tgz",
"integrity": "sha512-rLquk/eeqqJCbdGljSSuIZWW25vzYjTblXkD/tXQXKR5YsSIC91EtlqrzA1L4TJDZCxXKeFXPYqkW7R16UipXQ==",
"hasInstallScript": true,
"license": "Apache-2.0",
"bin": {
@@ -7753,40 +7819,40 @@
"node": ">=16"
},
"optionalDependencies": {
"@cloudflare/workerd-darwin-64": "1.20260312.1",
"@cloudflare/workerd-darwin-arm64": "1.20260312.1",
"@cloudflare/workerd-linux-64": "1.20260312.1",
"@cloudflare/workerd-linux-arm64": "1.20260312.1",
"@cloudflare/workerd-windows-64": "1.20260312.1"
"@cloudflare/workerd-darwin-64": "1.20260518.1",
"@cloudflare/workerd-darwin-arm64": "1.20260518.1",
"@cloudflare/workerd-linux-64": "1.20260518.1",
"@cloudflare/workerd-linux-arm64": "1.20260518.1",
"@cloudflare/workerd-windows-64": "1.20260518.1"
}
},
"node_modules/wrangler": {
"version": "4.73.0",
"resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.73.0.tgz",
"integrity": "sha512-VJXsqKDFCp6OtFEHXITSOR5kh95JOknwPY8m7RyQuWJQguSybJy43m4vhoCSt42prutTef7eeuw7L4V4xiynGw==",
"version": "4.93.0",
"resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.93.0.tgz",
"integrity": "sha512-qNsPr0oWRTc85SG7s1MjX+mWNTvkNV1zEQvRpTsV6eo8uqtvZoEAq8t8strQi9TtrDP3BOsxmy+N/G3ML6hH2w==",
"license": "MIT OR Apache-2.0",
"dependencies": {
"@cloudflare/kv-asset-handler": "0.4.2",
"@cloudflare/unenv-preset": "2.15.0",
"@cloudflare/kv-asset-handler": "0.5.0",
"@cloudflare/unenv-preset": "2.16.1",
"blake3-wasm": "2.1.5",
"esbuild": "0.27.3",
"miniflare": "4.20260312.0",
"miniflare": "4.20260518.0",
"path-to-regexp": "6.3.0",
"unenv": "2.0.0-rc.24",
"workerd": "1.20260312.1"
"workerd": "1.20260518.1"
},
"bin": {
"wrangler": "bin/wrangler.js",
"wrangler2": "bin/wrangler.js"
},
"engines": {
"node": ">=20.0.0"
"node": ">=22.0.0"
},
"optionalDependencies": {
"fsevents": "~2.3.2"
},
"peerDependencies": {
"@cloudflare/workers-types": "^4.20260312.1"
"@cloudflare/workers-types": "^4.20260518.1"
},
"peerDependenciesMeta": {
"@cloudflare/workers-types": {

View File

@@ -20,7 +20,7 @@
"db:studio:prod": "source .drizzle.env && DB_ID='48bf8d26-cdae-4887-a2c5-cf539788b6a5' drizzle-kit studio"
},
"dependencies": {
"@astrojs/cloudflare": "^13.1.1",
"@astrojs/cloudflare": "^13.5.2",
"@astrojs/mdx": "^5.0.0",
"@astrojs/rss": "^4.0.17",
"@astrojs/sitemap": "^3.7.1",
@@ -29,13 +29,13 @@
"rehype-katex": "^7.0.1",
"remark-math": "^6.0.0",
"remark-toc": "^9.0.0",
"sharp": "^0.34.3",
"wrangler": "^4.73.0"
"sharp": "^0.34.3"
},
"devDependencies": {
"@types/node": "^25.5.0",
"better-sqlite3": "^12.8.0",
"cross-env": "^10.1.0",
"drizzle-kit": "^0.31.9"
"drizzle-kit": "^0.31.9",
"wrangler": "^4.93.0"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -144,8 +144,8 @@ a start statement i.e. `int i = 0` (the bit of code that gets run before anythin
an end statement i.e. `i++` the statement that runs once the middle has been checked.
and if you are wondering how `int macro_var(_i_) = (start_func, 0)` assigns `macro_var(_i_)` to zero,
so am i, i will update this when i work this out.
so am i, i will update this when i work this out. <br/>
*update i have found out why this works check out [The comma operator](#the-comma-operator).
```c
#include <stdio.h>
@@ -490,6 +490,66 @@ void main() {
```
## The comma operator
Firstly you are asking yourself what the fuck is the comma operator is i was too when i saw the code for the defer macro. However the comma operator is fairly simple, the operator separates different expression much like how the `;` stop an expression. Although this is when the strangeness appears the comma operator will return the last expression value as the value of the total expression. This can lead to some neat readable code.
```c
int a = 1, b = 2;
int r = (a, b);
return r;
```
some real world use
```c
... // some fatal error occurd
retrun (errno = EINVAL, -1);
```
```c
int y;
if (y = f(x), y > x) {
return y;
}
if (y = g(x), y > u) {
return y;
}
if (y = q(x), y > b) {
return y;
}
```
## functions in functions (gcc only)
gcc has this really strange [compiler extensions](https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/C-Extensions.html) that can be used to some effect in the creation of clean code.
This one is the ability to define [functions in functions](https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/Nested-Functions.html#Nested-Functions). However dont use then out side the scope because this will go wrong.
```c
#include <stdio.h>
int main() {
printf("start\n");
char something[] = "this is outside the scope";
void print_name(char name[]) {
printf("%s\n", something);
printf("name is : %s", name);
};
print_name("jim");
}
```

View File

@@ -56,6 +56,7 @@ check this article often as i will be updating it
- using uart as a bus : https://www.uartbus.eu/
- https://milkv.io/docs/duo/overview
- https://multitude.net/wp-content/uploads/2022/07/BLESS_Book.pdf
- just all of cerns opensource hardware : https://ohwr.org/
# forges
- https://sourcehut.org/
@@ -152,3 +153,7 @@ check this article often as i will be updating it
- https://www.amazon.com.au/dp/0070486174?ref_=mr_referred_us_au_nz
- https://www.abebooks.com/9780520013636/Human-Engineering-Guide-Equipment-Designers-0520013638/plp
- https://link.springer.com/book/10.1007/978-1-4419-1788-1
# useful documents
- https://scidyne.com/ftp/ref_info/atx_201.pdf

View File

@@ -0,0 +1,54 @@
---
title: 'my perfect notebook'
description: 'recently I purchased some very nice notebooks from an art supply store however they are not perfect yet, so I will outline the changing I am planning on making to them in order to make them suit my needs, as well as requirements for my perfect notebook'
heroImage: '../../assets/article_hero_images/notebook.png'
pubDate: 'Apr 19 2026'
---
A while back I bought a Samsung Galaxy phone with the stylus partly because I wanted a new phone and partly because I thought it would use useful to take notes.
However, I found that when I would take notes on it the notes would just seem to fall into the bottomless pit (metaphorical bottomless, I have filled it with music) that is my phone.
so in my final year of unit I started taken notes on paper instead of my phone or even an Ipad and found it a lot better.
Although I wanted a better writing experience since I have started doing more lab work where space tends to be at a premium.
Therefor I recently purchased the [Ecoqua Original notebook](https://fabriano.com/en/product/ecoqua-original/) from fabriano.
These notebooks are wonderfully sized somewhere just smaller than a sheet of A6 with as well as excellent paper quality sitting at 90gsm[^1] with no bleed through.
Before this I was using [paperblanks notebooks](https://www.paperblanks.com/en/) and just like the Ecoqua they too have excellent although slightly thicker sitting at 120gsm as well as some very pretty colours.
Additionally, they also have a built-in document pocket and well as book ribbon and elastic or a clasp to hold the notebook close.
However, the largest downside of these notebooks were even in their smallest sizes (~A5) they were still too thick at 18mm with about 7mm of that coming from the covers.
This thickness of the covers also makes it very difficult to hold a pen on it as well.
So for a notebook that can be crammed in to a pocket paperblanks notebooks just arnt feasible unlike the Ecoqua which are around 4-5mm thick.
However, This is not to say the paperblanks notebooks are bad they are great a journaling notebooks (which I believe is what they actually sell them as).
But this is not to say the Ecoqua doesnt have downsides too, the largest one being they are paperbacked and for a notebook I carry around there normally isnt a hard surface near when I intend to write something down.
So that is the main problem I want a hardcover notebook that I can cram in my pocket and hold at least a pen as well as the obligatory of looking pretty.
To convert these desires easier to in to a set of requirements using the [EARS format](https://alistairmavin.com/ears/):
- The notebook shall be no larger than a sheet of A6 paper
- The notebook shall be no thicker than a phone with a case (*this is mainly because most things are designed with phones in mind*)
- The notebook shall contain some visual appeal
- The notebook shall have a documents pocket
- The notebook shall have a hardcover
- the notebook shall have a location to store a pen
Now time for the more gimmicky things I keep thinking would be nice in a notebook:
- When the pen is removed from the notebook, the notebook can then be opened
- this is primarily because when you open a notebook you intend to write in it.
Therefor requiring that the pen is removed in order to be opened would allow for a cleaner solution then a piece of elastic or a clasp that might not close if too many things are in the notebook
- The notebook shall contain storage for additional drawing implements such as stencils and straight edges
- The notebook shall have the ablity to change the paper within it.
for a design to meet these requirement I have created an [openscad script](https://git.sirlilpanda.studio/sirlilpanda/parametric-notebook) that generates a notebook based off of a page size.
This notebook uses a hinge based design I originally saw from a creator called [dogteeth](https://www.dogteeth.co/) who created a notebook based off a fence hinge.
![alt text](/perfect-notebook/notebook.png)
However, I believe they did not take full use of the hinge designs additional the pages with in the notebook feel too tall.
Although I do believe this is just due to their design using off the shelf parts and not custom fabrication.
Therefor my plan is to take this same design expand out the metal holding the hinge to give more space for the paper.
Additionally, I plan to create a hole through the hinge and using that to hold the pen much like a spiral bound notebook, this would also allow for the possibility of cutting a keyway in as well, meaning when the pen is inserted the notebook cannot open.
However, this notebook design does have a major flaw and thats the hinge itself, when the notebook fully open the hinge sits in the middle causing there to be a bump in the middle of the notebook.
One method of solving this could be to change to more of a notepad instead, but this changes the use of the notebook to a notepad, since notebook are there so you can look back through your notes where notepads are there to write notes down then discard of them.
There are other possible designs I may still look in to like lether bound notebooks where I might just embed some piece of hard material in, or maybe a spiral notebook with some hardcover.
However for the mean time I will continue development on this current notebook possibility trying to find an alternative hinge mechanism with possible future updates to come.
[^1]: gsm or Grammage is simply the ratio of the mass (g) of the paper compared to its area (m<sup>2</sup>), this unit does correlate to the thickness of the paper however higher gsm papers can be thinner then lower gsm papers.

View File

@@ -0,0 +1,46 @@
---
title: 'schematics should show intent rather than reailty'
description: |
when people send me schematics for review, I occasionally see seemingly random connectors with no description or notes for what they are used for. Therefor this article covers how to change your schematic to be more readable at a glance.
pubDate: '23 May 2026'
heroImage: '../../assets/article_hero_images/schematics-should-show-intent-rather-than-reailty.png'
---
When reviewing schematics I will tend to find that people have designed their schematics to directly reflect the reality of what they are building.
This is not a *bad* thing per say, however this can and does cause information about the circuit to be lost.
This in turn means when reviewing the schematic the reviewer can not tell if what you are planning to implement and can not therefor give adequate feedback.
So to solve this problem the schematic that you create should show your intent of what goes there rather than what is actually there.
For example a common act that causes confusion is something like this:
![alt text](/schmatic_rant/example_of_poor_design.png)
Here the user has connected a connector with a current limiting resistor to a pin of their microcontroller.
When looking at this the first thing I ask is "*what is going on that connector*", most of the time it will just be a button.
And if it is just a button then I may suggest to the user to add a capacitor for debouching so they don't have to implement it in code.
However, this could also be a switch and then that suggestion would be useless.
Furthermore, this could even be a connector to an LED that they are sinking through the microcontroller.
So as you can see that just having a single connector to say something is going to go here does not give the reviewer enough information to make an informed decision.
Therefor my suggestion is to make the schematic reflect your intention instead.
So if you are planning on using a switch then just replace the connector symbol with a switch instead as shown:
![alt text](/schmatic_rant/example_of_better_design.png)
Or if its a button then use a button symbol or an led symbol if its an LED.
Then just keep the footprint the same as the connector before.
However i would add that this still isnt clear enough as this now implies that this switch is on the PCB itself.
This now contrast with the pervious symbol as it showed there was something going off board.
You could fix this by adding a note next to the switch as can be seen below or even moving the wires and adding a box around it to show it's off the PCB.
![alt text](/schmatic_rant/example_of_better_design_with_label.png)
![alt text](/schmatic_rant/example_of_better_design_with_label_and_box.png)
Although these fixes now reflect your intent on the PCB they don't truly reflect the reality of your PCB.
I know ive just been going on about how your schematic show should the intent of what your doing not the reality.
However, the best way to show your intent is to show the exact reality of how It's going to be implemented.
Therefor, you can instead implement the switch like what is seen below, with both the connector on the board the connector off the board and the switch itself.
![alt text](/schmatic_rant/example_of_best_implemention.png)
This now show both your intention behind the design and the exact reality of the design itself.
Additionally, this implemention also give the extra benefit of automatically including these items in the BOM of your PCB.
Lastly make sure to give these parts the attributes of `exclude from board` and `exclude from position files`.
These attributes make it, so these parts don't need footprints as well as do not need to be routed on the PCB.
![alt text](/schmatic_rant/boxes_to_check.png)
To conclude you should attempt to show the whole reality of your design rather than just the parts that sit on the PCB.

View File

@@ -0,0 +1,114 @@
---
title: 'using decision trees for self documenting design reports'
description: |
decision trees are a tool more commonly used in contexts of probability modeling as well as business decision mapping. However, this article uses them in the context of product design as a method for continuous documention of design.
heroImage: '../../assets/article_hero_images/decision-tree.jpg'
pubDate: 'May 21 2026'
---
Some background I enjoy to help out with some of the design courses at uni and act as a stakeholder in a product.
These students then have to go out and design either some project that i had rattling around in the good old head hole or one of their on creation.
Once they have designed it they then must write a design report and throw it as me so they can get marked.
When reviewing these design reports I have seen both great reports and terrible reports (and even worse reports that make me question how they made it this far).
Throughout that time I noticed the main thing that separates a great report from one that I would use as kindling, that being comparisons of different choices.
To give and example this would be like a student comparing many different microcontrollers before selecting the one thats best for the job rather than just writing "i picked this one because ive used it before" (not to say that this is a bad rational for picking a MCU but it is bad rational if you didnt compare it to any others) or even worse they dont even specify the MCU.
However, I believe (possibly naively) that students have thought of the alternative but have just not included them in their reports.
This then leads to them not writing as much rational and therefor not creating an convincing argument for why this choice was made.
As if you have not yet worked it out yet a design report isn't a report that tells the reading what you designed a design report is you attempting to convince the reader that your design is the best design.
So to solve this problem of not writing down alternatives during the design/research phase i have adapted the concept of decision trees. Decision trees are more commonly found in probability modeling, business decision mapping and many other fields.
Firstly the syntax, normal decision trees tend to only have 3 node types:
- decision
- chance
- end
These node then allow the user to map out a tree of possible decision and the optimise for their given path.
these although good are not enough for the more complex system that is design.
Therefor my suggested syntax/nodes are:
- `+` : problem <br/>
this is the main problem you are attempting to solve some time solutions can create new problems. An example of this is if a motor draws too much power and now you have a new problem to deal with
- `>` : solution <br/>
this a solution to a decision
- `?` : decision <br/>
this is the node where decision are made like what microcontroller should we select
- `^` : pro <br/>
this allow the user to write down the pros for the given solution
- `*` : con <br/>
this allow the user to write down the cons for the given solution
- `!` : depends on [^1] <br/>
This allows for decision to depend on other decision within the system. lets say something needs to be actuated, the choice of actuator will depend on the power system available
- `#` : tag <br/>
this is used to tag multiple items when something depends on them
- `${id}` : requirement <br/>
this allows for the addition of requirement for a given decision
- `-` : <br/>
comment, reasoning, explanation
(i have given them characters has it's easier to identify when typed)
So how does this syntax solve the problem of students not writing down their design during research; well it doesn't that's still on the student to do.
However, this does allow for a fast way to check over your design to check if there are any gaps in your design. Therefor lets use this in an example project.
Additionally, pros and cons can also be used to show that a given solution meets a given requirements ID.
## Example project
problem statement: need a device for continuous monitor for the temperature of a system over WiFi
Requirements: (i would write some here but thats not the main point of the article)
...
```
+ need a device for continuous monitor for the temperature of a system over WiFi
? off the shelf device
> google nest temperature sensor
> idk some other tempture sensor
? bespoke device
? microcontroller
$1.1 the micro controller shall have WiFi
$1.2 the micro controller shall have an interface to commuicate with a temperature sensors
> esp32s3
# bulitin temp sensor
^ 1.1
* more expensive
? stm32
# bulitin temp sensor
> stm32wb
^ built in wifi
* requires RF routing
> stm32g4
# wifi-less
> rp2040
# wifi-less
> atmega
# wifi-less
? wifi
! wifi-less
> nrf24
> WINCS02PE-I/100
> esp8266
? temperature sensor
?! bulitin temp sensor
- the inbuilt temp sensor my not be good enough
> tmp100
? thermistor
...
? thermocouple
? adc
...
? spec
...
```
So as you can see in the example project we are attempting to solve the problem of remotely measuring temperature using WiFi.
So starting off we make the decision whether we make our own device on get one off the shelf.
For the bespoke deice we recognize that we need a microcontroller, Some way to communicate over wifi and some way to measure temperature.
Additionally, we can see in the decision to pick a Wi-Fi module that it depends on if we select a wifi-less MCU which is denoted by the tags.
Again you can notice with the temperature sensor the bulitin temp sensor dependency also has a decision mark this is to show that this dependency is optional so even if it is met then you can still pick another one for a different reason.
Now using this tree you can keep adding to it more rational more requirements
[^1] : and yes, the depends on does now in technically make this a graph but if you end up with a circular dependence in your design that's your fault

4725
src/pages/boms/index.astro Normal file

File diff suppressed because one or more lines are too long