DEV Community

KevinTen
KevinTen

Posted on

The 68th Attempt: When Your Knowledge Management System Becomes a Content Generation Machine (That No One Uses)

The 68th Attempt: When Your Knowledge Management System Becomes a Content Generation Machine (That No One Uses)

Honestly, let's cut to the chase. I've spent 1,847 hours building a personal knowledge management system called Papers. It has 170+ saved articles, 6 stars on GitHub, and... 84 actual uses in three years.

Yeah, you read that right. 1,847 hours of development. 2,847 saved documents. 68 published articles about the system itself. 84 real uses.

If that's not the most hilariously pathetic thing you've read all week, I don't know what is.

But here's the thing — I've learned more from this spectacular failure than I have from any of my "successful" projects. And today I want to share what actually happened, what works, what doesn't, and why I'm still building it anyway.

What Is Papers Anyway?

Papers started simple enough: I wanted a place to save all my technical notes, articles, and insights so I could find them later. No fuss, no magic, just searchable knowledge.

Here's what it looks like in its current form. It's a straightforward Spring Boot application with a React frontend (though I rarely use the frontend anymore — don't ask).

@RestController
@RequestMapping("/api/knowledge")
public class KnowledgeController {

    private final KnowledgeService knowledgeService;

    public KnowledgeController(KnowledgeService knowledgeService) {
        this.knowledgeService = knowledgeService;
    }

    @GetMapping("/search")
    public List<KnowledgeItem> search(@RequestParam String query) {
        // This is where the magic happens... or doesn't
        return knowledgeService.search(query);
    }

    @PostMapping("/save")
    public KnowledgeItem save(@RequestBody KnowledgeItem item) {
        return knowledgeService.save(item);
    }
}
Enter fullscreen mode Exit fullscreen mode

Pretty standard stuff, right? The KnowledgeItem is just a simple POJO:

public class KnowledgeItem {
    private String id;
    private String title;
    private String content;
    private List<String> tags;
    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;

    // getters and setters...
}
Enter fullscreen mode Exit fullscreen mode

Nothing revolutionary here. And that's kind of the point. After 68 iterations, I ended up where I should have started: simple.

The Three Stages of Knowledge Management Hell

If you've ever built a personal knowledge system, you know this progression. I went through exactly three phases, each more expensive than the last.

Stage 1: The AI Utopia (Months 1-6)

I started with big dreams. "Why not use NLP to automatically tag articles? Why not build a recommendation engine that suggests related content? Why not semantic search instead of keyword search?"

Looking back, I want to slap myself.

Honestly, how stupid can you get? I was storing 200 articles. I didn't need semantic search. I didn't need AI recommendations. I just needed to find that one article I wrote six months ago about that one weird bug.

Here's what my "smart" search looked like before I simplified it:

// This is actually from my first commit. I'm keeping it here as a monument to my hubris.
public List<KnowledgeItem> semanticSearch(String query) {
    List<Double> queryEmbedding = openAiClient.getEmbedding(query);
    return knowledgeRepository.findAll().stream()
        .filter(item -> cosineSimilarity(queryEmbedding, item.getEmbedding()) > 0.7)
        .sorted(Comparator.comparingDouble(item -> 
            -cosineSimilarity(queryEmbedding, item.getEmbedding()))
        )
        .collect(Collectors.toList());
}
Enter fullscreen mode Exit fullscreen mode

This took 47 seconds to run on my local machine. 47 seconds. For 200 documents. And the results were garbage. Half the time it returned articles that had nothing to do with what I was searching for.

Worse, every time I added a new article, I had to call the OpenAI API. It cost me a few cents every month, which isn't much, but it's the principle of the thing. Why pay for something I don't need?

Stage 2: The Database Dream (Months 6-12)

OK, so AI was overkill. Let's do it properly with a real database. I set up PostgreSQL, added full-text search, created indexes on every column, normalized the schema...

You know where this is going.

Full-text search was faster — about 2-3 seconds instead of 47. But it was still overkill. I had 500 documents at this point. PostgreSQL is amazing, but it's like using a bulldozer to move a pebble.

And the problem wasn't the database. The problem was me. I wasn't saving things consistently. I wasn't using the system every day. I was too busy tweaking the database indexes to actually use the damn thing.

Here's what that PostgreSQL full-text search looked like:

@Query(value = "SELECT * FROM knowledge_items " +
               "WHERE to_tsvector('english', title || ' ' || content) @@ plainto_tsquery(:query) " +
               "ORDER BY ts_rank(to_tsvector('english', title || ' ' || content), plainto_tsquery(:query)) DESC",
       nativeQuery = true)
List<KnowledgeItem> fullTextSearch(String query);
Enter fullscreen mode Exit fullscreen mode

It works! It's standards-compliant! It's 100x faster than the AI version! But does it matter when you use it once a month?

Stage 3: The Simple Epiphany (Month 12 — Present)

I learned the hard way: simple beats perfect every single time.

One day I got fed up. I deleted 2,000 lines of code. I ripped out the AI, I ripped out the full-text search, I ripped out all the fancy indexes. I kept it to this:

public List<KnowledgeItem> search(String query) {
    String lowerQuery = query.toLowerCase();
    return allItems.stream()
        .filter(item -> 
            item.getTitle().toLowerCase().contains(lowerQuery) ||
            item.getContent().toLowerCase().contains(lowerQuery) ||
            item.getTags().stream().anyMatch(tag -> 
                tag.toLowerCase().contains(lowerQuery)))
        .limit(20)
        .collect(Collectors.toList());
}
Enter fullscreen mode Exit fullscreen mode

That's it. 10 lines of code. No AI. No database full-text search. Just string.contains().

Want to guess the performance? 50ms. From 47 seconds to 50 milliseconds. That's a 60,000% improvement. And the results are better 90% of the time.

I'm not joking. When I search for "null pointer exception", I get articles about null pointer exceptions. When I search for "Spring Boot", I get articles about Spring Boot. It just works.

The Brutal Pros & Cons (I'm Being Honest, I Promise)

Let's cut the B.S. and talk about what's actually good and bad about this approach (and Papers in general).

The Pros

  1. It's actually fast — 50ms search is instant. You don't think about it, it just works. That's the way software should be.

  2. It's dead simple — 10 lines of search code. You can understand the whole system in 10 minutes. No dependencies on external APIs, no complex queries, nothing to break.

  3. It works offline — Everything is local. You don't need internet, you don't need API keys, you don't need to wait for rate limits. Perfect for when you're on a plane or your internet is out.

  4. It's free — No monthly subscription, no API costs, nothing. Just clone the repo and run it.

  5. It's forced me to write better notes — If your search is simple, you have to use better titles and more relevant tags. You can't hide behind AI magic. That's actually a good thing.

The Cons

  1. It doesn't scale forever — If you have 10,000+ articles, string.contains() will get slow. But how many people actually have 10,000 high-quality notes? Be honest with yourself.

  2. It's just keyword matching — No synonym support, no concept matching. If you write "JVM" but search for "Java Virtual Machine", you might miss it. But that's on you for not being consistent with your notes, not the search.

  3. There's no mobile app — Yeah, I know. It's just a web app. I've been meaning to build one for three years. It hasn't happened. That's the reality of passion projects.

  4. I still don't use it that much — This is the biggest con. The system works fine now, but I still only use it about 15 minutes a day. After 1,847 hours. Ouch.

Why Don't You Use It? The Real Answer

So here's the existential question: If I built this whole thing, why don't I use it every day?

I've thought about this a lot. And honestly, it's not the system's fault. It's my fault.

The cold hard truth is: Most of us don't need a fancy knowledge management system. What we need is to think more and save less. I was hoarding articles instead of actually reading them and internalizing the ideas.

I saved 2,847 articles. I've actually re-read maybe 84 of them. That's 2.9%. That's the real efficiency rate. 2.9%.

Think about that. 97.1% of what I saved, I've never looked at again. What a waste of time.

But here's the unexpected upside: Writing 68 articles about my failed knowledge management system got me more engagement than the system itself ever did. People actually read these articles. They comment, they share, they tell me their own failure stories.

It turns out failure is more valuable than success. Everyone has a successful side project they barely use. Nobody talks about the spectacular failures. But we've all been there.

What Would I Do Differently If I Started Over?

If I could go back three years and tell my younger self what to do, here's what I'd say:

  1. Start with plain markdown files in a Git repo — That's it. That's all you need. Use VS Code's search. It's already better than 99% of the knowledge management tools out there. I'd probably be there if I'd started simple.

  2. Don't build anything until you've used the simple version for six months — If after six months you actually need a feature, build it. Otherwise, don't. 90% of features you think you need you'll never use.

  3. Focus on usage, not features — A simple system you actually use is better than a perfect system you don't. I have the T-shirt.

  4. Accept that most knowledge you save will never be used — That's OK. The act of writing it down is what helps you remember it. You don't need to retrieve it 99% of the time. The act of saving is the benefit.

  5. It's OK to quit — If you're not using it after six months, kill it. Don't keep pouring time into a zombie project. I didn't quit, but that's because I started writing these articles and that became the actual point.

The Meta Joke That Became the Product

Let me let you in on a secret. Papers isn't really a knowledge management system anymore. It's a meta-experiment about building knowledge management systems.

I started with the goal of building a system that stores my knowledge. That failed spectacularly. But then I started writing about the failure, and that became the product. Now I have 68 articles about building a knowledge management system, people actually read them, and I've learned more than I ever would have if the original project had "succeeded".

Is that weird? Absolutely. Is it planned? Absolutely not. But that's how a lot of side projects go, isn't it? The thing you start with isn't the thing you end up with.

The ROI is still terrible: $112,750 worth of my time (at $50/hour) for $660 in actual income from affiliate links and sponsorships. That's a net loss of $112,090. But I've learned more about software design, about what people actually want, about writing, about marketing... I can't put a price on that.

OK, I just did. It's -$112,090. But you get what I mean.

Wanna Check It Out?

It's open source, it's free, it's on GitHub: https://github.com/kevinten10/Papers

Clone it, run it, break it, laugh at my 2000-line AI search implementation that I keep in the git history as a reminder. It's all there.

Would I recommend you use it for your own knowledge management? Honestly... probably not. You're probably better off with plain markdown files in Git. But that's the point — I'm not here to sell you anything. I'm just here to tell you what happened.

Your Turn

I know I can't be the only one who's done this. Who's poured hundreds of hours into a side project that nobody uses, including yourself? What did you learn from it? Did you keep going, or did you kill it? Did it turn into something else unexpected like mine did?

Drop a comment below and share your story. I'd love to read it. Because honestly, the most interesting thing about failure is finding out we're all in it together.

Top comments (0)