Open-source project
Nagi-ovo/dsh-ads avatar
Nagi-ovo/dsh-ads

dsh-ads: turning the DSH Web UI into a 2005 portal site, ads and all

Turns DSH into a 2005-style web portal. Parody ads, fake games, and popups for the DSH Web UI.

723 stars7 forksTypeScriptBSD-3-Clause

At a glance

What is it?
dsh-ads is a DSH web-profile plugin that injects parody portal ads, fake games, a jackpot wheel and popups into the chat UI. The gimmick is that inference keeps running behind the ad break, and the recommended plugins are real GitHub repositories.
Who is it for?
Adopt dsh-ads if you run the DSH web profile, want to see what a plugin can do to the conversation surface, and are fine with a joke that pauses what you see while the model keeps working. Skip it if you use DSH for anything where a mid-inference interruption is unacceptable, or if you are not on the web profile at all, since the client block declares platform web and the install command targets --profile web.
Can I use it commercially?
Yes. BSD-3-Clause is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 1 day ago.
What is it written in?
Mainly TypeScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.

From daily snapshots

Star history

  • Nagi-ovo/dsh-ads723 ★ · +93
Star history
Repository2026-09-212026-11-14
Nagi-ovo/dsh-ads630723

93 Stars in the last 54 days, measured from the daily GitHub snapshot. Compare with other projects

Editorial analysis

What dsh-ads actually changes in the DSH conversation

The problem it solves is not a problem in the usual sense. dsh-ads is a joke plugin for the DSH Web UI, and its target is the calm, minimal chat surface. It fills the sidebar, the conversation, the middle of a streaming answer and the bottom right corner with a full set of fictional advertisements: fake portal banners, fake antivirus warnings, fake games and popups. The README describes the effect as turning DeepSeek Harness into a 2005 portal site, and adds that even inference does not escape the ads.

The audience is narrow and specific. You need to be running DSH's web profile, because the package declares platform web in its dsh.client block and the recommended install path targets that profile. The repository carries the topics deepseek-harness, dsh-plugin, trolling and web-ui, which is an accurate summary of the intent. This is for people who want to watch a plugin reach into the conversation UI, or who want to show someone what the plugin surface can do. It is not a productivity tool and the README does not pretend otherwise.

One detail is worth separating from the gag. The plugin does not only mock itself. Public plugins on GitHub carrying the dsh-plugin topic and updated within the last two weeks enter the recommendation slots, and clicking one opens the real repository. The README notes that the repository is still discoverable after it moves to a personal account or another organization. That makes part of the ad inventory a genuine plugin directory rather than pure fiction, and the exposure records stay in the local browser.

Inference keeps running behind the ad break

The mechanism that matters is the pause. According to the README, dsh-ads appears to pause inference, but the model keeps working in the background; the follow-up answer and tool calls simply wait until the ad finishes before they are shown. That is a presentation-layer delay, not a stop signal. It is the single design decision that separates this from a static theme, and it is also the one most likely to annoy a real user, because the wall clock and the visible transcript disagree.

The package layout backs up the client-side nature of the work. package.json declares main lib/index.js, exports a ./client entry at lib/client.js, and declares a dsh.bundle.patch pointing at cordis.patch.yml, so the plugin is delivered as a bundle patch plus a client module rather than a standalone server. The dsh.client block injects @deepseek-ai/dsh-client-runtime and @deepseek-ai/dsh-client-locale. Those two injections explain the localization behaviour: switching DSH's language setting swaps the entire asset set, copy and interactions on the current page without a reload, with a Chinese mode built around browser-game aesthetics and an English mode built around fake antivirus and weird-tricks ads. The two blue-whale posters in Chinese mode rotate every 20 seconds.

The reward-gate ad is the most elaborate piece. It appears inside a streaming answer as a V4 Pro lottery, with a fortune whale, a wheel that grants one draw per round, and four unlock progress bars. The repository also contains a startup score screen that reports a measured startup time and a fabricated national ranking; the README is explicit that the timing is real and the ranking is invented. Build tooling is conventional for the ecosystem: tsdown for the bundle, vitest for tests, and separate tsconfig.json and tsconfig.client.json projects for the server and client halves.

Installing dsh-ads into the DSH web profile

The README recommends installing straight from GitHub into the web profile. The command below adds the plugin to that profile; if dsh web is already running, restart it and refresh the page afterwards.

sh
dsh plugin --profile web add github:Nagi-ovo/dsh-ads

After that, confirm the plugin made it into the resolved configuration. The README gives this exact command for the check, and the plugin should appear in the dumped config for the web profile.

sh
dsh --profile web --dump-config

If you want to change the source, clone the repository and add it from inside the repository directory. The README states that the build output is already committed, so no extra build step is required.

sh
dsh plugin --profile web add .

Users of the community plugin-registry can install from Settings then Plugins instead. Once installed, every ad slot can be turned off individually under Settings then Ads (unofficial), and the README says those choices persist until the next start. That settings panel is the first thing to open.

The verification button and what it actually contacts

The plugin has a verify-fix interaction, and it is the one outbound action the README documents. The README states that it queries GitHub star status once, only after the user clicks, preferring the local gh CLI or a token and otherwise calling the anonymous public API. The result is stored in the local browser only.

That is a modest disclosure, and the README is upfront about it, but it is still the part of the plugin a cautious user should read twice. A parody ad that reaches out to GitHub on click is doing more than rendering pixels, and the fallback path to an anonymous public API means requests can leave your machine without a credential attached. The disclaimer is equally clear in the other direction: the brands, people, domains, prices, viruses and promises in the ads are fictional, and the plugin does not scan, read or modify files on the machine.

The startup score screen follows the same pattern of one real number wrapped in fiction. Startup time is measured; the national ranking next to it is made up. If you are the kind of reader who skims screenshots, that screen is the one most likely to be mistaken for telemetry.

Where dsh-ads is the wrong tool

The obvious limitation is the pause. If a hidden delay between the model finishing and you seeing the result is unacceptable, this plugin is disqualified regardless of how funny the ads are. The README describes the behaviour plainly, so there is no ambiguity to resolve: the answer and tool calls wait for the ad to end. Anyone using DSH for work where they watch the stream to decide whether to interrupt will find that the stream lies to them.

The second constraint is platform. The client block declares platform web, the install instructions use --profile web, and there is no documented path for any other profile. If you run DSH somewhere else, the README gives you nothing to follow. There is also no release history to fall back on; the package.json version is 0.1.0 and it is marked private, so you are installing from the repository rather than from a published artifact.

The third is dependency drift. The peer dependencies are @deepseek-ai/cordis ^4.0.1, @deepseek-ai/dsh-client-locale ^0.1.0-rc.6, @deepseek-ai/schemastery ^3.18.1 and react ^18.2.0, while the devDependencies pin release candidates such as @deepseek-ai/dsh-client-runtime 0.1.1-rc.2. A plugin that patches the client bundle and injects client runtime modules is coupled to the host's internals, and the -rc suffixes in the dependency list are a fair warning that this coupling can break. The README does not document a rollback procedure, so removing the plugin is something you would work out from the DSH plugin command itself.

dsh-visualize and the difference in approach

The README names one alternative, and it is by the same author: dsh-visualize, which lets the model draw interactive interfaces directly in the conversation. The two plugins sit at opposite ends of the same surface. dsh-ads decorates the conversation with content the model did not produce, inserting banners, popups and a lottery gate between the user and the answer. dsh-visualize makes the conversation itself the rendering target, so the model's output arrives as an interactive visualization rather than as text with a delay attached.

That difference decides the choice. If you want the model's work to reach you faster and in a richer form, dsh-visualize is the relevant plugin and dsh-ads is the wrong one. If you want to see how far a plugin can bend the DSH Web UI, including a deliberate interruption of the stream, dsh-ads is the demonstration. The README even labels the dsh-visualize link as the only serious advertisement in the whole page, which is a fair summary of the split.

A second comparison is implicit in the recommendation slots. The plugin surfaces other dsh-plugin repositories that were updated in the last two weeks, so the ad inventory doubles as a discovery channel for the ecosystem. That is a different function from dsh-visualize's, and it is the part of dsh-ads that would still make sense if the joke were removed.

Licence, maintenance and upgrade cost

The repository is BSD-3-Clause, which permits use, modification and redistribution provided the copyright notice and licence text are retained. That is a permissive licence and it is compatible with the plugin being installed into a host application, but the licence covers the code and the fictional brand assets are a separate question the README does not address. The disclaimer states that the plugin is for entertainment and has no connection to DeepSeek or any real company, product or service, and that the brands, people, domains, prices, viruses and promises in the ads are fictional. If you fork it and ship it somewhere, that disclaimer is the part to keep intact. None of this is legal advice.

Maintenance is a judgement call. The repository is not archived, and the last push was on 2026-08-27, which is recent enough that the project is not dormant. There are no releases, so there is no versioned upgrade path and no changelog to read before pulling. Upgrading means re-running the add command against the current default branch, which is main, and accepting whatever the peer dependencies resolve to at that moment. The presence of release-candidate versions in devDependencies suggests the plugin tracks a host that is itself still settling, so an upgrade can change behaviour without any signal in the repository.

The practical cost is low in one respect and open-ended in another. The build output is committed and the install is a single command, so trying it is cheap. But the plugin patches the client bundle, and the README does not document how to unpick that patch, so the exit is less defined than the entrance.

Editorial conclusion

Adopt dsh-ads if you run the DSH web profile, want to see what a plugin can do to the conversation surface, and are fine with a joke that pauses what you see while the model keeps working. Skip it if you use DSH for anything where a mid-inference interruption is unacceptable, or if you are not on the web profile at all, since the client block declares platform web and the install command targets --profile web. Before installing, check that your DSH build satisfies the peer dependencies on @deepseek-ai/cordis ^4.0.1, @deepseek-ai/dsh-client-locale ^0.1.0-rc.6, @deepseek-ai/schemastery ^3.18.1 and react ^18.2.0, then confirm the plugin landed with dsh --profile web --dump-config.

Frequently asked questions

What does DSH mean?

In this repository DSH refers to DeepSeek Harness, the host application the plugin extends. The package targets DSH's web profile and its client runtime packages are published under the @deepseek-ai scope.

What does the abbreviation DSH stand for?

The README expands it as DeepSeek Harness, which it describes as being turned into a 2005 portal site by this plugin. The repository topics include deepseek-harness and dsh-plugin.

Does dsh-ads actually pause the model while an ad is showing?

No. The README states that the plugin only appears to pause inference, and that the model keeps working in the background while the follow-up answer and tool calls wait for the ad to finish before being displayed.

Can I turn off individual ad slots in dsh-ads?

Yes. Every ad slot can be disabled separately under Settings then Ads (unofficial), and the README says those choices are kept until the next start.

Does dsh-ads read or modify files on my machine?

The README's disclaimer states that the plugin does not scan, read or modify files on the machine. The one outbound action it documents is the verify-fix button, which queries GitHub star status once after a user click and stores the result in the local browser.

Official sources

  1. Issues
  2. License: BSD-3-Clause
  3. Nagi-ovo/dsh-ads on GitHub
  4. README
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/nagi-ovo-dsh-ads.svg)](https://hysenlabs.com/projects/nagi-ovo-dsh-ads)

Star history chart for your README

markdown
[![Star history](https://hysenlabs.com/chart/nagi-ovo-dsh-ads.svg)](https://hysenlabs.com/projects/nagi-ovo-dsh-ads)

Was this useful?