From 2ed2d32de52ffc31c28d4db9ef63b8cd40c96721 Mon Sep 17 00:00:00 2001 From: Max Baginskiy Date: Fri, 10 Jul 2026 22:33:54 +0300 Subject: [PATCH 1/4] Add 2026 tech radar and Engineering School positions tab Update Tech Radar with a 2026 entry (RabbitMQ, ElasticSearch, Loki, OpenAPI to Hold; Claude, Cursor to Adopt) and add a new "Engineering School" nav tab listing open engineering positions across teams as expandable cards. Co-Authored-By: Claude Sonnet 5 --- src/App.js | 475 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 469 insertions(+), 6 deletions(-) diff --git a/src/App.js b/src/App.js index 9c6fc18..be75b7f 100644 --- a/src/App.js +++ b/src/App.js @@ -414,6 +414,72 @@ const RADAR_CONFIG = { { label: "Claude", quadrant: 3, ring: 1, moved: 2 }, ], }, + 2026: { + ...DEFAULT_RADAR_CONFIG, + date: getLastUpdated("2026-07-10"), + title: "Tech Radar 2026", + entries: [ + // Languages & Frameworks + { label: "Go", quadrant: 0, ring: 0, moved: 0 }, + { label: "Kotlin", quadrant: 0, ring: 0, moved: 0 }, + { label: "PHP", quadrant: 0, ring: 3, moved: -1 }, + { label: "Symfony", quadrant: 0, ring: 3, moved: -1 }, + { label: "Ktor", quadrant: 0, ring: 3, moved: -1 }, + { label: "Spring", quadrant: 0, ring: 0, moved: 0 }, + { label: "Echo v4", quadrant: 0, ring: 3, moved: -1 }, + { label: "GORM", quadrant: 0, ring: 3, moved: -1 }, + { label: "Go PGX", quadrant: 0, ring: 0, moved: 1 }, + { label: "React", quadrant: 0, ring: 0, moved: 0 }, + { label: "TypeScript", quadrant: 0, ring: 0, moved: 0 }, + { label: "JavaScript", quadrant: 0, ring: 3, moved: -1 }, + { label: "Hugo", quadrant: 0, ring: 3, moved: -1 }, + { label: "Astro", quadrant: 0, ring: 1, moved: 1 }, + { label: "Redux", quadrant: 0, ring: 3, moved: -1 }, + { label: "Python", quadrant: 0, ring: 0, moved: 0 }, + { label: "Task", quadrant: 0, ring: 0, moved: 0 }, + { label: "Fastify", quadrant: 0, ring: 0, moved: 0 }, + { label: "Shell", quadrant: 0, ring: 3, moved: -1 }, + { label: "Make", quadrant: 0, ring: 3, moved: -1 }, + // Platform & Infrastructure + { label: "Loki", quadrant: 1, ring: 3, moved: -1 }, + { label: "GitLab", quadrant: 1, ring: 0, moved: 0 }, + { label: "GitLab CI/CD", quadrant: 1, ring: 0, moved: 0 }, + { label: "VictoriaMetrics", quadrant: 1, ring: 0, moved: 0 }, + { label: "Grafana", quadrant: 1, ring: 0, moved: 0 }, + { label: "Apache Airflow", quadrant: 1, ring: 0, moved: 0 }, + { label: "Docker", quadrant: 1, ring: 0, moved: 0 }, + { label: "Kubernetes", quadrant: 1, ring: 2, moved: 0 }, + { label: "AWS", quadrant: 1, ring: 0, moved: 0 }, + { label: "Terraform", quadrant: 1, ring: 0, moved: 0 }, + // Data Management + { label: "RabbitMQ", quadrant: 2, ring: 3, moved: -1 }, + { label: "SQS", quadrant: 2, ring: 0, moved: 0 }, + { label: "PostgreSQL", quadrant: 2, ring: 0, moved: 0 }, + { label: "Redis", quadrant: 2, ring: 0, moved: 0 }, + { label: "Kafka", quadrant: 2, ring: 0, moved: 0 }, + { label: "ElasticSearch", quadrant: 2, ring: 3, moved: -1 }, + { label: "OpenSearch", quadrant: 2, ring: 0, moved: 0 }, + { label: "MongoDB", quadrant: 2, ring: 3, moved: -1 }, + { label: "MySQL", quadrant: 2, ring: 3, moved: -1 }, + // Techniques, Tools & AI + { label: "TBD", quadrant: 3, ring: 0, moved: 0 }, + { label: "Buf (gRPC)", quadrant: 3, ring: 0, moved: 0 }, + { label: "Buf (gRPC) Registry", quadrant: 3, ring: 0, moved: 0 }, + { label: "golangci-lint", quadrant: 3, ring: 0, moved: 0 }, + { label: "bufbuild/protovalidate", quadrant: 3, ring: 1, moved: 0 }, + { label: "OpenAPI", quadrant: 3, ring: 3, moved: 0 }, + { label: "Jira", quadrant: 3, ring: 0, moved: 0 }, + { label: "Confluence", quadrant: 3, ring: 0, moved: 0 }, + { label: "Blue-Green Deployment", quadrant: 3, ring: 0, moved: 0 }, + { label: "GitOps", quadrant: 3, ring: 0, moved: 0 }, + { label: "GitHub Copilot", quadrant: 3, ring: 3, moved: 0 }, + { label: "OpenAI", quadrant: 3, ring: 0, moved: 0 }, + { label: "Gemini", quadrant: 3, ring: 0, moved: 0 }, + { label: "Cursor", quadrant: 3, ring: 0, moved: 1 }, + { label: "CodeRabbit", quadrant: 3, ring: 0, moved: 0 }, + { label: "Claude", quadrant: 3, ring: 0, moved: 1 }, + ], + }, }; function LanguageBlock({ language, logo, requirements, questions }) { @@ -4422,8 +4488,291 @@ function AIUsageSection() { ); } +const POSITION_STACK_STYLES = { + Go: { color: "#14416C", bg: "#CADCED" }, + Kotlin: { color: "#E65100", bg: "#FFE0B2" }, + "Node.js": { color: "#4A9F8A", bg: "#E4F0EC" }, + Frontend: { color: "#4D1D74", bg: "#DBC0F0" }, +}; + +const ENGINEERING_SCHOOL_POSITIONS = [ + { + title: "Node.js Backend Engineer", + team: "Banking", + stack: "Node.js", + hook: "Move millions across currencies — build the IBANs merchants use instead of a local bank account.", + details: + "Treasury gives merchants their own EUR, USD, and GBP IBANs, fast SEPA and SWIFT transfers, competitive FX rates, and worldwide payouts — moving millions in merchant funds across markets every month, all from a single dashboard. The team owns everything from account provisioning to reconciliation with banking partners, so companies never have to open a local bank account just to operate globally.", + }, + { + title: "Go Engineer", + team: "Billing & Taxes", + stack: "Go", + hook: "Run the subscription engine behind 10M+ active subscriptions — and the taxes on every single one.", + details: + "The team owns the subscription engine end-to-end for 10M+ active subscriptions — renewals, upgrades, downgrades, cancellations, and revenue recovery — plus the Tax sub-team, which keeps tax calculation and compliance correct across every market Solidgate operates in. Get this wrong and merchants lose LTV and churn; get it right and it compounds revenue quietly in the background.", + }, + { + title: "Go Engineer", + team: "Antifraud", + stack: "Go", + hook: "Screen every one of our 20M+ monthly transactions for fraud — in real time, without slowing anyone down.", + details: + "Part of Risk Systems, this team builds the fraud-prevention engine that scores and screens all 20M+ transactions Solidgate processes every month in real time, combining rules and automated detection to block fraud before it happens. The hard part is doing that without adding friction for legitimate shoppers — a balance that directly protects merchant trust and Solidgate's own financial resilience.", + }, + { + title: "Go Engineer", + team: "Dispute Representment", + stack: "Go", + hook: "Build the system that fights chargebacks — 96% of it running with zero human hands.", + details: + "Also part of Risk Systems, in the Dispute Management sub-team, this group builds the logic behind chargebacks and disputes — evidence handling, automated representment, and outcome tracking — with 96% of the representment process fully automated. Winning disputes recovers revenue merchants would otherwise lose, so this is one of the clearest places where engineering work shows up directly in a merchant's bottom line.", + }, + { + title: "Go Engineer", + team: "APM (Alternative Payment Methods)", + stack: "Go", + hook: "Wire up 20+ alternative payment methods into one engine that decides how every transaction gets paid.", + details: + "Part of Payment Infra, the APMs sub-team integrates 20+ alternative payment methods — wallets, bank transfers, and local payment rails — into Solidgate's orchestration and routing layer. Every new method and every routing decision affects conversion, latency, and margin at a scale where milliseconds and basis points matter.", + }, + { + title: "Frontend Engineer", + team: "APM", + stack: "Frontend", + hook: "Make 20+ alternative payment methods feel like one seamless checkout, everywhere they show up.", + details: + "Same Payment Infra / APMs mission as the Go role on this team, from the frontend side: the checkout and merchant-facing surfaces that expose our 20+ alternative payment methods have to stay fast and reliable as new methods and routing logic roll out underneath them.", + }, + { + title: "Frontend Engineer", + team: "Finance Engineering", + stack: "Frontend", + hook: "Turn billions of calculations a month into dashboards Finance can actually trust.", + details: + "Finance Engineering automates work that would otherwise be manual for the Finance team — reconciliation, reporting, ledgers — while running billions of calculations every month on financial data. The team builds the internal tools and dashboards that let Finance operate at Solidgate's transaction volume without drowning in spreadsheets.", + }, + { + title: "Kotlin Engineer", + team: "Core", + stack: "Kotlin", + hook: "Build the engine that authorizes and routes 20M+ card payments every single month.", + details: + "Core is the heart of Solidgate's payment router — the engine that decides how every one of the 20M+ card payments we process each month gets authorized, routed, and settled. It sits inside the Orchestration team, which builds intelligent routing across PSPs and payment methods for NA, EU, and LatAm — the layer where milliseconds, conversion, and merchant trust are won or lost.", + }, +]; + +function PositionCard({ position, isExpanded, onToggle }) { + const stack = POSITION_STACK_STYLES[position.stack]; + + return ( +
{ + e.currentTarget.style.borderColor = "#66BB6A"; + }} + onMouseLeave={(e) => { + e.currentTarget.style.borderColor = "#e5e7eb"; + }} + > +
+
+
+

+ {position.title} +

+

+ {position.team} Team +

+
+
+ + {position.stack} + + + › + +
+
+ +

+ {position.hook} +

+ + {isExpanded && ( +
+

+ {position.details} +

+
+ )} +
+ ); +} + +function EngineeringSchoolSection() { + const [expandedIndex, setExpandedIndex] = useState(null); + + return ( +
+
+

+ Software Engineering School — Open Positions +

+

+ We look for product engineers who know how to code and are ready to + become real T-shaped specialists. +

+
+
+ {ENGINEERING_SCHOOL_POSITIONS.map((position, index) => ( + + setExpandedIndex(expandedIndex === index ? null : index) + } + /> + ))} +
+
+ ); +} + function TechRadarTabs() { - const [selected, setSelected] = useState("2025"); + const [selected, setSelected] = useState("2026"); return (
2025 +
@@ -4675,10 +5063,11 @@ export function App() {
{ if (hash !== "#home") { @@ -4726,6 +5116,7 @@ export function App() { border: "2px solid transparent", transition: "all 0.2s ease", textAlign: "center", + whiteSpace: "nowrap", }} onMouseEnter={(e) => { if (hash !== "#interview") { @@ -4759,6 +5150,7 @@ export function App() { border: "2px solid transparent", transition: "all 0.2s ease", textAlign: "center", + whiteSpace: "nowrap", }} onMouseEnter={(e) => { if (hash !== "#minds-behind-code") { @@ -4792,6 +5184,7 @@ export function App() { border: "2px solid transparent", transition: "all 0.2s ease", textAlign: "center", + whiteSpace: "nowrap", }} onMouseEnter={(e) => { if (hash !== "#more-about-us") { @@ -4824,6 +5217,7 @@ export function App() { border: "2px solid transparent", transition: "all 0.2s ease", textAlign: "center", + whiteSpace: "nowrap", }} onMouseEnter={(e) => { if (hash !== "#ai") { @@ -4843,6 +5237,40 @@ export function App() { > AI @ Solidgate + { + if (hash !== "#se-school") { + e.target.style.background = "#F5F5F5"; + } + }} + onMouseLeave={(e) => { + if (hash !== "#se-school") { + e.target.style.background = "#ffffff"; + } + }} + onMouseDown={(e) => { + if (hash !== "#se-school") { + e.target.style.background = "#d1d5db"; + } + }} + > + Engineering School +
AI @ Solidgate + setMobileMenuOpen(false)} + style={{ + color: "#26282C", + fontWeight: 400, + textDecoration: "none", + fontSize: "1rem", + padding: "8px 16px", + borderRadius: "8px", + background: hash === "#se-school" ? "#E1EFFC" : "#ffffff", + border: "2px solid transparent", + transition: "all 0.2s ease", + textAlign: "center", + }} + onMouseEnter={(e) => { + if (hash !== "#se-school") { + e.target.style.background = "#F5F5F5"; + } + }} + onMouseLeave={(e) => { + if (hash !== "#se-school") { + e.target.style.background = "#ffffff"; + } + }} + onMouseDown={(e) => { + if (hash !== "#se-school") { + e.target.style.background = "#d1d5db"; + } + }} + > + Engineering School +
)} {/* Page Content */}
- {hash === "#interview" ? ( + {hash === "#se-school" ? ( + + ) : hash === "#interview" ? ( ) : hash === "#minds-behind-code" ? ( From b83ed8605edc0413e4151b4aef0a864d52f8cbd0 Mon Sep 17 00:00:00 2001 From: Max Baginskiy Date: Sat, 11 Jul 2026 04:53:12 +0300 Subject: [PATCH 2/4] Rename Go engineer position from APM to Cards team The role owns card network/acquiring bank integrations, not alternative payment methods, so relabel the position and update its copy to match. Co-Authored-By: Claude Sonnet 5 --- src/App.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/App.js b/src/App.js index be75b7f..ca0425c 100644 --- a/src/App.js +++ b/src/App.js @@ -4530,11 +4530,11 @@ const ENGINEERING_SCHOOL_POSITIONS = [ }, { title: "Go Engineer", - team: "APM (Alternative Payment Methods)", + team: "Cards", stack: "Go", - hook: "Wire up 20+ alternative payment methods into one engine that decides how every transaction gets paid.", + hook: "Build the integrations that connect Solidgate to card networks and acquiring banks worldwide.", details: - "Part of Payment Infra, the APMs sub-team integrates 20+ alternative payment methods — wallets, bank transfers, and local payment rails — into Solidgate's orchestration and routing layer. Every new method and every routing decision affects conversion, latency, and margin at a scale where milliseconds and basis points matter.", + "The Cards team owns card payment integrations — connecting Solidgate to card networks, schemes, and acquiring banks so every card transaction can be authorized and processed reliably. Every new integration affects uptime, authorization rates, and how many markets and card types Solidgate can support.", }, { title: "Frontend Engineer", From 84691b409fa66b8e4a663f32278ea39a8ce76a4b Mon Sep 17 00:00:00 2001 From: Max Baginskiy Date: Mon, 13 Jul 2026 16:38:01 +0300 Subject: [PATCH 3/4] Add ML Engineer position to Orchestration team in Engineering School Co-Authored-By: Claude Sonnet 5 --- src/App.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/App.js b/src/App.js index ca0425c..7674d8f 100644 --- a/src/App.js +++ b/src/App.js @@ -4493,6 +4493,7 @@ const POSITION_STACK_STYLES = { Kotlin: { color: "#E65100", bg: "#FFE0B2" }, "Node.js": { color: "#4A9F8A", bg: "#E4F0EC" }, Frontend: { color: "#4D1D74", bg: "#DBC0F0" }, + ML: { color: "#00838F", bg: "#B2EBF2" }, }; const ENGINEERING_SCHOOL_POSITIONS = [ @@ -4560,6 +4561,14 @@ const ENGINEERING_SCHOOL_POSITIONS = [ details: "Core is the heart of Solidgate's payment router — the engine that decides how every one of the 20M+ card payments we process each month gets authorized, routed, and settled. It sits inside the Orchestration team, which builds intelligent routing across PSPs and payment methods for NA, EU, and LatAm — the layer where milliseconds, conversion, and merchant trust are won or lost.", }, + { + title: "ML Engineer", + team: "Orchestration", + stack: "ML", + hook: "Train the models that decide, in milliseconds, which PSP gets each of our 20M+ monthly card payments.", + details: + "Orchestration builds intelligent payment routing across PSPs and payment methods for NA, EU, and LatAm — the layer where milliseconds, conversion, and merchant trust are won or lost. This role builds the machine learning models behind that routing — feature pipelines, training, and online scoring — working alongside the Go engineers who run the router in production, so routing decisions keep getting sharper as PSP performance and fraud patterns shift.", + }, ]; function PositionCard({ position, isExpanded, onToggle }) { From 2dacb8635075dc55bd0059c9ab05024bc4c7240b Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 13 Aug 2026 14:44:55 +0300 Subject: [PATCH 4/4] feat: add AI screening --- src/App.js | 221 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 215 insertions(+), 6 deletions(-) diff --git a/src/App.js b/src/App.js index 7674d8f..16c0ea9 100644 --- a/src/App.js +++ b/src/App.js @@ -1853,6 +1853,7 @@ function InterviewGuide() { const [fireworkPosition, setFireworkPosition] = useState(null); const [showFirework, setShowFirework] = useState(false); const [showTechInterview, setShowTechInterview] = useState(false); + const [showAIScreen, setShowAIScreen] = useState(false); const [isMobile, setIsMobile] = useState(window.innerWidth < 768); useEffect(() => { @@ -2076,7 +2077,7 @@ function InterviewGuide() { margin: 0, }} > - 💻 Tech Screen (React live-coding) (30 min) + 🤖 AI Fluency Screening (~1 hour) - Frontend Only + Frontend / Full-Stack Only
-

- A real-time coding session focused on React fundamentals and - problem-solving. Before the technical interview, Front-End - Engineer candidates go through this additional step. +

+ A browser-based VS Code session with Claude Code available + throughout. You'll explore a small TypeScript/Node.js + codebase, add a focused feature, then implement a bigger one + from a deliberately concise spec. Before the technical + interview, Front-End and Full-Stack Engineer candidates go + through this additional step. +

+

+ We're not grading whether you finish — we're watching how you + direct AI, verify its output, and reason about trade-offs.

+ + + {showAIScreen && ( +
+
+

+ Preparation +

+

+ Check out{" "} + + solidgate.com + {" "} + 💚 and get to know what we build. You don't need domain + knowledge going in — what matters is how you think, + communicate, and use AI tools like Claude. +

+
+
+

+ 1. 👋 Intro (5 min) +

+

+ Quick introductions, then a chance to ask any questions + upfront — about the role, the team, or how we work. +

+
+
+

+ 2. 🔍 Warm-Up — Explore the Environment (5 min) +

+

+ A browser-based VS Code environment, pre-configured + with Node.js, TypeScript, and Claude Code CLI. Read the + spec, run the tests, ask clarifying questions. +

+
+
+

+ 3. 🔧 Task 1 — Small Feature (15 min) +

+

+ A small, well-scoped feature on a pre-built TypeScript/ + Node.js app. Get oriented, make a focused change, verify + it works in the running app — not just that the code + looks right. +

+
+
+

+ 4. ✨ Task 2 — Feature Implementation (20 min) +

+

+ A bigger feature from a spec that's intentionally + concise. Treat it like a real ticket — ask clarifying + questions, read the code you're building on, consider + edge cases, verify your work. +

+
+
+

+ 5. ✅ Wrap-Up & Next Steps (5 min) +

+

+ A short debrief and what's next. Time to ask us + anything — about the role, the team, or the engineering + culture at Solidgate. +

+
+
+

+ What we're looking for +

+

+ Not whether you finish everything — how you approach + problems and collaborate with AI: +

+
    +
  • + Requirements Discovery — explore + before touching code; ask about what's left open + rather than assuming +
  • +
  • + AI Direction — give Claude specific, + bounded tasks; skip it when reading the code yourself + is faster +
  • +
  • + Verification & Debugging — read + AI-generated code before applying it; dig for root + cause, don't just patch symptoms +
  • +
  • + Judgment & Trade-offs — make + reasonable calls on scope and design, and say why +
  • +
  • + Communication — think out loud, + treat the interviewer as a pairing partner +
  • +
+
+
+ )}