# Anson's Notes > Discussions on Space, Computer Science, Crypto, or whatever else has my interest at the moment. Public Ghost content for AI and LLM tooling. This file includes a bounded export of public pages first, then recent public posts. Append `.md` to any post or page URL to get the content in Markdown (for example, `/example-post.md`). ## Pages ### About URL: https://notes.ansonbiggs.com/about/ Last updated: 2025-04-24T20:48:22.000Z *I'm Anson.* For the sake of reducing duplication, my home page is where you can learn about me [ansonbiggs.com/](https://ansonbiggs.com/) *What is this website?* This website serves two major purposes for me. The first is that I want to develop my skills as an engineer, and secondly forcing myself to present a topic makes me more honest in my research. The focus of this website is for my growth, not to grow a subscriber list. I have social and subscriber features turned on because I think they can make content far more engaging. I think it is cute when people interact over small sites instead of on social media. *Use of AI generated content.* LLMs are really powerful and avoiding it will put you at a major disadvantage. I use it at work, I use it for fun, and I sometimes use it here. I went through a phase of using AI generated images for posts, now I'm against it. I've always been against AI art for a majority of cases but I figured for a little blog post some of the images if generates could be fun. I would love to get to the point where I can have someone make really cool art for some of my posts. Now I mostly use Unsplash which has an expansive library that is licensed very permissively, and once in a Blue Moon I have fun making images from scratch. However, its great to have a chat window where I can bounce ideas or have it write some gross code that I don't want to figure out myself, like making a matplotlib plot look pretty with a specific palette, or writing a bash script. For socials or contact info see my homepage ### Living Documents URL: https://notes.ansonbiggs.com/living-documents/ Last updated: 2024-03-14T05:57:19.000Z Below is a list of pages that I maintain where the content changes often. [Cryptocurrency RankingsHighly opinionated, but non speculative, list of popular cryptocurrencies.![](https://notes.ansonbiggs.com/content/images/size/w256h256/format/jpeg/2023/11/pillars-1.jpg)Anson's NotesAnson Biggs![](https://notes.ansonbiggs.com/content/images/2023/12/output.webp)](https://notes.ansonbiggs.com/cryptocurrency-rankings/) [Libre ProjectsList of projects that I host and provide the source code of for free.![](https://notes.ansonbiggs.com/content/images/size/w256h256/format/jpeg/2023/11/pillars-1.jpg)Anson's NotesAnson Biggs![](https://images.unsplash.com/photo-1555885239-f4e4b2fdf87c?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDZ8fGxpYnJlfGVufDB8fHx8MTcxMDM5NTc5NHww&ixlib=rb-4.0.3&q=80&w=2000)](https://notes.ansonbiggs.com/libre-projects/) ### Libre Projects URL: https://notes.ansonbiggs.com/libre-projects/ Last updated: 2025-10-14T02:06:24.000Z Welcome to my collection of Libre Projects! Each of these projects is not only free to use and openly licensed but also comes with a hosted version when possible that you're welcome to utilize. I encourage you to explore, use, fork, and contribute to these projects. Your contributions, whether through using the hosted services, providing feedback, or contributing code, are invaluable. > Think free, as in free speech, not free beer. - Richard Stallman #### Biggs Brief RSS still seems alive and well, but there aren't any really good RSS readers out there. So, I decided to build my own that gives me kind of a newspaper/daily report. I also decided to make it open for anyone to read or use with their own feeds. Repository: [Project Homepage](https://zine.ansonbiggs.com/) #### Wikipedia Location Bot Really simple Telegram bot that you send your current location and it returns nearby Wikipedia entries. Awesome for if you are bored in a new part of town and want to do some reading, or on vacation looking for an adventure. Repository: [Telegram Link](https://t.me/WikiLocationBot) # Vibe Coded #### BadFriends - Bluesky App Bluesky analytics tool that identifies which accounts you follow are frequently posting content that triggers your muted words and filters. Uses client-side analysis with recency-weighted scoring to prioritize accounts actively posting problematic content. Built with vanilla JavaScript and AT Protocol OAuth. Repository: [Project Homepage](https://badfriends.ansonbiggs.com) #### WikiMap Ever wondered which Wikipedia articles near you need help? This map shows nearby Wikipedia articles color-coded by completeness—red and orange markers need photos or content. Built with Apple MapKit JS because I wanted a beautiful map experience that encourages people to contribute to Wikipedia. Repository: [Project Homepage](https://around.ansonbiggs.com) #### SECURE Act 2.0 Student Loan Matching Educational tool demonstrating how employer 401(k) matching for student loan payments impacts retirement savings. Single-page app with interactive scenarios, compound growth visualizations, and profession-based examples to illustrate this SECURE Act 2.0 benefit. Repository: [Project Homepage](https://401k.ansonbiggs.com) # Dead Projects ![](https://notes.ansonbiggs.com/content/images/2024/06/Stock-Bot.png) #### Simple Stock Bot Upgrade financial discussion's in your group chats with Simple Stock Bot. Get real-time stock market and cryptocurrency insights within your Telegram or Discord group chats. With Simple Stock Bot, keeping up with the stock market or cryptocurrency trends has never been more seamless and engaging. Repository: [Project Website](https://simplestockbot.com/) ### Reading List URL: https://notes.ansonbiggs.com/reading-list/ Last updated: 2025-01-13T04:49:31.000Z The following is a collection of links that I often find myself referencing or sharing with others. ## Top Links [It’s Time to Build | Andreessen HorowitzEvery Western institution was unprepared for the coronavirus pandemic, despite many prior warnings. This monumental failure of institutional effectiveness will reverberate for the rest of the decade, but it’s not too early to ask why, and what we need to do about it. Many of us would like to pin the cause on one political…![](https://notes.ansonbiggs.com/content/images/icon/favicon-180.png)Andreessen HorowitzMarc Andreessen![](https://notes.ansonbiggs.com/content/images/thumbnail/Software_is_Eating_the_World_10_Year_Twitter.jpg)](https://a16z.com/its-time-to-build/) Probably the most inspiring thing I've read. I think innovation should be a priority and this essay presents that perfectly. [GPS – Bartosz CiechanowskiInteractive article explaining how GPS works.![](https://notes.ansonbiggs.com/content/images/icon/favicon-3.ico)Bartosz Ciechanowski![](https://notes.ansonbiggs.com/content/images/thumbnail/gps.png)](https://ciechanow.ski/gps/) The most high quality blog on the internet. I think every post could make this list. I chose this post specifically since it was released as I was modeling some GPS related behavior for my work at United Launch Alliance and it really helped me connect some dots. ## Engineering [How to be a -10x Engineer![](https://notes.ansonbiggs.com/content/images/icon/apple-touch-icon-2.png)Taylor Troesh![](https://notes.ansonbiggs.com/content/images/thumbnail/2dy9vzxugi3b1.jpg)](https://taylor.town/-10x) All of Taylors writing is really good, but I find myself sending this to coworkers often and it is usually a pretty sobering read that can help you get back on an efficient track. [The Story of TitaniumThe earth contains a lot of titanium - it’s the ninth most abundant element in the earth’s crust.![](https://notes.ansonbiggs.com/content/images/icon/https-3A-2F-2Fsubstack-post-media.s3.amazonaws.com-2Fpublic-2Fimages-2F996cb600-c77d-471b-ac46-8a9a3aac5709-2Fapple-touch-icon-180x180.png)Construction PhysicsBrian Potter![](https://notes.ansonbiggs.com/content/images/thumbnail/https-3A-2F-2Fsubstack-post-media.s3.amazonaws.com-2Fpublic-2Fimages-2F8667efda-5f6d-480a-bc16-24037b636815_1600x1188.png)](https://www.construction-physics.com/p/the-story-of-titanium) Great insight on economies of scale and just how capable the US Gov. was at innovating in aerospace. [Pauls Online Math NotesWelcome to my math notes site. Contained in this site are the notes (free and downloadable) that I use to teach Algebra, Calculus (I, II and III) as well as Differential Equations at Lamar University. The notes contain the usual topics that are taught in those courses as well as a few extra topics that I decided to include just because I wanted to. There are also a set of practice problems, with full solutions, to all of the classes except Differential Equations. In addition there is also a selection of cheat sheets available for download.![](https://notes.ansonbiggs.com/content/images/icon/favicon-6.ico)](https://tutorial.math.lamar.edu) Pauls note presentation style clicked with me far more than textbooks, so I give this website a lot of credit for getting me through college. ### Space [Akin’s Laws of Spacecraft Design![](https://notes.ansonbiggs.com/content/images/icon/faviconV2)![](https://notes.ansonbiggs.com/content/images/thumbnail/110920.MMR.png)](https://spacecraft.ssl.umd.edu/akins%5Flaws.html) Lots of wisdom here. Super impressive how well its held up considering that spaceflight has gone through massive changes in the past decade. [The Lunacy of ArtemisFor the first time since the 1960’s, it looks doubtful whether the US space agency is even capable of getting us to the Moon.![](https://static.ghost.org/v5.0.0/images/link-icon.svg)![](https://notes.ansonbiggs.com/content/images/thumbnail/artemis_cloud-2.jpg)](https://idlewords.com/2024/5/the%5Flunacy%5Fof%5Fartemis.htm) Really good critique of the ConOps for the Artemis program. ### Software [bliki: Given When Thena bliki entry for Given When Then![](https://notes.ansonbiggs.com/content/images/icon/favicon-4.ico)martinfowler.comMartin Fowler![](https://notes.ansonbiggs.com/content/images/thumbnail/logo-sq.png)](https://martinfowler.com/bliki/GivenWhenThen.html) A majority of my professional career has been writing tests, I've tried quite a few methods but this is definitely the best. If you are writing tests that ever need to be updated you will greatly thank yourself for writing them in a way that is easy for future people to understand. [styleguideStyle guides for Google-originated open-source projects![](https://notes.ansonbiggs.com/content/images/icon/faviconV2-1)styleguide](https://google.github.io/styleguide/pyguide.html) This is your Python bible. Codify it into law in every project you take part in. ## Optimism [Fast · Patrick Collison![](https://static.ghost.org/v5.0.0/images/link-icon.svg)](https://patrickcollison.com/fast) Great examples of how fast we used to accomplish great feats. [The Techno-Optimist Manifesto | Andreessen HorowitzWe are told that technology is on the brink of ruining everything. But we are being lied to, and the truth is so much better. Marc Andreessen presents his techno-optimist vision for the future.![](https://notes.ansonbiggs.com/content/images/icon/favicon-180-1.png)Andreessen HorowitzMarc Andreessen![](https://notes.ansonbiggs.com/content/images/thumbnail/Tech-Optimist_Facebook-11.jpg)](https://a16z.com/the-techno-optimist-manifesto/) Kind of a follow on to ****It's Time To Build**, which is linked above, but equally as great in my opinion. ## Crypto ## Random I think Porsche does some of the best engineering in the world, but its without faults. This video sums it up nearly perfectly. [Mario meets ParetoDiscover how to find the best Mario Kart 8 build using the Pareto frontier method. This interactive guide explores multi-objective optimization of speed, acceleration, and other key stats to help you beat your friends on the race track.![](https://notes.ansonbiggs.com/content/images/icon/favicon.png)Antoine Mayerowitz![](https://notes.ansonbiggs.com/content/images/thumbnail/mario-meets-pareto.png)](https://www.mayerowitz.io/blog/mario-meets-pareto) I think this is peak web dev and technical communication. ## Posts ### How Subagents are Built URL: https://notes.ansonbiggs.com/how-subagents-are-built/ Last updated: 2026-06-21T22:28:12.000Z Watching the development of AI harnesses is really interesting for a ton of reasons. It is ground zero for agentic development, a large amount of the work is open source, and every major player thinks that they are in a winner takes all race so the enginering teams are large and incredibly talented. Claude Code alone will probably be processing $100bn a month in tokens in the next year so every single choice has large consequences, if they aren't executing better than everyone else they will quickly get left behind. Being open source this is also the best view we have into how engineering is happening at these labs which are likely a few months ahead of everyone else when it comes to the latest software development cycles. For a long time I really thought that all of the AI labs would start to converge on implementations across their stack, but its actually been the complete opposite. Models all behave so differently that I can pretty consistently call out lab of origin and size for any model when I run openrouter random through my OpenClaw. Agent harnesses are not different, pretty much every detail is different especially under the hood when you look at the agent side - tools, text formats, prompts are all completely heterogeneous. The reason we are here today is mostly because pi.dev/ doesn't ship with subagents. Pi is a really incredible agent harness, and I've been forcing myself to use it without extensions for about a month now to kind of cleanse my pallete of all the incredible bells and whistles Claude Code ships with in an attempt to figure out what I really need. By far the thing I miss the most is subagents. Subagents are critical for cost, context management, and speed. A single Agent does do surprisingly well at a lot of tasks I thought it would struggle at alone, and it put me back on the hotseat as the orchestrator. For example if I need to compare the subagent implementations of OpenCode, Hermes, Codex, and Claude Code, then right now I just open 4 terminal tabs and paste the same question across them, then I copy them all into one conversations and work from there. It is kind of fun getting a layer closer to the engineering again :P ## Subagent Primitives Now if subagents are just as important as your Agent being able to read bash, then why didn't pi bundle some minimal subagent tooling? Turns out its because everyone is building them differently and there is no "correct" implementation. Firstly as I see it there are 3 different tools here: - tool handoff - Especially bash, but really any tool should be capable of being handed off to a subagent, especially if you build system spits out 100k tokens. Tool form should roughly be `agent_handoff(tool, args, prompt)` - `agent_handoff(bash, 'make build', 'on failure tell me what the error is')` - No turns, tools, or context. Subagent is just fed the tool call, its output, and what we want to know about the output. - subagent - This agent usually has the same tools and environment as the agent you are interfacing with, but it has to one-shot it problem. This is pretty much just calling `pi -p "{prompt}"` - No communication with other agents or its host agent, but it also isn't too much of a stretch to keep subagents alive so that they can take multiple turns, receive additional instructions, or elaborate on their response. - orchestrator - Claude calls these [agent teams ](https://code.claude.com/docs/en/agent-teams)and is the only harness that fully ships this out of the gate. Your agent becomes a manager and spins up persistent subagents that can not only talk to your orchestrator but even eachother. - There is a lot of infrastructure that needs to work well in order for this to work. I think the biggest hurdle is prompting since all agents currently just want to optimize for user satisfactions which really falls apart when you are collaborating on a large task. You have to have some sort of tension and push/pull between eachother that current agents just aren't good at. ## SubAgent Implementations Now back to every harness doing this differently. Nobody is really converging on one idea of a subagent, which is exactly why pi isn't shipping them. There is no obvious “correct” primitive yet. ### Claude Code Claude Code is the most ambitious of the bunch, and definitely the most developed subagent implementation. What makes it different is that it supports multiple delegation modes instead of one: fresh specialist agents that start from zero context, forked workers that inherit parent context, background execution, resumable sidechain transcripts, and coordinator-style team workflows.Claude Code is treating subagents as a real runtime for collaborative agent work. The important caveat is that this power comes with complexity. Once you move into persistent sidechains, background notifications, resume semantics, and team coordination, you are no longer just spawning a worker. You are managing a whole system which means its easy to end up in a [gas town](https://steve-yegge.medium.com/welcome-to-gas-town-4f25ee16dd04https://steve-yegge.medium.com/welcome-to-gas-town-4f25ee16dd04) scenario where you are 100x'ing your token spend to 1.1x your productivity. [Dynamic workflows](https://claude.com/blog/introducing-dynamic-workflows-in-claude-code) came out right as I started writing this and threw my original conclusion for a loop. I was going to say pi will end up being a leader in this space because it is moldable and dynamic enough to become whatever workflow you need on the fly. I think dynamic workflows are going to become that inside Claude Code. Hopefully Anthropic keeps writing high quality blog posts since their releases are slowly pushing deeper into the veil and being abstracted from the user as time goes on. ### Codex I think Codex is focusing on building out infrastructure and they haven't landed on a golden path yet. On paper they aren't that far behind Claude Code, and they should be able to handle things like Agent Teams, but in practice I never see Codex utilizing subagents on its own. I have to very explicitly tell it to break a task down on a specific axis and to assign subagents to each unit. ### Hermes Hermes just does a pure subagent like I describe in the primitives section above. They are new sessions, that inherit their parents permissions and tools, and have to one shot their task. Hermes is still pretty new so I'm sure this will expand. But its also probably totally fine for a personal assistant type tool. Something I think they could build that would be really cool is not just searching the transcript for previous conversations, but to be able to talk to those conversations as well and keep the threads going. ### OpenCode OpenCode makes an addressable child process with limited permissions and tools, but otherwise they are pretty durable and can handle multiple turns. This is probably the obvious path to build subagents with pi. You just let your agent call pi in json/rpc mode and let it cook. ### Pi So I actually tried the approach I mentioned in OpenCode and Pi did it really well. > can you call multiple pi sessions to have them all review my resume at once with different prespectives and give me the results? ```sh $ set -euo pipefail mkdir -p /tmp/pi-resume-review PROMPT_BASE='Review the attached resume/index.html / rendered resume content for Anson Biggs. Do not edit files. Return concise, evidence-backed feedback with: strengths, top concerns, concrete changes, and any suggested rewritten bullets. Focus only on your assigned perspective.' pi --print --no-tools --name resume-review-ats @resume/index.html "$PROMPT_BASE Perspective: ATS/recruiter screening for Lead/Staff Generative AI, autonomy, aerospace/defense roles. Consider keyword fit, scanability, titles, dates, metrics, and red flags." > /tmp/pi-resume-review/ats.txt 2>/tmp/pi-resume-review/ats.err & P1=$! pi --print --no-tools --name resume-review-hm @resume/index.html "$PROMPT_BASE Perspective: technical hiring manager for AI platform/agentic engineering. Evaluate credibility, technical depth, impact, scope, architecture signals, and interview hooks." > /tmp/pi-resume-review/hm.txt 2>/tmp/pi-resume-review/hm.err & P2=$! pi --print --no-tools --name resume-review-defense @resume/index.html "$PROMPT_BASE Perspective: aerospace/defense cleared programs recruiter/manager. Evaluate clearance wording, restricted data/CUI/ITAR positioning, mission relevance, and compliance/security concerns." > /tmp/pi-resume-review/defense.txt 2>/tmp/pi-resume-review/defense.err & P3=$! pi --print --no-tools --name resume-review-exec @resume/index.html "$PROMPT_BASE Perspective: executive/CTO reviewing for senior leadership potential. Evaluate strategic narrative, business outcomes, leadership scope, influence, and whether the resume sells seniority." > /tmp/pi-resume-review/exec.txt 2>/tmp/pi-resume-review/exec.err & P4=$! FAIL=0 for p in $P1 $P2 $P3 $P4; do if ! wait "$p"; then FAIL=1; fi; done if [ "$FAIL" -ne 0 ]; then echo "One or more pi sessions failed" >&2 for f in /tmp/pi-resume-review/*.err; do echo "--- $f ---" >&2; tail -50 "$f" >&2 || true; done exit 1 fi printf 'Outputs saved in /tmp/pi-resume-review\n' ``` You don't even need to use a special mode, just -p does most of what you would need. Now I've never seen Pi do this itself so I don't think this is truly a solution, but it does mean that the gap might even be small enough that just a skill is needed for "implementing" subagents. ## Conclusion All of this for me to just glaze Pi and Claude Code as usual. I do think all software will start to take the Pi approach going forward now that LLM improvements are pushing the cost of code generation to zero. Why do I have to settle with the way Anthropic wants my world to look if I can have my software generated on the fly to not just meet my specific wants, but the exact bridge to get me through my immediate task. ### You're probably using Agent Skills wrong URL: https://notes.ansonbiggs.com/youre-probably-using-agent-skills-wrong/ Last updated: 2026-06-22T07:26:40.000Z The entire ecosystem around Claude Code is pretty confusing, the naming conventions are a mess and the pace of change is beyond any production tool I've seen. However Skills are probably the most misused. I see it at work at ton but a paper just came up on Hacker News: [SkillsBench: Benchmarking How Well Agent Skills Work Across Diverse TasksAgent Skills are structured packages of procedural knowledge that augment LLM agents at inference time. Despite rapid adoption, there is no standard way to measure whether they actually help. We present SkillsBench, a benchmark of 86 tasks across 11 domains paired with curated Skills and deterministic verifiers. Each task is evaluated under three conditions: no Skills, curated Skills, and self-generated Skills. We test 7 agent-model configurations over 7,308 trajectories. Curated Skills raise average pass rate by 16.2 percentage points(pp), but effects vary widely by domain (+4.5pp for Software Engineering to +51.9pp for Healthcare) and 16 of 84 tasks show negative deltas. Self-generated Skills provide no benefit on average, showing that models cannot reliably author the procedural knowledge they benefit from consuming. Focused Skills with 2--3 modules outperform comprehensive documentation, and smaller models with Skills can match larger models without them.![](https://notes.ansonbiggs.com/content/images/icon/apple-touch-icon-4.png)arXiv.orgXiangyi Li![](https://notes.ansonbiggs.com/content/images/thumbnail/arxiv-logo-fb.png)](https://arxiv.org/abs/2602.12670) The paper the got me fired up enough to write this post The HN title is editorialized for some reason *"Study: Self-generated Agent Skills are useless"*, but it immediately grabbed me since I get massive value from Skills written by Agents, but I also consistently see them misused by my peers. The concept is great, I've been looking at benchmarking specific parts of the Agentic ecosystem myself so this was highly relevant to me. Overall the paper is decent but one bullet invalidates the whole thing: > **Self-Generated Skills**: No Skills provided, but the agent is prompted to generate relevant procedural knowledge before solving the task. This isolates the impact of LLMs’ latent domain knowledge. So all they are doing is taking a problem that a model can't solve well on its own, and asking it to write about the task before attempting it. They just reinvented thinking blocks but worse! ### The Skill Anti-Pattern What they did is a very common mistake right now. My Agent is bad at this thing so, I ask the Agent to write a skill on this thing. I'll reiterate this is identical to thinking blocks. In order for your Agent to create something worthwhile you have to make sure they can see the gaps. I see this as the classic CS intro where you ask someone to write out the steps to make a PB&J, you don't really understand what makes the problem hard until you've struggled through solving it. This directly leads into the largest Faux Pas of the AI era, just asking a LLM someone elses question verbatim, and pasting the LLMs answer as your response. If I ask you how you did something cool with an Agent, and you just on the fly have a fresh Agent build me a SKILL.md on my question, *I will kill you.* ## What are Skills Before getting into proper usage, I just want to cover what skills are. As a primitive they are just markdown files that have some metadata at the top to help Agents/Tools know when to use them, and then the rest of the document is the skill. Each skill has its own folder so it can no only teach your Agent how to do something but also give it better tools. ```bash .claude/skills/ └── monitor-gitlab-ci/ ├── SKILL.md # The file mentioned above ├── monitor_ci.sh # Complicated command └── references/ # Additional references ├── api_commands.md ├── log_analysis.md └── troubleshooting.md ``` Above is a Skill I used a ton to let older versions of Claude work on my GitLab CI. It's a folder with a simple markdown Skill that just explained the setup and that the Agent needs to watch the CI until either a job fails or everything passes, a simple CLI to prevent the Agent from writing a script, and additional references for edge cases. ## Skills for Context Agents are completely stateless meaning that every new conversation is like meeting the model for the first time, it has no idea what your project is or what you were working on 10 minutes ago. CLAUDE.md does a lot to fix this, but for a large enough project it can't contain everything. If I open up a monorepo and tell Claude to run a SIL test then it is going to have to run around to figure out how to do that. It has to figure out what language the project is in, then look for common test patterns for that language, its going to see a complicated Docker Compose setup, its going to see that the containers need x86 but we're running on a Mac, then its going to look for CI, etc. This can all be solved by writing Skills for common, but not universal patterns. Anytime a model struggles to do something in your project that you know is simple and basic, tell it to make a Skill covering the gaps in knowledge it had to complete that task. ## Skills for Repetition Another simple use for Skills is to explain tasks that you often do. For instance I often tell my Agents to make sure my docs/, MR description, Issue, and codebase are all in alignment. So, I made a simple Skill for it to keep me from typing it out all the time. ## Skills for Hard Problems Claude can solve some really hard problems, but it might take $500 in tokens and you might have to yell at it for reward hacking a few times. Almost any time I have to intervene on a problem, once the Agent is unstuck I ask it what the gap was that kept it from figuring it out on its own. Sometimes it is something silly, but sometimes it is something genuinely insightful and I have Claude make a Skill to fill the gap. ## Conclusion I edited the original benchmark to do Skills my way and the results were as I suspected, the Agents nailed the test with proper Skills. I don't have the money to spend on fully validating this result but the first pass was good enough for me to be happy. I think this essentially doubles the amount of dataset needed for this benchmark so I assume thats why the authors didn't include this method. Remember, there are two reasons to make a skill – Remembering a novel problem, and avoiding repetition. If you are just making a fresh session with your Agent and asking for a Skill on `x` then its probably no value. It needs to know something the fresh model doesn't which can come from you're prompt explaining a common process, a compilation of knowledge gained from a hard problem, or even having it go off and do its own research on something that isn't novel. Happy Hacking. Comments on HN ### Scaling With Agents URL: https://notes.ansonbiggs.com/scaling-with-agents/ Last updated: 2026-01-22T05:24:22.000Z The current generation of Frontier Models are incredibly capable. It is no longer a question of what can I build but how fast can I build it. But building fast at scale introduces its own complexity. Scaling your compute and your Agents is two completely different issues that have to be done in lock step. # Mise en Place With Claude Code you are now a CTO, if you enjoyed being in the weeds of your codebase and writing artisanal Python like I did you need a whole new set of skills to build at the new scales available to you. Implementation details are now a waste of time, you need to be able to take large projects and break them down into smaller independent features that can be worked on in parallel. I use GitLab with the `glab` CLI tool to have Claude help me plan everything out. I find that the interview style works really well for this. It's impossible to one shot explain a perfectly constrained statement of work for Claude to break down so the back and forth is really important. I find myself totally changing my perception of the project as we go through this phase. It's important to vibe code at this phase too. Sure you probably have some infrastructure constraints like the project needs to run on your macbook, and host in a cloud that you are familiar with but other than that I try to let my Agent figure out those details. Remember you are a CTO you're worried about the vision not that your favorite language is used. Personally I strongly dislike Javascript, but for many projects it is the right tool for the job and a tool that Claude understands incredibly well. When I stopped forcing a stack that I preferred on my Agents things started coming together a lot better. This isn't to say that your technical depth is going to go to waste, it's just that for many large projects you need to think bigger picture. Now back to breaking down work, I recommend going the whole nine yards and really plan things out. I know most engineers don't even want to use branches for personal projects but having Claude help you make Sprints, Epics, crawl/walk/run plans, etc. goes a super long way. Remember that the biggest issue with Agents is that they are stateless, and the more you cram into their little brains the worse they perform. So, having layers that the Agent can reach out to if it needs more information on its own is really powerful. Most of the time the Merge Request description and the codebase is all it needs, but sometimes a problem isn't well enough defined and it can go out and grab that context itself. ![Concentric rings showing how the more your agent has the grab that the info grows exponentially](https://notes.ansonbiggs.com/content/images/2026/01/image.png) My attempt at visualizing the context use Breaking this work down also helps your orchestration Agent know what needs to be worked on next. If your orchestration Agent needs to understand every single ticket and the entire codebase on every iteration then it is going to fail. I do still skim all tickets and sprints before I let my Agents get to work, but I rarely make any edits myself. Any issues I see I tell my planning agent directly to make sure that it keeps everything in alignment, and so that it fully understands the bigger picture. **One of the most powerful things Claude can do is keep things in alignment.** One of my favorite prompts is to tell my Agents to review the ticket, Merge Request description, `docs/` and the codebase to make sure that everything is in alignment. Make it use multiple independent Agents and to be exhaustive. This essentially changes your coding language into English. Your `docs/` will be a source of truth that you can review to make sure everything meets your expectations, your open work items describe the path forward. Any divergence you just explain the issue to your Agent it gets fixed. # Infinite Compute Now, you've broken your project down into a super detailed plan that your Agents can go work through on their own, but you're limited to an old laptop that can barely run your test suite, let alone run it 10 times in sync while all of your Agents are developing at the same time. Enter CI/CD Pipelines. Pipelines are something I'm kind of obsessed with, every startup I've worked for is confused when the first thing I want to tackle is getting a pipeline set up for running tests and lints. I think the single most important part of any team is aligning on workflows and CI pipelines are a great way to do that. A huge benefit for AI Agents is that it essentially gives each Agent a sandbox so when you have 8 Agents working through an entire 2 week sprint in parallel you don't have to worry about them working on top of each other. Some tools, especially when working simulation environments, can't run multiple times on one machine so even if you are using git worktrees you won't be able to support multiple Agents iterating at once. The other huge benefit is you get infinite compute. One important thing when working with Agents is your test suite needs to be overkill to ensure that your workflows are protected. Remember AI Agents are stateless beings so it won't know what your code is supposed to look like when you run it, if there isn't a clear pass/fail in your iteration loop your Agents will break everything around them. So, your test suite is 10x larger than it would be if developed by humans, and there are 8 AI Agents working all at the same time on different tasks, so even a beefy development machine is going to struggle under the workloads. A Pipeline fixes this entirely. # Conclusion Scaling is the latest hot topic, this is how I do it and I've been seeing a ton of success with it. I'm helping multiple startups manage the entirety of their software development with these workflows. If you are only using one Agent at a time, or babysitting your Agents then you are missing out on massive productivity boosts. Break your problems down into chunks up front, and make sure that you have infrastructure in place to keep your Agents aligned and able to develop entirely independently with no bottlenecks. ### Using Code Agents Effectively URL: https://notes.ansonbiggs.com/using-code-agents-effectively/ Last updated: 2025-10-06T03:14:09.000Z Every time LLMs get an "upgrade" they feel like magic, the first impressions are always so strong. That's how I felt with code agents, all of a sudden models were hyper context aware to my exact system, and could iterate on problems until they made a working solution. The craziest part is I don't even have to understand the solution because the Agent already implemented it. But as it always goes, playing with this new capability you quickly find it has hard limits. Beyond creating a toy project they begin to cut major corners, or making any edits to a large repo they just completely fail. The latest models, GPT5-Codex and Sonnet 4.5, are well into the territory of being as capable as a new engineer. However, they need to be directed with extreme nuance and can't just be let loose on problems like an eager new grad. The models are smart enough to get just about anything done, but it not without a lot of teamwork. Below I'll detail some of the strategies I'm using to get good results with the current batch of cutting edge LLMs and tools. ## Managing Context Context is worth more than gold at this point. Even with large token windows every token is poison that is ruining your results. This is from 3 major angles: - Price - With current Anthropic pricing a single prompt can cost over $30 - Tasking Overload - Your model is thinking about its system prompt, every `# TODO` it finds, all of your instructions etc. All of these compound to confuse the model. - Retrieval - Every model is doing something a little different to keep all those tokens in its brain, in reality none of them are really holding hundreds of thousands of tokens in their head. Retrieval is probably the most important area of advancement for LLMs right now and is far from a solved problem. ### Sub-Agents - This is currently my obsession Having your Agent call other Agents is a crazy hack. By having a fresh agent manage a task it: Gets higher quality answers, keeps your main agents context small, and saves money. There are two tasks that happen a lot when doing code pairing at work with an Agent, running build systems and reading our proprietary docs via MCP. Both of these are tasks where we need a small amount of info, but the tools dump a massive amount of tokens. The average docs page is about 10k tokens, and even a small `make build` is well into the thousands or tokens. Models are really good at doing specific `grep`s or using `tail` to get exactly what they need from a document, but it doesn't always work out like that. So having a fresh Agent get told "Run make build, I edited xxx.hpp let me know if there are any errors" gets your agent the concise binary feedback of "Your change worked" or gives it details of exactly what got mad. ### Compacting Frequently This is a feature that currently varies wildly between tools and models. Claude Code v2.0 is pretty damn good at it. I used to just manage this myself and start new models frequently but it is currently good enough that I keep the same chat going. This is something where it is more vibes than strict rules, but I tend to compact after a new feature is implemented and tests are passing. Pretty much the same milestones as when I would make a code commit. ### Planning with Precision In a large repo you have to be extremely explicit with tasking, but you can't provide too much info. Working on a proprietary tool is really hard because the model understands literally nothing about the product, but if you just dump all of your docs and a few folders into context then you're essentially lobotomizing your model. You need to be exact with telling the Agent exactly where to look and what path to take for implementation. If you don't know those answers then you probably need to use a few different Agents to get the relevant info, and help you build a prompt for your Agent that is going to do the executing. ### Clean Workspace Poisoning your model with bad prompts is a very big issue. I had a system level prompt that said `Use uv for all Python commands` and my model was thinking to itself about this rule after every single step. We weren't even in a Python repo anymore. Try to avoid any system level prompts and work on improving your prompts or AGENTS.md in individual repos. I was working in an old repo with a deprecated tool that had an upgrade warning on every build so my model was certain that was the issue and that everything would work with an upgrade. So, it started modifying my system and installing the latest update. In this case I had to make a wrapper around the function that hid the issue. ## Meta Prompting This is kind of just sub-Agents but on a higher level. I've had a lot of success having one Agent working with me on the big picture, and coming up with prompts for a worker agent together. This is especially useful if a task is way too large for a single model to tackle at once. In practice this usually has me talking to two Agents in separate terminals, one Agent is a manager of sorts and knows at a high level what we are doing. The other window gets reset often as we hit context limits or start down a completely wrong path. I'll collaborate with the manager Agent on what prompt we should provide, and when the worker model gets stuck we will take a higher level approach of figuring out what context it needs to go down the right path. This is a highly iterative process. I think the current batch of models are good enough that you could do this fully programmatically and have a manager Agent that you talk to that fully breaks down and distributes tasks but I haven't gotten to test that with the latest models. Sonnet 4 wasn't good enough but Opus 4.1 was close. ## Self-Check Loop Your Agent needs to be able to check on its own work. This is a key aspect that separates Agents from chatbots. You need to have a clear path laid out for it to build and test your code or else it is just going to build junk. Tests are also amazing documentation. If you or a different Agent can write tests before implementation begins then not only do you have a tight loop but code is far more concise than English. ## The Best Model and Tool Changes Daily The combo of LLM and [Agentic Tool](https://brain.ansonbiggs.com/Agentic-Tools) makes a massive difference in the quality of answers. Anthropic recently put out a [post-mortem](https://www.anthropic.com/engineering/a-postmortem-of-three-recent-issues) where they admitted that bugs in their infra made their models dumber. So, if one day something works and the next it doesn't, it is probably not your fault. If someone comes out with a new update you should probably try it for yourself to see which combination of mode/tool/task really excels. ## Conclusion Keep your context close and your sub-Agents closer. The best you can do is keep your context as small as possible, and don't be afraid to fully restart if the current path isn't great. I keep thinking that some of this stuff won't matter with the next era of models, but every time they ship I find myself tracking more things. I've certainly been displaced from some lines of work by Agents but we are a long way away from them building cool shit at scale. ### Working With Recruiters URL: https://notes.ansonbiggs.com/working-with-recruiters/ Last updated: 2026-02-23T02:47:48.000Z I have an extremely love-hate relationship with recruiters. Regardless whether a recruiter is first-party or contracted, rockstars or incompetent, the incentives between the job seeker (you), the hiring company, and the recruiter are all out of whack. Sure at the end of the day everyone just wants an open role filled, but the recruiter is optimising only for time. Door to door sales people don't care/know if your house is a good fit for their product or if the product is any good, but they'll do anything to connect the seller and buyer. ## The Good I've had a handful of recruiters that truly have fought for me and have forced a relationship that in hindsight was a perfect fit. Whether its them connecting dots on my experience that I hadn't thought to or forcing me onto a hiring manager because they saw past my resume. I had a contracted recruiter reach out to me for a Support Engineering role, this is something I never imagined for myself but on my resume I had a section about how I spent time embedded in customer teams and helped them onboard and move past blockers on software I had developed. After going over the job description with me I realized this is totally something I could enjoy and excel at. I have always wanted to land a developer advocate role and this is just a corporate version of that. In the end I didn't get that specific job, but it opened a lot of doors for me when I realized I should look into those types of roles. Another example that has come up a few times is getting buy-in on my [Simple Stock Bot](https://notes.ansonbiggs.com/simple-stock-bot-end-of-life/) experience. The aerospace industry really hates this on my resume, but tech focused companies love it. Unfortunately, applying is a numbers game so I don't tailor resumes to roles so everyone gets the same one. I've never tried to leap frog into a senior role with this experience, but like maybe I'm better at managing a big Python project than your standard new grad. I find that its really hard to work in things that make me a standout engineer in interviews so I'm always really happy when I get buy-in from a hiring team that this experience has relevance. ## The Bad Recruiters, especially contracted ones, really love to change facts to make you stand out without understanding what they are talking about. I will often stretch facts just to make sure they don't block me for something dumb like not having Jenkins experience when I have [extensive GitLab CI/CD experience](https://brain.ansonbiggs.com/GitLab-CI-work). > Yeah I've migrated build systems from Jenkins to more modern tooling. > > \- Me who has never touched Jenkins And I'll always come clean with the engineers, and never stretch the facts in this way for like a "Senior Jenkins DevOps" role. But more often than not this ends me up in an interview where the notes say that I have 10 years experience with a tech that came out like last year. So doing the recruiters job is a delicate balance where you have to gauge if they are already stretching facts for you. It also never hurts to just tell them like it is that while you don't match exactly is on their bit of paper that this isn't a blocker for you being a good fit. Another big frustration with this last job hunt has been when multiple different recruiters reach out to me for the same role. The contracted recruiters will pretty much never tell you any details until you get on a call with them so when a company hires 6 different firms to fill in one role I will end up with 5 wasted calls and an overflowing inbox. This has happened at least once every two weeks while I had my LinkedIn set to looking for work. Lastly, poor communication and organization. I've had a handful of times where I didn't know I wasn't in the running for a job anymore until I reached out, or where a recruiter has tried to make me try multiple times in succession for the same job. Or even worse, I end up in an interview for a completely unrelated role, but I think thats more the hiring managers fault. ## The Ugly I've had a few egregiously bad experiences where I got burned pretty bad. Luckily I have still forced jobs out of some of these situations but they are still incredibly demoralizing. One company I interviewed with had a 7 step process. Take home projects, reviews of my personal projects, multiple multi-hour interviews. The second to last step was really the final interview, it was a few hour long behavioural before they would fly me out to headquarters where I would meet a bunch of teams and the owner of the company, just to fully sell me before we signed any documents. At the end of the interview I was told that I got the job. We penciled in a start date, salary, and my day to come out and meet CEO who would give me my offer. I was told that the final step was more for them to sell themselves on me and that I wouldn't have to worry about failing. So, I reached out to all my other companies and told them that I had just over a week left on the market and if they wanted to give me an offer I would work with them but we needed to hash things out soon. Now I'm posting this way later, but during this time the DOGE was at its peak, and Trump was gutting NASA funding so the space market was really really bad. Almost every company I reached out to replied letting me know they were dropping my application. > While impressive, your skills don't match the current needs of our company. > This role likely doesn't exist anymore, if you get another offer I would take it. Worrying but at least I had a job locked in. The weekend passes and they still haven't reached out to me to schedule my travel to their HQ. No response to my follow ups. Then the night I was supposed to travel, I got a generic automated message that they wouldn't be moving further with my application. Nothing personalized or any feedback, just a cold robot telling me I was rejected. This was a small company with a single recruiter that had been around for most of the companies existance, so I took their word with a lot more weight than I usually would. It's not really their fault that this totally reset my job search but this was a pretty big blow to my career. My takeaway from this is to always play your cards really close. Given the current market I totally understand that companies who are already drowning in applicants wouldn't want to engage in a bidding war or push off other candidates to accomodate me. Another great takeaway is don't count your chickens when you only have a handshake deal with the hen, which is kind of relevant to my next example. Before I accepted at Blue Origin, I had been waiting for an offer from another large space company for about 3 months. They had been bought out right when my interviews were coming to a close so they weren't able to sign any contracts until the deal was done. When they finally got me my offer I reached out to my Blue Origin recruiter, and told them that if they didn't do their final full day interview on Monday and get me an offer shortly after that I would be off the market. Miraculously they came back and said they would interview me Tuesday and have an answer for me Wednesday Morning. My recruiter for my other offer was a real rockstar and immediately sensed that I was trying to work the timing so I could have another offer on the table and came back with a much better offer, so by the time Blue came back the numbers were a bit stale.When I told Blue that I would need bigger numbers to consider them, the hiring manager said no, but the recruiter emailed me separately confirming a better offer and said that there is a standard sign-on bonus that is non-negotiable and locked to my level but it was big enough that I was pretty happy. I accept the Blue Origin offer, and a few weeks pass. I was under the impression that I would be getting relocated to Seattle, and I was even coordinating the move with their relocation agents, but it turns out the program wanted me to be at the new Denver office that was just opening. So, to pump the numbers up the recruiter gave me a Seattle salary, knowing that they weren't willing to relocate me and one of the reasons for hiring me was staffing this new office. So, before even starting I took a pretty big salary hit. Luckily they acknowledged the "mistake" and gave me a much higher salary than I was initally offered so I was well above market. Not how I want to progress my career but I'll take it I guess. Then on my first paycheck I didn't get my starting bonus like I was promised. After reaching out to my manager I was told that there is no standard bonus, and that my offer didn't have one attached. Luckily, I had everything in writing and HR fixed the issue immediately without any drama. So at this point everything about my compensation had been lied about, but I still came out ahead. Until I got my promotion. I was hired at a lower level with the promise that if I did well I would get promoted at 6 months which generally isn't allowed, but I was right on the cusp of the experience so we had a solid handshake deal that my director would make it happen for me. And they did, except what I thought would be a huge XX% increase turned out to only be 2%. They reset me based on my market and didn't give a flat increase like I thought I would get. This is why I wrote [The Rat Race is Linear](https://notes.ansonbiggs.com/the-rat-race-is-linear/) since it made me question if I should even bother negotiating at this point in my career. tldr; companies are just going to try to keep you at their targets for your experience and market and breaking that cycle is really difficult. You definitely still should fight for better compensation, but its not as big of a win as I once thought. ## Conclusion After writing all of this out, my [2025 Job Search](https://brain.ansonbiggs.com/2025-Job-Search) came to a close thanks to recruiters that reached out to me. I had a couple of offers on the table at the same time, and all of them were for companies who reached out to me first. I think what I alluded to earlier about the markets being in turmoil around the time I got laid off is to blame for much of this nonsense, but I still think its incredibly important to vouch for yourself at every oppurtunity. As far as how to handle lining up offers. One company I kept completely in the dark, the others I told varying amounts of information. So, there isn't an exact script to follow. To wrap this up I just have to say be the master of your own destiny. If you want a job don't be scared to break the script and tell them what needs to happen. Reddit and the internet at large are full of poor opinions and suggestions to be incredibly formal and timid. I'm really proud of the career I've had out of college and I think a lot of it can be attributed to really fighting for yourself. *Make sure you get everything in writing, and especially make sure your offer letter is exhaustive.* ### Building My Own Newspaper URL: https://notes.ansonbiggs.com/building-my-own-new/ Last updated: 2025-06-08T22:36:00.000Z I really like reading independent blogs, they can range from in depth engineering blogs obsessing over bytecode to posts that just ramble about coffee to opinion pieces on space. If you're taking the time to manage a website and put content on it, I'm likely interested in what you have to say. One major driver for me developing my own tool is that on microblogging platforms like Twitter, Mastodon or BlueSky I find that it is impossible to curate a feed of high quality content with no toxicity. Even people at the absolute top of their craft that post high quality thoughtful content can't help themselves but feed into political turmoil or argue about something. I find that negative content rarely makes it onto blogs which largely removes this issue for this project. On BlueSky I've gone out of my way not to interact with anything political, and I've been very aggressive with blocking words but it still shows me political content pretty heavily. ## My own Algorithm When I first set out on this project the idea was to build out my own algorithm. Mastodon having zero algorithm pretty much kills it for me, I find that one person usually dominates my feed, and the overall presentation of threads is lacking. Twitter is the opposite and only shows what it thinks I want and rarely surfaces posts from my following, this is awesome for when I want to rot my brain but makes it difficult to find community. Unsurprisingly, building an algorithm is a pretty large understaking, especially because I wanted the site to be statically generated in CI with no backend which would mean every morning I would have to `get` and scan every piece of content on every blog to build out an index. Then theres the issues of what makes one blog post more relevant to me than others without having any feedback since the site is static. The "algorithm" I landed on is quite simple. I have a featured feed list and a normal feed list. The featured list is for blogs like where I literally put my life on pause when they post so I can read it in full. I just use the posted date for [ordering](https://brain.ansonbiggs.com/ordering) posts so I add like a week to featured posts to keep them at the top. Then I remove duplicates based on root domain so that if someone is on a posting spree, or accidentally sets all their posts to the same date that they don't dominate my feed. At the bottom of the page I pick 100 random posts from the entire pool that I collected from. This is fun because it surfaces older things that feeds I follow post. ## RSS is Inconsistent Working around the quirks of RSS is nearly half the battle of a project like this. I used Rust which was fun, but I'm sure Python has some better libraries for working with inconsistent data like this. ![Screenshot of an error from rss parsing in the final output of my zine](https://notes.ansonbiggs.com/content/images/2025/06/image.png) [tantek.com](http://tantek.com) why do you have to bully me :( In the end this project is posted publicly, but its 100% just for me to consume. Its public because why not, and hopefully it gives blogs I like some small SEO boost. The HTML artifacts and occasional bad link aren't big enough issues for me to care about. ## Check out the project #### Biggs Brief Repository: [Project Website](https://zine.ansonbiggs.com/) --- Also shout out to the [Orion Browser](https://kagi.com/orion/) for making it easy to find RSS feeds on websites, because sometimes its really really hard. ![](https://notes.ansonbiggs.com/content/images/2025/06/image-1.png) ### Interviewing with AI URL: https://notes.ansonbiggs.com/interviewing-with-ai/ Last updated: 2026-01-22T17:23:27.000Z It is safe to say that AI has almost entirely ruined the interviewing process. This is especially true with software engineering, but I think the tooling is well on its way to becoming ubiquitous. This is essentially an arms race by both sides to try and automate every step of the process so that they can handle volume. Part of this means that many companies are now having candidates interview directly with an AI before I get any human interaction. I applied for a role on LinkedIn earlier this week, and immediately got a phone call. The voice sounded perfectly human but it was introducing itself as an AI recruiter that was looking to gather more information about my skills. ![Transcript of a phone call: You> Who is this? Participant> Sure no problem. This is Alex. I'm a virtual AI recruiter with talent. We're just doing a quick screening for the software engineer position you applied for do you have a few minutes to chat?](https://notes.ansonbiggs.com/content/images/2025/06/IMG_0874.jpeg) Screenshot of the Apple notes app showing a recorded call with transcripts turned on [Now I'm not one to be super trusting of recruiters,](https://notes.ansonbiggs.com/working-with-recruiters/) but I find that the AI didn't do a terrible job. Most intro calls with recruiters are basically repeating your resume and the forms you just filled out, then they pass that info onto a hiring manager. Sounds like exactly the type of automation that AI enables. This conversation was a bit deeper though, and went on for 10 minutes. The AI was very conversational and high quality, and surpisingly it would cut me off when I said a key word that it was interested in. This does feel like a tech demo feature that shouldn't have been in this call, for an interview I think it would be better to let me finish my story about a project instead of abruptly cutting me off to ask about how I've use `pandas`. The AI should be really good at having good follow up questions queued up, so there is no need to interject. A less impressive example, but I've also had both application and post application "interviews" with a chat bot that could have just been a form. It probably cost just as much to have the model scrape my resume into structured `json` as it is to try to chat with me about it in a overly conversational customer support type way. Or they could just use the information from the form I just filled out to send in an application. ## Impact Making me invest any time in your company before I get to talk to a human is incredibly rude. While job searching you have to be talking to multiple companies at a time and if you don't have a human in the loop with me you are by far my lowest priority. I recently let an assessment exam lapse with a really big tech company that I would love to work for, but why would I spend 2 hours on a AI proctored coding interview before I know that a hiring manager at least likes my experience? As a hiring manager would you value feedback from an AI interview with an applicant? There are a few jobs that I feel will never be automated. Ones where a human interaction is essential. When I sit down at a restaurant, I don't want a tablet on my table for ordering. When I go to urgent care I don't want to explain my issue to an AI. Hiring is a huge investment on both ends and I think these tools are going to have massive negative effects on companies that force an AI filter, or leave important nuaced decisions to models. ### Double Pendulum URL: https://notes.ansonbiggs.com/2025-05-10-double-pendulum-redux/ Last updated: 2025-12-03T14:49:15.000Z Quarto (which this blog is built on) recently added support for [Observable JS](https://observablehq.com/@observablehq/observable-javascript), which lets you make really cool interactive and animated visualizations. I have an odd fixation with finding new tools to visualize data, and while JS is far from the first tool I want to grab I figure I should give OJS a shot. Web browsers have been the best way to distribute and share applications for a long time now so I think its time that I invest some time to learn something better than a plotly diagram or jupyter notebook saved as a pdf to share data. [Video](https://projects.ansonbiggs.com/posts/2025-05-10-double-pendulum-redux/FeistyCompetentGarpike-mobile.mp4) My original Double Pendulum done in Python and Processing.js Many years ago I hit the front page the [/r/python](https://www.reddit.com/r/Python/comments/ci1cg4/double%5Fpendulum%5Fmade%5Fwith%5Fprocessingpy/) with a double pendulum I made after watching the wonderful [Daniel Shiffman](https://thecodingtrain.com/showcase/author/anson-biggs) of the Coding Train. The video was posted on gfycat which is now defunct but the internet archive has saved it: I originally used Processing’s Python bindings to make the animation. So, a lot of the hard work was done (mostly by Daniel), and this animation seems to be a crowd pleaser so I went ahead and ported it over. Keeping the code hidden since its not the focus here, but feel free to expand it and peruse. ``` viewof length1 = Inputs.range([50, 300], {step: 10, value: 200, label: "Length of pendulum 1"}) viewof length2 = Inputs.range([50, 300], {step: 10, value: 200, label: "Length of pendulum 2"}) viewof mass1 = Inputs.range([10, 100], {step: 5, value: 40, label: "Mass of pendulum 1"}) viewof mass2 = Inputs.range([10, 100], {step: 5, value: 40, label: "Mass of pendulum 2"}) ``` Code `[](#cb2-40)pendulum = { [](#cb2-41) const width = 900; [](#cb2-42) const height = 600; [](#cb2-43) const canvas = DOM.canvas(width, height); [](#cb2-44) const ctx = canvas.getContext("2d"); [](#cb2-45) const gravity = .1; [](#cb2-46) const traceCanvas = DOM.canvas(width, height); [](#cb2-47) const traceCtx = traceCanvas.getContext("2d"); [](#cb2-48) traceCtx.fillStyle = "white"; [](#cb2-49) traceCtx.fillRect(0, 0, width, height); [](#cb2-50) [](#cb2-51) const centerX = width / 2; [](#cb2-52) const centerY = 200; [](#cb2-53) [](#cb2-54) // State variables [](#cb2-55) let angle1 = Math.PI / 2; [](#cb2-56) let angle2 = Math.PI / 2; [](#cb2-57) let angularVelocity1 = 0; [](#cb2-58) let angularVelocity2 = 0; [](#cb2-59) let previousPosition2X = -1; [](#cb2-60) let previousPosition2Y = -1; [](#cb2-61) [](#cb2-62) [](#cb2-63) function animate() { [](#cb2-64) // Physics calculations (same equations as Python) [](#cb2-65) let numerator1Part1 = -gravity * (2 * mass1 + mass2) * Math.sin(angle1); [](#cb2-66) let numerator1Part2 = -mass2 * gravity * Math.sin(angle1 - 2 * angle2); [](#cb2-67) let numerator1Part3 = -2 * Math.sin(angle1 - angle2) * mass2; [](#cb2-68) let numerator1Part4 = angularVelocity2 * angularVelocity2 * length2 + [](#cb2-69) angularVelocity1 * angularVelocity1 * length1 * Math.cos(angle1 - angle2); [](#cb2-70) let denominator1 = length1 * (2 * mass1 + mass2 - mass2 * Math.cos(2 * angle1 - 2 * angle2)); [](#cb2-71) let angularAcceleration1 = (numerator1Part1 + numerator1Part2 + numerator1Part3 * numerator1Part4) / denominator1; [](#cb2-72) [](#cb2-73) let numerator2Part1 = 2 * Math.sin(angle1 - angle2); [](#cb2-74) let numerator2Part2 = angularVelocity1 * angularVelocity1 * length1 * (mass1 + mass2); [](#cb2-75) let numerator2Part3 = gravity * (mass1 + mass2) * Math.cos(angle1); [](#cb2-76) let numerator2Part4 = angularVelocity2 * angularVelocity2 * length2 * mass2 * Math.cos(angle1 - angle2); [](#cb2-77) let denominator2 = length2 * (2 * mass1 + mass2 - mass2 * Math.cos(2 * angle1 - 2 * angle2)); [](#cb2-78) let angularAcceleration2 = (numerator2Part1 * (numerator2Part2 + numerator2Part3 + numerator2Part4)) / denominator2; [](#cb2-79) [](#cb2-80) // Update velocities and angles [](#cb2-81) angularVelocity1 += angularAcceleration1; [](#cb2-82) angularVelocity2 += angularAcceleration2; [](#cb2-83) angle1 += angularVelocity1; [](#cb2-84) angle2 += angularVelocity2; [](#cb2-85) [](#cb2-86) // Calculate positions [](#cb2-87) let position1X = length1 * Math.sin(angle1); [](#cb2-88) let position1Y = length1 * Math.cos(angle1); [](#cb2-89) let position2X = position1X + length2 * Math.sin(angle2); [](#cb2-90) let position2Y = position1Y + length2 * Math.cos(angle2); [](#cb2-91) [](#cb2-92) // Clear and draw to canvas [](#cb2-93) ctx.fillStyle = "white"; [](#cb2-94) ctx.fillRect(0, 0, width, height); [](#cb2-95) ctx.drawImage(traceCanvas, 0, 0); [](#cb2-96) [](#cb2-97) // Draw pendulum [](#cb2-98) ctx.save(); [](#cb2-99) ctx.translate(centerX, centerY); [](#cb2-100) [](#cb2-101) // First arm and mass [](#cb2-102) ctx.beginPath(); [](#cb2-103) ctx.moveTo(0, 0); [](#cb2-104) ctx.lineTo(position1X, position1Y); [](#cb2-105) ctx.strokeStyle = "black"; [](#cb2-106) ctx.lineWidth = 2; [](#cb2-107) ctx.stroke(); [](#cb2-108) [](#cb2-109) ctx.beginPath(); [](#cb2-110) ctx.arc(position1X, position1Y, mass1/2, 0, 2 * Math.PI); [](#cb2-111) ctx.fillStyle = "black"; [](#cb2-112) ctx.fill(); [](#cb2-113) [](#cb2-114) // Second arm and mass [](#cb2-115) ctx.beginPath(); [](#cb2-116) ctx.moveTo(position1X, position1Y); [](#cb2-117) ctx.lineTo(position2X, position2Y); [](#cb2-118) ctx.stroke(); [](#cb2-119) [](#cb2-120) ctx.beginPath(); [](#cb2-121) ctx.arc(position2X, position2Y, mass2/2, 0, 2 * Math.PI); [](#cb2-122) ctx.fill(); [](#cb2-123) [](#cb2-124) ctx.restore(); [](#cb2-125) [](#cb2-126) // Draw trace line [](#cb2-127) if (previousPosition2X !== -1 && previousPosition2Y !== -1) { [](#cb2-128) traceCtx.save(); [](#cb2-129) traceCtx.translate(centerX, centerY); [](#cb2-130) traceCtx.beginPath(); [](#cb2-131) traceCtx.moveTo(previousPosition2X, previousPosition2Y); [](#cb2-132) traceCtx.lineTo(position2X, position2Y); [](#cb2-133) traceCtx.strokeStyle = "black"; [](#cb2-134) traceCtx.stroke(); [](#cb2-135) traceCtx.restore(); [](#cb2-136) } [](#cb2-137) [](#cb2-138) previousPosition2X = position2X; [](#cb2-139) previousPosition2Y = position2Y; [](#cb2-140) [](#cb2-141) requestAnimationFrame(animate); [](#cb2-142) } [](#cb2-143) [](#cb2-144) animate(); [](#cb2-145) return canvas; [](#cb2-146)}` ## Conclusion I think this is far from an idiomatic implementation so I’ll keep this brief. I don’t think I used JS or Observable as well as I could have so treat this as a beginner stabbing into the dark because thats essentially what the code is. This was quite a bit more work than the [original Python implementation](https://gitlab.com/MisterBiggs/double%5Fpendulum/blob/master/double%5Fpendulum.pyde), but running real time, having beaufitul defaults, and being interactive without a backend make this leagues better than anything offered by any other language. There is definitely a loss of energy in the system over time that I attribute to Javascript being a mess, but I doubt that I would ever move all of my analysis to JS anyways so I don’t think it matters. Its also very likely I’m doing something bad with my timesteps. ## Reuse [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) --- *This content was originally posted on my projects website* [*here*](https://projects.ansonbiggs.com/posts/2025-05-10-double-pendulum-redux/)*.* ### 2024 URL: https://notes.ansonbiggs.com/2024/ Last updated: 2026-02-23T02:47:19.000Z People always tell you that as you get older time shifts into high gear and it becomes really easy to lose months, years, or even decades in a flash. Leaving college has definitely had that effect on me, the amount of milestones in a year have really boiled down to two for me. The holidays because of travel and nothing getting done at work, and when my lease is up in the summer so I move into a new home. When I think of the recent large events in my life all of them were in 2023\. So, to combat losing time, I want to reflect on my year a little bit and try to dig up some of the things I've done. While trying to outline this post I can already see some incredible recency bias, keeping good notes has been on the top of my mind for a few years. Maybe next year I'll figure it out. This post turned more into an awards show than a recap, but just thinking of my learnings from the past year has done a lot to help surface larger accomplishments so I think this post has mostly served its purpose. ## pytest Best Library I use [pytest](https://docs.pytest.org/en/stable/) extensively at work and at this point I'm convinced it is literally magic. Unfortunately, I work in aerospace so I'm hesitant to talk about specifics, so apologies for being vague in how I use the tool, but it's not for traditional unit testing. I do use it for that as well and it is excellent, but it's such an incredibly extensive tool you can do some really powerful test orchestration beyond that. If you care about writing tests in any language or environment I would highly recommend giving the pytest docs a read from cover to cover. I've used a handful of testing frameworks in various languages and nothing is near pytest quality. This is one of the few cases, [*black*](https://github.com/psf/black) *being the other that comes to mind*, where the professionals have put a lot of work into building something the right way to the point that I don't second guess any decisions. One awesome side effect from using pytest has been seeing metaprogramming at its fullest potential. Before pytest, metaprogramming never really clicked for me, the toy examples used to teach the subject never really had a clear path to production for me. After pytest I totally see the light. I wrote a whole library based solely on decorators this year with my discoveries from pytest and it is probably some of my best work of the year. ## M4 Mac Mini Best Hardware I've been using M processor Macbooks at work for a few years now, but the M4 Mac Mini is a significant leap forward. This was my first personal Apple computer since the 00's and it was a little bumpy getting started since I didn't have a [magic keyboard or USB-C peripherals](https://notes.ansonbiggs.com/steam-deck-dock-saves-new-mac-mini/), but beyond that it's mostly been a dream. There isn't a single major innovation that makes this generation special, but all of the incremental gains feel significant: - 16GB Unified memory for the base model - M4 chip is wicked fast - New tiny form factor - Lots of Thunderbolt 4 All of this comes together to make it the best computer on the market by far. I do much [harder than average workloads](https://notes.ansonbiggs.com/2024-09-25-moon-cannon-prelude/) and the base model doesn't even break a sweat. Before I got the M4 Mac Mini I would rent a server to do heavier workloads but moving local has been a huge upgrade for my productivity. I thought I would miss the extremely fast networking speeds but my gigabit home connection gets the job done well enough. The Unified Memory had me a little weary since 16BG isn't much to share, but it hasn't been an issue. I assume this is mostly thanks to macOS having great memory management. My M3 Macbook for work has 36GB of Unified Memory which is a lot of fun for running local LLMs, but otherwise I don't think I ever use close to that much. Storage is probably the biggest bottleneck for the base model. Thunderbolt does allow expanding the storage, but its not the best solution and I'm writing another post thats a deeper dive into my thoughts on the setup. ![A macOS storage management interface showing disk usage on a Macintosh HD with 136.56 GB used out of 245.11 GB total space. The interface displays a color-coded storage bar and a list of system components with their respective sizes, including Applications (38.38 GB), Developer (6.6 GB), Documents (15.38 GB), and various system folders. The interface uses a dark theme with white text and icons for different categories.](https://notes.ansonbiggs.com/content/images/2024/12/image.png) It just gets smaller and smaller As you can see 256GB quickly turns into 245GB available, then \~200GB with macOS, and lots of first party apps eat up space in opaque ways. So really plan on having about 100GB to store your things. Its not great, and I think this is something that anyone using a computer will definitely have to grapple with. There have been a lot of negative comments on the steep price increase for anything beyond the base model. Users on the world wide web have pointed out that doubling the storage and Unified Memory costs so much that you could just get two base models instead. It sucks for the power users but getting such a solid base model in at such a low price is definitely worth it. If you are a pro user, pound for pound the upgrades are still well worth it, don't let a killer entry-level yuck your yum. ## Sonos Fallen out of love 💔 I have been a huge Sonos fan boy for a few years now. I have collected quite a few of their products, and I even used to pay for their music streaming service. The hardware is pretty amazing, and the Sonos Move is still one of the best designed things I have purchased. Unfortunately, the reason I have fallen out of love with them is that they have completely destroyed the software. To be fair my UniFi networking hardware has never played very well with my Sonos system so I do suspect that my issues are a little exacerbated by the ecosystems not getting along. No idea which party is in the wrong here, but the quality of service I get with my Sonos speakers with the newest software "refresh" is abysmal. More often than not, I just can't AirPlay to certain speakers. This issue will last for a few days, even through resets, just to randomly work a few days later. The audio sync between multiple speakers is also way worse than it was before. Sometimes songs randomly skip in the middle of the song, or won't play any audio until the next song start. Overall a massive downgrade to the quality of my hardware that I hope they hash out soon. First two minutes of this video explain the new Sonos app debacle pretty well To add insult to the injury this whole mess is due to them adding headphones to their product line which for some reason made their big software overhaul a one way door. This is a little baffling to me since headphones largely negate all the investments I've made into their speakers. In this day and age when you buy into an ecosystem you really are putting a lot of trust into the company to do the right things. Sadly it appears to me that the market is pushing Sonos in a direction that is probably going to slowly erode all of the value I got from the products that I paid a huge premium for. Hopefully they fix their focus back to being platform agnostic and privacy friendly but I doubt thats where the market will take us. ## Factorio: Space Age Game of the Year Yes, I understand that this is a DLC, but [Wube Software](https://www.factorio.com/game/about) just doesn't miss and this expansion adds literal *hundreds of hours* of gameplay. From the announcement I knew this game would be a serious detriment to my productivity at work and boy has it delivered. The [Factorio Blog](https://www.factorio.com/blog/) is also one of the few blogs that I have in the recommendations of this site: . Game development runs into so many interesting problems and the solutions can have applications to a wide variety of engineering. Game dev also has a massive leg up on other types of software in that it always has great examples of progress to show off to external parties. A month of work in my industry usually amounts to an extra arrows connecting some boxes on a massive diagram. But I digress, if you enjoy strategy or automation at all you need to boot up Factorio. The biggest issue that the automation genre typically struggles with is keeping things interesting. The difficulty curve always swings wildly at some point and the game either becomes trivial or a full time job to continue. Factorio stays consistent for hundreds of hours, the game never feels dull or daunting. ## Claude 3.5 Sonnet Best LLM Between work and my Kagi Ultimate subscription I have access to every LLM on the market. Claude 3.5 Sonnet is by far the most capable for my workflow. I keep waiting for OpenAI to release a new iteration that dethrones Sonnet 3.5 but it hasn't happened for me yet. As of writing, ChatGPT-4 released 21 months ago which I think is pretty indicative of us not getting anymore huge leaps in LLM performance in the near future. What was unbeatable about a year ago can now run on a pretty affordable laptop. The incremental gains have been nice but OpenAI's lead has eroded entirely. My main usage for LLMs today is doing repetitive tasks that are too complicated for me to script in Python, or for giving me a quick snippet of code that I don't want to use a search engine to find. For coding I generally only use it for getting a function name or maybe writing a bash command. There are some really powerful tools like [continue.dev](https://continue.dev) that integrate deeply into your IDE. I really don't like this, most of the code modern LLMs write outside of leetcodes are slop. If the next generation of models can hold the context of a few hundred thousand line codebase I'll reconsider. That said, having a chat window right in your IDE is pretty helpful. Line autocomplete can be pretty useful too. I haven't had much luck for most of the code I write since the context window needs to be pretty large and I need a model thats faster than me, but XCode has an autocomplete model built in that I was really happy with when I was toying with iOS development. Honorable mentions: - Llama is super cool to run locally, even the entry-level Mac Mini can run pretty competent models, and NVIDIA gaming GPUs are getting pretty VRAM heavy now too. - Gemini is pretty good at SEO for blog posts and Alt text for images. Although you should try not to use its alt-text verbatim since anything that an automated tool can already provide is likely already being used by someone that needs alt-text. Just a note, I find that models change in quality fairly often with no mention of changes by their stewards. I know companies have denied that this is possible but I still believe, so it is important to try new models occasionally. Also as I've said above, some models really excel above the rest at specific workloads. ## Kagi Best Tool Search engines are one of the most important tools for any kind of work in the modern age. Paying for a search engine might seem like an odd value proposition but leaving such an essential tool to anything but the best is a massive mistake. Google is actively doing everything it can to make money off of your internet usage, and the continuously update their index in the direction of their profitability. These incentives could not be further out of alignment. Do you trust the Dodge car salesman to recommend a Toyota to you? Or even to recommend the best deal on the lot? No, they are going to walk you right over to the largest profit margin for them and try to keep you in that corner. Same concept for Google, are they going to send you to the official high quality Python docs, or the blog spam full of Google Adsense ads? AI takes this an even worse extreme but I need to end this rant. The search engine market is surprisingly pretty full of competition, but no one else has taken the sustainable route of charging for usage. Advertising just isn't lucrative enough to run a full high quality index of the web without manipulating search results and doing a large amount of tracking. I hate to dog on the competition but I think people struggle enough with the concept of paying for a search engine that I want to lay out why its necessary to not use a free offering. **So what makes Kagi awesome?** [The small web index](https://blog.kagi.com/small-web). They have put a lot of work into surfacing small, non-commercial websites which I think really enriches their search results. If I go to a search engine for something I need quality results from someone with passion on the subject, not some Medium post full of gifs written by someone writing for the dopamine rush. I've already talked about it a ton above, but no ads is a requirement. [Personalized Results Settings](https://kagi.com/stats?stat=leaderboard). This basically lets you change how often you want to see a domain. I have Wikipedia pinned which means that anytime it has a relevant result it moves right to the top of my results. I also have Pinterest blocked so I never have to see it. It is great for removing websites that post slop on topics that you care about, if I search something Python related I would much rather see the official docs or stack overflow than a content farm like geeksforgeeks. They also have a very similar [AI philosophy](https://help.kagi.com/kagi/why-kagi/ai-philosophy.html) to myself, which is quickly becoming a key part of the search engine market. Appending a `?` to any search has a model search results to try an answer your query, which definitely has its uses. They also have a high quality summarizer model that I talk about in [Combining Ghost and Quarto (The Lazy Way)](https://notes.ansonbiggs.com/combining-ghost-and-quarto-the-lazy-way/) post. ## macOS Biggest Surprise I'm going to keep this brief since I have a fuller post I'm working on for this topic, but macOS is miles ahead of Windows. Installing software is better, the UI/UX is unified not just across the OS but the entire Apple Ecosystem, no advertisements, search that works, built in apps are way higher quality than windows... I could keep going but I was just really surprised that the OS was so far ahead of the competition, I totally understand why hackintosh builds used to be so popular. ## Swapping Pockets Biggest Smallest Change I recently bought a [Porsche Cayenne](https://notes.ansonbiggs.com/tag/porsche-cayenne/), which has been an amazing car. But, it does one thing odd in that it puts the ignition on the left side of the steering wheel which is the opposite of every other manufacturer. Apparently this is from back when motorsports had drivers run over to their cars and start them, so having the ignition on the opposite side of the shifter was a small edge. Anyways, because of this I swapped to having my wallet and keys on my front left pocket, and my phone on my front right pocket. This way my key is always in the correct hand when I grab it which keeps me from juggling items around if my hands are full. The only reason I bring this up is because I thought I would have to fight decades of muscle memory, but it literally took one or two times of intentionally putting things in their new pockets. So I guess moral of the story is embrace change lol. --- Thanks for coming to my Year ~~Awards Show~~ Recap. ### Combining Ghost and Quarto (The Lazy Way) URL: https://notes.ansonbiggs.com/combining-ghost-and-quarto-the-lazy-way/ Last updated: 2024-12-10T05:41:51.000Z I currently manage two very distinct blogs: [notes.ansonbiggs.com](https://notes.ansonbiggs.com/) and [projects.ansonbiggs.com](https:projects.ansonbiggs.com). I don't like having more than one place where I write, but they both fill important roles. Notes is hosted using Ghost, which has a powerful editor, newsletter management, comments, and lets me write from any device. I've done a surprising amount of rambling on this blog from an airplane on my iPhone. My projects blog is built using [Quarto](https://quarto.org), where blog posts are essentially Jupyter notebooks. The site is static and published using GitLab CI/CD. Quarto gives me a lot of freedom when I want a blog post that has code or interactive graphics, but I need a text editor with a super heavy dev container to do any writing. Consolidating my writing on the web to one place is very desirable to me, but I don't think I'm fully there yet. Fully integrating the blogs is too much work at the moment, so for now I'm doing it the "Lazy Way". Maybe once [Ghost federates with ActivityPub](https://activitypub.ghost.org), I'll fully commit. The reason I'm doing a lazy implementation for now instead of just doing all the work to fully integrate is that: 1\. I don't want to do all of the work right now, I want to put my energy into producing more content. 2\. I think my projects website can benefit greatly from all the cool features Ghost provides. My lazy solution is to use an iframe to embed the post alongside a summary from the [Kagi summarizer API](https://kagi.com/summarizer/api.html). I know in my [About](https://notes.ansonbiggs.com/about/) page I say that I don't like using ChatGPT, but this is different than using an LLM to summarize posts. It’s a purpose-built model that far outperforms LLMs in 2024 in summary quality, token size, speed, and price. Using the Kagi summarizer is absolutely a shortcut, but I really hate writing SEO-type stuff, so I'm fine with the compromise for now. The summaries it makes aren't consistent across all of my posts, and obviously I could do a much better job writing about my work. However, I have a lot of old posts that I don't want to spend time on, and I like giving Kagi money. Creating the post is handled by some [Rust code](https://gitlab.com/Anson-Projects/projects/-/tree/master/ghost-upload?ref%5Ftype=heads) in my pipeline that does the following: %%{ init: { 'theme': 'dark', 'look': 'handDrawn', 'layout': 'elk' } }%% graph TD A\[Write Quarto blog post in VSCode\] -->|Commit & Push| D\[Static Site Generation\] subgraph "GitLab Pipeline" D --> E\[Deploy to GitLab Pages\] D --> |For main branch| G\[Rust Code\] G --> |Get post summary| H\[Kagi Summarizer\] H --> | Embed summary in Post| G end G --> |Upload to Ghost| I\[Publish Summary on Ghost\] How a Projects post gets built for Ghost ⚠️ After I started doing this Google completely removed `ansonbiggs.com` and any subdomains from its index. The removal could be due to various other changes I've made to my sites but it's worth a callout that this probably isn't best for SEO. However, the end of the day we're making websites for humans, not spiders. You can find examples of the output on any of my posts tagged with [Projects Website](https://notes.ansonbiggs.com/tag/projects-website/). I'll also link an example below. [Notes on NanoNano (Ӿ) is a fast, feeless and severely underrated currency.![](https://notes.ansonbiggs.com/content/images/icon/pillars-1-1.jpg)Anson's NotesAnson Biggs![](https://notes.ansonbiggs.com/content/images/thumbnail/banner.jpg)](https://notes.ansonbiggs.com/2021-11-27-notes-on-nano/) The Ghost API has is really nice to work with, I think the previous focus on supporting [Jamstack](https://jamstack.org) really benefitted what I did here. The API makes it really easy to add canonical tags, meta descriptions, footer scripts, or anything else that you can do natively in the editor. Having this as an automatic part of my CI pipeline when it merges into the default branch is has worked super well. There is definitely a lot of room to grow this integration and I think if I continue using both blog platforms I'll put in the work to fully marry them eventually. Overall, I'm happy with having my Ghost blog be a singular source of my writing. There is a lot of ground to cover to fully integrate the two sites, but for now its far from necessary. As I said in the start, my main focus is to spend time writing and creating posts. If you are anything like me it is significantly easier to spend a night tinkering the code for my platforms than it is to actually sit down a write out a post. ### ScrapNAS URL: https://notes.ansonbiggs.com/scrapnas/ Last updated: 2024-11-24T09:16:16.000Z I grew up with Dial-Up internet, which meant not only was the internet only allowed when the sun went down and we weren't expecting calls, but the speeds were dreadful. Your browser actually has a mode that can emulate networks from that time, and boy is it rough. Modern frontend practices and image sizes have pretty much ruined the web for anyone without a few Mbps. All this to say, if I wanted to play a video game, watch a movie, or sometimes even view a photo album, I generally had to download it overnight, and I could enjoy it after school the next day. It doesn't take long of living like this to catch a data hoarding addiction. Luckily, storage has mostly outpaced file sizes, so while there isn't a cure, you can easily live with this addiction. ### Before we get too far, what is a ScrapNAS? It is really just a way to turn old computer parts into a project, but let’s get scientific and write some bullets: 1. Made from components that are lying around 1. no ECC RAM, no fancy motherboard features, uses any storage medium that is lying around. 2. Has enough compute to run its own services 1. If you buy a NAS from the store it usually only has enough compute to manage its file system and server files. If you can cobble together multiple machines then great, but I'm focusing on one machine that can hold a ton of storage and serve it using NextCloud or Jellyfin. 3. Docker Support 1. Kind of grouped with the last bullet, but it should be easy to spin up tools. Modern hardware is all really good, even entry-level PC components from \~10 years ago are pretty capable. Power efficiency is where the real gains have happened in recent years, so your power bill might thank you for using newer gear but we're here to get things done with things that are lying around. That said, the thing that really enables you to take random components and turn it into a functioning NAS/Home-server is the operating system. ## Operating Systems I used **FreeNAS** up until they pushed the "Corral" release, which was a massive mess that ended up being reverted. The maintainers, iXsystems, have done some significant rebranding and reorganizing that I don't want to keep up with, so I'm going to stick to calling it FreeNAS. OpenZFS is really the killer feature here. In my opinion, it’s the best file system for a NAS, but it requires some pretty specific hardware, especially for storage and RAM, that I think removes it from being a ScrapNAS contender. Another negative: I think they run on Docker now, but when I used it, they were called jails, and they seemed a lot less powerful. FreeBSD also doesn't seem like it's worth investing time into learning. From FreeNAS, I had a short stint on **Ubuntu**. I tried a few different file systems, but it was all too much for me to manage at the time. I think this is a great path if you aren't worried about losing all the data on your NAS and you want to really get into the Ubuntu CLI and filesystems. Then by far the worst option, **Windows**. I had a friend in like 2012 from a Minecraft server that would sell me Windows licenses for a couple of Bitcoins, I think it was like $20 USD. Sadness. I also managed ARMA servers which had to run on Windows so I was really big into running Windows Servers for a long time. I would probably be a significantly better developer today if I never had the chance to host things on Windows, but whatever, here we are. Windows seemed cool because remote desktop worked really well, and Partition Manager made it really easy to combine random drives together. My big issue was running server software, a lot of the tools I wanted to run just didn't have Windows builds. This is definitely fixed by WSL/Docker today but at the time it led to me doing a lot of janky workarounds. The other issue is while Partition Manager makes it easy to turn many drives into one giant one, there is no way to manage what drive files end up on. As your pile of data grows this becomes really painful to work with, and even worse, if a drive dies you are just screwed. The correct thing to do here would be some sort of RAID but then we are back into needing matching drive sizes which defeats the purpose of the ScrapNAS. Enter **Unraid**. This is not free software which I get really goes against the ethos here, but please hear me out. You can throw every drive you want in a pool, you'll lose your largest to parity, but then everything just works. Your data is safe from a drive failure, Docker just works, the VPN just works, SSD Cache just works, Networking just works. I have an 11-year-old motherboard, a HDD with 8 years and 4 months of power on time, a brand-new m.2 SSD and I've never had a hardware compatibility issue or a crash, the only reason I have downtime is updating the OS or the power dropping in my home. It's money well spent. I think the true killer feature of Unraid is that for the most part you can add and remove drives as your ScrapNAS evolves. Adding and upgrading drives is really straightforward, removing or downgrading is a pain but the Unraid Docs and Forums are troves of helpful information that have been able to get me out of all sorts of odd scenarios. It all comes together with a great GUI over what I believe is just Linux. There is a community repository that has a huge variety of Docker containers that are mostly set up to run right in Unraid, and any configuration that is required is well documented in the GUI. And if the GUI ever gets in your way, you can just use the CLI to get your work done. So, there is full support for users that want a simple streamlined experience, and power users that want to manage every detail of their NAS and manage things from a CLI. --- I'll leave it here since I think this is already really looking like a sponsored post, but Unraid is the clear winner. If you have enough random hardware to make a computer run, and a few hard drives, then with a Unraid License you now have a ScrapNAS/home-server. ### Moon Cannon: Prelude URL: https://notes.ansonbiggs.com/2024-09-25-moon-cannon-prelude/ Last updated: 2025-12-03T14:49:21.000Z 🔥 **Important Note** This post ended up being more elementary than I initially thought it would be, but the last post on this blog was from 2 years ago so I’m going to send it. Getting to a satisfying MVP for this project was a larger undertaking than I thought, so I’m shipping from a less satisfying place. Treat this blog as a soft introduction to using the Julia `DifferentialEquations` package, and hopefully in a follow on I’ll get deeper into simulating space mechanics like I originally planned. # Moon Cannon: Can You Shoot Earth from the Moon? With technological advancements and decreasing launch costs, establishing permanent manufacturing and production facilities in Low Earth Orbit and on the lunar surface is becoming inevitable. As we move closer to this reality, innovative methods for transporting cargo between the Moon and Earth are worth exploring. One such method of transportation, though it may sound far-fetched, is launching a payload from the Moon to Earth using a cannon. The low gravity and lack of atmosphere on the Moon present a unique environment that enables this possiblity. The cannon is really a mathematical simplification, there are real solutions like a [Railgun](https://en.wikipedia.org/wiki/Railgun) or [SpinLaunch](https://en.wikipedia.org/wiki/SpinLaunch) are realistic way to impart a massive, instantaneous, initial velocity to something without any sort of combustive propulsion. ### Setting Up the Problem We’ll be using Julia to simulate the trajectory of a payload shot from the Moon towards Earth. I’ll explain the math and code we are setting up after the environment is setup. Here are the packages we need: using DifferentialEquations using LinearAlgebra using Plots plotlyjs() 1 1 To get pretty, interactive plots Here are some fundamental constants we’ll use throughout the simulation: ``` const G = 6.67430e-11 # Gravitational constant (m³/kg·s²) const M_Earth = 5.97e24 # Mass of Earth (kg) const M_Moon = 7.34767309e22 # Mass of Moon (kg) const R_Earth = 6.371e6 # Radius of Earth (m) const R_Moon = 1.737e6 # Radius of Moon (m) const d_Earth_Moon = 384400e3 # Average distance between Earth and Moon (m) const payload_mass = 1000.0 # Mass of payload (kg) ``` I tried using `Unitful` for tracking the units, but ran into issues and upon searching the Julia forums for an answer I found an open thread explaining why `DifferentialEquations.jl` doesn’t play nice with `Unitful` that was opened by ME! It’s crazy how I never learn from my mistakes… ## Differential Equations Setup The core of this problem lies in setting up and solving the equations of motion. We’ll start with a basic [restricted three-body problem](https://en.wikipedia.org/wiki/Three-body%5Fproblem#Restricted%5Fthree-body%5Fproblem), meaining only accounting for the Moon’s and Earth’s gravity. This is a **gross** oversimplification for a few reasons. The first being that in this simulation the Moon and the Earth will remain static, introducing their movement is more complicated than I want to cover in this introduction to the problem. The other oversimplification is ignoring the gravitational pull from the Sun and Jupiter, and evenutally maybe the rest of the planets in the solar system. Over the time period of this simulation we could get away with combining these into one static force vector that gets applied every step, but I would rather wait until I can properly build out the simulation. The equations of motion are: \\\[ \\begin{aligned} \\frac{d\\vec{r}}{dt} &= \\vec{v}, \\\\\[10pt\] \\frac{d\\vec{v}}{dt} &= \\vec{a}\_{\\text{Moon}} + \\vec{a}\_{\\text{Earth}} + \\vec{a}\_{\\text{drag}}. \\end{aligned} \\\] Ok so it is a *little* crazy to simulate such a simple environment, and then throw atmospheric drag into the equation. But hear me out, defining success criteria for this kind of problem can be difficult, since a lot of solutions get so close that they should be counted as wins, in this case drag creates a larger target that also accounts for velocity. If our spacecraft gets close enough that drag pulls it to the surface of Earth then we can call the simulation a success. ``` const payload_area = 10.0 # Cross-sectional area of payload (m²) const rho_0 = 1.225 # Sea-level atmospheric density (kg/m³) const H = 7000 # Scale height of atmosphere (m) const Cd = 0.47 # Drag coefficient (dimensionless) function atmospheric_drag(position, velocity) altitude = norm(position) - R_Earth if altitude > 100000 return [0.0, 0.0] end rho = rho_0 * exp(-altitude / H) v_mag = norm(velocity) drag_magnitude = 0.5 * rho * v_mag^2 * Cd * payload_area drag_force = -drag_magnitude * velocity / v_mag return drag_force end ``` Next, we define the differential equation function in Julia: ``` function f(du, u, p, t) # du: derivative of state vector # u: state vector (position and velocity) # p: parameters (unused in this function) # t: time (unused in this function) # Extract position and velocity from state vector r = u[1:2] # Position vector (x, y) v = u[3:4] # Velocity vector (vx, vy) # Define positions of Moon and Earth r_Moon = [0.0, 0.0] # Moon at origin r_Earth = [d_Earth_Moon, 0.0] # Earth along x-axis # Calculate relative positions r_rel_Moon = r - r_Moon # Spacecraft position relative to Moon r_rel_Earth = r - r_Earth # Spacecraft position relative to Earth # Calculate gravitational accelerations # Using Newton's law of gravitation: F = G * M1 * M2 / r^2 # Acceleration = Force / Mass = G * M / r^2 a_Moon = -G * M_Moon * r_rel_Moon / norm(r_rel_Moon)^3 a_Earth = -G * M_Earth * r_rel_Earth / norm(r_rel_Earth)^3 # Calculate atmospheric drag drag_force = atmospheric_drag(r_rel_Earth, v) a_drag = drag_force / payload_mass # Convert force to acceleration # Set up differential equations du[1:2] = v # dr/dt = v du[3:4] = a_Moon + a_Earth + a_drag # dv/dt = sum of accelerations end ``` I tried to comment the code as much as possible to help this make sense to someone who has never seen `DifferentialEquations.jl`. The state vector can be weird at first sight but should be similar to what you see in Matlab. ### Detecting Collisions [Julia is pretty fast](https://julialang.org/benchmarks/), but this is at minimum a multiple day simulation so it is important to define end conditions so that we don’t go on forever for really bad solutions (we crash back into the Moon) or really great solutions (we nail Earth head on). To handle this we just set callbacks that check our position and see if we are inside of either bodies radius. ``` function Earth_collision(u, t, integrator) r = u[1:2] r_Earth = [d_Earth_Moon, 0.0] return norm(r - r_Earth) - R_Earth end function Moon_collision(u, t, integrator) r = u[1:2] r_Moon = [0.0, 0.0] return norm(r - r_Moon) - R_Moon end Earth_cb = ContinuousCallback(Earth_collision, terminate!) Moon_cb = ContinuousCallback(Moon_collision, terminate!) cb = CallbackSet(Earth_cb, Moon_cb) ``` ## Run the Simulation Now like any good optimistic software engineer, I’m going to assume that I’ll get things right first time and not invest any time into a helper function to allow me to quickly iterate on the initial conditions. v0 \= \[1500, 1500\] 1 r0 \= v0 / norm(v0) \* (R\_Moon + 10) 2 tspan \= (0.0, 10.0 \* 24 \* 3600) 3 prob \= ODEProblem(f, \[r0; v0\], tspan) 4 sol \= solve(prob, Tsit5(), callback\=Earth\_cb, reltol\=1e-8, abstol\=1e-8) x \= \[u\[1\] for u in sol.u\] 5 y \= \[u\[2\] for u in sol.u\] 1 Guesstimate initial velocity 2 Make the initial position the same direction as the initial velocity, and 10 meters above the Lunar surface 3 Guesstimate timespan. 10 days should be more than plenty 4 Setup the Differential Equation 5 Grab the x and y positions from the solution. Now lets plot the results: ``` plot(x, y, aspect_ratio=:equal, label="cannonball", xlabel="x (m)", ylabel="y (m)") scatter!([0], [0], label="Moon", markersize=5, color="grey") scatter!([d_Earth_Moon], [0], label="Earth", markersize=10, color="cornflowerblue") title!("First Simulation!") ``` Well we clearly didn’t make it far, lets try again without the Earth included in the plot so we can see what happened. (Or you could use plotly to zoom in) ``` plot(x, y, aspect_ratio=:equal, label="cannonball", xlabel="x (m)", ylabel="y (m)") scatter!([0], [0], label="Moon", markersize=5, color="grey") title!("First Simulation! (But Zoomed in!)") ``` Spirographs are cool, but not really what we are looking for. Lets turn all of this code into a function so that we can iterate on the initial conditions faster. ``` function plot_trajectory(v0, title) r0 = v0 / norm(v0) * (R_Moon + 10) tspan = (0.0, 20.0 * 24 * 3600) prob = ODEProblem(f, [r0; v0], tspan) sol = solve(prob, Tsit5(), callback=Earth_cb, reltol=1e-8, abstol=1e-8) x = [u[1] for u in sol.u] y = [u[2] for u in sol.u] flight_time_days = sol.t[end] / (24 * 3600) final_pos = sol.u[end][1:2] r_Earth = [d_Earth_Moon, 0.0] distance_to_Earth = norm(final_pos - r_Earth) - R_Earth plot(x, y, aspect_ratio=:equal, label="cannonball", xlabel="x (m)", ylabel="y (m)") scatter!([0], [0], label="Moon", markersize=5, color="grey") scatter!([d_Earth_Moon], [0], label="Earth", markersize=10, color="cornflowerblue") title!(title) end ``` Try the same initial condition to make sure we wrapped everything up correctly: ``` plot_trajectory([1500, 1500], "First Simulation, plotted from a function") ``` Looks exactly the same. Now what if we go faster: ``` plot_trajectory([2000, 2000], "First Simulation, plotted from a function") ``` Ok, medium speed? ``` plot_trajectory([1700, 1700], "First Simulation, plotted from a function") ``` On the bright side the simulation passes the smell test for what we expect an orbital simulation to look like. The last attempt seems to be about the right magnitude, but what if we pointed the cannon right at the Earth? ``` plot_trajectory([2400, 0], "First Simulation, plotted from a function") ``` Well this problem is certainly easier than I had originally envisioned. What if I wanted to shoot from the dark side of the Moon. ``` plot_trajectory([-2300, 800], "First Simulation, plotted from a function") ``` Also super easy… ## Conclusion So I think we learned two things here, the Julia Differential Equations library makes getting problems like this going really really easy, and when you make massive oversimplifications for a problem it makes it look really easy. I think from this I have the confidence that I needed to invest time into a far more realistic simulation of the problem. For now this was a great way to dust off my Julia and diff eq part of my brain. ### Next Steps From here I think the next logical step is fully simulating all of the bodies in the solar system. Whether I do that with differential equations like this example, or use something like [Horizons](https://en.wikipedia.org/wiki/JPL%5FHorizons%5FOn-Line%5FEphemeris%5FSystem) is an exercise for the next post. I think another cool element of this problem would be giving the cannonball/payload some small amount of thrust it can use to see if it can circularize itself in LEO, but I just really want an excuse to turn this into an optimization problem. There is also the question of sending payloads from the Moon to Mars which opens up a ton of options for different things to optimize for like transfer time or minimum initial velocity by doing something crazy like a Venus flyby. Another cool end condition for this series would be trying to impact a landing site on another planet, but I really don’t want to deal with that much aerodynamics so I doubt I’ll get that crazy with it. ## Reuse [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) --- *This content was originally posted on my projects website* [*here*](https://projects.ansonbiggs.com/posts/2024-09-25-moon-cannon-prelude/)*.* ### Goodbye Hey.com URL: https://notes.ansonbiggs.com/goodbye-hey-com/ Last updated: 2024-11-26T06:56:52.000Z Hey has been one of my favorite products of recent years. The screener picks up right where [Inbox by Gmail](https://en.wikipedia.org/wiki/Inbox%5Fby%5FGmail) left off. Every sender has to sit in the screener until you explicitly tell Hey where to send it. *Imbox*, a portmanteau\[1\] created by combining "inbox" and "important", is for email that needs to be given attention. For me its for things like urgent bank alerts, emails from my local government, things that you want immediately on your lockscreen when they arrive. Then there is *The Feed*, this is where things that you want to be able to leisurely read through at your own pace, like newsletters or low priority alerts like replies to merge requests. Things here are also displayed in a way that makes it easy to scroll through, and expand things you want to read. Lastly, the *Paper Trail* for things like receipts, low quality mailing lists (I want be be able to grab coupons when I go to a site but I never want to keep up with the latest deals), or terms of service updates. Basically anything that you want to exist if you explicitly seek it out but you never want to see. Then there is also the options to just say no and ignore email from a sender, and obviously a spam option. These 3 buckets worked really well for me. There can be some ambiguity, like I want my magic login links immediately, but it felt wrong having them then exist next to my other Imbox items. The other large issue with this system is senders that have bad email practices like using a separate address for each thing they send or just one address for literally everything. Overall though this is without a doubt the best system I've ever used. Using Hey alongside Gmail and iCloud mail made them so painful to use that I eventually just forwarded everything to Hey. The other big benefit is the cost is very reasonable for a custom domain at $10/mo. ## Why Leave? HTML over the wire is ***really bad***. There was a ton of drama on Twitter about this a few months ago that I didn't really understand, but now that my life has changed and I use my email from my phone a lot more outside of good wifi, I see how terrible it can be. It is also one of those things that once you notice it, its really hard to not see anymore. Even on my super snappy wired gigabit connection at home, watching elements pop into place is really odd. I can see the use case for things that are really dynamic like the calendar, but for menu buttons in the email its a little ridiculous. Anything but a couple millisecond lag for main UI elements to fully render is completely unacceptable. Using the app somewhere like a baseball game is appalling, everything is completely unresponsive until they bytes start streaming down the wire which is insane to me. I understand that much of the content available to my phone is off on a server that needs to load on the fly, but animations and menu buttons is taking things a little too far. The other issue is I feel that they've lost direction and maybe even interest in the email side of the app. I get that a calendar is a key part of the combo, but they didn't provide enough synergy for me to use it. Besides invites coming through email I've never understood the need to bundle the two products. The last release that I enjoyed was the introduction of workflows, where you could essentially a Kanban board for your emails which is great when you have a ton of threads that all go through the same workflow. Now to be clear, I think my $10/month was awesome for the base product that I initially subscribed to and I don't have a need for a steady stream of new features to stay invested. However, any features that is added that I don't use takes away from my experience. Even seeing extra buttons and menus is a negative for your workflow and productivity. Shipping for the sake of shipping is far worse than a stale product. I would easily pay double for an app that provides the screener and native apps for each platform. --- This tool was great for getting my emails back into iCloud after leaving Hey: [GitHub - rgladwell/imap-upload: Python script for uploading a local mbox file to IMAP4 server.Python script for uploading a local mbox file to IMAP4 server. - rgladwell/imap-upload![](https://notes.ansonbiggs.com/content/images/icon/pinned-octocat-093da3e6fa40.svg)GitHubrgladwell![](https://notes.ansonbiggs.com/content/images/thumbnail/imap-upload)](https://github.com/rgladwell/imap-upload) ## Yap Time There probably isn't much value to the rest of the article but I wanted to comment on each feature to help others and myself for if I ever consider coming back in the future. Full list of features, and my thoughts. List pulled from: [A delightfully fresh take on email + calendar, from 37signalsFull of features you didn’t know you needed, but you won’t be able to live without.![](https://notes.ansonbiggs.com/content/images/icon/mask-icon.svg)HEY![](https://notes.ansonbiggs.com/content/images/thumbnail/opengraph.png)](https://www.hey.com/features/) Archive of the version as of writing: - The HEY Calendar - I'm just not a fan of this feature. I think they've brought a similar amount of innovation as they did for email, but my calendar usage is really basic and I don't see a need to grow it. - A dedicated spot for daily notes - There are so many better places for this, and there really isn't any synergy with the rest of the features in the app. - Screen emails like you screen calls - Big fan. - Send an email to the web - Not available for custom domains, kind of a cool idea but more of a weekend webapp than an email app feature. - The Imbox: It's not a typo - Huge fan. - Track an email's progress through stages - Kanban for your emails, on paper this was really powerful for my job search but in practice conversations flow around too much to put in columns. - Add a simple, searchable note to any contact - I prefer contact notes to live in the actual contact not in a separate app but I rarely use relationship management features like this. - Quiet by default, loud at your discretion - As should be the default for every app. - A "Reply Later" workflow built-in - Cool feature, but it's basically just a folder. - Just set it aside - Ditto above comment. - Blocking email spies 24-7-365 - Must have in any mail app. - E pluribus unum (Merge threads) - Never used this but seems neat. - Add some style to your Imbox with Cover Art - Neat gimmick that just covers your read important emails. - Link accounts and see all your email in one place - Again, just fancy folders. - Spread 'em out, read 'em together (Feed view for multiple emails) - This was nice for if you need to look at a few emails that don't require a response. Just kind of a feed of everything at once. - Collaborate with Collections - This seems pretty cool but I don't know or collaborate with anyone else that uses Hey. - Focus & Reply: Line 'em up, knock 'em down - Nice view for all of your 'reply later' emails so that you can actually make progress drilling them down. - Bundle dominating senders into one line - One of my favorite features, basically combines all emails received from a sender into one so that they don't take up 50 lines of your inbox. - Send massive files without using other apps - Sending large attachments feels like a pretty basic feature but most other apps refuse to increase any of their limits over the past decade so this is a win for Hey. - Surface bits, don't dig for them - This is a clips library, same gripe as the notes there are probably better places to store this info. I have beef with this issue since it seems to break a lot of copy paste behavior which is a massive sin for any text based app. - The Speakeasy code - Code that you can share to let people past your screener and straight into your imbox. Really cool idea since it would take a sophisticated bot to abuse, but probably not that unlikely in the age of ChatGPT. - Stick it to an email - Stick notes on your imbox. Cool idea but again probably a better place for notes. How many ways does this one app need to store notes? - Collaborate without the CCs and side-threads - Cool feature, but I don't know anyone else with the app. - Send from an external email address using SMTP - Pretty standard feature for email hosts. - Add private "notes to self" to any email thread - Another notes method lol. - New For You & Previously Seen - Unread emails are separated from read, how it should be. - A love letter to newsletters - This is just a feature of the screener that I gushed about above. - Put receipts in the Paper Trail - Ditto. - Set emails to Bubble Up to the top of your Imbox - My favorite part about the bubble up is making it random. Send an email and set it to bubble up randomly if you don't get a reply so you can naturally follow up if you don't get a response. - Get off threads without having to ask - I'm sure other apps have this but it's never really a problem for me. - Secure by design - As it should be. - Easily add sales@, info@, press@, etc addresses - As it should be. - Autorespond when you're away, out, etc. - Standard feature. - Send the same reply to multiple emails - Standard feature. - Share an email via a link - You can only share to other Hey members which is a massive shame. - HEY Spam Corps: Enlist in the fight against spam - Doesn't work that great. - Fix bad subjects without busting threads - Everything needs this feature, so good. - Find files without digging through threads - Probably one of my favorite features. I know most apps let you search specific file types but this UI is just chef's kiss. \[1\] I had to Kagi this to find the name because I knew it had to exist, but I didn't think it would be such a pretentious word. ### The Rat Race is Linear URL: https://notes.ansonbiggs.com/the-rat-race-is-linear/ Last updated: 2026-02-23T02:47:55.000Z I recently received a promotion, the first big milestone since I started my engineering career. I've taken a different route than anyone else, which demands that I act much scrappier than my peers that took the traditional routes. I don't have the luxury of taking a poorly paying job to gain experience, or the patience of working on projects that aren't moving fast and making the world a better place. I work hard, I am passionate about making a large impact, and I know the value I provide. > I got a big amount, I took a different route, I am the pick of the litter > \- 2 Chainz, Big Amount Talking about compensation can be considered quite vulgar by most. It's just yucky to talk about in western civilization. But there are many situations in life where simply asking will yield incredible rewards. Your job is arguably the biggest pile of money that can get left on the table. Especially for larger salaries, a few percent could mean thousands of extra dollars per year to save, donate, or enrich your life with. The fully loaded cost to your employer to keep you around can be over [double your salary! ](https://www.kalzumeus.com/2012/01/23/salary-negotiation/) Think about what you could do with an extra $10k. Now, what is the company going to do with an extra $10k? To end my ramble, HR won't miss a few thousand dollars nearly as much as you'd think. --- Ok I used to believe all of the above. I still do, but my promotion has given me some additional perspective that shakes things up. This is the second time in my career that I have negotiated an increased salary, just for it to get wiped away. I've never backwards, but I've had my lead completely eroded. My first job out of college I was able to negotiate a pretty significant salary increase. It put me about 10% higher than colleagues that started the exact same day, with the exact same resumes (fresh out of college). I also negotiated a 12.5% sign on bonus which felt really good as well. However, a few months after starting the whole company received a massive cost of living bonus. I want to say it was close to 12% but my memory is fuzzy. Well, everyone got that large of an increase but me. I got a paltry 2%. They just set all the entry level engineers to the same compensation which meant that I was no longer ahead. In fact, since they just gave everyone a whole percentage, increase I was now slightly behind everyone else. I'm pretty certain they let me negotiate this high knowing it wouldn't matter after my first few paychecks anyways. The same thing just happened with my recent promotion at my current job. My compensation was well ahead of other people in my position, so when the promotion bump came through mine was about half the size that it should have been. Turns out there isn't a percent difference in compensation between roles, they just reset your clock to what they calculate is the market rate for your role and you get that much now. This is pretty frustrating to me and just feels like a stupid way to tarnish my relationship with my employer. There is a lot of trust that goes into picking an employer, and as is the case with trust, it's much harder to gain than it is to lose. I'm still far ahead of where I would be if I wasn't negotiating hard with potential employers but I hate to be taken advantage of once I lose my leverage. This makes me think back to one of my favorite stock market quotes: > The stock market is like a yo-yo on an escalator. > \- Unknown, Every Finance Textbook Regardless of how hard you navigate the turbulence in the market, your best bet is to just ride the escalator to the top. Pressing hard to get more money is a short term gain, and eventually you will be corrected back to the index. The linear growth is certain and your results will compound. My hope is that as my career matures and I can break away and contribute in a much more impactful way. This will hopefully enable me to create my own path. Until then, I'll be lost in the rat race. ### 1 Year With My 958 Diesel Porsche Cayenne URL: https://notes.ansonbiggs.com/1-year-with-my-porsche-cayenne/ Last updated: 2024-06-08T03:21:28.000Z I kind of talked about it in [My Cars and Bids Review](https://notes.ansonbiggs.com/cars-and-bids-experience/), but in May 2023 I took a big leap and bought a Porsche at auction on Cars and Bids. In my review I talk about how it was kind of a rocky start, but everything worked out and ever since then I've been incredibly happy with the purchase. Having Doug DeMuro write an excerpt about my car was honestly worth the sticker price in itself. #### Doug's Take > Not everyone realizes that Porsche sold a turbodiesel-powered version of the Cayenne here – but they did, and here it is. The 3.0-liter twin-turbocharged V6 boasts a muscular 406 lb-ft (!) of torque that comes in handy when towing – and it also touts excellent range and surprisingly good fuel economy. This particular Cayenne Diesel is also a nicely-equipped Platinum Edition model that features a set of 20-inch Cayenne SportDesign II wheels, heated and ventilated front seats, heated rear seats, a heated steering wheel, and much more. Plus, this Cayenne is a one-owner SUV, and it's nearly unmodified – great benefits that enhance its appeal. Everyone I know expected this car to bankrupt me. Now the costs have hurt, but only because I lived without a car for over a year before purchasing the Cayenne. You forget how much car insurance and gas really adds up, but obviously everyone thought that it would be the maintenance costs that were going to ruin me. Like any performance vehicle they have to stay well fed to keep operating, but surprisingly the Porsche tax hasn't been that bad. Apart from good mechanics charging over $250 an hour, the steep price for parts is usually reasonable considering the lifetime and performance of the part. Repairs are pretty straightforward too considering it’s model year. My previous car was a 1998 BMW Z3 which was much worse to work on and maintain. ![1998 BMW Z3 on a sunny day](https://notes.ansonbiggs.com/content/images/2024/06/image.png) My old Z3 Obviously a bit of an apples to oranges comparison, and BMW isn't known for being cheap to maintain either, but I think Porsche engineering really is a step ahead. The few maintenance items I've done myself have been super straightforward. There are never hidden clips, or bolts that are impossible to unscrew, and every time I look up a maintenance guide I think to myself that I could have easily figured that out on my own. I am sitting at 157k miles and I bought the car at 145k so there could be plenty of demons biding their time but so far there hasn't been any major maintenance items. I even had a very reputable mechanic give it a full inspection and everything came back perfect. ## Adventures I'm a remote (finger quotes) worker that lives in a walkable downtown so unlike most American vehicles, almost none of my miles are from commuting. I go into my office occasionally and make consistent Costco trips but otherwise all of my driving has been either offroading or road trips. Home for me is currently Colorado, and the car was in Massachusetts when I purchased it so the first time behind the wheel of the Cayenne was a 33 hour road trip. The Diesel is absolutely insane for road trips. I generally get over 30 miles to the gallon and I pretty much always push the limits of legal (finger quotes) highway speeds. Not bad for a massive SUV. This is the first car where the ~~gas~~ fuel tank outlasts my bladder on a road trip. The other amenities you get from a fully optioned out Porsche help the experience too. The other road trips have been between Denver and Phoenix, I can't recommend going through the Rockies and then Moab enough. As far as offroading there isn't too much to say, I haven't done anything that extreme since I haven't managed to save a big enough pile of money to get the [Berg Peaks](https://bergpeaks.com/blogs/news/prosciutto-porsche-cayenne-958) build I want yet. The car handles incredibly on icy snowy conditions and mud. My friend got his RAM 1500 stuck up a trail in the Rockies this winter and I led a group of built out rescue Jeeps up to where his truck was and one of the Jeeps got stuck on the way up the trail while my Cayenne wasn't even breaking a sweat. That felt very satisfying because I could tell they were worried about me getting stuck up on the trail. ![Porsche Cayenne in front of a house pulling a U-Haul trailer](https://notes.ansonbiggs.com/content/images/2024/06/image-1.png) I promise I never let her get this dirty I also hauled a U-Haul trailer but there's no surprise that the Diesel didn't even notice that it was pulling a fully loaded 6x12 trailer. ## Quality of Life Purchases I won't provide direct links since I don't want search engines to think I'm just churning out affiliate link garbage but: - VIOFO Dash Cam - Required with these Denver drivers - Road Top Wireless Carplay Touchscreen - I tried using the build in PCM overrides but it was a total pain to install and didn't work well so I returned it. Phone mount would also work just as well. - Trunk Cargo Net - Gotta stop items from sliding around in the boot ## Undocumented Behavior 2014 is a quirky year for the Cayenne because it shipped with many cool features that were limited by software for various reasons: Bluetooth that doesn’t auto-connect, brake hold that only activates on hills, and parking sensors without auto cruise control. These little oddities add to the charm of owning a car from this transitional period in automotive tech. I've discovered some neat undocumented tricks. The rear hatch open button on the driver-side door will close the door as long as you hold the button down. This is cool because the only documented way is to push the button on the bottom of the door or manually pull it down. Another cool thing is pressing and holding the lock button on the key fob causes the mirrors to fold in, which is handy for street parking. ### Simple Stock Bot End-of-Life URL: https://notes.ansonbiggs.com/simple-stock-bot-end-of-life/ Last updated: 2026-02-23T02:47:37.000Z Me and my friends were huge fans of [Google Allo](https://en.wikipedia.org/wiki/Google%5FAllo), specifically its integration with the stock and cryptocurrency markets. Bringing live market data directly in our group chats majorly enhanced related conversations. Allo was very popular and loved by users so of course Google axed it, [Rest in Peace](https://killedbygoogle.com/). Once its end-of-life was announced my group chat began searching for a new home. So, in 2018 in my dorm room I started working on a Discord chat bot that could help bridge some of the gaps left by losing access to the Google Assistant in our chats. At that point the bot API was very open and I don't think there were any privileged endpoints. However, Discord sucks if you only goal is a group chat with friends. So the group went down with the USS Allo ⛴️, and when it finally went offline we made the last second judgement call to move to Telegram. With that [Simple Stock Bot](https://simple-stock-bots.gitlab.io/simple-stock-bot/) was born. Telegram is an incredible app for group chats and for bot development. I liked the idea of the stock market bot, so I decided to refactor the codebase so that it could support multiple frontends with a single backend that handled routing requests to the correct market API. Something like this: flowchart LR subgraph frontend \[Frontends\] telegram(Telegram) discord(Discord) end subgraph common\_code \[Common Code\] symbol\_router(Symbol Router) end subgraph cloud \[The Cloud\] backend1\[Stock Market API Backend\] backend2\[Crypto API Backend\] end telegram --> symbol\_router discord --> symbol\_router symbol\_router --> backend1 symbol\_router --> backend2 classDef frontend fill:#f9f,stroke:#333,stroke-width:2px; classDef common\_code fill:#ccf,stroke:#333,stroke-width:2px; classDef cloud fill:#cff,stroke:#333,stroke-width:2px; This worked really well early on, and let me easily test new data providers. I had high hopes of adding different frontends like Twitter, Reddit, maybe even selling dashboards of real-time bot usage, but keeping up with the demands of my Telegram and Discord users proved plenty of work for me. The project quickly grew to about 15k monthly active users completely organically which made getting stock market data really difficult. I found that most of my users were from southeast Asia. Why they care about American markets I have no idea, but a lion's share of usage was for US stock market data. Back then, the market data was costing me $30-$50 a month which was a stretch but reasonable enough that the occasional donor was making me cut just about even. Luckily cryptocurrency data at that time was very high quality and free so my only other cost was servers. I was mostly able to run for free off of my Digital Ocean referral program at that time. I put in a lot of effort to make sure it was seamless for anyone else to run their own bot so that referral did quite well. Seeing this referral program do so well made me happy thinking that I was introducing people to running their own service which was one of the most rewarding parts of this project. The first big hit to the product was Discord constantly changing its API, and making me apply for certain permissions. This led to a lot of downtime since I would have to wait for my dependencies to update and then I would have to go through the application process and update my code. To be fair the application process was always very quick and this is mostly on me for not keeping up to date, but the instability caused a lot of headaches for me and the maintainers. Eventually the bots main interaction with users, putting a `$` stock ticker in any message and getting a price, was blocked behind a privileged intent that they wouldn't grant me access to. To be fair this required letting the bot read every single message in any Discord server that the bot was part of which is a lot of data for bad actors, but they weren't interested in if I was actually storing the data. > Unfortunately, I am denying your Message Content Privileged Intent request. This is because we are only providing access to our privileged gateway intents to power unique, compelling, user-facing functionality, and we do not believe your use-case meet this criteria. This change, while not totally unreasonable, pretty much killed my Discord userbase. Shortly after the maintainer for discord.py eventually burned out pretty hard and ended up killing the project: [The Future of discord.py](https://gist.github.com/Rapptz/4a2f62751b9600a31a0d3c78100287f1). This wasn't very encouraging for me since I was feeling the same fatigue towards working Discord, and while I was able to switch to a fork, it was one of the final updates I made to make the bot work on Discord. It still mostly works today I imagine its days are numbered. **The final nail in the coffin for the bots** was the sharp price increase in stock market data. I was using IEX Cloud for a long time who offered a high quality, very reasonably priced service. To switch my bot back to their service today would cost a whopping $2700 per month. Still cheaper than most of the competition but well beyond a hobby project. There are alternatives like the Yahoo Finance API, or doing web scraping, or even using an API with personal licensing. However, I think all of those are going to be impossible to maintain long term, and breaking a terms of service with something this valuable is scary. Crypto data has similar woes. The Coin Gecko API is starting to be very restricted, licensing no longer allows commercial usage for free, and I've noticed a degradation in their service. All of this inspired my [APIs Are Temporary](https://notes.ansonbiggs.com/apis-are-temporary/) post. While it's disappointing to say goodbye to this project, I'm incredibly proud of what I accomplished. Building a service that reached so many people and taught me so much about software development has been an amazing experience. This project could likely thrive as a proper startup or company, but I have time for neither. For now, it's time to explore new ideas, but I'll always cherish the journey of Simple Stock Bot and the community it created. ### Biden Admin Declares War on C++ URL: https://notes.ansonbiggs.com/biden-declares-war-on-c/ Last updated: 2025-06-04T02:33:39.000Z Today the White House office of the National Security Director released a report titled [](https://www.whitehouse.gov/wp-content/uploads/2024/02/Final-ONCD-Technical-Report.pdf)[“Back to the Building Blocks: A Path Toward Secure and Measurable Software.”](https://web.archive.org/web/20240227202443/https://www.whitehouse.gov/oncd/briefing-room/2024/02/26/memory-safety-fact-sheet/) that outlines actions the White House wants developers nationwide to make to ensure the cybersecurity of the United States. ## Roadmap to Memory Safety The suggestion from the report that is immediately actionable for developers is switching to memory safe programming languages. The report states that now is the best time it has ever been to switch to a memory safe language, therefore, all new projects should make the jump. It even goes as far as calling existing projects to start refactoring their codebases as well. The report explicitly calls out C/C++ as the popular problematic languages and suggests that Rust should be used instead. No other languages are mentioned in the report, cue [crab rave](https://youtu.be/LDU%5FTxk06tM). It does acknowledge that while on paper Rust checks all the boxes needed to replace C/C++ (specifically for space applications) it is not yet battle proven. There is the argument that with more adoption comes improvements such as toolchain development and workforce education that could really take Rust to the Moon. The most important discussion in this paper is how the incentives are not aligned to favor memory safety. Huge systematic changes need to happen just to dethrone C++ as the default systems language, let alone to get the ball rolling on refactoring old code. I don't think the systems that are being implemented in the report are doing enough. They are mostly education and incentive based with a focus on the very long term. I would like to see strict punishments put in place for malice/negligence when it comes to system design. The cost of refactoring even critically vulnerable parts of a codebase in a new language is magnitudes more expensive than the fine/advertising costs it takes to sweep a massive cybersecurity incident under the rug. Over time I think the better languages will prevail, but there is a strong need for swift action to push the market into the correct course. Open source is also mentioned as a critical part of the overall software ecosystem. I found it surprising that there was no mention of supporting open source work. The `Log4Shell` vulnerability was highlighted as a key reason why we need better observability into open source but there is a void of any plan to fix it. I think open source is one of the few things where resources input creates orders of magnitude of economic activity. It truly is the backbone of all forms of modern engineering and progress at large. Interestingly, there is also the discussion on how hardware is another avenue towards a memory safe future. There are projects in development that could allow patching memory vulnerabilities just by switching hardware. This is still a new area that doesn't appear to have made it outside of a lab yet, but given the cost of refactoring ancient C monoliths I could see little wins in this field gaining a lot of traction and snowballing. ## Measuring Cybersecurity Quality The other required step is far less actionable, figuring out a way to measure code safety. This is a huge problem that I think the report really nailed. There is no simple way to describe the safety of a software system. How is anyone supposed to make informed decisions regarding the safety of their data and systems in the current ecosystem? Even if you have a full teams dedicated to pouring over every piece of code that your organization uses would they catch things like `Log4Shell` or `Heartbleed`? The answer is no. This is an extremely hard area of research that I think is a mostly open problem. I think its awesome that the White House is willing to tackle something this big. It really does effect every single part of the software ecosystem. From CTO's to developers to consumers nobody has any actionable data about the safety of a system. The report says that groundbreaking academic research is an essential part of getting a solution here so hopefully that will inspire the upcoming generation of PHD's to tackle these difficult problems. So what can we measure today? It seems odd that the only real indicator is what language the project was written in. Don't tell HackerNews but in the near future seeing Rust as the main language of a project is probably going to be the singular selling point in sensitive areas. Maybe AI will save us. ## tldr; So in conclusion, stop writing code in C/C++. The biggest dent you can make in the security of your code is writing it in a memory safe language. If you need a low level systems language you should probably use Rust instead, but its likely you don't actually need that. Hopefully soon hardware wins will make unsafe code a little safer, and in the longer term we will have actionable metrics about the safety of our systems. Here is my highlighted copy of the report: [Anson-Notations-ONCD-Technical-ReportAnson-Notations-ONCD-Technical-Report.pdf681 KBdownload-circle](https://notes.ansonbiggs.com/content/files/2024/02/Anson-Notations-ONCD-Technical-Report.pdf "Download") ### Ghost is a little empty without Email URL: https://notes.ansonbiggs.com/ghost-is-a-little-empty-without-email/ Last updated: 2024-09-23T07:44:25.000Z Ghost is the go-to platform for independent publishing. Setting up a blog is straightforward, whether on your own hardware (like this site), using a prebuilt image on Digital Ocean, or hosting it on Ghost's own SaaS. However, many open-source projects that branch into a SaaS model to generate revenue often experience a gradual shift away from prioritizing self-hosting. **Ghost is a powerful app for professional publishers to create, share, and grow a business around their content. It comes with modern tools to build a website, publish content, send newsletters & offer paid subscriptions to members.** \- ghost.org Ghost's reliance on email is a large issue for self-hosting. Newsletters may be trending, but email integration poses difficulties for those who self-host, with no work arounds. Sure mailgun is integrated and cheap for now, but an open platform shouldn't rely so heavily on a closed system. Several features are hampered or non-functional without email integration. A notable example is the new [recommendations](https://ghost.org/changelog/recommendations/) feature. Despite being able to add recommendations in the admin dashboard, the button to display them on the site is doesn't work without email integrated. The button to view them has shows no user-facing errors or log entries to diagnose the issue, without the smtp configured it just does nothing. Having used Ghost since 2018, I can affirm it's one of the best options available and I appreciate their commitment to an open web. This issue may not be intentional, but it underscores the risks of depending on a project that also has a lucrative SaaS component. Email integration is convenient for Ghost to provide at scale, so the needs of self-hosters who don't use email might not be a priority. ## Email Setup Setting up email was far from straighforward. I host this blog with docker compose on a server that is hiding behind a cloudflare proxy. Cloudflare is something I want to get away from, but dns and ssl scare me. Here is the relevant part of the `docker-compose.yml` for setting up SMTP. Bulk delivery is setup in the ghost admin dashboard but that is super straighforward. ```yaml mail__transport: SMTP mail__options__host: smtp.mailgun.org mail__options__port: 587 mail__options__secureConnection: false mail__options__auth__user: postmaster@mail.notes.ansonbiggs.com mail__options__auth__pass: a_super_duper_strong_password ``` Now you might notice that I use `mail.notes` for the subdomain instead of just `notes` like the websites URL. This is because the Cloudflare proxy blocks SMTP but not bulk sending. This means that sending a newletter worked, but sending singular emails, like magic login links, didn't work. Again Ghost didn't really give me any tools to help me diagnose this. Add email to the list of things that scare me. So to get around this I created a new (sub?)subdomain that doesn't have the proxy enabled. I don't claim that this is the correct resolution, but if you are hitting the same issues I did then maybe this will help. ### Vulcan and BE-4 Inaugural Flight URL: https://notes.ansonbiggs.com/vulcan-and-be-4-inaugural-flight/ Last updated: 2024-03-07T22:28:42.000Z *Full disclosure I am an employee of Blue Origin, but I do not work on any of the programs mentioned.* A new chapter of space exploration began. At 2:18 AM in Cape Canaveral the two Blue Origin BE-4 engines roared to life and brought the next generation ULA Rocket to space. A huge milestone for both companies with a lot to prove. ULA was once the uncontested leader of space launches, but after a rough decade tonight's flawless launch reaffirms their place as a premium launch provider. Similarly, Blue Origin, a billionaire-backed company, has had much to prove, having shown little over its 20-year history. The perfect operation of a brand new engine on its first rocket is a marvel of engineering that for the first time showcases what Blue has been cookin. ULA's claim to fame, their 100% mission success, likely continued into the next generation with tonight's launch, setting a high bar for other launch vehicles. Successfully lifting a new rocket off the ground requires immense talent, dedication to excellence, and engineering prowess, as demonstrated this evening. The Vulcan, a configurable rocket, is specifically designed to deliver U.S. National Security payloads into high-energy orbits with unparalleled accuracy, surpassing even the Falcon 9\. Additionally, Vulcan's substantial backlog of commercial missions suggests that it remains a dominant force in the industry. The overall system working is a feat, but getting engines right on the first try is just as impressive. Building rocket engines is no small feat and it is no surprise that ULA opted to outsource the development of their engines. The only reason that this engine architecture makes financial sense is because Blue Origin has much much larger aspirations than just supplying the Vulcan rocket. > So, Vulcan is the first methane fueled rocket to reach orbit on its first attempt, and the first to reach orbit from the US. > > — Scott Manley (@DJSnM) [January 8, 2024](https://twitter.com/DJSnM/status/1744262210678059288?ref%5Fsrc=twsrc%5Etfw) Scott with the fun facts "Gradatim Ferociter" aptly describes Blue Origin's trajectory, as it transitions from meticulous planning to delivering tangible results like tonight. The anticipated 2024 launch of New Glenn, previously subject to valid criticism, has gained a lot of credibility. Tonight's event significantly bolsters confidence in Blue Origin's capabilities and solidifies its position in the space industry. As the dawn breaks over Cape Canaveral, and the payload coasts towards the moon. The echoes of a historic launch linger, marking the beginning of a new era in space exploration. Tonight's success is not just a testament to the technological marvels of ULA and Blue Origin, but also a beacon of inspiration for the future of space travel. ULA reaffirms its prowess as a premier launch provider, while Blue Origin has now demonstrated its engineering excellence and strategic foresight. This collaborative achievement in successfully launching the Vulcan rocket sets a new standard in the industry. Looking ahead, the eagerly awaited New Glenn launch in 2024 is now poised to be a defining moment, further cementing Blue Origin's emerging leadership in the space sector. *Full disclosure I am an employee of Blue Origin, but I do not work on any of the programs mentioned.* ### Beli: Rating Has Never Been So Good URL: https://notes.ansonbiggs.com/rating-has-never-been-so-good/ Last updated: 2024-09-26T03:49:38.000Z I got an ad on Instagram for an app called Beli. Upon first glance, it's a social media app for restaurant patrons aimed at a similar niche as Untapped but with an emphasis on the restaurant instead of beers. Untapped is a social media where you mark places that you've had a beer, rate the beer, give it some tags, maybe include a friend or make a post to the apps social feed. It is also great for researching and tracking of beers and its cool when friends use it so you can spy on their drinking habits. I used to use Untapped a lot so I seemed like a natural fit for Beli. I'm still new to it, but so far Beli is a very well made app that I'm really excited to watch grow. The reason for this post is that Beli does something really cool that I haven't seen before. It has a novel rating method that honestly was so fun my partner and I ended up rating every restaurant I've been to in Denver over the past year and we had a blast doing it. Most rating systems have you provide a value of some sort to use for ranking. Google Maps has a 5-star rating, Apple Maps has thumbs up/down for a few categories, and Untapped has a `0:0.1:10` system. These systems are all flawed. I subscribe to the same method as Dave Portnoy when it comes to giving a rating. High ratings should be very rare, and a perfect rating should only happen once in a lifetime. Restaurants, or whatever you happen to be rating, usually don't agree with this system and they work hard to chase those perfect ratings. I've been active on Google Maps for over 10 years now and its so frustrating when a perfectly find restaurant reaches out to me because I gave them a 4/5 star rating. When I drove for Uber there was a similar problem where if your driver rating was below a 4.7 you were put on probation until you got your numbers back up. 5 options for rating just isn't enough. On the other end of the spectrum you have Untapped that essentially gives 100 different rating options. The issue is that people rarely give ratings from 3 to 7 and they still end up essentially using a 5 star system where things they like do abnormally well and things they don't like score horribly. Apple is probably my favorite system we've covered so far. They give you a few categories; overall, food & drink, customer service, and atmosphere. All are optional to rate too. This is great because it pretty much breaks down how the 5 star system should work and removes the stress of some factors being abnormally good or bad changing the overall rating. Steam uses a similar positive/negative system that I trust more than any other reviews. All of the previously mentioned systems are flawed, but Beli has innovated greatly in this space because their rating system is actually a ranking system. When you add a new place to your list it doesn't ask you for a number or a star count or which way a thumb should go, it compares it to the other places in your list. You rank this new place against all of the places you have already visited using a binary insertion sort. So, after a few comparisons to places you've already ranked, you end up with a ranked list, which then a linear interpolation is ran on to give everything a rating 0.0-10.0\. I'll break down this algorithm in full detail below. This system is a lot of fun because pitting two of your favorite places against each other really makes you think about each option, and it kind of diminishes the numerical value of the actual rating, which is a good thing. I think this system would also make buying fake reviews a lot more difficult and obvious to spot. Right now [The Wolf's Tailor ](https://www.thewolfstailor.com/) is my top ranked restaurant which gives it a 10/10\. Like I said earlier, a 10/10 should be reserved for that once in a lifetime meal, which to its credit The Wolfs Tailor is pretty close, but since what I'm really rating is its performance compared to its peers the rating is fine with me. It was even fun debating how this $330 meal stacked up compared to my favorite fast food fried chicken place. I think this is also a better ranking system for the restaurants too. If my place got a 5/10 rating from someone then I would be worried about how their visit went, but if I can see that it's simply because my neighbors are beating me in the head to head ranking then I know that I need to strive to be better instead of writing off a few bad reviews. ## Lets Write Some Code If you don't want to see python and charts, turn around now Lets see if we can recreate this system in Python. First we need a list of things to sort: ```python books = [ "The Next 100 Years", "Extreme Ownership", "Project Hail Mary", "The Space Barons", "Safe Is Not an Option", "Skunk Works", "Artemis", "What If?", "The Hitchhiker's Guide to the Galaxy", "Ready Player One", ] ``` First 10 books that I could think of Then we pretty much just write a simple binary search algorithm that uses user input to decide on equality of each item. Wikipedia is an awesome resource for getting pseudocode of an algorithm like this. ```python import random random.shuffle(books) # Just to make things more fun sorted_books = [] for book in books: low = 0 high = len(sorted_books) while low < high: mid = (low + high) // 2 answer = input(f"Was '{book}' better than '{sorted_books[mid]}'? (y/n) ") if answer.lower() == "y": low = mid + 1 elif answer.lower() == "n": high = mid else: raise ValueError("Invalid input. Please enter 'y' or 'n'.") sorted_books.insert(low, book) ``` 23 lines of code not too bad 😎 Since this algorithm uses binary search, the worst case for adding a new entry to the list is only \\(\\lfloor \\log\_2 (n) + 1 \\rfloor\\) operations which for this list of 10 books means a worst case of 4 user inputs to sort the new book. My ranking of the 10 books looks like this: ``` Was 'The Hitchhiker's Guide to the Galaxy' better than 'Project Hail Mary'? (y/n) n Was 'Safe Is Not an Option' better than 'Project Hail Mary'? (y/n) n Was 'Safe Is Not an Option' better than 'The Hitchhiker's Guide to the Galaxy'? (y/n) y Was 'Ready Player One' better than 'Safe Is Not an Option'? (y/n) n Was 'Ready Player One' better than 'The Hitchhiker's Guide to the Galaxy'? (y/n) n Was 'Skunk Works' better than 'Safe Is Not an Option'? (y/n) n Was 'Skunk Works' better than 'The Hitchhiker's Guide to the Galaxy'? (y/n) n Was 'Skunk Works' better than 'Ready Player One'? (y/n) y Was 'What If?' better than 'The Hitchhiker's Guide to the Galaxy'? (y/n) y Was 'What If?' better than 'Project Hail Mary'? (y/n) n Was 'What If?' better than 'Safe Is Not an Option'? (y/n) n Was 'The Space Barons' better than 'What If?'? (y/n) n Was 'The Space Barons' better than 'Skunk Works'? (y/n) n Was 'The Space Barons' better than 'Ready Player One'? (y/n) y Was 'Extreme Ownership' better than 'The Hitchhiker's Guide to the Galaxy'? (y/n) n Was 'Extreme Ownership' better than 'The Space Barons'? (y/n) y Was 'Extreme Ownership' better than 'Skunk Works'? (y/n) y Was 'The Next 100 Years' better than 'The Hitchhiker's Guide to the Galaxy'? (y/n) n Was 'The Next 100 Years' better than 'Skunk Works'? (y/n) n Was 'The Next 100 Years' better than 'The Space Barons'? (y/n) n Was 'The Next 100 Years' better than 'Ready Player One'? (y/n) n Was 'Artemis' better than 'Extreme Ownership'? (y/n) n Was 'Artemis' better than 'The Space Barons'? (y/n) n Was 'Artemis' better than 'Ready Player One'? (y/n) n Was 'Artemis' better than 'The Next 100 Years'? (y/n) n ``` idk how to make a pretty UI on the fly for this sorry It took me 25 inputs to sort this list which is quite literally the worst case scenario. The `random` library really did a number on me tonight. That may seem like a lot of inputs for only 10 books but if you factor that the max any book took was only 4 inputs then it isn't too bad, and since math equations aren't the easiest to visualize we can plot plot the length of a list vs. inputs required to get an idea of how the inputs really tapers off as the list grows exponentially: ![A line graph titled 'Number of User Inputs Required for Each Insertion in Binary Insertion Sort' with the x-axis labeled 'Length of List at Insertion' ranging from 0 to 100 and the y-axis labeled 'User Inputs for Each Insertion' ranging from 0 to 6. The plot shows a curve starting at the origin and increasing at a decreasing rate as the length of the list increases, depicting the number of inputs required for each insertion.](https://notes.ansonbiggs.com/content/images/2024/01/download--6-.png) Not the prettiest chart I would argue that over a few hundred items in a list it becomes hard for a human to manage so I doubt users would ever have to do more than 8 inputs even for a really large library of items. ## Cool Additional Things the Beli Implementation Does Beli does two things that are really important for making this rating method work for the general population. They first have you sort you new entry into three options: bad, okay, great. I think this helps keep the comparisons grounded since it starts the comparisons off in a region of the list that is closer where it ends up. The other thing is they have a button for if comparing two restaurants is too hard. I don't know how this actually decides a ranking, but I would imagine this is necessary for making the ranking easier. To wrap things up, here is my final ranking of the 10 books. Feel free to let me know how wrong I am. | Rating | Book | | ------ | ------------------------------------ | | 10 | Project Hail Mary | | 9 | Safe Is Not an Option | | 8 | What If? | | 7 | The Hitchhiker's Guide to the Galaxy | | 6 | Extreme Ownership | | 5 | Skunk Works | | 4 | The Space Barons | | 3 | Ready Player One | | 2 | The Next 100 Years | | 1 | Artemis | Its crazy that ghost still doesn't have native tables. ### Media Needs Preservation URL: https://notes.ansonbiggs.com/media-must-be-preserved/ Last updated: 2024-11-26T06:56:03.000Z [This week Google News announced it is removing magazines](https://9to5google.com/2023/11/15/google-news-magazine/), even ones I paid for, and if I don't act quickly to export them they will be lost forever. To add insult to injury my hundreds of magazines have to be exported manually and slowly one at a time as PDFs. Whether it's a [film that was never released](https://en.wikipedia.org/wiki/List%5Fof%5Fabandoned%5Fand%5Funfinished%5Ffilms#Films%5Fabandoned%5Fduring%5Fpost-production%5For%5Fcompleted%5Fand%5Fnever%5Freleased), [removed from streaming because of licensing](https://www.nbcnews.com/media/streaming-services-remove-tons-movies-shows-rcna86656), or [a video game lost to time](https://lostmediawiki.com/Category:Lost%5Fvideo%5Fgames), it is clear that we do a terrible job at preserving media. This is largely due to licensing and copyright, and there are a few big offenders (Disney and Nintendo) that are doing a serious disservice to humanity by locking content and throwing away the keys. We need laws that keep media from disappearing. Simply enforcing that if media isn't available to consumers at a reasonable expense for a short period of time then that content should become public domain. This forces consumer friendly distribution by the owners of the media, and most importantly preserves art. Unfortunately, Disney is annoyingly good at getting its way when it comes to protecting its precious intellectual property. So, for now piracy is the only real force working to preserve media. Hopefully with streaming services struggling and doubling down on anti-consumer practices, the tides will shift and the wind will fill the sails of the piracy movement again. Hopefully this time it's enough of a force that legislators see that piracy is only a symptom of a broken system. A system that is aligned to be hostile to consumers, and they enact laws that protect media and enable consumers. For the record I think they'll instead try to ban encryption or `http` or HDMI, but it's nice to be optimistic sometimes. ### This... Is my Cars and Bids Review URL: https://notes.ansonbiggs.com/cars-and-bids-experience/ Last updated: 2024-11-26T06:54:17.000Z ## Bidding is Fun The thrill of participating in an auction is electrifying. I had spent months pouring over auctions and local classifieds trying to find the perfect match. When the diesel Porsche Cayenne I had been looking for was listed I immediately knew it had to come home with me. The auction process is a week long rollercoaster of anticipation and adrenaline. Cars and Bids lists cars for seven days which gives you ample time to do research and prepare for your purchase. The final moments are the most intense, with bids coming in rapidly until the clock closes in on zero. I told my co-workers that I would be bidding on this car during my lunch break so I was truly in a hot seat with all eyes on me. Every bid by me was met with cheering across the entire floor. I had tried to win a few cars in the previous weeks but I was always beat out by someone with a much larger budget. Not this time. The energy was so electric that I threw my budget out the window. I needed this car. I was outbid in the final seconds, so I came back with a large final bid, blowing everyone else out of the water. It worked, I won. That was fun. I can't imagine buying a car any other way. [1 Year With My 958 Diesel Porsche CayenneMy experience of my first year of ownership of a 958 Diesel Porsche Cayenne![](https://notes.ansonbiggs.com/content/images/icon/pillars-1.jpg)Anson's NotesAnson Biggs![](https://notes.ansonbiggs.com/content/images/thumbnail/photo_2024-06-04_21-13-53-1.jpg)](https://notes.ansonbiggs.com/1-year-with-my-porsche-cayenne/) The car I won was a 958 Porsche Cayenne Diesel. For my thoughts on the car checkout out my review ## Cars and Bids Review I won, Cars and Bids hit my credit card with their fee, now what? I had imagined that Cars and Bids would just set me up with the seller and then silently vanish into the background with their fee in hand, but they were actually very keen on being involved every step of the transaction. They leave it to you and the seller to figure out the logistics of money and getting the car. They provide a guide with steps that was helpful but in my case me and the seller were able to get on the phone and hash things out pretty quickly. I decided what worked best for me was to fly from Denver to the East Coast to get the car myself and drive it back since shipping cars is apparently an incredibly scummy business. I also wanted to put my money where my mouth is calling my Porsche a road trip machine. After wiring some money, taking some last second PTO, and flying across the country the seller was nice enough to pick me up from the airport and take me somewhere that we could finalize the paperwork. They picked me up in my new Cayenne which was fun, but there were a ton of warning lights on the dash that weren't disclosed earlier. I asked about it and the seller told me the car had been sitting long enough for the battery to die, and this is just something that happens when the battery dies in these cars. They assured me that once the alternator gets the battery topped up that everything will be fine. Seems reasonable enough. I document the issues with the car, we do all the paperwork and I'm on my way. ✏️ Side note, the paperwork was **not* done correctly and ended up causing me a ton of trouble with the Colorado DMV. Double check everything! After a quick stop for some coffee and food I am officially on my way! Unfortunately, the moment was quickly ruined as this is where the problems really start to show up. I had no cruise control, which is something I really wanted for my 29hr road trip, and almost all of the steering wheel function weren't working. The seller had been super responsive and helpful up until now so I reached out about the issues. They said they worked with Cayenne's a lot so I asked a super non confrontational question about if I needed to do any sort of reset to get things working again. Of course the seller had not vaporized into thin air and didn’t reply 🙄. I was visiting my friend in D.C. for a few days so I figured I would drop the car off at a local dealership and have them take a look at the car. The Porsche Dealership in Tysons Corner was incredibly understanding about me being on a road trip and got the car in immediately for some diagnostics. In the meantime Cars and Bids was involved enough in the process so far that they actually checked in to see how the pickup went. I told them my concerns with the state of the car at pickup and they immediately stepped up their involvement and asked for me to send the full diagnostic from the dealership. This felt amazing. I immediately felt like even if my car was a complete lemon, I would be taken care of. Unfortunately the dealership didn't have luck. ![iMessage from Porsche techs telling me the cars software is beyond repair](https://notes.ansonbiggs.com/content/images/2023/10/IMG_05741.png) Not a great way to start my road trip. I shot this text off to Cars and Bids along with the paperwork the dealership gave me. Since the techs didn't find an issue they topped up my fluids, checked a few other road trip things and sent me on my way without charging me anything. Bunch of class acts. Shortly after Cars and Bids got the documents the seller wanted to chat again, funny how that works! They were coming across as super apologetic, but were trying to gas light me into seeing these issues as a positive, and that I should be happy to have custom software breaking everything! Now being the overly patient person that I am I told the seller and Cars and Bids to hold tight until I got a second opinion back in Denver. The rest of the road trip was a breeze, the lack of cruise control was brutal at some points but the car was otherwise running beautifully, diesel is awesome for road trips. Cars and Bids continued to check in with me regularly to make sure that things were progressing, and anytime the seller wasn't responding to me they wanted to know and they corrected it. The support was really incredible and helped me stay calm. The good news is Porsche Littleton and Berg Performance (both in Denver) both came to much better conclusions about the issue than Porsche Tysons Corner. *What a relief.* The local dealership said that it was just a module that needed to be replaced for around $1000\. Berg came to the same conclusion so they gave me a discount on the diagnosis because they are awesome like that. Now I was relieved that we had a simple fix, but I still thought that the seller owed me for the repair. There were pictures on the listing showing that now broken features were working before I picked up the car. Obviously the seller disagreed, but Cars and Bids was still keen on getting me a good solution. I provided my proof comparing the listing to what I had picked up and Cars and Bids agreed with me. They barred the seller from access to the platform until they made things right with me. Now being the super chill nice guy that I am, I only expected the cost of the repair, and not any of the diagnosis I paid for. The seller obviously disagreed. We ran the normal gamut of excuses to stall, but in the end I got a check in the mail. Cars and Bids really went above and beyond here. The fee I paid them for the transaction was well worth the mediation and care that they provided me during this process. Had this been a private party Craigslist transaction, or even one with a local dealership I likely would have had to get an attorney involved and at that point I would just be spending money to punish someone without a chance of me coming out break even. It's rare to get any customer service on the internet outside of a business to business context these days, so to have a company working hard to take care of you after a transaction has been completed and they have nothing else to gain is a really rare sight. **I can't promise it will be soon, but as long as Doug owns Cars and bids I will be buying my 911 from the site in the future. 🏎️** ### APIs Are Temporary URL: https://notes.ansonbiggs.com/apis-are-temporary/ Last updated: 2024-05-11T03:58:14.000Z A REST API has always been a great enabler for new projects. I suspect that at this moment, with LLMs being new and enabling so many ideas, that we must be at an all time high for small products being offered where the product is almost entirely a wrapper around an API. There is nothing wrong with this, and ChatGPT has become the de-facto LLM API format in the same way that S3 has for object storage. So, if you have to jump providers at any point it should be as easy as changing a URL. I worked on a fairly successful [Stock and Crypto Chat Bot](https://simplestockbot.com/) for a few years that was just a wrapper. Sure, I did a lot of sleuthing of data to make it presentable. There was also a lot of time spent intelligently caching to save on API calls. However, at the end of the day all of the heavy lifting was being done by exchanges. On top of that the bot only worked on Discord and Telegram meaning that I was completely beholden to them too. I can't bring up the Discord API without mentioning how extremely hostile towards bot developers they were. It was not a fun platform to support. Despite impressive growth and a clear path to profitability, the product ultimately failed due to its heavy reliance on third-party APIs. *What could I do* when Discord took away key interactions that killed usability, ask users to make an account somewhere else? *What could I do* when US Stock Market data pricing sky rocketed, run my own cable to the New York Stock Exchange? *What could I do* when the Cryto hype cycle crashed and no one wanted to provide data anymore, run my own nodes? Realistically, my stock market bot only worked when those services were provided to me. I could have found work arounds or stretched the rules a little on my licensing agreements, but to what end? As long as the product couldn't stand on its own the cycle would continue. Every project that relies on a 3rd party to do something critical that they can't provide for themselves should consider their days numbered. I would be especially scared of LLMs because I think that right now the entire market is being heavily subsidized by Venture Capitalists and Established Tech players. Unless GPT5 sees the same exponential growth (I think it will) then it isn't even remotely profitable to run your own inference hardware for 99% of use cases. LLMs are still far too dumb for the value they provide. In conclusion, while APIs can be a powerful tool for creating new products and services, they also come with inherent risks. Developers must be aware of their reliance on 3rd party services and plan accordingly. LLMs are incredibly hot right now so it is easy to pick on them, but it is important to know that no level of power makes you safe from being shut down when your product relies on an API. Reddit and Twitter 3rd party clients are a great example of a universally loved product disappearing because the host decided it no longer needed to provide options. No one cries over [Flamingo ](https://www.androidcentral.com/flamingo-one-best-twitter-clients-android-dead)or [Tweetbot ](https://tapbots.com/tweetbot/)anymore, and soon no one will even remember [Apollo.](https://apolloapp.io/) Good luck hacking. ### Machine Learning Directed Study: Report 2 URL: https://notes.ansonbiggs.com/2022-04-03-machine-learning-directed-study-report-2/ Last updated: 2025-12-03T14:49:27.000Z ## Gathering Data To get started on the project before any scans of the actual debris are made available, I opted to find 3D models online and process them as if they were data collected by my team. GrabCAD is an excellent source of high-quality 3D models, and all the models have, at worst, a non-commercial license making them suitable for this study. The current dataset uses three separate satellite assemblies found on GrabCAD, below is an example of one of the satellites that was used. ![A 3D model of a satellite with deployed solar panels. The satellite bus is a rectangular structure with exposed framework. The solar panels are arranged in a cross-like configuration, with blue and gold panels. The model is shown against a light gray background with a reflective surface.](https://projects.ansonbiggs.com/posts/2022-04-03-machine-learning-directed-study-report-2/Figures/assembly.jpg) Example CubeSat Used for Analysis, Interfluo ([n.d.](#ref-interfluo6UCubeSatModel)) ## Data Preparation The models were processed in Blender, which quickly converted the assemblies to `stl` files, giving 108 unique parts to be processed. Since the expected final size of the dataset is expected to be in the magnitude of the thousands, an algorithm capable of getting the required properties of each part is the only feasible solution. From the analysis performed in [Report 1](https://gitlab.com/orbital-debris-research/directed-study/report-1/-/blob/main/README.md), we know that the essential debris property is the moments of inertia which helped narrow down potential algorithms. Unfortunately, this is one of the more complicated things to calculate from a mesh, but thanks to a paper from ([Eberly 2002](#ref-eberlyPolyhedralMassProperties2002)) titled [Polyhedral Mass Properties](https://www.geometrictools.com/Documentation/PolyhedralMassProperties.pdf), his algorithm was implemented in the Julia programming language. The current implementation of the algorithm calculates a moment of inertia tensor, volume, center of gravity, characteristic length, and surface body dimensions in a few milliseconds per part. The library can be found [here.](https://gitlab.com/MisterBiggs/stl-process) The characteristic length is a value that is heavily used by the NASA DebriSat project ([Murray et al. 2019](#ref-DebriSat2019)) that is doing very similar work to this project. The characteristic length takes the maximum orthogonal dimension of a body, sums the dimensions then divides by 3 to produce a single scalar value that can be used to get an idea of thesize of a 3D object. ![A diagram illustrating the current mesh processing pipeline. The pipeline begins with a satellite image and converts it into a mesh. The mesh is brought into code represented by summation symbols over x, y, and z. Finally, properties labeled Ix, Iy, and Iz are extracted from the mesh.](https://projects.ansonbiggs.com/posts/2022-04-03-machine-learning-directed-study-report-2/Figures/current_process.svg) Current mesh processing pipeline The algorithm’s speed is critical not only for the eventual large number of debris pieces that have to be processed, but many of the data science algorithms we plan on performing on the compiled data need the data to be normalized. For the current dataset and properties, it makes the most sense to normalize the dataset based on volume. Volume was chosen for multiple reasons, namely because it was easy to implement an efficient algorithm to calculate volume, and currently, volume produces the least amount of variation out of the current set of properties calculated. Unfortunately, scaling a model to a specific volume is an iterative process, but can be done very efficiently using derivative-free numerical root-finding algorithms. The current implementation can scale and process all the properties using only 30% more time than getting the properties without first scaling. ``` Row │ variable mean min median max ─────┼─────────────────────────────────────────────────────────────────── 1 │ surface_area 25.2002 5.60865 13.3338 159.406 2 │ characteristic_length 79.5481 0.158521 1.55816 1582.23 3 │ sbx 1.40222 0.0417367 0.967078 10.0663 4 │ sby 3.3367 0.0125824 2.68461 9.68361 5 │ sbz 3.91184 0.29006 1.8185 14.7434 6 │ Ix 1.58725 0.0311782 0.23401 11.1335 7 │ Iy 3.74345 0.178598 1.01592 24.6735 8 │ Iz 5.20207 0.178686 1.742 32.0083 ``` Above is a summary of the current 108 part with scaling. Since all the volumes are the same it is left out of the dataset, the center of gravity is also left out of the dataset since it currently is just an artifact of the `stl` file format. There are many ways to determine the ‘center’ of a 3D mesh, but since only one is being implemented at the moment comparisons to other properties doesn’t make sense. The other notable part of the data is the model is rotated so that the magnitudes of `Iz`, `Iy`, and `Ix` are in descending order. This makes sure that the rotation of a model doesn’t matter for characterization. The dataset is available for download here: - [scaled\_dataset.csv](https://gitlab.com/orbital-debris-research/directed-study/report-3/-/blob/main/scaled%5Fdataset.csv) ## Characterization The first step toward characterization is to perform a principal component analysis to determine what properties of the data capture the most variation. `PCA` also requires that the data is scaled, so as discussed above the dataset that is scaled by `volume` will be used. `PCA` is implemented manually instead of the Matlab built-in function as shown below: ``` % covaraince matrix of data points S=cov(scaled_data); % eigenvalues of S eig_vals = eig(S); % sorting eigenvalues from largest to smallest [lambda, sort_index] = sort(eig_vals,'descend'); lambda_ratio = cumsum(lambda) ./ sum(lambda) ``` Then plotting `lambda_ratio`, which is the `cumsum`/`sum` produces the following plot: ![A line graph depicting the cumulative variance of different components. The x-axis represents the components (Iz, Iy, Ix, body z, body y, body x, Lc, and Surface Area), and the y-axis represents the cumulative variance ranging from 0.988 to 1. The variance is calculated as ∑i=1Mλi/∑λ, where λ represents the eigenvalues. The plot shows a rapid increase in cumulative variance for the first few components, followed by a plateau.](https://projects.ansonbiggs.com/posts/2022-04-03-machine-learning-directed-study-report-2/Figures/pca.png) PCA Plot The current dataset can be described incredibly well just by looking at `Iz`, which again the models are rotated so that `Iz` is the largest moment of inertia. Then including `Iy` and `Iz` means that a 3D plot of the principle moments of inertia almost capture all the variation in the data. The next step for characterization is to get only the inertia’s from the dataset. Since the current dataset is so small, the scaled dataset will be used for rest of the characterization process. Once more parts are added to the database it will make sense to start looking at the raw dataset. Now we can proceed to cluster the data using the k-means method of clustering. To properly use k-means a value of k, which is the number of clusters, needs to be determined. This can be done by creating an elbow plot using the following code: ``` for ii=1:20 [idx,~,sumd] = kmeans(inertia,ii); J(ii)=norm(sumd); end ``` Which produces the following plot: ![A line graph illustrating the sum of distances to centroids for different numbers of clusters (K). The x-axis represents the number of clusters, ranging from 2 to 20, and the y-axis represents the sum of distances to the centroid. The plot shows a sharp decrease in the sum of distances as the number of clusters increases initially, followed by a gradual flattening of the curve, suggesting diminishing returns with increasing K.](https://projects.ansonbiggs.com/posts/2022-04-03-machine-learning-directed-study-report-2/Figures/kmeans.png) Elbow method to determine the required number of clusters. As can be seen in the above elbow plot, at 6 clusters there is an “elbow” which is where there is a large drop in the sum distance to the centroid of each cluster which means that it is the optimal number of clusters. The inertia’s can then be plotted using 6 k-means clusters produces the following plot: ![A 3D scatter plot showing clusters of data points. The plot's axes represent Inertia x, Inertia y, and Inertia z. Six distinct clusters are represented by different colors and labeled accordingly in a legend.](https://projects.ansonbiggs.com/posts/2022-04-03-machine-learning-directed-study-report-2/Figures/inertia3d.png) Moments of Inertia plotted with 6 clusters. From this plot it is immediately clear that there are clusters of outliers. These are due to the different shapes and the extreme values are slender rods or flat plates while the clusters closer to the center more closely resemble a sphere. As the dataset grows it should become more apparent what kind of clusters actually make up a satellite, and eventually space debris in general. ## Next Steps The current dataset needs to be grown in both the amount of data and the variety of data. The most glaring issue with the current dataset is the lack of any debris since the parts are straight from satellite assemblies. Getting accurate properties from the current scans we have is an entire research project in itself, so hopefully, getting pieces that are easier to scan can help bring the project back on track. The other and harder-to-fix issue is finding/deriving more data properties. Properties such as cross-sectional or aerodynamic drag would be very insightful but are likely to be difficult to implement in code and significantly more resource intensive than the current properties the code can derive. ## References Eberly, David. 2002\. “Polyhedral Mass Properties (Revisited).” .Interfluo. n.d. “6U CubeSat Model | 3D CAD Model Library | GrabCAD.” Accessed February 15, 2022\. .Murray, James, Heather Cowardin, J-C Liou, Marlon Sorge, Norman Fitz-Coy, and Tom Huynh. 2019\. “Analysis of the DebriSat Fragments and Comparison to the NASA Standard Satellite Breakup Model.” In *International Orbital Debris Conference (IOC)*. JSC-E-DAA-TN73918\. . ## Reuse [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) --- *This content was originally posted on my projects website* [*here*](https://projects.ansonbiggs.com/posts/2022-04-03-machine-learning-directed-study-report-2/)*.* ### Machine Learning Directed Study: Report 1 URL: https://notes.ansonbiggs.com/2022-02-14-machine-learning-directed-study-report-1/ Last updated: 2025-12-03T14:49:28.000Z ## Gathering Data To get started on the project before any scans of the actual debris are made available, I opted to find similar 3D models online and process them as if they were data collected by my team. GrabCad is an excellent source of high-quality 3D models, and all of the models have at worst a non-commercial license making them suitable for this study. To start, I downloaded a high-quality model of a 6U CubeSat, which coincidentally enough was designed to detect orbital debris. This model consists of 48 individual parts, most of which are unique. ![A 3D model of a satellite with deployed solar panels. The satellite bus is a rectangular structure with exposed framework. The solar panels are arranged in a cross-like configuration, with blue and gold panels. The model is shown against a light gray background with a reflective surface.](https://projects.ansonbiggs.com/posts/2022-02-14-machine-learning-directed-study-report-1/assembly.jpg) CubeSat Used for Analysis ## Data Preparation To begin analysis of the satellite, fundamental properties from each piece needed to be derived. The most accessible CAD software for me is Fusion 360, but almost any CAD software can give properties for a model. The only way to export the properties from fusion is to my computer’s clipboard. This creates a long process that requires clicking on each part of the CubeSats assembly, then creating a text file and pasting my clipboard to the file. This task was easily automated using an AutoHotkey script to automatically push my computer’s clipboard to a file. Below is an example of each file’s contents, but only a portion of the file for brevity. The text file is generated in a way that makes it difficult to parse, so a separate piece of code was used to collect all of the data from all of the part files and then turn it into a `.csv` file for easy import into Matlab. ``` ... Physical Mass 108.079 g Volume 13768.029 mm^3 Density 0.008 g / mm^3 Area 19215.837 mm^2 World X,Y,Z 149.00 mm, 103.80 mm, 41.30 mm Center of Mass 101.414 mm, 102.908 mm, -0.712 mm ... ``` The entire file of the compiled parts properties from Fusion 360 can be seen [here.](https://gitlab.com/orbital-debris-research/directed-study/report-1/-/blob/main/compiled.csv) This method gave 22 columns of data, but most of the columns are unsuitable for the characterization of 3D geometry. The only properties considered must be scalars independent of a model’s position orientation in space. Part of the data provided was a moment of inertia tensor. The tensor was processed down to \\(I\_x\\), \\(I\_y\\), and \\(I\_z\\), which was then used to calculate an \\(\\bar{I}\\). Then bounding box length, width, and height were used to compute the total volume that the object takes up. In the end, the only properties used in the analysis of the parts were: mass, volume, density, area, bounding box volume, \\(\\bar{I}\\), and material. Some parts also had to be removed because the final dataset is 44 rows and 7 columns. Below is a *Splom* plot which is a great way to visualize data of high dimensions. As you can see, most of the properties correlate with one another. [View Plot as an image](https://projects.ansonbiggs.com/posts/2022-02-14-machine-learning-directed-study-report-1/prepped.svg) Now that the data is processed and clean, characterization in Matlab can begin. The original idea was to perform *PCA*, but the method had difficulties producing meaningful results. This is likely because the current dataset is tiny for machine learning and the variation in the data is high. The application of *PCA* will be revisited once the dataset grows. The first step for characterization is importing our data into Matlab. ``` data = readmatrix('prepped.csv'); ``` Next *k-means* will be used to cluster the data. Since it is hard to represent data in higher dimensions than two, only two columns of data will be provided for the clustering. For now, I think it makes most intuitive sense to treat volume and mass as the most critical columns since the volume vs. mass plot shows 3 reasonably distinct groups. ``` [idx,C] = kmeans(data(:,1:2),3); ``` We can look at the distribution of parts in each cluster to ensure that each cluster has at least a few data points. Since *k-means* is an iterative method that relies on a user guess and randomness, it’s essential to ensure that the clusters make some sense. ``` histcounts(idx) = 22 13 9 ``` Then plotting Volume vs. Mass using our clusters produces the following plot. These make intuitive sense, but it is clear that the dataset needs much more data for **Cluster 3**. ![A scatter plot displays the correlations between several satellite properties, including mass, volume, density, area, box size, Ibar, and material index. Each panel illustrates the relationship between two properties, with the x and y axes representing the different properties, and blue dots marking the data points.](https://projects.ansonbiggs.com/posts/2022-02-14-machine-learning-directed-study-report-1/clusters.svg) Volume and Mass clusters Below is another *Splom*, but with the clusters found above. Since the *k-means* only used Mass and Volume to develop its clusters, some of the properties do not cluster well against each other. This is also a powerful cursory glance at what properties are correlated. [View Plot as an image](https://projects.ansonbiggs.com/posts/2022-02-14-machine-learning-directed-study-report-1/prepped%5Fclustered.svg) ## Next Steps The current dataset needs to be grown in both the amount of data and the variety of data. The most glaring issue with the current dataset is only two different material types. Modern satellites, and therefore their debris, is composed of dozens of unique materials. The other and harder to fix issue is finding/deriving more data properties. Properties such as cross-sectional are or aerodynamic drag would be very insightful, but there is no good way to collect that data. Thankfully, the 3D scanner methods to obtain more properties can be developed and applied over the entire dataset. Once the dataset is grown, more advanced analysis can begin. PCA is the current goal and can hopefully be applied by the next report. Check out the repo for this report for all the code and raw data. ## Reuse [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) --- *This content was originally posted on my projects website* [*here*](https://projects.ansonbiggs.com/posts/2022-02-14-machine-learning-directed-study-report-1/)*.* ### Space Debris Characterization Using Machine Learning Methods URL: https://notes.ansonbiggs.com/2022-02-07-space-debris-characterization/ Last updated: 2025-12-01T03:42:43.000Z 📝 **Important Note** This is a reposting of my research proposal since my Univeristy only posted the abstract and a very low quality image. I removed any information that wasn’t written by me, or anything that could be considered sensitive. ## Project Summary There are currently approximately 23,522 debris objects 10 centimeters in size or larger tracked by NASA, an estimated 500,000 objects 1 centimeter in size or larger, and upwards of 100 million debris objects at least 1 millimeter in size \[[1](#ref-noauthor%5Fspace%5F2022)\]. Furthermore, the average relative velocity of objects in Low Earth Orbit is ten km/s \[[2](#ref-wertz%5Fspace%5F2011)\], which means collisions with even tiny pieces of debris can end a space mission and create more debris. These factors could combine and lead to a vicious cycle where debris causes more debris, potentially creating debris faster than atmospheric drag could remove it and, in an extreme case blocking access to space for decades \[[3](#ref-kessler%5Fcollision%5F1978)\]. Essential factors in predicting the damage due to collision with space debris are its mass, density, speed, and shape. As a result, developing models to predict the orbits of debris and categorizing them based on their shape characteristics is a growing focus for the US and allied space agencies \[[4](#ref-orbital%5Fdebris%5Fresearch%5Fand%5Fdevelopmentinteragency%5Fworking%5Fgroup%5F2021%5F2021)\]. These models are used to maneuver around the upcoming debris or assess the potential damage due to collisions. Current studies have the following shortcomings. Although they only utilize a few shape characteristic factors for space debris classification, namely characteristic length, and average cross-section, they do not consider shape characteristics vital in calculating collision damage, such as ballistic coefficient. This proposal aims to improve state-of-the-art through advanced object classification with the following methodology that utilizes 3D scanning and Machine Learning. First, high-resolution 3D scans of satellite debris are acquired imported in CATIA, and solid models from them are created from which an abundance of shape characteristics factors can be obtained. 3D scanning is followed by employing Machine Learning techniques for reducing the dimensionality of the obtained features (via the Principal Component Analysis) and replacing the current decision trees with more reliable clustering algorithms, such as K-Means Clustering or Artificial Neural Networks. Then this data is processed with Ballistic coefficient and other essential factors in the collision of a satellite with different classes of space debris found from machine learning will be calculated, and further refinement in these clusters will be investigated. ## Project Description ### Project Background With the current accelerating rate of satellites accruing in orbit, collisions are becoming exponentially more likely. Low earth orbit (LEO) suffers the most from Orbital Debris since it is a highly desired altitude, has the least room for satellites, and must be passed through to reach higher altitudes. In addition, stage separations to reach higher orbits may happen in LEO, meaning almost every mission into space creates orbital debris in this critical region. Combined, these factors mean that a cascade event is becoming more likely, and this critical orbital regime is on track to become too hazardous for any level of use. Due to limited tracking technologies, especially for high-altitude orbits, hazard estimation of orbital debris is only possible by utilizing a model that considers the physical characteristics of debris. The current authority on debris modeling comes from the NASA DebriSat program. This program creates mockup satellites that are destroyed using hypervelocity impacts. The debris from the impacts is then collected and tabulated to characterize the orbital debris distribution created from an impact in space. This creates a valuable model for knowing the general makeup of orbital debris but provides insufficient information for more advanced modeling. The methods used by the DebriSat program to characterize their debris involve a purpose-built imaging system that determines the characteristic length of a piece of debris \[[5](#ref-moraguez2015imaging), [6](#ref-cowardin%5Foptical%5F2020)\] which is tabulated with the material and weight of each piece of debris. Then a simple decision tree is used to characterize the debris. Decision trees are a helpful method to categorize data. We propose to use a more advanced approach to improve the cluster characterization of the debris. ### Objectives The materials and construction methods used to create satellites are changing rapidly because the price to orbit is now low enough that new companies can create satellites with unproven designs, and established players can take risks and relax TRL requirements \[[4](#ref-orbital%5Fdebris%5Fresearch%5Fand%5Fdevelopmentinteragency%5Fworking%5Fgroup%5F2021%5F2021), [7](#ref-buchs2021intensifying)\]. However, rapid innovation in this field has the drawback that to keep their models up to date, DebriSat needs to continuously create mock satellites that reflect the cutting edge of satellite manufacturing so that their model can stay relevant. In addition, each test creates tens of thousands of pieces that must be accurately cataloged \[[8](#ref-carrasquilla%5Fdebrisat%5F2019)\], so any new characterization method needs to be fast enough to keep up with changing satellite characteristics. It also means that the essential characteristics of orbital debris may change, so new data must be analyzed and incorporated into models. Another benefit to our approach is that since all the debris we catalog will have a 3D model saved and could potentially be reprocessed in code in the future if new modeling methods are adopted. ### Project Approach Below in [Figure 1](#fig-comparison), you can see an example of the current decision tree method used by DebriSat alongside the advanced 3D scan data science pipeline that we propose. Our method utilizes complex analysis only possible with a high-resolution scan of the models and then uses a variety of machine learning and data science techniques to process the data into useful metrics. Our method is a modern approach that can eventually be developed into complex simulations of debris. ![A flowchart comparing two approaches to debris satellite analysis. The Traditional Approach begins with inspecting the object and determining if it is flexible. If yes, it is labeled FLEXIBLE. If not, it is checked if one axis is significantly longer than others. If yes, it is labeled Bent Plate. If not, the process continues to other classifications. The Our Approach imports scanned geometry into MATLAB, derives data such as moment of inertia, center of mass, aerodynamic drag, density, and material from the 3D scans, and processes the data in a machine learning pipeline to determine impact lethality, accurate orbit propagation, and predictions for future impacts.](https://projects.ansonbiggs.com/posts/2022-02-07-space-debris-characterization/uripropcomparison.svg) Figure 1: DebriSat Approach versus Our Approach Enough samples to get the project started have been provided by Dr. Madler, but as of now, they are entirely uncharacterized. The first step towards characterizing the debris we have is to manually organize them into different clusters. The clusters are based on similar characteristics that can be observed visually to produce a preliminary characterization and are just meant to be a starting point for the MATLAB code. Then three to five samples from each cluster will be scanned to give a somewhat even distribution of what we expect MATLAB to provide for each cluster. When clustering using machine learning methods, every cluster must have a few pieces to ensure minimal outliers in the data. As more data becomes available, the machine learning methods get more powerful. Before being put into MATLAB, every scan will be uploaded into CATIA to take data from the scans and clean up the model. CATIA makes some of the desired characteristics of the debris samples, such as the moment of inertia, the center of gravity, etc., very easy to collect. Future iterations of this project will likely do all processing in MATLAB to reduce the manual labor required for each piece of debris. Below in [Figure 2](#fig-debris) is a render of a real piece of debris scanned by the Rapid Prototyping Lab on campus. Even after reducing the number of points provided by the scanner, the final model has over 1.2 million points, which is an impressive resolution given that the model is only a few inches in length on its longest axis. With debris created by hyper-velocity impacts having such complex shapes, it becomes clear almost immediately that the geometry is far too complex for any sort of meaningful characterization by a human without machine learning techniques. This issue is compounded by the fact that satellites comprise many exotic materials. The DebriSat program uses a simplified satellite to reduce costs, and it still comprises 14 different categories of materials where a category is primarily a way to determine how dense the material is \[[9](#ref-cowardin2019updates)\] and not for each unique material. This also means that the shapes vary wildly since PCBs, wires, batteries, and the aluminum structure reacts entirely differently to a hypervelocity collision. The example in [Figure 2](#fig-debris), and every piece of debris we have at our disposal, are from a hypervelocity impact involving aluminum sheet metal. A dataset of one material type is beneficial at this point since our dataset is still small; it makes sense to start our characterization with a single type of debris. ![A 3d renderr of a thin piece of metal with a lot of bends.](https://projects.ansonbiggs.com/posts/2022-02-07-space-debris-characterization/long.png) Figure 2: Sample Debris Scans Our data collection process gives us much more data than the traditional methods, so machine learning is required to make sense of the data. The first step towards processing our data once it has been tabulated into MATLAB is to perform a principal component analysis (PCA). Utilizing PCA has two significant benefits at this stage of the project in that it reduces the required size of our dataset and decreases the amount of computational power to process the dataset. Reducing our dataset’s dimensionality will allow us to derive what aspects of the orbital debris are truly important for the classification. This may be easy for a human to discern at this stage of the project, but the DebriSat database has almost 200,000 pieces of debris cataloged \[[8](#ref-carrasquilla%5Fdebrisat%5F2019)\], so it is essential to start with an approach that is adaptable to big data and is robust enough to handle the metrics we are trying to classify that are very complex. Once PCA has reduced the dataset, it can be clustered using the k-means method. K-means is a method of categorizing large, complex datasets using pattern recognition. Depending on which insight we are looking for, k-means could produce a valuable result, or it could be a step to much more advanced machine learning methods of analysis. ## Safety Considerations As with any research, safety is the number one priority, and steps need to be taken to ensure that every step of the project is approached as safely as possible. Lucky for this project, the only safety consideration is that the debris pieces can have sharp edges and need to be handled with care. Anyone interacting with the debris will be informed of this risk, and the debris will only be handled in the RPL lab where it is safely stored, and the room also has a first aid kit. That said, the risk of a cut from the debris is very low, and the severity would likely be on the magnitude of a paper cut. ## Outreach Activities Outreach will be performed at the Prescott Regional SciTech Festival, which Embry-Riddle holds on March 5th, but this year will be held virtually. This is an excellent opportunity to share our research with professionals across the STEAM community. Expected Project Outcomes Orbital debris is pollution and is on a visible path towards reaching a point of no return where our access to space could be completely cut off for decades. Even a reduction in space activities could have a long-standing impact on military, commercial and civilian operations \[[7](#ref-buchs2021intensifying)\]. This research will increase our understanding of the current orbital debris environment and enable further research to mitigate new debris by creating more advanced collision avoidance and manufacturing techniques for rockets and satellites that decrease the amount of debris generated. The student researchers will also benefit from performing this project. First, students will learn how to collect a large dataset specifically to make it accessible by the code they write. Then a great deal of work will be spent on analyzing the data, which will rely on knowledge of solid mechanics, space mechanics, materials science, and machine learning to characterize the debris properly. ## References 1.(2022) [Space debris by the numbers](https://www.esa.int/Safety%5FSecurity/Space%5FDebris/Space%5Fdebris%5Fby%5Fthe%5Fnumbers)2.Wertz JR, Everett DF, Puschell JJ (2011) Space mission engineering: The new SMAD. Microcosm Press : Sold; distributed worldwide by Microcosm Astronautics Books, Hawthorne, CA3.Kessler DJ, Cour-Palais BG (1978) Collision frequency of artificial satellites: The creation of a debris belt. J Geophys Res 83:2637\. 4.ORBITAL DEBRIS RESEARCH AND DEVELOPMENTINTERAGENCY WORKING GROUP, SUBCOMMITTEE ON SPACE WEATHER, SECURITY, AND HAZARDS, COMMITTEE ON HOMELAND AND NATIONAL SECURITY, NATIONAL SCIENCE & TECHNOLOGY COUNCIL (2021) 2021 national orbital debris research and development plan. Executive Office of the President of the United States5.Moraguez M, Patankar K, Fitz-Coy N, et al (2015) An imaging system for automated characteristic length measurement of DebriSat fragments. In: International astronautical congress meetong6.Cowardin HM, Hostetler JM, Murray JI, Reyes JA, Cruz CL (2020) Optical characterization of DebriSat fragments in support of orbital debris environmental models. 167.Buchs R (2021) [Intensifying space activity calls for increased scrutiny of risks](https://infoscience.epfl.ch/record/284971/files/IRGC%282021%29.%20Spotlight%20-%20Intensifying%20space%20activity%20calls%20for%20increased%20scrutiny%20of%20risks.pdf?version=1). IRGC8.Carrasquilla RE, Fitz-Coy NG (2019) DebriSat: Generating a dataset to improve space debris models from a laboratory hypervelocity experiment9.Cowardin H, Anz-Meador P, Murray J, et al (2019) Updates to the DebriSat project in support of improving breakup models and orbital debris risk assessments. In: Hypervelocity impact symposium. p V001T10A012 ## Reuse [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) --- *This content was originally posted on my projects website* [*here*](https://projects.ansonbiggs.com/posts/2022-02-07-space-debris-characterization/)*.* ### Notes on Nano URL: https://notes.ansonbiggs.com/2021-11-27-notes-on-nano/ Last updated: 2025-12-03T06:16:56.000Z ## The Current State of Crypto In 2021 news about cryptocurrency has been dominated by *meme coins*. It is without a doubt that the crypto bull runs of 2021 have been thanks to the hype around coins with zero utility besides the ability to rapidly shoot up in value due to carefully constructed tokenomics[1](#fn1). Unfortunately, the hype surrounding coins with actual utility has been disappointingly low in 2021. The current narrative of the most influential coins is that Bitcoin will change financial infrastructure and keep governments from taking our freedom. Ethereum will be the backbone for everything from the internet, to art, to the mortgage on your house. The rest of the top 10 (and most of the top 100) coins by market cap are either smart-contract platforms with little community gunning for Ethereum’s spot or meme coins promising valuations that challenge the wealth of the economy of the world. ## Return of the Utility The coin I want to talk about is Nano (XNO). As of writing, it is ranked #175 by market capitalization. Nano does one thing and executes it perfectly: being a currency. The current market capitalization is far lower than other coins with similar amounts of development and community. Ethereum has a vibrant ecosystem where usage causes more usage. [The figure here illustrates this nicely.](https://twitter.com/domothy/status/1462988092848156677/photo/1) The only way to increase demand for Nano and increase the price is to get it used for everyday transactions which would make the limited supply more scarce. Currencies have so much more to offer the world than just stores of value that can shoot up in price, and I think Nano is the perfect example of that. A coin of pure utility. Data from ([“Kraken” 2021](#ref-kraken%5Fdeposit)) and ([“CoinGecko” n.d.](#ref-coingecko)) Transactions must happen in seconds for a currency to be usable. Above are all the coins listed on Kraken, along with their confirmation time. Confirmation time is the amount of time Kraken recommends waiting before a transaction can be trusted not to be reversed on the blockchain. Kraken’s times are conservative, but I believe them to be a trusted authority on the topic. It’s important to note that most of the coins on this list are not designed with buying coffee in mind, but I think the comparison is still relevant since it is commonly believed that the only thing holding Bitcoin and its derivatives back from being used everywhere is hitting a critical mass of adoption among retail. Bitcoin is making progress, but Bitcoin today is far from being used as a currency. ![Data from (“CoinGecko” n.d.)](https://projects.ansonbiggs.com/posts/2021-11-27-notes-on-nano/fast.svg) {alt-text=“A bar chart titled”Market Caps of Fast Coins” showing the market capitalization of various cryptocurrencies. The x-axis lists the cryptocurrencies ripple, nano, serum, raydium, oxygen, kava, stellar, icon, cosmos, and solana. The y-axis represents market cap in billions of USD. Each bar is colored according to the cryptocurrency’s category: Currency, DeFi, Parachain, and Smart Contract. Solana has the largest market cap, followed by ripple.”} Above are all of the coins capable of settling in less than 1 second, which is about on par with a credit card. I also believe that confirming in less than a second is a benchmark that must be hit to be useful for everyday transactions. Solana stands out the most since it is the only smart contract platform on the list and has the highest market cap. Solana has a ton of potential, but I don’t believe that a coin with a smart-contract platform can compete long-term with a coin specifically designed to be a currency. The DeFi and Parachain coins are more governance tokens than actual cryptocurrencies, so they aren’t designed with the scale required for use as a currency. That leaves Ripple and Nano, which have wildly different market caps. Ripple is quite controversial since it is centralized to the point that I would argue it’s closer to Visa than Bitcoin[2](#fn2). I believe a fraudulent organization runs Ripple, so I don’t want to justify it by talking about it too much here. However, it would be biased not to compare the performance and tokenomics since they are the only two serious projects with the goal to become a currency. | | Nano[3](#fn3) | Ripple[4](#fn4) | | ------------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------------------------- | | Ticker | XNO | XRP | | Symbol | Ӿ | N/A | | Market Cap[5](#fn5) | .650B | 46B | | Transaction Speed | <1 second | 3+ seconds | | Transaction Fee | 0 | 0.00001 XRP[6](#fn6) | | Minimum Nakamoto Coefficient[7](#fn7) | 10[8](#fn8) | 1 | | Supply | All coins minted, no mechanism to remove coins from network. | All coins minted, transactions reduce overall supply. | | Foundation Ownership | Ӿ7 million Developer Fund | Ripple foundation and the founder own well over half of all the coins.[9](#fn9) | | Initial Distribution | Faucets | Initial Coin Offering | ## What is Nano **Nano is fast** because it uses a block-lattice architecture. This means that there is no concept of block times which are the limiting factor for most cryptocurrency’s transaction time. Every wallet has a unique blockchain, and each “block” only contains a single transaction. Since the block is only needed when a transaction is made, wallets can pre-mine a block and hold onto the proof of work. Since each wallet manages its blockchain and proof of work, nodes only need to worry about the balance of each wallet. This enables transactions to be instantly propagated to the network, and the nodes that govern the network only keep track of the balance of each wallet. **Nano is free** to transact because it does not rely on paying miners for proof of work, and it is designed to be efficient so running a node is cheap and does not require support from the network. Bitcoin requires 1900 kWh of power for a single transaction[10](#fn10), whereas Nano is only 0.111 Wh per transaction[11](#fn11) which is a difference of about 17 million percent.[12](#fn12) There are many arguments that no one will run the nodes required to keep the Nano network healthy without proper incentives. Nano can work around this by keeping the requirements to run a Node very low so that the indirect benefits of running a node far outweigh the costs of the hardware. Companies will likely run nodes since running a node will be cheaper than paying transaction fees for other payment methods. The Nano whitepaper goes into great detail about the types of nodes. ## Why isn’t Nano Mainstream Most cryptocurrencies have features that directly benefit other users or network maintainers from being used. Transaction fees fed back into the coin’s ecosystem are a great way to create feedback loops that generate more use for a coin. The incentive structure for Nano is much less direct but arguably much more potent. Established players in the cryptocurrency and payment processor world benefit significantly from having transactions go through them. To single out Coinbase, they have a feature where you can transfer crypto between any other member on the platform instantly and free[13](#fn13). This proprietary feature could create a walled garden that Nano threatens to dismantle. It would be unfair to suggest that Nano’s problems are from big established players fighting innovation. Nano’s most vital features also make it susceptible to spam attacks. Since there is no fee and the network supports dividing 1 Nano into 30 decimal places, attackers can spam the network by sending trace amounts of Nano to random addresses. The ability to send these dust transactions creates a ton of stress on the network and has even ground Nano to a halt in the past[14](#fn14). However, the network did perform better than most had hoped, and the spam attack worked as an excellent verification of Nano’s capabilities. Since then, the development team has focused on solutions to ensure that the issue doesn’t occur again. It is worth noting that although Nano is feeless, it is not free. So, while sending Nano does not cost any Nano, it does cost computation, so attacks on the network are still costly. --- I’ll close this off by saying that I highly recommend any cryptocurrency enthusiast to please read the [Nano Whitepaper](https://content.nano.org/whitepaper/Nano%5FWhitepaper%5Fen.pdf) since it is one of the best cryptocurrency whitepapers, and in my opinion, second only to the original [Bitcoin Whitepaper](https://bitcoin.org/en/bitcoin-paper). I hope that this article was insightful, and even though I am a holder of Nano, I hope that the information is unbiased. If you think Nano is worth checking out, the Nano Foundation has an excellent getting started page: https://nano.org/try-nano ## References “Bitcoin Energy Consumption.” n.d. Accessed November 28, 2021\. .“Coinbase - How to Send Crypto.” n.d. Accessed December 9, 2021\. .“CoinGecko.” n.d. Accessed November 28, 2021\. .Harper, Colin. 2021\. “Nano’s Network Flooded With Spam, Nodes Out of Sync.” .Jain, Anjali. 2021\. “Ripple ‘Guilty of Fraud,’ but Not Securities Law Violations: Messari’s Selkis.” .“Kraken.” 2021, October. .“Nano Is a Digital Currency for Everyone, Without Fees.” n.d. Accessed November 28, 2021\. .“NanoLooker Representatives.” n.d. Accessed November 28, 2021\. .“Ripple Global Instant Payments.” n.d. Accessed November 28, 2021\. .“Shiba Inu Ecosystem.” n.d. .Srinivasan, Balaji S. 2017\. “Quantifying Decentralization.” Earn.com. . ## Footnotes 1. “Shiba Inu Ecosystem” ([n.d.](#ref-Shiba))[↩︎](#fnref1) 2. Jain ([2021](#ref-Jain%5F2021))[↩︎](#fnref2) 3. “Nano Is a Digital Currency for Everyone, Without Fees.” ([n.d.](#ref-nano))[↩︎](#fnref3) 4. “Ripple Global Instant Payments” ([n.d.](#ref-ripple))[↩︎](#fnref4) 5. “CoinGecko” ([n.d.](#ref-coingecko))[↩︎](#fnref5) 6. Subject to change at any moment.[↩︎](#fnref6) 7. Srinivasan ([2017](#ref-Srinivasan%5F2017))[↩︎](#fnref7) 8. “NanoLooker Representatives” ([n.d.](#ref-NLReps))[↩︎](#fnref8) 9. cryptonomist\_xrp[↩︎](#fnref9) 10. “Bitcoin Energy Consumption” ([n.d.](#ref-BTC%5FECI))[↩︎](#fnref10) 11. CanadianVelociraptor\_2018[↩︎](#fnref11) 12. Numbers as of writing. Mining difficulty is variable, and hardware efficiency gets better every day.[↩︎](#fnref12) 13. “Coinbase - How to Send Crypto” ([n.d.](#ref-CoinbaseHowSend))[↩︎](#fnref13) 14. Harper ([2021](#ref-harperNanoNetworkFlooded2021))[↩︎](#fnref14) ## Reuse [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) --- *This content was originally posted on my projects website* [*here*](https://projects.ansonbiggs.com/posts/2021-11-27-notes-on-nano/)*.* ### Understanding the U.S. Treasury's Perspective on Stablecoins URL: https://notes.ansonbiggs.com/highlights-on-the-november-2021-us-report-on-stablecoins/ Last updated: 2024-03-07T22:29:49.000Z The document can be found here: The U.S. Treasury has released a pivotal report addressing stablecoins. This report is crucial in understanding the government's stance on stablecoins, particularly those used for payment purposes, highlights several key areas of concern and recommendations for legislative and regulatory actions. ### Key Concerns and Recommendations 1. **Regulatory Gaps and Prudential Authority**: The report identifies significant gaps in the prudential regulation of stablecoins. It emphasizes the need for Congress to establish a federal prudential framework to consistently and comprehensively regulate "payment stablecoins." 2. **Legislative Actions**: Urging prompt legislative action, the report recommends that stablecoin issuers should be classified as insured depository institutions. This move would bring them under stricter regulatory scrutiny, akin to traditional banking institutions. This is due to the fact that stablecoins are characterized by a promise that the coins can be redeemed for a set value of fiat currency. 3. **Reserve Assets and Redemption Rights**: A notable concern is the lack of standards regarding the composition of stablecoin reserve assets. Additionally, the rights and processes for stablecoin redemption vary considerably, leading to uncertainty about the timing and reliability of redemptions. 4. **Operational Aspects**: The report discusses how stablecoin transactions are recorded, either on the wallet provider's books or through permissioned blockchains, which may offer more certainty regarding network monitoring but also pose concerns about less transparency and security. 5. **Market Size and Growth**: As of October 2021, the market capitalization of stablecoins had reached approximately $127 billion, marking a 500% increase over the previous twelve months. This explosive growth underscores the urgency of regulatory action. 6. **Use in Digital Asset Trading and DeFi**: Stablecoins are central to the functioning of decentralized finance (DeFi) and digital asset trading platforms. They allow users to quickly convert volatile digital assets into more stable ones and are often used as collateral on trading platforms. However, this raises issues of fraud, money laundering, terrorist financing, excessive leverage, and market abuse. 7. **Legal Classification**: Parts of stablecoin arrangements may be classified as securities, commodities, or derivatives, necessitating compliance with federal securities laws. 8. **Systemic Risk and Economic Impact**: The report expresses concern about the systemic risk posed by stablecoins and the potential concentration of economic power. It highlights the need for a comprehensive regulatory framework to ensure stablecoin functionality in both normal and stressed market conditions. 9. **Recommendations for Wallet Providers**: The Treasury suggests that custodial wallet providers should be under federal oversight, with authority to restrict these providers from lending customer stablecoins and impose limits on affiliations with commercial entities or the use of transaction data. ### Conclusion The U.S. Treasury's report on stablecoins is a clarion call for comprehensive legislation and regulation in this rapidly evolving sector. It underscores the need for a balanced approach that addresses the risks posed by stablecoins while recognizing their potential to support beneficial payment options. The report's emphasis on transparency, consumer protection, and financial stability sets the stage for future regulatory developments in the digital asset space. As the market for stablecoins continues to grow and integrate with the broader financial system, these recommendations and insights will likely shape the trajectory of digital asset regulation both in the United States and globally. ### Continuous Integration and Systems Engineering URL: https://notes.ansonbiggs.com/2021-09-27-continuous-integration-and-systems-engineering/ Last updated: 2025-11-30T18:19:56.000Z ## The Problem Working on a complex project that spans multiple domains can be challenging for a small team. In addition, the small team size encourages every team member to keep entirely up to date on the inner workings of every system, but that can add a ton of overhead and make progress slow to a halt. Teammates can also slow meetings to a halt or make low quality project contributions if tasked to contribute on a subsystem they aren’t knowledgeable of. My [Capstone](https://projects.ansonbiggs.com/#category:Capstone) team makes this even harder since all, but one of us are Astronautical Engineers. Astronautical is just a fancy way of saying, “Systems, but every problem is a satellite” so a project like ours with a massive Embedded software aspect can be challenging since the most crucial part of the project is essentially an enigma to a majority of the team. So what we needed was a way for me to write code and to keep the rest of the team up to date without ever having to touch the code and ideally without me having to generate any kind of report manually. ## The Solution With Continuous Integration and a little Python, my GitLab repository automatically builds the latest code, runs the code, produces plots with the results, and makes an executable available if someone is inclined to run the code themselves. The automation means that the project readme is always up to date, and if anyone is wondering how progress is proceeding, they can check the readme and view the current performance in an accessible format. The data availability is also excellent for when my team has to produce a progress report because there is never waiting on the person who can run the code and then build some plots. Unfortunately, the same can’t be said for the other sub-teams who usually have difficulty compiling their progress into a report. ## The Result All of the code being used for the Capstone is public, and the specific repository that I’ve been talking about can be accessed here: https://gitlab.com/lander-team/lander-cpp As you can see, the readme has charts that are always up to date. The `.gitlab-ci.yml` file contains all the build info, and you’ll likely be surprised how simple of a setup it is. ## Reuse [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) --- *This content was originally posted on my projects website* [*here*](https://projects.ansonbiggs.com/posts/2021-09-27-continuous-integration-and-systems-engineering/)*.* ### ISS Eclipse Determination URL: https://notes.ansonbiggs.com/2021-04-14-iss-eclipse-determination/ Last updated: 2025-12-03T14:49:31.000Z Determining the eclipses a satellite will encounter is a major driving factor when designing a mission in space. Thermal and power budgets have to be made with the fact that a satellite will periodically be in the complete darkness of space where it will receive no solar radiation to power the solar panels and keep the spacecraft from freezing. ## What is an Eclipse ![Geometry of an Eclipse](https://projects.ansonbiggs.com/posts/2021-04-14-iss-eclipse-determination/geometry.svg) The above image is a simple representation of what an eclipse is. First, you’ll notice the Umbra is complete darkness, then the Penumbra, which is a shadow of varying darkness, and then the rest of the orbit is in full sunlight. For this example, I will be using the ISS, which has a very low orbit, so the Penumbra isn’t much of a problem. However, you can tell by looking at the diagram that higher altitude orbits would spend more time in the Penumbra. ![A diagram expanding on the last figure, but with distances marked for the radii of the sun and body, and the distance between the body and spacecraft.](https://projects.ansonbiggs.com/posts/2021-04-14-iss-eclipse-determination/vectors_radiuss.svg) Body Radius’s and Position Vectors Here is a more detailed view of the eclipse that will make it easier to explain what is going on. There are 2 Position vectors, and 2 radius that need to be known for simple eclipse determination. More advanced cases where the atmosphere of the body your orbiting can significantly affect the Umbra and Penumbra, and other bodies could also potentially block the Sun. However, we will keep it simple for this example since they have minimal effect on the ISS’s orbit. `Rsun` and `Rbody` are the radius of the Sun and Body (In this case Earth), respectively. `r_sun_body` is a vector from the center of the Sun to the center of the target body. For this example I will only be using one vector, but for more rigorous eclipse determination it is important to calculate the ephemeris at least once a day since it does significantly change over the course of a year. The reason that I am ignoring it at the moment is because there is currently no good way to calculate [Ephemerides](https://ssd.jpl.nasa.gov/?ephemerides) in Julia but the package is being worked on so I may revisit this and do a more rigorous analysis in the future. `r_body_sc` is a position vector from the center of the body being orbited, to the center of our spacecraft. ## The Code Imports `[](#cb1-1)using Unitful [](#cb1-2)using LinearAlgebra [](#cb1-3)using SatelliteToolbox [](#cb1-4)using Plots [](#cb1-5)using Colors [](#cb1-6)theme(:ggplot2)` To get the orbit for the ISS, I used a [Two-Line Element](https://en.wikipedia.org/wiki/Two-line%5Felement%5Fset) which is a data format for explaining orbits. The US Joint Space Operations Center makes these widely available, but https://live.ariss.org/tle/ makes the TLE for the ISS way more accessible ([“ARISS TLE,” n.d.](#ref-ariss)). The Julia Package [SatelliteToolbox.jl](https://github.com/JuliaSpace/SatelliteToolbox.jl) makes it super easy to turn a TLE into an orbit that can be propagated. Simply putting the TLE in a string and using the `tle` string macro like below, we now have access to the information to start making our ISS orbit. ``` ISS = tle""" ISS (ZARYA) 1 25544U 98067A 21103.84943184 .00000176 00000-0 11381-4 0 9990 2 25544 51.6434 300.9481 0002858 223.8443 263.8789 15.48881793278621 """ ``` TLE: Name : ISS (ZARYA) Satellite number : 25544 International designator : 98067A Epoch (Year / Day) : 21 / 103.84943184 (2021-04-13T20:23:10.911) Element set number : 999 Eccentricity : 0.00028580 Inclination : 51.64340000 deg RAAN : 300.94810000 deg Argument of perigee : 223.84430000 deg Mean anomaly : 263.87890000 deg Mean motion (n) : 15.48881793 revs / day Revolution number : 27862 B* : 1.1381e-05 1 / er ṅ / 2 : 1.76e-06 rev / day² n̈ / 6 : 0 rev / day³ Now that we have the TLE, we can pass that into SatelliteToolbox’s orbit propagator. Before propagating the orbit, we need to have a range of time steps to pass into the propagator. The TLE gives the mean motion, n, which is the revolutions per day, so using that, we can calculate the amount of time required for one orbit, which is all that we’re worried about for this analysis. The propagator returns a tuple containing the Orbital elements, a position vector with units meters, and a velocity vector with units meters per second. For this analysis were only worried about the position vector. ``` ISS.mean_motion ``` ``` 15.48881793 ``` ``` orbit = Propagators.init(Val(:SGP4), ISS); time = 0:0.1:((24/ISS.mean_motion).*60*60); propagated = Propagators.propagate!.(orbit, time); r = first.(propagated); # Get distance from propagator ``` We just need to use the radii and vectors discussed earlier to determine if the ISS is in the penumbra or umbra. This is a lot of trigonometry and vector math that I won’t bore anyone with. However, using the diagrams above and following the code in the sunlight function, you should follow what’s happening. For a rigorous discussion, check out ([Vallado 1997](#ref-vallado)). ``` function sunlight(Rbody, r_sun_body, r_body_sc) Rsun = 695_700u"km" hu = Rbody * norm(r_sun_body) / (Rsun - Rbody) θe = acos((r_sun_body ⋅ r_body_sc) / (norm(r_sun_body) * norm(r_body_sc))) θu = atan(Rbody / hu) du = hu * sin(θu) / sin(θe + θu) θp = π - atan(norm(r_sun_body) / (Rsun + Rbody)) dp = Rbody * sin(θp) / cos(θe - θp) S = 1 if (θe < π / 2) && (norm(r_body_sc) < du) S = 0 end if (θe < π / 2) && ((du < norm(r_body_sc)) && (norm(r_body_sc) < dp)) S = (norm(r_body_sc .|> u"km") - du) / (dp - du) |> ustrip end return S end ``` ``` sunlight (generic function with 1 method) ``` Then we can pass all the values we’ve gathered into the function we just made. ``` S = r .|> R -> sunlight(6371u"km", [0.5370, 1.2606, 0.5466] .* 1e8u"km", R .* u"m"); ``` ## Plotting the Results The `sunlight` function returns values from 0 to 1, 0 being complete darkness, 1 being complete sunlight, and anything between being the fraction of light being received. Again since the ISS has a very low orbit, the amount of time spent in the penumbra is almost insignificant. Code `[](#cb9-1)# Downsample for plotting (keep ~1000 points for visual fidelity) [](#cb9-2)n_points = length(S) [](#cb9-3)step = max(1, n_points ÷ 1000) [](#cb9-4)idx = 1:step:n_points [](#cb9-5)S_plot = S[idx] [](#cb9-6) [](#cb9-7)# Get fancy with the line color. [](#cb9-8)light_range = range(colorant"black", stop=colorant"orange", length=101); [](#cb9-9)light_colors = [light_range[unique(round(Int, 1 + s * 100))][1] for s in S_plot]; [](#cb9-10) [](#cb9-11)plot( [](#cb9-12) LinRange(0, 24, length(S_plot)), [](#cb9-13) S_plot .* 100, [](#cb9-14) linewidth=5, [](#cb9-15) legend=false, [](#cb9-16) color=light_colors, [](#cb9-17)); [](#cb9-18) [](#cb9-19)xlabel!("Time (hr)"); [](#cb9-20)ylabel!("Sunlight (%)"); [](#cb9-21)title!("ISS Sunlight Over a Day")` ISS Sunlight Looking at the plot, the vertical transition from 0% to 100% makes it pretty clear that the time in the penumbra is limited. Still, almost counterintuitively, it also looks like the ISS gets more sunlight than it does darkness. So, using the raw sunlight data, we can calculate precisely how much time is spent in each region. Time in Sun: ``` sun = length(S[S.==1]) / length(S) * 100 ``` ``` 62.04757721886597 ``` Time in Darkness: ``` umbra = length(S[S.==0]) / length(S) * 100 ``` ``` 37.627951167918546 ``` Time in Penumbra: ``` penumbra = 100 - umbra - sun ``` ``` 0.32447161321548634 ``` This means that even with the ISS’s low orbit, it still gets sunlight \~62% of the time and spends almost no time in the penumbra. This would vary a few percent depending on the time of year, but in a circular orbit like the ISS, the amount of sunlight would remain pretty constant. There are other orbits like a polar orbit, lunar orbit, or highly elliptic earth orbits that can have their time in the sunlight vary widely by the time of year. ## References “ARISS TLE.” n.d. *Amateur Radio on the International Space Station*. .Vallado, David A. 1997\. *Fundamentals of Astrodynamics and Applications, 2nd. Ed.* Edited by Wiley Larson. Dordrecht: Microcosm, Inc. ## Reuse [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) --- *This content was originally posted on my projects website* [*here*](https://projects.ansonbiggs.com/posts/2021-04-14-iss-eclipse-determination/)*.* ### Air Propulsion Simulation URL: https://notes.ansonbiggs.com/2021-04-01-air-propulsion-simulation/ Last updated: 2025-12-03T14:49:33.000Z For Capstone my team was tasked with designing a system capable of moving mining equipment and materials around the surface of the Moon using a propulsive landing. The system had to be tested on Earth with something feasible for our team to build in 2 semesters. One of the first considerations my capstone advisor wanted was to test the feasibility of an air propulsion system instead of the obvious solution that of using solid rocket motors. This document is just *napkin math* to determine if the system is even feasibly and is not meant to be a rigorous study of an air propulsion system that would easily keep a capstone team busy by itself. Imports `[](#cb1-1)using Plots [](#cb1-2)plotlyjs() [](#cb1-3) [](#cb1-4)using Unitful [](#cb1-5)using DataFrames [](#cb1-6)using Measurements [](#cb1-7)using Measurements: value, uncertainty [](#cb1-8)using CSV` ## The Simulation I chose an off-the-shelf paintball gun tank for the pressure vessel. The primary consideration was the incredible pressure to weight ratio, and the fact that it is designed to be bumped around would be necessary for proving the safety of the system further into the project. ``` # Tank https://www.amazon.com/Empire-Paintball-BASICS-Pressure-Compressed/dp/B07B6M48SR/ V = (85 ± 5)u"inch^3"; P0 = (4200.0 ± 300)u"psi"; Wtank = (2.3 ± 0.2)u"lb"; Pmax = (250 ± 50)u"psi"; # Max Pressure that can come out the nozzle ``` The nozzle diameter was changed until the air prop system had a *burn time* similar to a G18ST rocket motor. The propulsion system’s total impulse is not dependant on the nozzle diameter, so this was just done to make it plot nicely with the rest of the rocket motors since, at this time, it is unknown what the optimal thrust profile is. ``` # Params d_nozzle = ((1 // 18) ± 0.001)u"inch"; a_nozzle = (pi / 4) * d_nozzle^2; ``` These are just universal values for what a typical day would look like during the summer in Northern Arizona. ([Çengel and Boles 2015](#ref-cengel%5Fthermodynamics)) ``` # Universal Stuff P_amb = (1 ± 0.2)u"atm"; γ = 1.4 ± 0.05; R = 287.05u"J/(kg * K)"; T = (300 ± 20)u"K"; ``` The actual simulation is quite simple. The basic idea is that using the current pressure, you can calculate \\(\\dot{m}\\), which allows calculating the Thrust, and then you can subtract the current mass of air in the tank by \\(\\dot{m}\\) and recalculate pressure using the new mass then repeat the whole process. The bulk of the equations in the simulation came from ([Çengel and Boles 2015](#ref-cengel%5Fthermodynamics)), while the Thrust and \\(v\_e\\) equations came from ([Sutton and Biblarz 2001](#ref-sutton%5Frocket%5F2001), eq: 2-14). \\\[ T = \\dot{m} \\cdot v\_\\text{Exit} + A\_\\text{Nozzle} \\cdot (P - P\_\\text{Ambient}) \\\] The initial pressure difference is 4190.0 ± 300.0 psi, which is massive, so the area of the nozzle significantly alters the thrust profile. The paintball tanks come with pressure regulators, in our case, 800 psi which is still a huge number compared to atmospheric pressure. While the total impulse of the system doesn’t change with different nozzle areas, the peak thrust and *burn time* vary greatly. One of the benefits of doing air propulsion and the reason it was even considered so seriously is that it should be possible to change the nozzle diameter in flight, allowing thrust to be throttled, making controlled landing easier to control. ``` t = 0.0u"s"; P = P0 |> u"Pa"; M = V * (P / (R * T)) |> u"kg"; ts = 1u"ms"; df = DataFrame(Thrust=(0 ± 0)u"N", Pressure=P0, Time=0.0u"s", Mass=M); while M > 0.005u"kg" # Calculate what is leaving tank P = minimum([P, Pmax]) ve = sqrt((2 * γ / (γ - 1)) * R * T * (1 - P_amb / P)^((γ - 1) / γ)) |> u"m/s" ρ = P / (R * T) |> u"kg/m^3" ṁ = ρ * a_nozzle * ve |> u"kg/s" Thrust = ṁ * ve + a_nozzle * (P - P_amb) |> u"N" # Calculate what is still in the tank M = M - ṁ * ts |> u"kg" P = (M * R * T) / V |> u"Pa" t = t + ts df_step = DataFrame(Thrust=Thrust, Pressure=P, Time=t, Mass=M) append!(df, df_step) end ``` ## Analysis Below in figure 1, the result of the simulation is plotted. Notice the massive error once the tank starts running low. This is because the calculation for pressure has a lot of very uncertain variables. This is primarily due to air being a compressible fluid, making this simulation challenging to do accurately. The thrust being below 0 N might not make intuitive sense, but it’s technically possible for the pressure to compress, leaving the inside of the rocket nozzle with a pressure that’s actually below atmospheric pressure. The effect would likely last a fraction of a second, but the point stands that this simulation is wildly inaccurate and only meant to get an idea of what an air propulsion system is capable of. ``` thrust_values = df.Thrust .|> ustrip .|> value; thrust_uncertainties = df.Thrust .|> ustrip .|> uncertainty; time_values = df.Time .|> ustrip; # Downsample for plotting (keep ~1000 points for visual fidelity) n_points = length(thrust_values) step = max(1, n_points ÷ 1000) idx = 1:step:n_points air = DataFrame( Thrust=thrust_values[idx], Uncertainty=thrust_uncertainties[idx], Time=time_values[idx] ); plot(air.Time, air.Thrust, title="Thrust Over Time", ribbon=(air.Uncertainty, air.Uncertainty), fillalpha=0.2, label="Thrust", xlabel="Time (s)", ylabel="Thrust (N)", ) ``` Air Propulsion Simulation In Figure 2, the air propulsion simulation is compared to commercially available rocket motors. This early in the project, we have no idea whether short burns or longer burns are ideal for a propulsive landing, so the air propulsion system was compared to a variety of different motors with unique profiles. ``` f10 = CSV.read("AeroTech_F10.csv", DataFrame); f15 = CSV.read("Estes_F15.csv", DataFrame); g8 = CSV.read("AeroTech_G8ST.csv", DataFrame); plot(air.Time, air.Thrust, label="Air Propulsion", legend=:outertopright); for (d, l) in [(f10, "F10"), (f15, "F15"), (g8, "G8ST")] plot!(d[!, "Time (s)"], d[!, "Thrust (N)"], label=l) end title!("Propulsion Comparison"); xlabel!("Time (s)"); ylabel!("Thrust (N)") ``` Rocket Motor Data: ([Coker, n.d.](#ref-thrustcurve)) In the end, the air propulsion system’s performance has a very impressive total impulse and, with more time and resources, could be a serious option for a propulsive landing on Earth. One of the largest abstractions from the Moon mission that the mission here on Earth will have to deal with is the lack of Throttling engines since any propulsion system outside of model rocket motors is well beyond the scope of this Capstone. ## Future Work After determining that solid model rocket motors are the best option for the current mission scope, the next step is determining what motor to use. There are many great options, and deciding what thrust profile is ideal may have to wait until a Simulink simulation of the landing can be built so that the metrics of each motor can be constrained more. Instead of throttling motors, the current working idea is that thrust vector control may be a way to squeeze a little more control out of a solid rocket motor. Thrust Vector Control will undoubtedly be challenging to control, so another essential piece that needs exploring is whether an LQR controller is feasible or if a PID controller is accurate enough to control our system. Codebase: ## References Çengel, Yunus A., and Michael A. Boles. 2015\. *Thermodynamics: An Engineering Approach*. Eighth edition. New York: McGraw-Hill Education.Coker, John. n.d. “Rocket Motor Data.” .Sutton, George P., and Oscar Biblarz. 2001\. *Rocket Propulsion Elements*. 7th ed. New York: John Wiley & Sons. ## Reuse [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) --- *This content was originally posted on my projects website* [*here*](https://projects.ansonbiggs.com/posts/2021-04-01-air-propulsion-simulation/)*.* ### How to use Mermaid on your Ghost Blog URL: https://notes.ansonbiggs.com/how-to-use-mermaid/ Last updated: 2024-09-23T07:46:15.000Z ## What is Mermaid? graph TD; A-->B; A-->C; B-->D; C-->D; Diagrams like the one above usually require expensive software to create and have GUIs that can be a pain to use. Mermaid fixes this with a Markdown style approach by using a simple syntax to generate beautiful diagrams, flowcharts and even GANTT Charts quickly. For example, the above flowchart was easily made with the following code. ``` graph TD; A-->B; A-->C; B-->D; C-->D; ``` Mermaid has a large variety of chart types and many other features that cover pretty much all the bases for any sort of diagram or chart you would want to make. [**The official documentation is the best resource to find out more.**](https://mermaidjs.github.io/) Mermaid support in markdown editors is becoming more popular, but unfortunately, Ghost Markdown does not support this feature. Luckily, it is effortless to add to a Ghost Blog so you can get working. ## Adding Mermaid to Ghost graph TD; A\[Open Admin Interface\] --> B\[Open Code Injection\] B --> C\[Paste Code\] C --> D\[???\] D --> Profit??? It's really as simple as the diagram makes it. 1. Open the ghost Admin Interface, i.e. www.yourblog.com/ghost 2. Open the *Code Injection* Tab 3. Paste the following code into the blog header section, making sure that the version is the most recent which can be [found here](https://unpkg.com/mermaid@8.0.0/dist/) ```javascript ``` Then your blog should be able to render Mermaid. Unfortunately it doesn't work natively in markdown with code blocks but using html makes it render fine like the example below. ```html
graph TD; A[Open Admin Interface] --> B[Open Code Injection] B --> C[Paste Code] C --> D[???] D --> Profit???
``` ### How to Export Fusion 360 files to Other File Types URL: https://notes.ansonbiggs.com/2018-09-12-how-to-export-fusion-360-files-to-other-file-types/ Last updated: 2025-12-01T15:23:07.000Z A major downfall of Fusion 360 is its lack of exporting options and its overall lack of interoperability with other CAD software. Its main filetype `.f3d`, seems to be closed source and isn’t supported by any other programs. A naive approach of exporting to an intermediary format like `.step` or `.obj` then using something else like Autodesk Inventor or Blender to export to your final filetype from is likely to cause artifacts, loss of dimensions, and be a slow manual process. Luckily Fusion has more export options built-in, but they don’t show the functionality in their desktop program. ## [Go to the Autodesk 360 Dashboard](https://myhub.autodesk360.com) Going to will give you a similar looking Project and file options as the data panel in the Desktop version. Navigate to your model and open it. Whether you are in the Design View or the 3D View in the top right corner, you’ll have a few options to choose from. Clicking the download button provides you with a ton more options than the desktop version offers. Unfortunately, you cannot download straight from the website as it takes time to convert, so you have to wait for an email. In my experience, this usually takes less than a minute although I would imagine more complex models take more time. Below I have a list of every file-type that can be exported and a quick summary of what they are good for. ![A screenshot of the export options in Fusion 360. The options are Fusion 360 Archive, Inventor 2016, IGES, SAT, SMT, STEP, DWG, DXF, STL, FBX, SketchUp, and OBJ.](https://projects.ansonbiggs.com/posts/2018-09-12-how-to-export-fusion-360-files-to-other-file-types/websiteExport.png) List of Export Options ## Fusion 360 Export Formats The file extension doesn’t give much information about what a format actually is so I aim to give a brief description of each export format below. Basic rule of thumb as of writing is to export as an `.stl` if your 3D printing, and `.obj` if your going to a different piece of software to work on the model. | FORMAT | WHAT ITS GOOD FOR. | | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Fusion 360 Archive | Provides a .f3d file-type which is a proprietary file-type for Fusion 360\. Preserves full model functionality when opened in any Fusion 360, and is a great way to make personal backups of Fusion Models. | | Inventor 2016 | Downloads either a single .ipt if the part is a single component, or multiple .ipt files and a .iam if your Fusion model contains multiple components. .ipt is an Inventor Part file, and .iam is an Inventor Assembly file. The models lose all parametric abilities, but keep dimensions and shape. | | IGES | .iges is an open CAD format and should be usable in any CAD software. Does not retain any parametric elements | | SAT | Developed by Dassault Systems but is a pretty widely accepted file-type for CAD software. Does not retain any parametric elements. | | SMT | Only usable by Fusion 360 and Inventor 2019 | | STEP | .step is an open CAD format and should be usable in any CAD software. Does not retain any parametric elements | | DWG | Autodesk AutoCAD file format. Exports a wireframe of your model. Great for exporting to AutoCAd but otherwise useless. | | DXF | Drawing format. Exports a wireframe of your model. Much better off making an actual drawing in fusion then exporting a .dxf | | STL | .stl is an open standard used by most 3D modeling and CAD programs and is great for 3D printing, keep in mind that units are not stored in .stl formats, so it is important to remember what units your model was created in. If you aren’t prompted by the soft then it likely assumed millimeters so you may need to convert yourself by scaling the model. | | FBX | Autodesk owned file format. No real use in CAD and doesn’t preserve dimensions so you end up with a tiny model. | | SketchUp | Exports a .skp which opens in SketchUp perfectly, Great if you want to use your part in a SketchUp Project. | | OBJ | .obj or Object is an open format and the geometry should be workable in most 3D modeling or CAD programs. | *If you have anything to add to this table please contact me.* ## Reuse [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) --- *This content was originally posted on my projects website* [*here*](https://projects.ansonbiggs.com/posts/2018-09-12-how-to-export-fusion-360-files-to-other-file-types/)*.* ### Simplifying Fusion 360 for Beginners URL: https://notes.ansonbiggs.com/biggest-rules-of-modeling-in-fusion-360/ Last updated: 2026-09-06T04:11:45.000Z I recently had my friend create a model for me to 3D print and it became immediately clear that while Fusion 360 is widely available, it is not as beginner friendly as most people online make it seem. This guide aims to highlight a few things that are not as straightforward, or even really mentioned at all in the Fusion interface. ### Set Z-Axis as Up ![Fusion 360 settings menu where the default modeling orientation is being changed to Z up](https://notes.ansonbiggs.com/content/images/2025/06/zUP.png) Fusion 360 settings menu where the default modeling orientation is being changed to Z up For some odd reason, Fusion defaults to Y-Up, every other program uses Z-Up so if you ever import anything to another program it is going to be sideways. Change this when you get started and save yourself some headache later. ### Start Every Project with a New Component ![New Component button from Fusion 360](https://notes.ansonbiggs.com/content/images/2025/06/createComponent-1.png) New Component button from Fusion 360 In a quick 5-minute project you can probably get away with just doing an entire project without making a component, but for anything larger making a component will make your life much easier. Keeping the timeline clean is extremely advantageous for multiple reasons. Mainly it allows you to easily go back in time and make changes to each part, instead of scrolling through a massive timeline that's full of every modifier that you've used. Fusion ~~can be~~ is buggy. The most common issue I come across is when a Modifier doesn't want to update or editing it makes everything after it break. While these issues still occur when your project is broken into components, it is much easier to manage when it does. Most of the time you just have to scrub back in the timeline to where you made a feature and do the feature over again from scratch. For some modifiers, this isn't an issue in the slightest, but sometimes you have a mirror with 15 features selected and it can be a pain to find them all when your timeline is massive. ### Use Parameters for Large Projects ![Fusion 360 parameters value editor](https://notes.ansonbiggs.com/content/images/2025/06/parameters.png) Fusion 360 parameters value editor Parameters are like writing comments in Code. In my opinion, there is nothing worse than having to go through an old model trying to make a simple change when you must search for where that change is defined, or even worse if the value is used multiple times so you have to go hunting for it. Parameters make life easier for current you, future you, and any other poor soul that might have to modify your file. You can also leave comments on parameters for added brownie points with future you. ### Use the Browser to Hide Unnecessary Items ![Fusion 360 browser tree](https://notes.ansonbiggs.com/content/images/2025/06/browserTree.png) Fusion 360 browser tree This one is basic; the Browser hides a ton of functionality in it and most of the time it is easier to keep anything that isn't necessary for what you're doing at the moment hidden. If you still have a mess of lines and faces on your screen long pressing the left mouse button can be a tremendous help. It is also good to note that you can unhide old sketches to use them again. ### Offset Planes and the Loft Tool ![Example of a loft between a circle and a square](https://notes.ansonbiggs.com/content/images/2025/06/loftAndOffsetPlanes.png) Example of a loft between a circle and a square In parametric modeling, it's easy to get stuck in the mindset of just wanting to start everything as cubes and cut them down to the shape you want, but the loft tool wants to do this work for you. You can create two sketches with the geometry you need, have one sketch use the default plane (or define a plane however you want), then the other on an offset plane, click both profiles with the loft tool open and you're off to the races. This is the closest that Fusion will probably ever get to the amazing Generative Design Tools that CATIA has, but this pretty much gets you where you need to go. ### McMaster-Carr Integration is awesome ![Screenshot of the McMaster-Carr download page](https://notes.ansonbiggs.com/content/images/2025/06/mcMasterCarrImport.png) Screenshot of the McMaster-Carr download page This integration completely takes the guesswork out of making holes for nuts, bolts, or one of the literally thousands of modeled parts. I generally import .step models and they look great, import with the part number as the item name, and are dimensionally correct. This takes literally all the guesswork out of working with these kinds of components ### Cryptocurrency Rankings URL: https://notes.ansonbiggs.com/cryptocurrency-rankings/ Last updated: 2026-02-24T04:19:22.000Z There are hundreds of cryptocurrencies out there with a massive range in quality. I get asked about different coins a lot so I figured I would start compiling my opinions. That said this list is highly opinionated, but unlike most crypto discussions, almost entirely non speculative. Opinions are my own, not investment advice. Even if my analysis is correct it doesn't mean that the market will react correctly. ## Innovators Coins that are going to change the world ## Nano By far the most underrated coin there is. Instant, feeless transactions with a clear path to planet scale usage. Nano is literally going to run Visa out of town in a few years. [Notes on NanoAnson’s Projects - Notes on Nano discusses the current state of cryptocurrency, highlighting the dominance of meme coins in 2021, while utility-focused coins have received less attention. The article emphasizes the potential of Nano (XNO), which is designed as a currency and offers rapid transaction speeds, making it suitable![](https://notes.ansonbiggs.com/content/images/size/w256h256/format/jpeg/2023/11/pillars-1.jpg)Anson's NotesAnson Biggs![](https://projects.ansonbiggs.com/posts/2021-11-27-notes-on-nano/banner.jpg)](https://notes.ansonbiggs.com/2021-11-27-notes-on-nano/) I did an in depth breakdown awhile ago I think the only thing holding Nano back is that it doesn't have any tokenomics (economic feedback loops) that make the network grow from usage. The price will rise with increased usage because all of the coins have already been minted, but there are no mechanisms to automatically burn or mint coins based on usage patterns. This is good and bad, Nano is built to be the best currency in the world, and only that. It just means that it will never really see growth due to speculation and the only way it can grow is by being so much better than government issued currencies that it takes over, which is a ridiculously tall order. ## Ethereum I have never seen a project innovate as fast as Ethereum. The living whitepaper is almost impossible to keep up with, and it isn't all just research either, the project actively implements groundbreaking new features all the time. When you see a coin call itself an Ethereum killer, it’s definitely a scam. It might implement one feature better than Ethereum, but it won’t ever match Ethereum’s feature parity. One of the key differentiators for Ethereum compared to the other established-large-cap projects is that it is constantly updating and evolving. I think for someone to take the throne would require a massive breakthrough that will be immediately apparent, or a complete paradigm shift in how we look at computing. ## I want to succeed Coins searching for solutions to challenging problems, where there may not be a resolution ## Chainlink I'm still not convinced that Oracles are a solvable problem, but if anyone is able to figure it out I think it will likely be the team at Chainlink. ## Filecoin Distributed file storage using blockchain for payments and security. The team behind Filecoin also works on [IPFS](https://www.ipfs.com/) which is a fantastic idea that is plagued by low performance. Hard to tell if IPFS is failing because it's a ridiculously hard problem or if it's just the wrong team working on it. Their presentation at Consensus 2023 was one of the best of the entire conference. ## Underrated Coins that do something well and don't get enough credit for it ## Monero You should be able to move money without anybody knowing. Monero provides that security. ## Overrated Everyone else loves them but me ## Bitcoin The king of crypto. I personally don't believe Bitcoin will ever gain utility, at best it becomes gold alternative. The development community is constantly gridlocked and unable to make progress, the small updates that do make it to production are usually too washed out to make a difference. There is a lot of money tied up in keeping Bitcoin in its current restricted state, which will eventually lead to its demise. The ecosystem is managed by rent seekers that make huge profits from the congested broken state of Bitcoin. ## Cardano I respect that Cardano takes a very research forward approach to development, and when it was new to the market it was really ahead in a few key areas. Over time it's failed to keep its edge over other projects so I don't see why anyone would buy it anymore. ## Probably going to take all of your money Not outright scams, but your money likely isn't safe either ## Solana This is where all the American Venture Capital has gone for the past few crypto hype cycles. Solana is an incredibly performant coin, but this is achieved because its nodes are on a datacenter scale. In theory, this means that the blockchain is not actually distributed or verifiable, and that has mostly proven to be true so far. If you believe in a Cyperpunk future where mega corps own everything then you should hold some Solana. ⚠️ The bull run of March 2024 has seen meme coins reach a new low, but with much larger explosions in price. The Solana team has really been pushing these coins, and even making some themselves. ## Doge Elon likes it so it isn't cool anymore. Honestly, I think the team behind Doge is very competent, but the forces of memes are way stronger. So, holding Doge is always going to be a massive gamble. Elon being in the White House will certainly make the coin go crazy at some point so if you are already holding I would wait for that. ## Scams Coins that literally only exist to steal your money ## Ripple Centralized. The foundation owns 2/3 of all the coins. The CEO has a very poor track record. Banks are the target customers of Ripple but I don't see any path to mass adoption. ## Tether Stablecoins in general require extra caution, but Tether deserves extra scrutiny. Tether is the largest stablecoin by market cap and has yet to prove that its reserves actually exist. The US government is well aware of the issue and has taken many actions so hopefully we get some closure on whether they can be trusted in the near future. ## Polkadot I think that the leadership is full of snake oil salesmen, but even dismissing that cross chain transactions are a very bad idea and I don't think Polkadot has a working solution. ## {Insert Meme Coin Name} Do I even need to say this? It doesn't matter if Dave Portnoy or Reddit or Twitter is hyping up some shitcoin, its pretty much a given that you will lose all of your money. The creators of these coins aren't doing it to be funny. They are carefully crafting a community and an image that they can grow until they rug pull.