Skip to content

ai-feed@suleman: new desklet - #1847

Open
suleman-dawood wants to merge 3 commits into
linuxmint:masterfrom
suleman-dawood:add-ai-feed
Open

ai-feed@suleman: new desklet#1847
suleman-dawood wants to merge 3 commits into
linuxmint:masterfrom
suleman-dawood:add-ai-feed

Conversation

@suleman-dawood

Copy link
Copy Markdown

New desklet: AI Feed

Aggregates trending AI content from GitHub, arXiv, Hacker News, and HuggingFace into one live desktop feed.

Features

  • Per-source counts, filters (languages, categories, keywords), refresh interval
  • Bookmark items + searchable bookmark dialog
  • Configurable colors, font scale, dimensions, source display order
  • Optional GitHub / HuggingFace tokens for higher rate limits
  • Offline cache fallback

Source

Upstream repo: https://github.com/suleman-dawood/ai-feed
Tested on: Cinnamon 5.4-6.4 (libsoup 2.4 via GJS).

Notes for reviewers

  • `screenshot.png` and `files/ai-feed@suleman/icon.png` are placeholders pending real captures (will push real images on request).
  • `validate-spice ai-feed@suleman` passes.

@github-actions

Copy link
Copy Markdown

Best-practices scanner

This is a regex-based check for API usage that can pose security, performance or
maintainability issues, or that may already be provided by Cinnamon. Most findings
are advisory and do not automatically disqualify a pull request.

This check is not perfect and will not replace a normal review.


Found 6 potential issue(s):

⚠️ WARNING

⚠️ sync_file_load_contents

ai-feed@suleman/files/ai-feed@suleman/bookmarks.js:22

let [ok, contents] = file.load_contents(null);

Synchronous load_contents() blocks the main loop.
Use load_contents_async() instead.

ai-feed@suleman/files/ai-feed@suleman/cache.js:19

let [ok, contents] = file.load_contents(null);

Synchronous load_contents() blocks the main loop.
Use load_contents_async() instead.

⚠️ sync_file_replace_contents

ai-feed@suleman/files/ai-feed@suleman/bookmarks.js:41

file.replace_contents(json, null, false, Gio.FileCreateFlags.REPLACE_DESTINATION, null);

Synchronous replace_contents() blocks the main loop.
Use replace_contents_async() instead.

ai-feed@suleman/files/ai-feed@suleman/cache.js:34

file.replace_contents(json, null, false, Gio.FileCreateFlags.REPLACE_DESTINATION, null);

Synchronous replace_contents() blocks the main loop.
Use replace_contents_async() instead.

⚠️ sync_file_query_exists

ai-feed@suleman/files/ai-feed@suleman/bookmarks.js:18

if (!file.query_exists(null)) {

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

ai-feed@suleman/files/ai-feed@suleman/cache.js:18

if (!file.query_exists(null)) return null;

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.


Automated pattern check.

A partial/empty cache.json caused JSON.parse to throw on every load.
The error was logged but the bad file was never removed, so the same
failure repeated until a successful network refresh overwrote it.
Now we delete the bad file on parse failure so the next write starts
clean.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant