Omahub
← All plugins
D

Duolingo

by danglenoir

Your Duolingo streak and learning stats in the Omarchy bar.

Security review

Review recommended · 1 finding

Deterministic scan — not a security guarantee

Low
Risk level
Low
Analyzed commit
f369524
Scanned
1 month ago

Flagged patterns appear only in documentation files (README / docs) — descriptive examples, not executable code.

  • Docs external_hosts README.md:63

    Downloads or connects to an external HTTP(S) host.

    curl -fsSL "https://www.duolingo.com/2017-06-30/users?username=YOUR_USERNAME" \

Automated analysis only — not a security guarantee.

AI advisory review

No obvious issues detected

Language-model assessment · ~deepseek/deepseek-v4-flash-latest — advisory only

None
AI risk level
None
Recommendation
install
Model
~deepseek/deepseek-v4-flash-latest
Analyzed commit
f369524
Reviewed
1 month ago

This is a straightforward Duolingo stats widget: it fetches public profile and leaderboard data from allowlisted Duolingo HTTPS hosts, runs its Node helper without a shell, and sanitizes remote text before display. The deterministic finding points to a curl example in the README, which is documentation only and not executed by the plugin.

How this check works

This review combines the deterministic scan (the rule-based results above) with an independent look at the plugin's code by a language model. The model reads a trimmed sample of the repository's files, the manifest, and the README, then gives a plain-language risk level and a recommendation: install (no notable danger), review (look closer first), or avoid (clearly dangerous).

It runs on the same analyzed commit as the deterministic scan and is strictly advisory — it is not a security guarantee and never blocks a plugin by itself. A human moderator still reviews plugins before they are listed.

AI advisory only — automated analysis, not a security guarantee.

Install
$ omarchy plugin add https://github.com/danglenoir/omarchy-duolingo --enable
Widgets #bar #system

Omarchy Duolingo

An Omarchy Shell bar widget for your Duolingo streak and learning stats.

The bar shows Duo's mark and your current streak. When today's lesson is still outstanding, both turn urgent red, the count becomes bold, and an exclamation mark is added. Click the widget for course XP, total XP, and league standing.

Requirements

  • Omarchy 4.0 or newer with the Quickshell-based Omarchy Shell
  • Node.js (v18 or newer)
  • A public Duolingo profile
  • Internet access to duolingo.com and duolingo-leaderboards-prod.duolingo.com

Duolingo does not provide a supported public developer API for this use case. This plugin reads the same website endpoints used by Duolingo and may need updates when those responses change.

Install

Install and enable the plugin through Omarchy:

omarchy plugin add https://github.com/danglenoir/omarchy-duolingo.git --enable

The widget is added to the right section of the bar. Move it when needed:

omarchy bar move danglenoir.duolingo --section right

Local development install

From a local checkout, link the repository into the user plugin directory:

mkdir -p ~/.config/omarchy/plugins
ln -s "$PWD" ~/.config/omarchy/plugins/danglenoir.duolingo
omarchy-shell shell rescanPlugins
omarchy plugin enable danglenoir.duolingo

Configure

The widget can be configured directly from the Omarchy Shell UI!

  1. Click the Duolingo widget on your bar to open the popup panel.
  2. Click the gear icon (󰒓) in the top-right corner to open the Settings form.
  3. Enter your Duolingo username, and optionally a Language code (such as es, de, or ja) or exact Course ID.
  4. Click Save (󰆓). The settings are persisted directly within your Omarchy Shell configuration (shell.json).

Configuration fields:

Field Required Purpose
username Yes Your exact Duolingo username.
language No Learning-language code such as es, de, or ja. The matching course is shown.
courseId No Exact Duolingo course ID. This takes priority over language.

If both course selectors are blank, the active course is used when Duolingo returns it; otherwise the course with the most XP is shown. A Duolingo streak belongs to the whole account, not one language. The selected course supplies the language name and course XP shown next to that streak.

List the course IDs available on a public profile:

curl -fsSL "https://www.duolingo.com/2017-06-30/users?username=YOUR_USERNAME" \
  | jq '.users[0].courses[] | {id, title, learningLanguage}'

To force a shell reload:

omarchy restart shell

Refresh interval

The default refresh interval is 10 minutes. Change it through the bar configuration:

omarchy bar set danglenoir.duolingo refreshIntervalMinutes 15 --json

Middle-clicking the bar widget or pressing the refresh button in the panel requests fresh data immediately.

Troubleshooting

Run the data adapter directly to inspect its normalized output:

node ~/.config/omarchy/plugins/danglenoir.duolingo/Duolingo.js \
  --force --pretty

Useful Omarchy checks:

omarchy plugin validate ~/.config/omarchy/plugins/danglenoir.duolingo
omarchy plugin list --json
omarchy-shell shell rescanPlugins

Successful responses are cached in ~/.cache/omarchy-duolingo/stats.json. If Duolingo is temporarily unreachable, the panel keeps the last successful snapshot and marks it as cached.

Update

omarchy plugin update danglenoir.duolingo

Uninstall

Remove the widget and plugin checkout:

omarchy plugin remove danglenoir.duolingo

Optionally remove the cached stats:

rm -rf ~/.cache/omarchy-duolingo

For a local development symlink, disable the widget first, then remove the link:

omarchy plugin disable danglenoir.duolingo
rm ~/.config/omarchy/plugins/danglenoir.duolingo
omarchy-shell shell rescanPlugins

License

MIT