Repository files navigation

Release

Stuff I Read

Desktop app for keeping track of stories (books, fanfics) you read.

Do you need this?

  1. You read a lot of different stuff. Like in hundreds or even thousands.
  2. You can't remember everything you read, and you have to keep track of that.
  3. Also, you like to score stories and write reviews, even if only for yourself.
  4. Maybe, you even re-read some stories.
  5. Excel spreadsheet is not enough anymore.

Development and support

Stuff I Read was created and tailored for my personal use-case, but I will add features by request if there's a need.

Technology

Built using Compose Multiplatform framework (selected as experiment/research).
My personal opinion after working with it: don't use it for serious multiplatform development until 2025 or so. Standard library is lacking, and framework is fragile. You will waste time re-implementing basic components, exploring internals because documentation is minimal, and fighting obscure bugs.

Features

Browse stories with extensive search

You can browse your archive using advanced search. You can search by author, description, publishing/last update dates, tags, score, review, content, word count and other parameters.

Example

Story search

Review and score stories that you read

Write reviews and score stories, so you won't forget why you enjoyed reading a story.

Score formats

Multiple score formats are supported, including 5 stars, 10 stars, 10/10, 100/100. Format can be changed at any time without breaking existing scores.

Example

Score display types

Tag system: tag categories, implied tags, search

To help with categorization stories can have fully customizable tags.

Tag category

Category provides order and color of the tag. Ordering can be very useful when story has dozens of tags.

Tag order

Tag implications

Tags can imply other tags. For example, tag of character can imply their species, and now you can search for stories with that species without explicitly adding the species tag.
You can edit implications at any moment and all stories will be affected by the change.

Examples of tags, you can create your own at any moment

Tag table

Sequels & prequels

Easy navigation for story sequels/prequels.

Example

Story sequels/prequels

Local story archive

Files with story content can be locally archived. Strictly speaking all formats are supported, but EPUB, HTML, PDF and TXT have special handling, for example word counting.
Files can represent not only the whole story, but individual chapters as well as any additional content too.

Example

Story files

Import stories from selection of websites

Currently supported:

  • archiveofourown.org
    Work can be imported in multiple file formats if needed.
  • pastebin.com
    Multiple pastes can be imported as one story.
  • poneb.in (Pony)
    Multiple pastes can be imported as one story.
  • ponepaste.org (Pony)
    Multiple pastes can be imported as one story.

||Don't worry, you can hide pony website integrations in settings||
If website has story tags - they can be imported and mapped to local tags:

Example

Tag mapping

Misc

Dark / light theme

Use system theme or select one yourself.

Example

Light/dark theme

Planned features

Localization support

Support at least English and Russian. Also support language-based import sources settings.

More import sources

Feel free to request other websites!

  • FimFiction.net - Pony (has excellent API, but need to request access).
  • PonyFiction.org - Pony, Russian
  • FicBook.net - Russian

Read Later and In Reading Lists

Read Later List: stuff that you want to read sometime. Prioritized, with notes, url, date added, etc.
In Reading List: stuff that you are reading right now.
Also, a way to move stories between lists: Read Later -> In Reading -> Archive

Stats and graphs

Page with aggregated stats on everything you read, including: total word count, score distribution, time distribution, and so on.

File format conversions

To be able to convert EPUB to PDF, TXT to HTML and so on.

Track individual reads

As of now only first read and last read dates are supported, but I think it would be cool to know about specific dates when you read something.

Android version

Compose Multiplatform "supports" it, but I personally don't need it. So it's low priority.

Story archive format

Story archive is a folder and consists of tags (tags.json), stories (individual folders with story info in story.json and archived files).

Q: Why use separate files instead of something like SQLite database?
A: I wanted story archive to be easily versioned. E.g. Git/other VCS, or clouds like Google Drive. SQLite DB with a thousand stories can be GB-sized - you don't want to upload that each time new story is added.

About

Cross-platform desktop app for keeping track of stuff that you read.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Release

Stuff I Read

Desktop app for keeping track of stories (books, fanfics) you read.

Do you need this?

  1. You read a lot of different stuff. Like in hundreds or even thousands.
  2. You can't remember everything you read, and you have to keep track of that.
  3. Also, you like to score stories and write reviews, even if only for yourself.
  4. Maybe, you even re-read some stories.
  5. Excel spreadsheet is not enough anymore.

Development and support

Stuff I Read was created and tailored for my personal use-case, but I will add features by request if there's a need.

Technology

Built using Compose Multiplatform framework (selected as experiment/research).
My personal opinion after working with it: don't use it for serious multiplatform development until 2025 or so. Standard library is lacking, and framework is fragile. You will waste time re-implementing basic components, exploring internals because documentation is minimal, and fighting obscure bugs.

Features

Browse stories with extensive search

You can browse your archive using advanced search. You can search by author, description, publishing/last update dates, tags, score, review, content, word count and other parameters.

Example

Story search

Review and score stories that you read

Write reviews and score stories, so you won't forget why you enjoyed reading a story.

Score formats

Multiple score formats are supported, including 5 stars, 10 stars, 10/10, 100/100. Format can be changed at any time without breaking existing scores.

Example

Score display types

Tag system: tag categories, implied tags, search

To help with categorization stories can have fully customizable tags.

Tag category

Category provides order and color of the tag. Ordering can be very useful when story has dozens of tags.

Tag order

Tag implications

Tags can imply other tags. For example, tag of character can imply their species, and now you can search for stories with that species without explicitly adding the species tag.
You can edit implications at any moment and all stories will be affected by the change.

Examples of tags, you can create your own at any moment

Tag table

Sequels & prequels

Easy navigation for story sequels/prequels.

Example

Story sequels/prequels

Local story archive

Files with story content can be locally archived. Strictly speaking all formats are supported, but EPUB, HTML, PDF and TXT have special handling, for example word counting.
Files can represent not only the whole story, but individual chapters as well as any additional content too.

Example

Story files

Import stories from selection of websites

Currently supported:

  • archiveofourown.org
    Work can be imported in multiple file formats if needed.
  • pastebin.com
    Multiple pastes can be imported as one story.
  • poneb.in (Pony)
    Multiple pastes can be imported as one story.
  • ponepaste.org (Pony)
    Multiple pastes can be imported as one story.

||Don't worry, you can hide pony website integrations in settings||
If website has story tags - they can be imported and mapped to local tags:

Example

Tag mapping

Misc

Dark / light theme

Use system theme or select one yourself.

Example

Light/dark theme

Planned features

Localization support

Support at least English and Russian. Also support language-based import sources settings.

More import sources

Feel free to request other websites!

  • FimFiction.net - Pony (has excellent API, but need to request access).
  • PonyFiction.org - Pony, Russian
  • FicBook.net - Russian

Read Later and In Reading Lists

Read Later List: stuff that you want to read sometime. Prioritized, with notes, url, date added, etc.
In Reading List: stuff that you are reading right now.
Also, a way to move stories between lists: Read Later -> In Reading -> Archive

Stats and graphs

Page with aggregated stats on everything you read, including: total word count, score distribution, time distribution, and so on.

File format conversions

To be able to convert EPUB to PDF, TXT to HTML and so on.

Track individual reads

As of now only first read and last read dates are supported, but I think it would be cool to know about specific dates when you read something.

Android version

Compose Multiplatform "supports" it, but I personally don't need it. So it's low priority.

Story archive format

Story archive is a folder and consists of tags (tags.json), stories (individual folders with story info in story.json and archived files).

Q: Why use separate files instead of something like SQLite database?
A: I wanted story archive to be easily versioned. E.g. Git/other VCS, or clouds like Google Drive. SQLite DB with a thousand stories can be GB-sized - you don't want to upload that each time new story is added.

About

Cross-platform desktop app for keeping track of stuff that you read.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Release

Stuff I Read

Desktop app for keeping track of stories (books, fanfics) you read.

Do you need this?

  1. You read a lot of different stuff. Like in hundreds or even thousands.
  2. You can't remember everything you read, and you have to keep track of that.
  3. Also, you like to score stories and write reviews, even if only for yourself.
  4. Maybe, you even re-read some stories.
  5. Excel spreadsheet is not enough anymore.

Development and support

Stuff I Read was created and tailored for my personal use-case, but I will add features by request if there's a need.

Technology

Built using Compose Multiplatform framework (selected as experiment/research).
My personal opinion after working with it: don't use it for serious multiplatform development until 2025 or so. Standard library is lacking, and framework is fragile. You will waste time re-implementing basic components, exploring internals because documentation is minimal, and fighting obscure bugs.

Features

Browse stories with extensive search

You can browse your archive using advanced search. You can search by author, description, publishing/last update dates, tags, score, review, content, word count and other parameters.

Example

Story search

Review and score stories that you read

Write reviews and score stories, so you won't forget why you enjoyed reading a story.

Score formats

Multiple score formats are supported, including 5 stars, 10 stars, 10/10, 100/100. Format can be changed at any time without breaking existing scores.

Example

Score display types

Tag system: tag categories, implied tags, search

To help with categorization stories can have fully customizable tags.

Tag category

Category provides order and color of the tag. Ordering can be very useful when story has dozens of tags.

Tag order

Tag implications

Tags can imply other tags. For example, tag of character can imply their species, and now you can search for stories with that species without explicitly adding the species tag.
You can edit implications at any moment and all stories will be affected by the change.

Examples of tags, you can create your own at any moment

Tag table

Sequels & prequels

Easy navigation for story sequels/prequels.

Example

Story sequels/prequels

Local story archive

Files with story content can be locally archived. Strictly speaking all formats are supported, but EPUB, HTML, PDF and TXT have special handling, for example word counting.
Files can represent not only the whole story, but individual chapters as well as any additional content too.

Example

Story files

Import stories from selection of websites

Currently supported:

  • archiveofourown.org
    Work can be imported in multiple file formats if needed.
  • pastebin.com
    Multiple pastes can be imported as one story.
  • poneb.in (Pony)
    Multiple pastes can be imported as one story.
  • ponepaste.org (Pony)
    Multiple pastes can be imported as one story.

||Don't worry, you can hide pony website integrations in settings||
If website has story tags - they can be imported and mapped to local tags:

Example

Tag mapping

Misc

Dark / light theme

Use system theme or select one yourself.

Example

Light/dark theme

Planned features

Localization support

Support at least English and Russian. Also support language-based import sources settings.

More import sources

Feel free to request other websites!

  • FimFiction.net - Pony (has excellent API, but need to request access).
  • PonyFiction.org - Pony, Russian
  • FicBook.net - Russian

Read Later and In Reading Lists

Read Later List: stuff that you want to read sometime. Prioritized, with notes, url, date added, etc.
In Reading List: stuff that you are reading right now.
Also, a way to move stories between lists: Read Later -> In Reading -> Archive

Stats and graphs

Page with aggregated stats on everything you read, including: total word count, score distribution, time distribution, and so on.

File format conversions

To be able to convert EPUB to PDF, TXT to HTML and so on.

Track individual reads

As of now only first read and last read dates are supported, but I think it would be cool to know about specific dates when you read something.

Android version

Compose Multiplatform "supports" it, but I personally don't need it. So it's low priority.

Story archive format

Story archive is a folder and consists of tags (tags.json), stories (individual folders with story info in story.json and archived files).

Q: Why use separate files instead of something like SQLite database?
A: I wanted story archive to be easily versioned. E.g. Git/other VCS, or clouds like Google Drive. SQLite DB with a thousand stories can be GB-sized - you don't want to upload that each time new story is added.

About

Cross-platform desktop app for keeping track of stuff that you read.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Release

Stuff I Read

Desktop app for keeping track of stories (books, fanfics) you read.

Do you need this?

  1. You read a lot of different stuff. Like in hundreds or even thousands.
  2. You can't remember everything you read, and you have to keep track of that.
  3. Also, you like to score stories and write reviews, even if only for yourself.
  4. Maybe, you even re-read some stories.
  5. Excel spreadsheet is not enough anymore.

Development and support

Stuff I Read was created and tailored for my personal use-case, but I will add features by request if there's a need.

Technology

Built using Compose Multiplatform framework (selected as experiment/research).
My personal opinion after working with it: don't use it for serious multiplatform development until 2025 or so. Standard library is lacking, and framework is fragile. You will waste time re-implementing basic components, exploring internals because documentation is minimal, and fighting obscure bugs.

Features

Browse stories with extensive search

You can browse your archive using advanced search. You can search by author, description, publishing/last update dates, tags, score, review, content, word count and other parameters.

Example

Story search

Review and score stories that you read

Write reviews and score stories, so you won't forget why you enjoyed reading a story.

Score formats

Multiple score formats are supported, including 5 stars, 10 stars, 10/10, 100/100. Format can be changed at any time without breaking existing scores.

Example

Score display types

Tag system: tag categories, implied tags, search

To help with categorization stories can have fully customizable tags.

Tag category

Category provides order and color of the tag. Ordering can be very useful when story has dozens of tags.

Tag order

Tag implications

Tags can imply other tags. For example, tag of character can imply their species, and now you can search for stories with that species without explicitly adding the species tag.
You can edit implications at any moment and all stories will be affected by the change.

Examples of tags, you can create your own at any moment

Tag table

Sequels & prequels

Easy navigation for story sequels/prequels.

Example

Story sequels/prequels

Local story archive

Files with story content can be locally archived. Strictly speaking all formats are supported, but EPUB, HTML, PDF and TXT have special handling, for example word counting.
Files can represent not only the whole story, but individual chapters as well as any additional content too.

Example

Story files

Import stories from selection of websites

Currently supported:

  • archiveofourown.org
    Work can be imported in multiple file formats if needed.
  • pastebin.com
    Multiple pastes can be imported as one story.
  • poneb.in (Pony)
    Multiple pastes can be imported as one story.
  • ponepaste.org (Pony)
    Multiple pastes can be imported as one story.

||Don't worry, you can hide pony website integrations in settings||
If website has story tags - they can be imported and mapped to local tags:

Example

Tag mapping

Misc

Dark / light theme

Use system theme or select one yourself.

Example

Light/dark theme

Planned features

Localization support

Support at least English and Russian. Also support language-based import sources settings.

More import sources

Feel free to request other websites!

  • FimFiction.net - Pony (has excellent API, but need to request access).
  • PonyFiction.org - Pony, Russian
  • FicBook.net - Russian

Read Later and In Reading Lists

Read Later List: stuff that you want to read sometime. Prioritized, with notes, url, date added, etc.
In Reading List: stuff that you are reading right now.
Also, a way to move stories between lists: Read Later -> In Reading -> Archive

Stats and graphs

Page with aggregated stats on everything you read, including: total word count, score distribution, time distribution, and so on.

File format conversions

To be able to convert EPUB to PDF, TXT to HTML and so on.

Track individual reads

As of now only first read and last read dates are supported, but I think it would be cool to know about specific dates when you read something.

Android version

Compose Multiplatform "supports" it, but I personally don't need it. So it's low priority.

Story archive format

Story archive is a folder and consists of tags (tags.json), stories (individual folders with story info in story.json and archived files).

Q: Why use separate files instead of something like SQLite database?
A: I wanted story archive to be easily versioned. E.g. Git/other VCS, or clouds like Google Drive. SQLite DB with a thousand stories can be GB-sized - you don't want to upload that each time new story is added.

About

Cross-platform desktop app for keeping track of stuff that you read.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Release

Stuff I Read

Desktop app for keeping track of stories (books, fanfics) you read.

Do you need this?

  1. You read a lot of different stuff. Like in hundreds or even thousands.
  2. You can't remember everything you read, and you have to keep track of that.
  3. Also, you like to score stories and write reviews, even if only for yourself.
  4. Maybe, you even re-read some stories.
  5. Excel spreadsheet is not enough anymore.

Development and support

Stuff I Read was created and tailored for my personal use-case, but I will add features by request if there's a need.

Technology

Built using Compose Multiplatform framework (selected as experiment/research).
My personal opinion after working with it: don't use it for serious multiplatform development until 2025 or so. Standard library is lacking, and framework is fragile. You will waste time re-implementing basic components, exploring internals because documentation is minimal, and fighting obscure bugs.

Features

Browse stories with extensive search

You can browse your archive using advanced search. You can search by author, description, publishing/last update dates, tags, score, review, content, word count and other parameters.

Example

Story search

Review and score stories that you read

Write reviews and score stories, so you won't forget why you enjoyed reading a story.

Score formats

Multiple score formats are supported, including 5 stars, 10 stars, 10/10, 100/100. Format can be changed at any time without breaking existing scores.

Example

Score display types

Tag system: tag categories, implied tags, search

To help with categorization stories can have fully customizable tags.

Tag category

Category provides order and color of the tag. Ordering can be very useful when story has dozens of tags.

Tag order

Tag implications

Tags can imply other tags. For example, tag of character can imply their species, and now you can search for stories with that species without explicitly adding the species tag.
You can edit implications at any moment and all stories will be affected by the change.

Examples of tags, you can create your own at any moment

Tag table

Sequels & prequels

Easy navigation for story sequels/prequels.

Example

Story sequels/prequels

Local story archive

Files with story content can be locally archived. Strictly speaking all formats are supported, but EPUB, HTML, PDF and TXT have special handling, for example word counting.
Files can represent not only the whole story, but individual chapters as well as any additional content too.

Example

Story files

Import stories from selection of websites

Currently supported:

  • archiveofourown.org
    Work can be imported in multiple file formats if needed.
  • pastebin.com
    Multiple pastes can be imported as one story.
  • poneb.in (Pony)
    Multiple pastes can be imported as one story.
  • ponepaste.org (Pony)
    Multiple pastes can be imported as one story.

||Don't worry, you can hide pony website integrations in settings||
If website has story tags - they can be imported and mapped to local tags:

Example

Tag mapping

Misc

Dark / light theme

Use system theme or select one yourself.

Example

Light/dark theme

Planned features

Localization support

Support at least English and Russian. Also support language-based import sources settings.

More import sources

Feel free to request other websites!

  • FimFiction.net - Pony (has excellent API, but need to request access).
  • PonyFiction.org - Pony, Russian
  • FicBook.net - Russian

Read Later and In Reading Lists

Read Later List: stuff that you want to read sometime. Prioritized, with notes, url, date added, etc.
In Reading List: stuff that you are reading right now.
Also, a way to move stories between lists: Read Later -> In Reading -> Archive

Stats and graphs

Page with aggregated stats on everything you read, including: total word count, score distribution, time distribution, and so on.

File format conversions

To be able to convert EPUB to PDF, TXT to HTML and so on.

Track individual reads

As of now only first read and last read dates are supported, but I think it would be cool to know about specific dates when you read something.

Android version

Compose Multiplatform "supports" it, but I personally don't need it. So it's low priority.

Story archive format

Story archive is a folder and consists of tags (tags.json), stories (individual folders with story info in story.json and archived files).

Q: Why use separate files instead of something like SQLite database?
A: I wanted story archive to be easily versioned. E.g. Git/other VCS, or clouds like Google Drive. SQLite DB with a thousand stories can be GB-sized - you don't want to upload that each time new story is added.

About

Cross-platform desktop app for keeping track of stuff that you read.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Release

Stuff I Read

Desktop app for keeping track of stories (books, fanfics) you read.

Do you need this?

  1. You read a lot of different stuff. Like in hundreds or even thousands.
  2. You can't remember everything you read, and you have to keep track of that.
  3. Also, you like to score stories and write reviews, even if only for yourself.
  4. Maybe, you even re-read some stories.
  5. Excel spreadsheet is not enough anymore.

Development and support

Stuff I Read was created and tailored for my personal use-case, but I will add features by request if there's a need.

Technology

Built using Compose Multiplatform framework (selected as experiment/research).
My personal opinion after working with it: don't use it for serious multiplatform development until 2025 or so. Standard library is lacking, and framework is fragile. You will waste time re-implementing basic components, exploring internals because documentation is minimal, and fighting obscure bugs.

Features

Browse stories with extensive search

You can browse your archive using advanced search. You can search by author, description, publishing/last update dates, tags, score, review, content, word count and other parameters.

Example

Story search

Review and score stories that you read

Write reviews and score stories, so you won't forget why you enjoyed reading a story.

Score formats

Multiple score formats are supported, including 5 stars, 10 stars, 10/10, 100/100. Format can be changed at any time without breaking existing scores.

Example

Score display types

Tag system: tag categories, implied tags, search

To help with categorization stories can have fully customizable tags.

Tag category

Category provides order and color of the tag. Ordering can be very useful when story has dozens of tags.

Tag order

Tag implications

Tags can imply other tags. For example, tag of character can imply their species, and now you can search for stories with that species without explicitly adding the species tag.
You can edit implications at any moment and all stories will be affected by the change.

Examples of tags, you can create your own at any moment

Tag table

Sequels & prequels

Easy navigation for story sequels/prequels.

Example

Story sequels/prequels

Local story archive

Files with story content can be locally archived. Strictly speaking all formats are supported, but EPUB, HTML, PDF and TXT have special handling, for example word counting.
Files can represent not only the whole story, but individual chapters as well as any additional content too.

Example

Story files

Import stories from selection of websites

Currently supported:

  • archiveofourown.org
    Work can be imported in multiple file formats if needed.
  • pastebin.com
    Multiple pastes can be imported as one story.
  • poneb.in (Pony)
    Multiple pastes can be imported as one story.
  • ponepaste.org (Pony)
    Multiple pastes can be imported as one story.

||Don't worry, you can hide pony website integrations in settings||
If website has story tags - they can be imported and mapped to local tags:

Example

Tag mapping

Misc

Dark / light theme

Use system theme or select one yourself.

Example

Light/dark theme

Planned features

Localization support

Support at least English and Russian. Also support language-based import sources settings.

More import sources

Feel free to request other websites!

  • FimFiction.net - Pony (has excellent API, but need to request access).
  • PonyFiction.org - Pony, Russian
  • FicBook.net - Russian

Read Later and In Reading Lists

Read Later List: stuff that you want to read sometime. Prioritized, with notes, url, date added, etc.
In Reading List: stuff that you are reading right now.
Also, a way to move stories between lists: Read Later -> In Reading -> Archive

Stats and graphs

Page with aggregated stats on everything you read, including: total word count, score distribution, time distribution, and so on.

File format conversions

To be able to convert EPUB to PDF, TXT to HTML and so on.

Track individual reads

As of now only first read and last read dates are supported, but I think it would be cool to know about specific dates when you read something.

Android version

Compose Multiplatform "supports" it, but I personally don't need it. So it's low priority.

Story archive format

Story archive is a folder and consists of tags (tags.json), stories (individual folders with story info in story.json and archived files).

Q: Why use separate files instead of something like SQLite database?
A: I wanted story archive to be easily versioned. E.g. Git/other VCS, or clouds like Google Drive. SQLite DB with a thousand stories can be GB-sized - you don't want to upload that each time new story is added.

About

Cross-platform desktop app for keeping track of stuff that you read.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Release

Stuff I Read

Desktop app for keeping track of stories (books, fanfics) you read.

Do you need this?

  1. You read a lot of different stuff. Like in hundreds or even thousands.
  2. You can't remember everything you read, and you have to keep track of that.
  3. Also, you like to score stories and write reviews, even if only for yourself.
  4. Maybe, you even re-read some stories.
  5. Excel spreadsheet is not enough anymore.

Development and support

Stuff I Read was created and tailored for my personal use-case, but I will add features by request if there's a need.

Technology

Built using Compose Multiplatform framework (selected as experiment/research).
My personal opinion after working with it: don't use it for serious multiplatform development until 2025 or so. Standard library is lacking, and framework is fragile. You will waste time re-implementing basic components, exploring internals because documentation is minimal, and fighting obscure bugs.

Features

Browse stories with extensive search

You can browse your archive using advanced search. You can search by author, description, publishing/last update dates, tags, score, review, content, word count and other parameters.

Example

Story search

Review and score stories that you read

Write reviews and score stories, so you won't forget why you enjoyed reading a story.

Score formats

Multiple score formats are supported, including 5 stars, 10 stars, 10/10, 100/100. Format can be changed at any time without breaking existing scores.

Example

Score display types

Tag system: tag categories, implied tags, search

To help with categorization stories can have fully customizable tags.

Tag category

Category provides order and color of the tag. Ordering can be very useful when story has dozens of tags.

Tag order

Tag implications

Tags can imply other tags. For example, tag of character can imply their species, and now you can search for stories with that species without explicitly adding the species tag.
You can edit implications at any moment and all stories will be affected by the change.

Examples of tags, you can create your own at any moment

Tag table

Sequels & prequels

Easy navigation for story sequels/prequels.

Example

Story sequels/prequels

Local story archive

Files with story content can be locally archived. Strictly speaking all formats are supported, but EPUB, HTML, PDF and TXT have special handling, for example word counting.
Files can represent not only the whole story, but individual chapters as well as any additional content too.

Example

Story files

Import stories from selection of websites

Currently supported:

  • archiveofourown.org
    Work can be imported in multiple file formats if needed.
  • pastebin.com
    Multiple pastes can be imported as one story.
  • poneb.in (Pony)
    Multiple pastes can be imported as one story.
  • ponepaste.org (Pony)
    Multiple pastes can be imported as one story.

||Don't worry, you can hide pony website integrations in settings||
If website has story tags - they can be imported and mapped to local tags:

Example

Tag mapping

Misc

Dark / light theme

Use system theme or select one yourself.

Example

Light/dark theme

Planned features

Localization support

Support at least English and Russian. Also support language-based import sources settings.

More import sources

Feel free to request other websites!

  • FimFiction.net - Pony (has excellent API, but need to request access).
  • PonyFiction.org - Pony, Russian
  • FicBook.net - Russian

Read Later and In Reading Lists

Read Later List: stuff that you want to read sometime. Prioritized, with notes, url, date added, etc.
In Reading List: stuff that you are reading right now.
Also, a way to move stories between lists: Read Later -> In Reading -> Archive

Stats and graphs

Page with aggregated stats on everything you read, including: total word count, score distribution, time distribution, and so on.

File format conversions

To be able to convert EPUB to PDF, TXT to HTML and so on.

Track individual reads

As of now only first read and last read dates are supported, but I think it would be cool to know about specific dates when you read something.

Android version

Compose Multiplatform "supports" it, but I personally don't need it. So it's low priority.

Story archive format

Story archive is a folder and consists of tags (tags.json), stories (individual folders with story info in story.json and archived files).

Q: Why use separate files instead of something like SQLite database?
A: I wanted story archive to be easily versioned. E.g. Git/other VCS, or clouds like Google Drive. SQLite DB with a thousand stories can be GB-sized - you don't want to upload that each time new story is added.

About

Cross-platform desktop app for keeping track of stuff that you read.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Release

Stuff I Read

Desktop app for keeping track of stories (books, fanfics) you read.

Do you need this?

  1. You read a lot of different stuff. Like in hundreds or even thousands.
  2. You can't remember everything you read, and you have to keep track of that.
  3. Also, you like to score stories and write reviews, even if only for yourself.
  4. Maybe, you even re-read some stories.
  5. Excel spreadsheet is not enough anymore.

Development and support

Stuff I Read was created and tailored for my personal use-case, but I will add features by request if there's a need.

Technology

Built using Compose Multiplatform framework (selected as experiment/research).
My personal opinion after working with it: don't use it for serious multiplatform development until 2025 or so. Standard library is lacking, and framework is fragile. You will waste time re-implementing basic components, exploring internals because documentation is minimal, and fighting obscure bugs.

Features

Browse stories with extensive search

You can browse your archive using advanced search. You can search by author, description, publishing/last update dates, tags, score, review, content, word count and other parameters.

Example

Story search

Review and score stories that you read

Write reviews and score stories, so you won't forget why you enjoyed reading a story.

Score formats

Multiple score formats are supported, including 5 stars, 10 stars, 10/10, 100/100. Format can be changed at any time without breaking existing scores.

Example

Score display types

Tag system: tag categories, implied tags, search

To help with categorization stories can have fully customizable tags.

Tag category

Category provides order and color of the tag. Ordering can be very useful when story has dozens of tags.

Tag order

Tag implications

Tags can imply other tags. For example, tag of character can imply their species, and now you can search for stories with that species without explicitly adding the species tag.
You can edit implications at any moment and all stories will be affected by the change.

Examples of tags, you can create your own at any moment

Tag table

Sequels & prequels

Easy navigation for story sequels/prequels.

Example

Story sequels/prequels

Local story archive

Files with story content can be locally archived. Strictly speaking all formats are supported, but EPUB, HTML, PDF and TXT have special handling, for example word counting.
Files can represent not only the whole story, but individual chapters as well as any additional content too.

Example

Story files

Import stories from selection of websites

Currently supported:

  • archiveofourown.org
    Work can be imported in multiple file formats if needed.
  • pastebin.com
    Multiple pastes can be imported as one story.
  • poneb.in (Pony)
    Multiple pastes can be imported as one story.
  • ponepaste.org (Pony)
    Multiple pastes can be imported as one story.

||Don't worry, you can hide pony website integrations in settings||
If website has story tags - they can be imported and mapped to local tags:

Example

Tag mapping

Misc

Dark / light theme

Use system theme or select one yourself.

Example

Light/dark theme

Planned features

Localization support

Support at least English and Russian. Also support language-based import sources settings.

More import sources

Feel free to request other websites!

  • FimFiction.net - Pony (has excellent API, but need to request access).
  • PonyFiction.org - Pony, Russian
  • FicBook.net - Russian

Read Later and In Reading Lists

Read Later List: stuff that you want to read sometime. Prioritized, with notes, url, date added, etc.
In Reading List: stuff that you are reading right now.
Also, a way to move stories between lists: Read Later -> In Reading -> Archive

Stats and graphs

Page with aggregated stats on everything you read, including: total word count, score distribution, time distribution, and so on.

File format conversions

To be able to convert EPUB to PDF, TXT to HTML and so on.

Track individual reads

As of now only first read and last read dates are supported, but I think it would be cool to know about specific dates when you read something.

Android version

Compose Multiplatform "supports" it, but I personally don't need it. So it's low priority.

Story archive format

Story archive is a folder and consists of tags (tags.json), stories (individual folders with story info in story.json and archived files).

Q: Why use separate files instead of something like SQLite database?
A: I wanted story archive to be easily versioned. E.g. Git/other VCS, or clouds like Google Drive. SQLite DB with a thousand stories can be GB-sized - you don't want to upload that each time new story is added.

About

Cross-platform desktop app for keeping track of stuff that you read.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages