Anatomy of a modern arrow

This is an entry in my series Things I learned. Here is a brain dump of what I’ve learned so far about arrows used in contemporary recurve archery.

A modern arrow consist of at least 4 elements:

  1. a point, some kind of metal. This is the pointy bit that should always point away from the archer (and anyone else)
  2. a shaft, often made of carbon; also from aluminum or a mix of carbon and metal
  3. 3 times fletching, usually plastic vanes
  4. a nock, made of plastic. Plops into the shaft directly or with some metal pin in between. This is where the arrow attaches to the string of the bow.
Photo of one of my arrows, labelling the 4 elements describe above (point, shaft, feltching, nock)

These elements contribute to a varying degree to the most important variable of an arrow: spine. Spine describe the stiffness or elasticity of the arrow. The spine needs to be aligned with the arrow length and the draw weight. It’s measured in a specific way the leads to values like 600 (300 would be a very stiff arrow, 1200 a very soft one). To learn more about why arrows need to bend when shot, look for the Archer’s Paradox. For example this Smarter Every Day video explains it:

The Archer’s Paradox in SLOW MOTION – Smarter Every Day 136 on YouTube

Let’s go into a bit more detail in each of the four elements:

Point

These come in different shapes and weights. For recurve target archery, they usually look like this:

Recurve points with different weights, measured in grains (source)

Most of the component is glued inside the shaft, only the tip is out in front of it. The weight of the point influences the arrow’s spine: With more point weight, the arrow behaves softer, with less weight it behaves firmer.

Shaft

Focusing on thin carbon arrows for outdoor target archery, the two variables for the shaft are the length and spine.

The length of the shaft needs to match the anatomy of the archer (basically relative to the length of the draw arm). This can initially be measured with a measuring arrow (a thick arrow without a point, with a scale on it).

The spine needs to match the draw weight of the archer, based on the pressure on the fingers at full draw. Finding the right spine value can initially be done with charts provided by arrow manufacturers.

Screenshot from Easton’s arrow size selection chart (source)

Fletching

Fletching are the three “feathers”, usually in the form of plastic vanes, glued near the nock end of the arrow on the shaft. There is a lot variety in shapes and colors:

Screenshot from Elias Bogensport

Fletching strongly influences how an arrow behaves in flight.

Nock

A nock is a small plastic part that attaches to the end of the shaft. There’s various constructions – some stick directly into the shaft, others sit on top of a small metal pin. Nocks end up being hit by other arrows – the metal pin is supposed to protect the shaft when that happens.

Screenshot from Elias Bogensport

The nock connects the arrow to the bow string, so the size of the nock needs to match the width of the string. When nocking an arrow and holding the bow horizontally, the arrow should stick to it. When tapping the string from the top, the arrow should fall down.

Assembling

So far I haven’t built my own arrows from scratch. I had to replace nocks, which is by far the most trivial (stick ’em in). I also replaced vanes, for which I recently bought my own fletching tool, a Bitzenburger:

Photo of a Bitzenburger fletching tool

Glueing the point into the shaft doesn’t look too complicated either, but it does involve an open flame:

As with everything, there’s a lot more detail to look into, like measuring radial stiffness of each shaft and indexing it accordingly.

Making of a shared path

This is an entry in my series Things I learned. Here I learned the value of sending many emails and not to be afraid of dog poop.

In December 2017 we moved into our current apartment. Back then, there was a path nearby, that looked promising, but ended after 5 meters. There was a sign covered by a black plastic bag. After some years, the bag had fallen apart and revealed a sign for a shared pedestrian and bike path:

Photo of the 5m of unfinished path, used by 2 cars for parking.
Note the tree and shrubs behind the white van – nothing there indicating a path.

If this path would exist, we could use it as a shortcut, saving 250m on foot or bike:

Google Maps screenshot showing two connections: 350m around the north, 105m going straight.
Google Maps screenshot showing two connections: 350m around the north, 105m going straight.

In the summer of 2021 I asked my contact in the city administration (Stadtverwaltung), who’s involved in planning bike infrastructure in our district, about this. At first he said that due to a school being planned in the area to the north (the grey area in the screenshot above, inside the blue dotted path), he couldn’t give me details, but forwarded the question to the responsible department.

Half a year later, we didn’t have any update and nothing was being built. But by coincidence, a friend and me found some plans for this city quarter from 2003 (19 years old!) where this path was already included:

City planning map from 2003 indicating the path

That was in January 2022. It took a bunch more emails and another one and a half years, till August 2023, that the construction actually started. By then the new school had already opened.

Another photo of the same path, with a parking forbidden sign next to the pedestration/bike path sign and a digger at the other end.

I found it somewhat amusing that the first thing they did was to damage the poor blue sign that had been standing there uselessly for 6+ years. At least it had the company of this parking forbidden sign, which had seen things:

A badly scratched parking forbidden sign, in detail

By October 2023 they even finished the 3 lamps:

The finished path, with some street lights visible on the right of it, partly covered by 3 trees.

When the path was finally done, we started using it quite often. A year later in August 2024, my son started going to school. And since he went to the new school to the north of the path, we’ve been using this path twice daily.

Part 2

Since I feel like having some responsibility for this path, and use it so often, I noticed a growing problem: While many people use this path, some drop their trash there, which mostly ends up in the shrubs on the side. And people walk their dogs here – and some leave their dog poop behind, on the path.

My first attempt at fixing this problem was a trash collection done with some kids who live close by or go to the same school. In November 2024 I registered this as an AWB (the city organization usually responsible for keeping the city clean) Putzmunter event, which at least ensured that the trash bags we filled would get picked up the next day. I borrowed some tools from KRAKE, who also provided me with gloves and trash bags (I could’ve picked those up from AWB, too). With about 15 people, from toddlers to grandmas, we collected trash along the path and around the school, filling three trash bags. We also collected pieces of a TV and a can of nitrous oxide (laughing gas):

Photo of a lamp post, trash can and 3 filled trash bags next to them. There's also pieces of a small TV and small gas can.

But this didn’t have any lasting effect. AWB kept ignoring the path. Trash started collecting again, a week after our cleanup. And once some dog poop was on the path, more showed up quickly. There were no trash cans at either side.

What do to? Send more emails! This proved successful again. Someone admitted, maybe by accident, that AWB wasn’t responsible for cleaning this path. When I asked a few times who then IS responsible, eventually they let me know that they’re going to take the responsibility from January 2025 onward. By early February they finally cleaned up the leftovers from New Years. They also installed trash cans on both sides of the path, one with dog poop bags:

Photo of the shared path sign and a new trash can attached to the sign post.

Unfortunately this did not solve the dog poop problem. That kept showing up, mostly on the right side of the path, next to the shrubs. My contact at AWB didn’t have any recommendations for dealing with this.

One day I finally decided to try some direct action: I found a sturdy enough stick and pushed five piles of dog poop into the shrubs. And for about a week the path was dog poop free!

My theory for now: There is a breed of dog owner that’s willing to pick up their dog’s shit as long as everyone else does it. But if there is already dog poop lying around, they’ll just leave theirs as well. “Why should I clean if others don’t?” would be their rationale.

I’m planning another cleanup event once spring is arriving for good. We’ll then have to instruct every helper not to step foot into the poop-hiding shrubs…

PS: If you’re a dog owner or have dog owner insights, let me know if there’s a more sustainable tactic.

Things I learned: some 90s arabic pop

A few days ago I was in one of my favorite locations in my city quarter of Köln, Café Casablanca. While drinking my green tea with Morrocan mint, I noticed a song and especially it’s very catchy hook. I used my phone to give me a title and saved it for later.

Later at home, my wife, son and me listened to it together:

I didn’t know the artist. Here’s what Wikipedia has to say about him:

Khaled is one of the most important musicians in the history of Raï music in his native Algeria and is one the world’s best-known Arab singers.[2] To date, Khaled has sold over 80.5 million albums (10 diamond, platinum, and gold) worldwide, making him one of the bestselling Arabic-language singers in history. Among his most famous songs are “Aïcha“, “Didi“, “El Arbi”, “Abdel Kader“, “La Poupée qui fait non“, “Wahran Wahran”, “Bakhta”, “C’est la vie“, and “Alech Taadi”.

He holds the Guinness World Record for best-selling artist of raï music.

Wikipedia

To lower our ignorance a bit further, we figured we could listen to his most famous song, Aicha:

When else should I check out, before I go back to listening to OBSCURA?

Things I learned: transpiling React Native JavaScript with babel in 2025

At work we’re using React Native to build our Android and iOS app. We use it with Hermes, a JavaScript engine Facebook/Meta built for React Native, which doesn’t have a JIT compiler, but is instead optimized for fast startup, by compiling JavaScript to a type of bytecode during build time.

Hermes supports plenty of modern JavaScript features, yet any current React Native app will have its source code processed by a bunch of babel plugins, transforming modern JS code into not-so-modern one.

In our case this bothered me in particular when debugging events handlers that make use of JavaScript’s async/await feature. Hermes supports this natively, but one of the babel plugins included in the build process, would replace each instance with generators (also a relatively new JS feature, but not quite as new as async/await). The resulting stacktrace, if not properly mapped to the original source code, is much harder to read, since there’s usually two extra items in the stack, one referring to a function injected by babel called _asyncToGenerator.

Trying to stop this transform from happening turned into quite a deep rabbit whole. I’ll summarize here what we learned:

  1. our babel.config.js uses babel-preset-expo as the only present
  2. babel-preset-expo in turn uses @react-native/babel-preset as a preset
  3. @react-native/babel-preset includes @babel/plugin-transform-async-to-generator as a plugin
  4. @babel/plugin-transform-async-to-generator itself transform async functions to generators!

To figure out this chain of dependencies, npm ls was useful:

npm ls @babel/plugin-transform-async-to-generator
└─┬ [email protected]
  └─┬ [email protected]
    └─┬ @react-native/[email protected]
      └── @babel/[email protected]

None of these presets have any configuration options we could find, so in the end we decided to add another patch with patch-package:

diff --git a/node_modules/@react-native/babel-preset/src/configs/main.js b/node_modules/@react-native/babel-preset/src/configs/main.js
index 077e1a6..d27d775 100644
--- a/node_modules/@react-native/babel-preset/src/configs/main.js
+++ b/node_modules/@react-native/babel-preset/src/configs/main.js
@@ -133,7 +133,7 @@ const getPreset = (src, options) => {
     extraPlugins.push([
       require('@babel/plugin-transform-async-generator-functions'),
     ]);
-    extraPlugins.push([require('@babel/plugin-transform-async-to-generator')]);
+    // extraPlugins.push([require('@babel/plugin-transform-async-to-generator')]);
   }
   if (
     isNull ||

This is now the 10th patch we’re maintaining, despite using renovate for greenkeeping.

After we verified our app still works fine without this transform, I figured I can at least ask if this could be upstreamed to @react-native/babel-preset. In short: no, at least not yet. From the community discussion post:

  • @react-native/babel-preset needs to support JSC (ie Safari on iOS >= 15.4, and the version of JSC we build for Android) as well as Hermes, so support needs to be universal before we remove plugins completely, but we can gate individual plugins by target (isHermes).
  • There may be runtime performance implications, we can check with the Hermes team or run an experiment case-by-case on that.
  • Static Hermes is coming soon-ish, which will have a very different level of language support and performance characteristics, so it might make sense to hold off for that.
discussions-and-proposals, Remove @babel/plugin-transform-async-to-generator from @react-native/babel-preset

Maybe in a year or so.

If you liked this post, boost it on Mastodon. Please reply there with comments, questions or ideas.