JDex & Maps of Content (MOCs): A Flexible Alternative to Header IDs

TL;DR
Header IDs solve a real problem: they group similar things together inside of categories. But they also encode another layer of hierarchy into the ID space, which can design you into a corner if the system keeps evolving. My proposal is to keep the Johnny.Decimal ID shallow at AC.ID, and express additional parent-child relationships through links in the JDex instead. In practice, a parent JDex note lists its children, and optionally child notes point back to their parent. This turns “headers” into flexible MOCs: they still provide overview and structure, but without forcing related IDs into fixed blocks of ten.

Background

This post is a continuation of my earlier thread: Revisiting EtE. The pattern I proposed there was:

Keep the JDex structure flat, and express deeper relationships through links.

I also mentioned that MOCs could serve as an alternative to Header IDs when the number of child or parent items might exceed ten. This post is meant to develop that idea more explicitly. Instead of focusing on EtE and sub-notes, I want to apply the same pattern specifically to Header IDs.

For me, the core distinction is:

Header IDs group by number range. MOCs group by relationships (links).

The Problem

At the ID level, Johnny.Decimal gives us up to 100 IDs per category. But we often like to group similar items together.

One way to solve this is to use Header IDs. A Header ID groups the category into blocks of ten, for example:

11.40 Header
11.41 Item
11.42 Item
11.43 Item
...

This is useful mostly static and carefully designed system. But it also adds another layer of hierarchy to the ID itself. The problem is that this hierarchy is fixed by the number range. If the system changes later, the header structure may no longer fit.

This is the same basic tension I kept running into:

How much structure should be encoded into the ID, and how much structure should live outside the ID?

IDs are excellent as stable addresses. But if we put too much semantic or hierarchical meaning into them, they become harder to change.

The Proposed Solution

My proposal is to keep AC.ID as the stable address and avoid encoding further hierarchy into the ID itself. Instead, the JDex note should define relationships between IDs: links express parent-child relationships, turning the JDex note into a MOC.

This keeps the ID system simple, while still allowing it to grow and reorganize over time.

Example

The figure below shows the idea. Parent-child relationships are established by links. The arrows point from parent to child.

In this example, 11.43_OS acts as a parent note for several related IDs:

---
created: 2024-11-29T18:53:52
modified: 2026-04-26T22:19:19
tags:
  - JDex/10-19_Life/11_Workspace
locations:
  - "[[03.21_Raindrop]]"
  - "[[03.53_ChatGPT]]"
old-titles:
  - 11.24_MacOS
children:
  - "[[11.43+Linux]]"
  - "[[11.43+MacOS]]"
  - "[[11.46_Windows]]"
---

This means that 11.43_OS is a normal JDex note that also functions as a MOC.

Corresponding Folder Tree

The folder tree could look like this:

10-19_Life
├── 11_Workspace
│   ├── 11.42_Tools
│   ├── 11.43_OS
│   │   ├── 11.43+Linux
│   │   └── 11.43+MacOS
│   ├── 11.44_PKM
│   ├── 11.45_Terminal
│   │   └── 11.45+Vim
│   ├── 11.46_Windows
│   ├── 11.47_Gaming

But the conceptual structure is primarily defined by the JDex.

For example:

  • 11.43+Linux and 11.43+MacOS are children of 11.43_OS;
  • 11.46_Windows is also a child of 11.43_OS;
  • 11.45+Vim is a child of 11.45_Terminal;

This separates the storage location from the conceptual relationship.

Suggested Rules

To keep the system predictable, I would use a few simple rules.

1. A parent-child relationship must be documented

It should be recorded in the JDex, for example with a children property.

2. A child should have at most one parent

This keeps the structure tree-like. Ordinary cross-links can still exist, but I would not treat them as structural parent-child relationships.

3. A child can be dependent or independent

3.1 Dependent childdren

A dependent child shares the same base ID as its parent, for example:

11.43_OS
11.43+Linux
11.43+MacOS

This means the child is part of the parent ID. If the parent disappears, the child probably disappears too.

A dependent child must be linked to its parent MOC and must not have any children of its own.

3.2 Independent children

An independent child has its own separate ID, for example:

11.43_OS
11.46_Windows

This means the child is important enough to have its own ID, but can still be conceptually linked from a parent MOC.

4. Parents should usually stay inside one category

I would avoid parent-child relationships that cross category boundaries. Cross-category relationships are better handled as ordinary links or references, not as structural parent-child relationships.

5. Old IDs should be documented

I keep an old-titles field to track previous names or IDs. This helps when the system changes over time.

6. Removed IDs should leave a marker

I also like to keep an AC.ID_EMPTY marker when an ID is (re)moved, so available IDs are easy to spot later.

Conclusion

I am not arguing that Header IDs are wrong. They are useful in stable, carefully designed systems.

But in an expanding system, I think they introduce too much fixed hierarchy. MOCs offer a softer alternative: they give us overview, grouping, and navigation, while keeping the actual Johnny.Decimal IDs simpler and more flexible.

So my current rule of thumb would be:

Use IDs for stable addresses.
Use MOCs for flexible structure.

2 Likes

Thanks for sharing, @ontologist! I find this intriguing and would like to share my own approach in case I am missing something.

As I understand your proposal, a ‘parent note’ is a header ID that is not limited to 9 items underneath. So in principle, any ID can be a header. If I’m understanding correctly, the main advantages you see are that you now have 90-100 header IDs (depending on use of standard zeros) in every category rather than 9 (10, 20, etc). I can see how some might want more headers, but in my case the idea that a zero anywhere in an ID is structural has been a great memory aid and 9 IDs (##.#1-##.#9) under a header (##.#0) is almost always enough. Where it isn’t my rule is to

  • turn ##.#9 into a mini archive under that header and move previous ids that are inactive into that with the id ##.#9+ . That frees up standard Ids under the header for my new thing.
  • alternatively, I just keep adding subhead IDs by using ##.#91, .#92, etc. To me, it’s really helpful to use the rule ‘every unique thing has a number’ which is why I eTe with # rather than +. A + in my system indicates added structure under an ID and is fairly rare.

Are there advantages to your approach you think I am missing?

I definitely agree that thinking of ‘parent’ notes as MOCs is very helpful, but wonder if you limit this to lower level notes only? My related approach (I is that anything that doesn’t have its own AC.ID must be linked back to an AC.ID (making that AC.ID a parent note) to ensure it comes up on a search by ##.##. That includes notes relevant to whole areas (#0.00), categories (##.00) or headers (##.#0) that don’t belong in my standard zeros (##.00-09) and don’t require their own folder in my file system. Again, would appreciate any thoughts you have here.

1 Like

I think your approach is coherent, especially if the “zero = structural” rule works well as a memory aid for you. That is a real advantage.

For me, the difficulty is different: I struggle with defining 9 headers in advance and then trying to distribute future items evenly among them. Most of my categories are evolving. They feel more like a green field than a finished city map: I do not yet know what the final structure will be.

That is where MOCs become useful to me. Their purpose is to map and reveal emerging relationships between notes that I did not know beforehand. So instead of making the ID itself carry too much structural meaning, I keep the ID as a stable address and let the JDex/MOC describe the relationships.

This also avoids what I see as the main downside of a workaround. Turning ##.#9 into a mini archive, or extending locally with ##.#91, ##.#92, etc., certainly works. But to me, it means the local number space is being expanded because the original 9-item header structure was too restrictive. That is exactly what I am trying to avoid.

The advantage of my approach is therefore not mainly that I get “more headers.” It is that I do not have to decide too early what is a header, what belongs under it, or how large it will become. Any ID can become a parent/MOC if the material naturally grows in that direction.

That said, I still use +: for things that are worth documenting or regulating, but are not worthy of their own full ID. In my earlier approach, I avoided + and only linked full IDs together, but that quickly cluttered the category. So now I use + to create subordinate items that are not independent “things,” but parts of an existing thing. They therefore keep the same AC.ID.

1 Like

Got it! This bit is what I didn’t fully appreciate before.

Conceptualizing + as a designator for subordinate stuff rather than a way to eTe is more or less my approach too. And I agree, finding the right number of ‘buckets’ and predicting their size is the challenge for any organizational system. I’ve been puzzling over this for a new system I’m about to build and your more flexible approach will really help me there.

Thanks again!

1 Like

Great idea! We’re going through our own JDex which is, shamefully, a bit of a mess. But that’s just the reality, right? You’re busy on a project, work-work-work, and when you come out the other side you find you need to tidy up. So that’s what we’re doing.

This is very helpful.

2 Likes

Interesting! This is probably the better route, since all links within a category are now centrally stored in the category JDex AC.00.

One question: Do you use Theory IDs and Actual product IDs as JDex notes, or only as section headings within the note?

Applied to my example and your approach, the result might look like this:

The result is very easy to produce and maintain. Additionally, it provides a nice overview. Thanks for the new food for thought!

1 Like

Just headers in that note.

Thanks for sharing this visual. It’s very helpful!! What are you then putting in these IDs like the workshop - what would go in that note? A description of the product, price, link etc?

Yeah well 21.32 is the master ID for the workshop in our system. That’s the finished product.

This is when the creative pattern/now work packages comes in handy. And why it was invented. Because making a 5-hour, 30-lesson video series doesn’t fit in an ID. So each lesson gets its own WP while it’s being produced, leaving the main note reasonably tidy.

Will be documenting this WP thing real soon, just gotta find the time.