Alcides Oliveira

Full-stack software engineer

All projects

ÍGNEA Hub

Work at ÍGNEA · Aug 2025 – May 2026 · Private repository

A public page that lists ÍGNEA DATA’s tools for the mining sector, such as MineCheck, ReportGeo, and Calendário Mineral, says what each one does, and links to it. Executives, compliance teams, and engineers all arrive through the same page, so it had to work for all three.

I worked on the hub from its first version in 2025 and was its only developer from January to May 2026.

ÍGNEA Hub, screenshot 1
Home page in Portuguese, February 2026: the hero and the sidebar with that month’s six products, with the language switch and the collapse control at the bottom.

ÍGNEA DATA offers several separate tools for the mining sector, each on its own domain. The first version of the hub, built in 2025, was a portal behind a login, with a dashboard, an admin panel, and its own database. The company needed a public page where anyone could see every tool, read what it does, and open it. The list of tools also kept changing, with products added, renamed, and taken down, so the site had to absorb those changes without layout work.

Cut the back end the site no longer used

After the hub became a static catalog, production still ran six containers, including two PostgreSQL databases and two pgAdmin instances, and together they used up the server’s 2 GB of RAM and brought it down. I removed Prisma, the auth code, the API routes, and Redux, cut the deploy to one container, and kept a separate compose file for local development.

One page with state instead of one route per product

I kept the whole hub on a single page and switched products through React state. The sidebar and the chosen language stay put while people browse, and that is enough for a catalog of ten entries. The cost is that a product page has no URL of its own to share.

One brand instead of one logo per product

The team decided not to design a logo for every system. I wrote the change up in a short spec, then removed the per-product logos and icons from the sidebar and the cards, hid the product list when the sidebar is collapsed since there were no icons left to show, and put the ÍGNEA DATA mark on every detail page, so the products read as parts of one suite.

  • Front-end pieces of the first version in 2025, in React and Tailwind CSS: the card and menu components, a hamburger menu for mobile, a modal with more detail when a card is clicked, the admin panel interface (dashboard, user management, and settings screens), and a front-end documentation page.
  • The new public page: I prototyped it in a separate repository in December 2025, moving it from Vite to Next.js, and brought it into the main repository in January 2026 with a hero, product grid, product detail page, CTA, footer, and a collapsible sidebar that collapses on its own below 1024 px.
  • A typed bilingual content model in TypeScript: every product text is stored as a Portuguese and English pair, and a switch at the bottom of the sidebar changes the language of the whole page.
  • A pending state for products without official copy or a production URL: a neutral “under review” text, an amber status in the detail panel, and a disabled access button labeled “Link pending”. With it the catalog went from five active systems to ten, six of them pending, without invented claims or broken links.
  • A lean Docker setup for AWS Lightsail: Next.js standalone output, a two-stage Node 20 Alpine image, a memory cap on the container and on the Node heap, init to reap zombie processes, and a health check that uses wget instead of starting a second Node process.
  • Security and load fixes: upgraded Next.js from 15.4.7 to 15.5.12 to patch CVE-2025-66478, removed about 67 MB of images no page referenced, and stopped loading the background noise texture from an outside site, first hosting it myself and then inlining it as a data URI.

The hub is a single Next.js 15 page. One client component holds three pieces of state: the selected product, whether the sidebar is collapsed, and the current language (Portuguese or English). The sidebar, the product grid, and the footer all read the same product list, and picking a product swaps the overview for a detail page in place, with no route change. In January 2026 I pointed the old routes (login, dashboard, admin, docs) at the home page, and in February I deleted them along with the back end.

Product content lives in one typed TypeScript file, which I moved out of the page component in May 2026. Each product has an id, a name, description, and category in both languages, a list of features with bilingual titles and descriptions, an optional link to the app, an active flag, and a content status of ready or pending. The components render what that file says and nothing else, so adding, hiding, or renaming a product is a data change. Interface labels such as “Overview” and “Back to Hub” switch on the same language state.

The site builds to a Next.js standalone server inside a two-stage Docker image, runs as a non-root user with a health check, and is deployed with Docker Compose on an AWS Lightsail instance. GitHub Actions runs ESLint, a TypeScript check, and a production build on pull requests to the dev and main branches and on pushes to dev.

ÍGNEA Hub, screenshot 2
Product grid from the same period: each card comes from the typed product list, with logo, category, name, and summary. The per-product logos were removed in May 2026.
ÍGNEA Hub, screenshot 3
MineCheck detail page from the shared template: summary, four features, status panel, and a link to the app.
ÍGNEA Hub, screenshot 4
ReportGeo on the same template, filled with different data and no layout changes.
Front end
Next.js 15, React 19, TypeScript, Tailwind CSS, Lucide icons
Infrastructure
Docker, Docker Compose, Node.js 20 (Alpine), AWS Lightsail
Tooling
GitHub Actions, ESLint