<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Harsh Srivastava</title>
    <description>The latest articles on DEV Community by Harsh Srivastava (@harsh_srivastava_bf21360d).</description>
    <link>https://dev.to/harsh_srivastava_bf21360d</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3616069%2Fb65fd586-5abf-485f-82c6-0b57f1090098.jpg</url>
      <title>DEV Community: Harsh Srivastava</title>
      <link>https://dev.to/harsh_srivastava_bf21360d</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/harsh_srivastava_bf21360d"/>
    <language>en</language>
    <item>
      <title>Dear Diary, You Remember Nothing: I Built a Journal That Does-horizon</title>
      <dc:creator>Harsh Srivastava</dc:creator>
      <pubDate>Sun, 04 Oct 2026 20:46:28 +0000</pubDate>
      <link>https://dev.to/harsh_srivastava_bf21360d/horizon-look-back-see-forward-22oi</link>
      <guid>https://dev.to/harsh_srivastava_bf21360d/horizon-look-back-see-forward-22oi</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;A journal is good at remembering what happened.&lt;/p&gt;

&lt;p&gt;But after months of writing, it becomes surprisingly difficult to remember what kept happening.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;Horizon&lt;/strong&gt;, an intelligence layer on top of a personal journal. The journaling experience stays familiar, and the journal becomes more useful the longer you write in it.&lt;/p&gt;

&lt;p&gt;Instead of only asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What did I write?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;you can ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What have I been repeatedly thinking about?"&lt;/p&gt;

&lt;p&gt;"What have I been putting off?"&lt;/p&gt;

&lt;p&gt;"What has been taking most of my attention lately?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Horizon answers using your own journal history, and every answer links back to the entries it came from.&lt;/p&gt;

&lt;h3&gt;
  
  
  Who I built it for
&lt;/h3&gt;

&lt;p&gt;The challenge is "Build for a Friend", and the honest answer is that the friend is me. Horizon grew out of a private journal app I built for myself, and I wanted that journal to remember things I might have forgotten: ideas I mentioned once and dropped, and things I said I would do and never did.&lt;/p&gt;

&lt;p&gt;To show Horizon without exposing my real journal, the public demo uses a fictional student's five weeks of entries, which I wrote for this purpose.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ask My Journal
&lt;/h3&gt;

&lt;p&gt;Ask questions about your journal and get answers grounded in relevant past entries. Each answer shows the entries it is based on, with a label for how strong the evidence is. When the entries don't answer the question, Horizon says so instead of guessing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Memory
&lt;/h3&gt;

&lt;p&gt;Horizon identifies recurring ideas, goals, projects, people, interests, and topics across entries. It surfaces things you may have mentioned once and forgotten, as well as ideas that keep coming back.&lt;/p&gt;

&lt;h3&gt;
  
  
  Open Loops
&lt;/h3&gt;

&lt;p&gt;While journaling, people naturally write things like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I still need to finish my portfolio."&lt;/p&gt;

&lt;p&gt;"I should apply for that internship."&lt;/p&gt;

&lt;p&gt;"I need to call Rahul."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Horizon identifies these unresolved intentions and tracks them over time. A loop can be marked resolved or dismissed by you, or marked finished when a later entry says it was done. Nothing is deleted, so you keep the history.&lt;/p&gt;

&lt;h3&gt;
  
  
  Weekly Reflection
&lt;/h3&gt;

&lt;p&gt;The existing weekly page gets an evidence-backed reflection. It separates what was observed (days written, topics that came up on more than one day, things finished, loops still open) from the model-written reflection, and each pattern links to its entries.&lt;/p&gt;

&lt;p&gt;The goal isn't to build another AI chatbot. The goal is to make a journal more useful the longer you use it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live Demo:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://horizon-theta-vert.vercel.app" rel="noopener noreferrer"&gt;https://horizon-theta-vert.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Demo password: &lt;code&gt;hackmyfriend@7007&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The demo is already seeded.&lt;/strong&gt; It contains five weeks of fictional journal entries written for this challenge, so every feature has real history to work with. It is a separate database from my own journal, and none of my private writing is in it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Video Demo:&lt;/strong&gt;&lt;br&gt;
  &lt;iframe src="https://www.youtube.com/embed/M5rlI2QpGJA" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A quick way to explore it:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the live demo and enter the password above.&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Insights&lt;/strong&gt; and ask: &lt;em&gt;"What have I been avoiding?"&lt;/em&gt; Then click any date chip to open the entry behind the answer.&lt;/li&gt;
&lt;li&gt;Open &lt;strong&gt;Memory&lt;/strong&gt; to see how often the event-discovery idea came back.&lt;/li&gt;
&lt;li&gt;Open &lt;strong&gt;Open Loops&lt;/strong&gt; to see what the writer said they'd do and never finished.&lt;/li&gt;
&lt;li&gt;Open &lt;strong&gt;Weekly&lt;/strong&gt;, scroll to &lt;strong&gt;Your Week&lt;/strong&gt;, write a reflection, and compare an earlier week with the latest one.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/harsh373/Friend" rel="noopener noreferrer"&gt;https://github.com/harsh373/Friend&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;Horizon is built with React and TypeScript on the frontend, Node.js and Express on the backend, and MongoDB Atlas as the data layer.&lt;/p&gt;

&lt;p&gt;The AI system works in stages, and the model never sees the whole journal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Journal Entry
      ↓
Extraction (topics, intentions) + Embedding
      ↓
MongoDB Atlas
      ↓
Question → Embedding → Similarity search on the server
      ↓
Most relevant entries only
      ↓
Open-weight model
      ↓
Grounded answer + links to the original entries
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When an entry is saved, one model call extracts structured notes from that single entry (recurring topics, intentions, and completions) and an embedding of the entry is stored. When you ask a question, Horizon embeds the question, compares it with the stored entry embeddings, and passes only the closest entries to the model.&lt;/p&gt;

&lt;p&gt;MongoDB Atlas stores the entries, their embeddings, memories, open loops, and weekly reflections. The similarity search runs in server code over the stored vectors, which is enough at journal scale. Atlas Vector Search would be the natural next step as the data grows.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keeping the AI honest
&lt;/h3&gt;

&lt;p&gt;A journal is the wrong place for confident guesses, so the checks are in code and not just in the prompt:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every extracted item must include a quote that appears word for word in the entry, otherwise it is dropped.&lt;/li&gt;
&lt;li&gt;Source entries come from the database, never from the model. The model only picks entry numbers, and the server maps them back to real dates.&lt;/li&gt;
&lt;li&gt;Observations with no valid source are discarded, and the evidence strength (limited, moderate, strong) is computed from how many entries support it.&lt;/li&gt;
&lt;li&gt;A weekly pattern needs at least two entries behind it.&lt;/li&gt;
&lt;li&gt;When the entries don't support an answer, Horizon says "not enough evidence".&lt;/li&gt;
&lt;li&gt;The model is told never to diagnose or comment on mental health, only to describe what is written.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Models
&lt;/h3&gt;

&lt;p&gt;For generation, Horizon uses OpenAI's open-weight &lt;code&gt;gpt-oss-20b&lt;/code&gt; served through Groq. For embeddings, it uses BAAI's &lt;code&gt;bge-small-en-v1.5&lt;/code&gt; through Hugging Face Inference. Both are hosted, because my development laptop cannot practically run a large language model.&lt;/p&gt;

&lt;p&gt;The model name, endpoint, and API key are configuration values, and the app talks to a small provider interface, so switching to another model or host means editing configuration, not rewriting the app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;A journal can contain some of the most personal information a person creates: thoughts, failures, goals, relationships, and changes in perspective.&lt;/p&gt;

&lt;p&gt;For Horizon, AI isn't a decorative feature. It is the intelligence layer that turns a collection of entries into something you can explore over time. I chose an open-weight model because I wanted that layer to stay replaceable. The retrieval system, memory layer, journal data, and evidence checks keep working while the underlying model changes. That leaves room for different models, different inference providers, and eventually self-hosted inference when suitable hardware is available.&lt;/p&gt;

&lt;p&gt;There is a trade-off, and I'd rather state it than hide it. Inference here is hosted, so the entries selected for a question or a reflection are sent to the inference provider. The whole journal is never sent, only the few entries relevant to the task. A fully private setup would need a self-hosted model, and this architecture is built so that move is possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Best Use of MongoDB Atlas&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
  </channel>
</rss>
