condenser-plus: Multi-Node API Rotation and Multilingual UI for the Classic Steemit Frontend

in #witness16 hours ago

What this is about

For years, steemit.com and the various forks of its frontend (Condenser) have been quietly running on a single hardcoded API endpoint. If that endpoint slows down or goes offline, the whole frontend becomes unusable. Yesterday I addressed exactly that — and today I'm extending it with proper multilingual support. Both changes are now in my public fork:

github.com/greece-lover/condenser-plus

Apache 2.0, fork point of steemit/condenser is commit 99914655.


Yesterday: Multi-node API rotation

The original Condenser passes a single URL to @steemit/steem-js:

steem.api.setOptions({ url: SDC_CLIENT_STEEMD_URL })

That's it. One server, no failover. If api.steemit.com goes down or gets sluggish, every Condenser-based frontend goes down with it.

I integrated my steem-node-rotator library — currently still in a private repo, will become public soon — which:

  1. Initializes a list of about 10 known Steem RPC nodes at app startup

  2. Probes all nodes in parallel and measures their latency

  3. Sets the fastest healthy node as the active RPC URL

  4. Re-checks every 60 seconds and switches over if the active node fails or recovers

  5. Exposes a small floating status indicator in the bottom-right corner showing the current node and full node table on click

The integration is minimal and non-invasive. Three files changed:

  • src/app/utils/RotatorBootstrap.js — new, initializes rotator and hooks into steem-js

  • src/app/components/elements/RotatorStatus.jsx — new, the status widget

  • src/app/Main.js — about 14 lines added for import and mount

The existing Settings UI (where users can manually pick an RPC server) is preserved. The rotator complements it, doesn't replace it.

In the browser console, three helpers are exposed:

window.__steemRotator.nodes()
window.__steemRotator.call('condenser_api.get_dynamic_global_properties', [])
window.__getActiveSteemNode()

You can verify the node-switching behavior live with these in DevTools.


Today: Multilingual UI

Condenser already had nine UI languages built in — English, French, Italian, Japanese, Korean, Polish, Russian, Spanish, Ukrainian — plus a deactivated Chinese file (zh.json.remove). But:

  • All translations except Ukrainian are incomplete — typically missing 100–130 strings out of 703 (15–19% gaps)

  • The translations themselves look like they came from machine translation around 2017 and haven't been touched since

  • German, the language of one of the larger Steem sub-communities, is missing entirely

  • The plural-form helper files in counterpart/ all require('pluralizers/en') — meaning every language was using English plural rules. A long-standing bug.

So I'm running a complete pass with AI-assisted high-quality translation:

  • All 9 existing languages will be fully re-translated and gap-filled

  • 10 new languages added: German, Chinese (reactivated and properly translated), Hindi, Bengali, Arabic (with RTL support), Indonesian, Vietnamese, Turkish, Dutch, Portuguese

  • The plural-bug gets fixed along the way

  • A browser-language auto-detection on first visit so users land on the right language without configuring anything

  • The language switcher gets moved from the side panel into the top bar where it's actually visible

That's around 14,000 strings total going through quality translation. German is starting today as the pilot — once that pass is verified, the others follow.

If your language isn't on the list and you'd like it added: drop a comment. I'm happy to add it.


Why bother with the old frontend at all?

Let me be transparent: I built something much more modern myself, available today at welako.app. It's a vacation rental and social platform on Steem with a contemporary UI, multi-language support from day one, and active development.

But humans are creatures of habit. Many users who have been on Steem for years are used to the classic Steemit interface. It is — despite years without serious upstream development — still the most-used frontend on the chain. Refusing to maintain it because it's old would just hurt those users.

So condenser-plus is my gift to the community: anyone can use this fork right now. Either clone the repo and run it locally:

git clone https://github.com/greece-lover/condenser-plus
cd condenser-plus
docker compose -f docker-compose.dev.yml up -d

…or wait a few days — I'll deploy a public instance to a server so people can use it without setting anything up.

I'll keep adding small and larger improvements as time and energy permit. The codebase is hopelessly outdated in many places (Node 12, Webpack 4, dozens of unmaintained dependencies), but it works, and that's what matters for the people using it.


What I'd love from witnesses and the community

Witness votes help me keep nodes online and time available for community work like this. I currently run as @greece-lover at rank 52. If condenser-plus is useful to you, vote for me — and consider voting for the witnesses who keep the API nodes healthy that this rotator depends on, particularly @moecki, @justyy and others maintaining stable RPC endpoints.


Deutsche Version

condenser-plus: Multi-Node API-Rotation und mehrsprachige Oberfläche für das klassische Steemit-Frontend

Ein kleines Geschenk an die Steem-Community.


Worum es geht

Seit Jahren laufen steemit.com und die verschiedenen Forks des Condenser-Frontends still und heimlich gegen einen einzigen hartcodierten API-Endpunkt. Wird der langsam oder fällt aus, ist das ganze Frontend nicht mehr nutzbar. Gestern habe ich genau das adressiert — und heute erweitere ich es um vernünftige Mehrsprachigkeit. Beide Änderungen liegen in meinem öffentlichen Fork:

github.com/greece-lover/condenser-plus

Apache 2.0, Fork-Punkt von steemit/condenser ist Commit 99914655.


Gestern: Multi-Node API-Rotation

Der Original-Condenser übergibt eine einzige URL an @steemit/steem-js:

steem.api.setOptions({ url: SDC_CLIENT_STEEMD_URL })

Das war's. Ein Server, kein Failover. Wenn api.steemit.com ausfällt oder lahmt, geht jedes Condenser-basierte Frontend mit unter.

Ich habe meine Library steem-node-rotator integriert — aktuell noch in einem privaten Repo, wird bald öffentlich. Sie:

  1. Initialisiert beim App-Start eine Liste von etwa 10 bekannten Steem-RPC-Nodes

  2. Testet alle Nodes parallel und misst deren Latenz

  3. Setzt den schnellsten gesunden Node als aktive RPC-URL

  4. Prüft alle 60 Sekunden nach und schaltet bei Ausfall oder Recovery um

  5. Zeigt unten rechts einen kleinen Status-Indikator mit dem aktiven Node, beim Klick öffnet sich die Tabelle aller Nodes

Die Integration ist minimal und nicht-invasiv. Drei Dateien geändert:

  • src/app/utils/RotatorBootstrap.js — neu, initialisiert den Rotator und hängt sich in steem-js ein

  • src/app/components/elements/RotatorStatus.jsx — neu, das Status-Widget

  • src/app/Main.js — etwa 14 Zeilen für Import und Mount ergänzt

Die bestehende Settings-UI (wo User manuell einen RPC-Server wählen können) bleibt erhalten. Der Rotator ergänzt sie, ersetzt sie nicht.

In der Browser-Konsole sind drei Helfer verfügbar:

window.__steemRotator.nodes()
window.__steemRotator.call('condenser_api.get_dynamic_global_properties', [])
window.__getActiveSteemNode()

Damit kannst du das Node-Switching live in den DevTools verifizieren.


Heute: Mehrsprachige Oberfläche

Condenser hatte bereits neun UI-Sprachen eingebaut — Englisch, Französisch, Italienisch, Japanisch, Koreanisch, Polnisch, Russisch, Spanisch, Ukrainisch — plus eine deaktivierte Chinesisch-Datei (zh.json.remove). Aber:

  • Alle Übersetzungen außer Ukrainisch sind unvollständig — typischerweise fehlen 100–130 Strings von 703 (15–19% Lücken)

  • Die Übersetzungen selbst sehen aus wie maschinelle Übersetzungen von 2017, seitdem hat niemand mehr Hand angelegt

  • Deutsch, die Sprache einer der größeren Steem-Sub-Communities, fehlt komplett

  • Die Plural-Helfer-Dateien in counterpart/ machen alle require('pluralizers/en') — jede Sprache nutzt also englische Plural-Regeln. Ein lange übersehener Bug.

Deshalb ziehe ich jetzt einen kompletten Durchgang mit KI-gestützter, hochwertiger Übersetzung durch:

  • Alle 9 bestehenden Sprachen werden komplett neu übersetzt und Lücken aufgefüllt

  • 10 neue Sprachen kommen dazu: Deutsch, Chinesisch (reaktiviert und ordentlich übersetzt), Hindi, Bengali, Arabisch (mit RTL-Unterstützung), Indonesisch, Vietnamesisch, Türkisch, Niederländisch, Portugiesisch

  • Der Plural-Bug wird nebenbei gefixt

  • Eine Browser-Sprach-Erkennung beim ersten Besuch, damit User automatisch auf der richtigen Sprache landen ohne irgendetwas einzustellen

  • Der Sprachen-Switcher wandert vom Side Panel in die Top-Leiste, wo er sichtbar ist

Insgesamt etwa 14.000 Strings durchlaufen die Qualitätsübersetzung. Deutsch macht heute den Pilot-Lauf — wenn der überzeugt, folgen die anderen.

Wenn deine Sprache nicht auf der Liste steht und du sie gerne hättest: kommentier kurz drunter. Ich nehme sie dann mit.


Warum überhaupt am alten Frontend basteln?

Lass mich ehrlich sein: Ich habe selbst etwas viel Moderneres entwickelt, das du heute schon unter welako.app nutzen kannst. Das ist eine Vermietungs- und Social-Plattform auf Steem mit zeitgemäßer Oberfläche, Mehrsprachigkeit von Tag eins und aktiver Entwicklung.

Aber der Mensch ist ein Gewohnheitstier. Viele Steem-User, die seit Jahren dabei sind, haben sich an die klassische Steemit-Oberfläche gewöhnt. Sie ist — trotz jahrelang ausbleibender ernsthafter Upstream-Entwicklung — noch immer das meistgenutzte Frontend auf der Chain. Sich zu weigern sie zu pflegen, weil sie alt ist, würde nur den Usern wehtun die sie nutzen.

Deshalb ist condenser-plus mein Geschenk an die Community: jeder kann diesen Fork sofort nutzen. Entweder das Repo klonen und lokal laufen lassen:

git clone https://github.com/greece-lover/condenser-plus
cd condenser-plus
docker compose -f docker-compose.dev.yml up -d

…oder ein paar Tage warten — ich werde demnächst eine öffentliche Instanz auf einen Server deployen, damit man es ohne Aufwand nutzen kann.

Ich werde immer mal wieder kleinere und größere Verbesserungen einbauen, wenn Zeit, Lust und Laune da sind. Die Codebase ist an vielen Stellen hoffnungslos veraltet (Node 12, Webpack 4, Dutzende ungepflegter Dependencies), aber sie funktioniert — und das ist das was zählt für die Leute die sie nutzen.


Was ich mir von Witnesses und der Community wünschen würde

Witness-Stimmen helfen mir Nodes am Laufen zu halten und Zeit für Community-Arbeit wie diese zu haben. Ich laufe aktuell als @greece-lover auf Rang 52. Wenn condenser-plus für dich nützlich ist, stimm für mich — und überleg auch für die Witnesses zu stimmen, die die API-Nodes gesund halten, von denen dieser Rotator abhängt, insbesondere @moecki, @justyy und andere die stabile RPC-Endpunkte betreiben.



Published with Welako

Sort:  

Gute Sache! Habe es aber noch nicht probiert. Aber du hattest ja schon im Discord gepostet, dass die CSP-Regeln keinen Einfluss auf den so eingestellten Knoten haben.

Wir müssen bloß aufpassen, dass wir nicht durch den ganzen "Checking"-Traffic (insbesondere, wenn mehrere User die Erweiterung nutzen) so viel Last auf die Server erzeugen, dass dieser allein dadurch langsamer wird.

Am Besten wäre also eine zentrale Instanz, die die Nodes testet, auf deren Ergebnisse dann die Clients zugreifen und switchen können.

Genau dafür haben wir den API-Monitor zuerst entwickelt — er fängt
diese Healthcheck-Anfragen zentral ab. In den nächsten Tagen wird
das komplett umgestellt: die Frontends fragen nicht mehr direkt
die API-Nodes ab, sondern den Monitor-Server. Damit hat jeder Node
nur noch eine Quelle die ihn pingt, statt tausender Browser parallel.

Das Live-Dashboard läuft hier: https://api.steemapps.com/index.html

Published with Welako