<?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: Priyansh Kumar</title>
    <description>The latest articles on DEV Community by Priyansh Kumar (@pkumar18).</description>
    <link>https://dev.to/pkumar18</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%2F4027956%2Fb370baac-c5f3-4464-9f03-487728aa6eca.jpg</url>
      <title>DEV Community: Priyansh Kumar</title>
      <link>https://dev.to/pkumar18</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pkumar18"/>
    <language>en</language>
    <item>
      <title>I Got Tired of Bad Fanfiction Recommendations, So I'm Building My Own Taste Engine</title>
      <dc:creator>Priyansh Kumar</dc:creator>
      <pubDate>Tue, 14 Jul 2026 02:15:50 +0000</pubDate>
      <link>https://dev.to/pkumar18/i-got-tired-of-bad-fanfiction-recommendations-so-im-building-my-own-taste-engine-1ag1</link>
      <guid>https://dev.to/pkumar18/i-got-tired-of-bad-fanfiction-recommendations-so-im-building-my-own-taste-engine-1ag1</guid>
      <description>&lt;p&gt;I read fanfiction. A lot of it, on AO3 and FanFiction.net. Finding something worth reading takes longer than it should.&lt;/p&gt;

&lt;p&gt;AO3 has over 10 million works. The discovery tool is tag search. You type a fandom, a ship, maybe a few tags, and scroll through whatever comes back. Kudos and bookmarks sort the list, but those measure popularity, not whether you'll enjoy it. A fic with 10k kudos might be beloved by thousands and still not your thing.&lt;/p&gt;

&lt;p&gt;I tried describing what I wanted to Claude once. It couldn't help. No domain knowledge, no idea what makes a fic actually good, no model of my taste. It guessed from a description. That's not useful.&lt;/p&gt;

&lt;p&gt;Every existing recommendation tool in this space matches surface features. Same fandom, same tags, same ship. None of them look at pacing, character voice, emotional tone, the things that make you stay up until 3am finishing something.&lt;/p&gt;

&lt;p&gt;I'm building Siagnos to fix that.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Siagnos actually does
&lt;/h2&gt;

&lt;p&gt;Siagnos is a personal taste engine. Track what I actually read, build a model of my taste from that behavior, score unseen fics against it.&lt;/p&gt;

&lt;p&gt;A preference model trained on my own reading data. The pipeline has six parts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Scrape fic metadata from AO3: title, fandom, tags, word count, kudos, completion status, summary&lt;/li&gt;
&lt;li&gt;Track real reading sessions: what I open, how far I get, whether I come back&lt;/li&gt;
&lt;li&gt;Generate embeddings from summaries using HuggingFace sentence transformers&lt;/li&gt;
&lt;li&gt;Run a local LLM (Mistral 7B via Ollama) to extract richer features from summaries (tone, pacing, character dynamics)&lt;/li&gt;
&lt;li&gt;Train a preference model on reading history using XGBoost&lt;/li&gt;
&lt;li&gt;Given a fic URL, return a taste score and a plain-language reason&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The output I want: "This matches your taste because it has the same slow-burn structure and morally grey protagonist you keep coming back to." Actual signal, not a popularity rank.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where it stands right now
&lt;/h2&gt;

&lt;p&gt;I'm three stages in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 0&lt;/strong&gt;: project structure, Git, virtual environment, mental model of embeddings and cosine similarity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 1&lt;/strong&gt;: sentence transformers installed, embeddings generated for a handful of fic summaries, cosine similarity working. Proof of concept done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 2&lt;/strong&gt;: scraper complete. Built with cloudscraper and BeautifulSoup, retry logic, failed URL logging, adult content bypass, resume from last point. Scraped around 7,000 My Hero Academia fics to CSV. Also collected behavior data for about 100 fics I've personally read.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 3&lt;/strong&gt;: PostgreSQL schema designed and implemented. Tables for fics, reading sessions, six value tables, six join tables, ENUMs for status and rating types. Schema committed to the repo.&lt;/p&gt;

&lt;p&gt;Stage 4 is next: a reading tracker, either a browser extension or a bookmarklet, that logs real sessions to the database.&lt;/p&gt;




&lt;h2&gt;
  
  
  The tech stack
&lt;/h2&gt;

&lt;p&gt;Python throughout. FastAPI for the backend when I get there. PostgreSQL replacing SQLite, which I'd outgrown. HuggingFace sentence transformers for embeddings. Ollama running Mistral 7B locally for feature extraction. XGBoost for the preference model. Docker for containerization. Azure for deployment.&lt;/p&gt;

&lt;p&gt;One constraint I set myself: no LangChain or similar for the core pipeline. Build it first, understand what's actually happening, add abstractions later if they help.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this is worth building
&lt;/h2&gt;

&lt;p&gt;Nobody with real ML experience is building for fanfiction readers. The domain is large (AO3 hit 879 million weekly page views earlier this year) and the recommendation problem is unsolved. I know the domain as a reader, which most ML engineers building recommendation systems don't.&lt;/p&gt;

&lt;p&gt;Siagnos builds a preference model trained on individual reading behavior. I'm a BCA student, this is my second serious project, and I'm learning ML from first principles by building it. Future posts will cover the pipeline, the modeling approach, and what failed.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Siagnos is on GitHub: &lt;a href="https://github.com/P-Kumar-18/Siagnos" rel="noopener noreferrer"&gt;github.com/P-Kumar-18&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>machinelearning</category>
      <category>nlp</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
