Tags vs Pages in the New Logseq DB: A Missed Chance for Unification?

TL;DR

  • In old Logseq, [[page]] and #tag behaved the same, which made tags feel redundant.

  • In Logseq DB, tags and pages are split — tags are property values, pages are documents — but they still look and act half-merged.

  • Problems: tags are writable but can’t have aliases, tags and pages share the same namespace (causing conflicts), and capitalisation hacks are needed to separate hubs from tags.

  • This creates confusion: sometimes a tag looks like a page, but doesn’t behave like one.

  • A unified model — where pages automatically function as tags and tag views are just special page queries — would avoid this inconsistency and give users the best of both worlds.


When Logseq introduced the new database backend, I was hopeful it would finally resolve something that always felt redundant in the old system: the separation of tags and pages.

In the old Logseq, [[page]] and #tag behaved almost identically — both created a page, both could be used as hubs, and both collected backlinks. In fact, tags often felt unnecessary, since pages could already fulfill their role. My hope was that the DB shift would unify the two concepts: let a page act as both a document and a taggable class.

Instead, Logseq DB has split them apart more strongly:

  • A page is a document — you can write on it, give it aliases, and use it as a hub.

  • A tag is a property value — it groups nodes, powers queries, and auto-generates a table of related entries.

This separation makes sense in terms of database schema, but from a user’s perspective it introduces several inconsistencies and dilemmas:

1. Tags look like pages — but aren’t

When you click on a tag (#career), you don’t just get a sterile DB view. You can write on the tag view, just like on a page. You can even link to tags with [[career]]. This blurs the line: tags feel page-like, but lack key page features such as aliases.

  • I can write notes at the top of #career, but I can’t alias it to #careers.

  • I can link to [[career]], but it doesn’t behave like a true page under the hood.

This half-page/half-tag state is what makes workflows messy. Sometimes I treat tags as hubs, sometimes as metadata, and the difference isn’t clear until it’s too late.

2. Tags and pages share a namespace

In DB, tags and pages aren’t fully separate. If I have #career as a tag, I can’t just create [[Career]] as a clean hub page — Logseq will redirect it to the lowercase tag view ([[career]]).

This collapses two different roles into one entity, but without giving me the power of both. It prevents me from cleanly separating:

  • Classification → using tags for grouping (#career).

  • Narrative → using a hub page for notes, aliases, and queries ([[Career]]).

3. A fragile workaround with capitalisation

I discovered a workaround: if I first create a page named Career, I can keep [[Career]] as a proper page, while #career remains a tag. That way I can:

  • Use [[Career]] as my hub (with aliases, context, queries).

  • Use #career as a property value for classification.

This gives me the best of both worlds, but it’s fragile:

  • It relies on capitalisation hacks.

  • It risks fragmenting backlinks if I accidentally use [[career]] instead of [[Career]].

  • Queries don’t automatically bridge the two — they treat page and tag as distinct entities.

This feels like an accidental loophole, not an intentional design.

4. Tags can’t be aliased or merged

Aliases were one of the most powerful features of pages in old Logseq. If I wanted career and careers to point to the same thing, I could just alias them. With tags, I can’t. That means either:

  • I lock myself into one spelling and hope I remember it forever, or

  • I fragment my graph with multiple near-duplicate tags.

What could have been better: a unified model

The database shift was a perfect opportunity to unify pages and tags into one concept:

  • Every [[Page]] could automatically behave like a tag value.

  • Tag views could simply be special presentations of a page with a built-in query.

  • Pages could keep their ability to hold notes, aliases, and metadata, while also powering the new DB grouping.

This would have:

  • Preserved the elegance of the old model (no redundant concepts).

  • Avoided confusion about when to use [[page]] vs #tag.

  • Given users the best of both worlds: structured queries and narrative hubs in a single place.

Why it matters

As a user, I don’t care about schema purity as much as I care about consistency and clarity in my workflow. Right now, Logseq DB gives me two different entities that behave almost the same, but not quite. That subtle gap (no aliases, namespace collisions, capitalisation hacks) is what creates friction and mess.

I believe the community would benefit if Logseq revisited this design choice and considered unifying tags and pages again — or at least making their roles clearer and more consistent.

:sparkles: Closing thought: If tags weren’t writable, I’d be nudged into using pages as hubs and tags as pure metadata, which would be cleaner. If pages had tag-like DB views, I’d only need one concept. But right now, we’re stuck in an awkward in-between: tags and pages overlap, yet neither fully replaces the other.

Any chance at least to revert to the old behaviour? I did use [[pages]] and #tags interchangeably and it definitely doesn’t fit my mental model to have them further split

3 Likes

Given all the new functionality that tags in DB bring, I think reverting would just be old Logseq (albeit stored in a database instead of .md files). Instead, what I urge is a keeping the new functionality that DB brings, but unifying pages and tags. This way you could use them interchangeably.

And ideally just have one functionality [[page]] [[tag]] instead of several ways of doing the same thing. Would make it a cleaner design overall. Less confusing.

2 Likes

Tags represent classes. Each page is assigned to one class, meaning a class itself cannot be a page, and a page cannot serve as a class.

If it was a crystal clear as you write it, I’m sure it would be a different experience. However, in a tag you can still write text, add images, nodes and linking - essentially treat at tag the same as you would a page, but they remain different (what properties can be added, how they respond in queries etc.) and this is confusing.

This is very well put and captures the friction I’ve felt with DB perfectly

2 Likes

I’ve been using the DB version for a few days now, and honestly, I don’t see any improvement over the MD version (well, except that I can add nice icons). This page/tag separation is really annoying. An interminable wait for that?

OK, so I can add properties and create a kind of database. But everything I’d want to put in a database is already in a database. My contacts? They’re already in my address book. My quotes and invoices? I already have software for that. My projects? I just need a tag.

In fact, the killer feature of LogSeq from my point of view is the tasks. That’s the only reason I still use this software, but I’m on the verge of giving up.

Today I stopped contributing. This software had great potential, but it was lost with the idea of stopping everything to spend more than 18 months on a DB version that doesn’t add anything useful.

1 Like

THIS!! I was trying out the DB version recently and found out about this big change from the MD version, and I was very disappointed.
I don’t really understand what is the logic/use case behind the separation of these two.

Both pages and tags are essentially the same thing from use case perspective: Collection of related pieces of information/objects/nodes at one place.
We add tags/page links at a node because we want this piece of information/node to be visible in that tag or page.
Why create two different ways to achieve the same thing?

And I cannot think of a single reason/use case this separation is required to fulfill. What’s wrong in giving pages the same UI tags have? I would love to hear from someone who thinks this separation is needed for their use case.

This separation is problematic because It adds unnecessary friction. When I am writing at a node and I want to this node to be visible at another place too, I have to check whether that place is a tag or page, then use # or [[]] syntax accordingly.

Currently these are the differences between page and tag, and their existence feel for just the sake of it (and I hope they are removed eventually and pages are given the capabilities of tags as well):

  1. The default view of references in pages is list view (and they are displayed at the bottom of the page) whereas the default view of references in tags is table view (and they are displayed at the top of the page).
  2. Tags can also be given aliases but these aliases are not displayed below the tag’s page title like the normal page.
  3. And ofc # and [[]] syntax difference for referencing.
  4. Extend like properties and properties inheritance to the node cannot be used for normal pages.
1 Like

My fault, I missed the point. If you can search and select the desired tag or page using different syntax while searching, you don’t need to check in advance whether that place is a tag or a page.

Given that it is possible to continue using the md version (which I do, since I haven’t had a chance to set up the DB version yet), references couldn’t be displayed at the top of the page because of the variable length of the list. For very long lists of references that would create a serious usability problem.
Yes, references could be shown as a table but they would overwhelm the content of the page. The proper place for references is below – or, better yet, in the sidebar.
The table, on the other hand, is the core content of a tag, so it naturally belongs at the top.

References are records made up of two field: the reference page and the content. You can modify the content, but you can’t add new fields.
Tags, on the other hand, are records with a variable number of fields: you can modify the value and also add new fields.
In my opinion, pages and tags aren’t pretty the same thing.

Thanks for all the responses — lots of good points. A few clarifications and expansions from my side, based on both the discussion here and what I can read in the DB documentation.

Tags and pages being “essentially the same” in DB

As I read the DB documentation tags aren’t a separate entity — #tag is simply a page reference. The schema doesn’t distinguish “tag” from “page”; the renderer/UI decides how they appear.

So my argument isn’t about the backend (which already unifies them), but about the conceptual and UX layer, where pages and tags still behave differently and create different expectations. My wish is for that conceptual difference to be reduced or clarified.

Tags as classes / page types

The documentation in places refers to tags as “classes” and that programming analogy makes sense. If we follow that line of thinking:

  • everything is a page already

  • a tag could be an abstract page (class) defining a type

  • concrete pages could be “instances” of that type

For example:

  • define an abstract Book page/class with properties like author, year, etc.

  • create multiple Book pages that use those shared properties (just apply tag “book” like today)

  • create a Books page that pulls all Book-type pages via a query or page parameter

This already kind of works today, but only through conventions and manual structure. I’m just arguing for a simpler, more unified model that builds on what the DB already makes possible.

It feels messy today because of the high degree of overlap between the pages and tags. Really redefining what each are and aren’t - tags light metadata or class definitions and pages as full entities - would bring us closer to a cleaner model.

On “references can’t be placed at the top” due to Classic mode and long lists

As I understand Classic mode (with .md rendering) must keep references at the bottom - the variable list length would be a problem. But in DB mode this constraint isn’t present. The DB UI could handle references differently (auto-collapsed sections, previews, counts, tabs, etc.) regardless of the underlying file representation. It’s already possible to quickly collapse them today in DB.

My suggestion wasn’t about changing Classic, just that DB mode could rethink the layout since it’s no longer bound by .md limitations. Whether references sit at the top or bottom is ultimately a UX choice in DB mode.

I just tried out the DB version of logseq and the new tag != page behavior feels completely broken.

The absence of aliases for tags is a very deep cut, making them unsuitable for my use case. I’d be curious to know what’s the reason behind this choice… (unless there is a terribly compelling technical reason, please reconsider!)

I also just cannot figure out how this works when a word is already declared as an alias: sometimes it links the page (as I would expect) and sometimes it does not and leads to the “tag page” instead.

IMO having tags appear in the margin is a nice feature and that should be the only feature of tags. At the moment, a tag page provides no useful addition to a page but instead prevents us from having the crucial alias feature.

1 Like

I have to say I really like the separation. It gets rid of that initial learning curve where new users wonder why we have two things that do the exact same job. But the real magic is how it handles properties. Having default page properties is nice, but being able to drop a #person or #company tag onto a node and watch it instantly transform into a structured database entry with the exact properties I need is amazing. It’s basically Logseq’s answer to Tana’s Supertags, and it’s the best way to get organized data out of your graph without having to spend time manually filing away your notes.

1 Like