Junior Full-Stack / Generalist Software Engineer (f/m/x)
Skills
Description
THE JOB WE ARE HIRING SOMEONE TO DO ANNEA runs two production systems for clients in the wind energy industry, each with its own backend, frontend, databases and deployment pipeline. Both need someone who ships backend work day to day, and picks up the frontend and infrastructure work around it. One of our senior engineers already carries this work across both projects, on top of everything else they do, and their time for it is about to get scarcer for a while. What we need is a second full-time pair of hands who can take over the day-to-day of it, with a proper handover now and growing independence after that, so they can spend the time they do have on the calls only they can make. THE PROGRESS WE EXPECT Instead of a list of responsibilities, here is what should be true at three points.
You will have very few days like this:
The role is based in Lisbon, Portugal, with regular time (at the moment 2-3 days/week) in the office in the heart of the city. We are flexible about the details, but we are not remote-first. WHO WE ARE ANNEA builds end-to-end software for the renewable energy industry. Our platform enables predictive maintenance and performance optimisation for wind turbines. We combine analytics, machine learning and deep engineering knowledge with a real physical understanding of the assets we work on. Our vision is to save resources for a more sustainable planet. Our mission is to make renewable energy assets more efficient through predictive maintenance and performance optimisation.
- After one month: You can navigate both codebases end to end, backend first, and run, debug and deploy both stacks through the existing pipelines. Small Sentry bugs are yours to fix, not to ask about. You've shipped at least one small backend change on each project. You've also written down what you had to figure out (setup, gotchas, how the services connect), so the handover lives in the docs and not only in our senior engineer's head.
- After three months: Our senior engineer has less time to give than in month one, and you've absorbed it: you've shipped self-contained backend features with NestJS on your own, you've created and updated the APIs of both projects, and you're turning client requirements into scoped tasks with only a light review.
- After six months: You own meaningful chunks of the backend on both projects without being asked, and you can make small, safe changes to the Timescale, ClickHouse, MariaDB and Postgres databases behind them, and to the CI/CD that ships your own code. You're a real second voice in architecture discussions (data model, caching) not just someone who hears the outcome afterwards.
- You are working somewhere that only lets you touch one layer — frontend tickets, or backend tickets, or nothing but tests — and you know from a side project, an internship or your studies that you can do more of the stack than you're allowed to there.
- You've used AI tools to ship something in a weekend, the way almost anyone can now, and you already know that's not the same as understanding what you built. You want to close that gap on something with real users, real data and real consequences if it breaks. Not a prompt-to-app project.
- You use AI coding tools every day and don't just take what they output at face value. You've caught an agent confidently shipping something broken or insecure, and you want to work somewhere that treats catching that as a real skill, not an inconvenience.
- You want backend ownership that goes beyond a ticket queue (real features and data) with enough exposure to frontend and infrastructure to see how your code actually reaches a user, and you'd rather learn that breadth hands-on with support than only from documentation.
- Fixing a bug that Sentry flagged, from reading the stack trace to shipping the patch.
- A backend feature in the morning, a frontend fix or a Docker/CI change in the afternoon.
- Turning a client requirement into a concrete, scoped task.
- Writing or reviewing a small piece of TypeScript, JavaScript, Python or SQL, depending on which project needs it that day.
- Checking a decision you're not sure about with our senior engineer before it goes live, and writing down what you decided and why.
You will have very few days like this:
- A single ticket in a single layer of the stack, for any stretch of time.
- An architecture decision made entirely without you, that you only hear about afterwards.
- Long stretches with no client- or user-visible outcome.
- A full day with nobody available to sanity-check a call you're unsure about.
- You have built and shipped something end to end where you wrote the real backend logic yourself and made the infrastructure decisions around it rather than a project an AI builder or PaaS scaffolded and hosted for you. You chose the database, wrote the Dockerfile, set up the deployment. A personal project, a university project, an internship deliverable or a freelance job all count.
- You are comfortable in at least one of TypeScript/JavaScript or Python, and can read the other. You know basic SQL: you can write a join and explain what an index is for.
- You have used Docker and Git on a real project, and can explain what your Dockerfile and CI config actually do, not just accepted ones an AI or a template wrote for you.
- You have used an AI coding tool (Claude Code, Cursor, Codex or similar) enough to have caught it silently producing something broken or insecure, and can describe exactly what it got wrong and how you found it, not just that it "sometimes makes mistakes."
- You can point to a decision on something you built that turned out to be wrong, and say what you learned from it.
- You would rather ask a question than guess when you're unsure, and you're comfortable being told your first answer was wrong.
- Experience with relational or time-series databases (Postgres, MySQL/MariaDB, TimescaleDB, ClickHouse) is a plus, not a requirement.
Energy, industrial or IoT experience is a plus, not a requirement.
- You work two different projects at once instead of going deep in one stack. That means different databases, different languages, different clients. If you want single-stack depth from day one, this isn't that.
- Our senior engineer supports you part-time, and for the first few months even that will be lighter than usual. You get review and guidance, not someone sitting next to you all day. Early on, you'll often make the call before you get feedback on it, not after.
- The domain is real: wind-farm data has real physics behind it, and both projects handle real client requirements and deadlines. You will have to learn the domain; nobody expects you to arrive already knowing it.
- Some of what you will touch (production databases, Hetzner firewalls, Kubernetes at user level) is infrastructure most junior roles don't get near. That's the opportunity, and also why it's reviewed before it goes live.
The role is based in Lisbon, Portugal, with regular time (at the moment 2-3 days/week) in the office in the heart of the city. We are flexible about the details, but we are not remote-first. WHO WE ARE ANNEA builds end-to-end software for the renewable energy industry. Our platform enables predictive maintenance and performance optimisation for wind turbines. We combine analytics, machine learning and deep engineering knowledge with a real physical understanding of the assets we work on. Our vision is to save resources for a more sustainable planet. Our mission is to make renewable energy assets more efficient through predictive maintenance and performance optimisation.



