All references

Uključi.me - Inkluzija u praksi

Live educational portal for a Montenegrin NGO, bringing inclusive education resources and practitioner discussion into one place.

  • Next.js
  • TypeScript
  • SQLite
  • Tailwind
  • VPS

Introduction

Uključi.me is an educational portal for inclusive education practitioners in Montenegro. Teachers and support staff needed one place to find videos, downloadable resources, a handbook, and a space to share experiences, instead of scattered links and informal channels. I led a small team as the primary developer: system design, client communication, deployment, and server setup, while collaborators handled implementation alongside me.

Purpose and goal

The client is an NGO building a central hub for inclusive education in Montenegro. The expected outcome was a live, maintainable site their staff could run without depending on us for every content update. Timing mattered. There was a hard deadline tied to a competitive selection process, where the NGO was choosing between several potential partners. We needed to deliver something credible quickly enough to win the work, then keep momentum through internal decisions about features, integrations, and scope.

Public interface

What the platform does

The library of videos, downloadable resources, and the handbook is the core, but the portal grew well past a static archive. What it runs today:

  • A news section, so practitioners get current information and data instead of a library that ages quietly
  • Personalization driven by what the client had provided, surfacing the content that fits their context
  • Search and filtering across the whole library, including a master search that spans every content type at once
  • An FAQ managed from the admin portal, because those answers change and should never need a developer
  • Quick share on every resource, so a teacher can pass something to a colleague in one action
  • A most viewed resources tracker, giving the NGO a real read on what practitioners actually use

Being an inclusion platform, accessibility was not a nice to have. I pushed for a pass against the accessibility requirements that apply to this kind of public facing service, along with a round of quality of life work on both sides of the product: the public interface, and the CMS the staff live in every day.

Spotlight

The piece I am most proud of is the anonymous forum. Public users post as guests with no accounts, which fit the NGO’s goal of lowering the barrier to honest conversation. That openness comes with abuse risk, so we layered:

  • IP based rate limiting to slow down spam bursts
  • A honeypot that silently discards bot submissions
  • Admin moderation behind a separate auth boundary

Guests can participate. Admins can curate. There is no public login surface to defend.

The other deliberate choice was running everything on a single VPS without managed services.

LayerChoice
ApplicationNext.js (public site + admin panel)
DatabaseSQLite via Drizzle ORM
FilesLocal filesystem uploads
AuthAuth.js for the CMS only

No managed database or object storage bill. No multi service ops surface for an NGO sized audience.

The tradeoff is explicit in the architecture: one machine, one process model, backups of the database file and upload folder. For this scale and budget, that was the right shape.

Lessons learned

The hardest part was not the code. It was working through layers of non technical stakeholders, including a change in dedicated project management partway through. I had to adjust how I communicated:

  • less implementation detail up front,
  • more side by side comparisons of options, with clear drawbacks and positives,
  • a phased plan that kept budget visible at every decision point.

Late in the build, that same pattern repeated one level higher. The actual project owners got involved for the first time and came back with a final list of things they saw as missing or wanted handled differently. Arriving after we already had a green light on where the project stood, it was a shock. It was also the right thing to happen: their input is what made the delivered result genuinely tailored to what the budget had been allocated for.

The takeaway is not technical. It is that I need to lead more deliberately, and earlier. Give the client a concrete reason to trust me, show them a demonstrably better way to settle the details upfront as far as that is possible, and then walk them through laying down project milestones in an order that holds. Getting the real decision makers into the conversation at the start is part of that job, not something to wait on.

SQLite is the tradeoff I would make again at this scale, but not by default. For a modest content site with a small admin team, a single file database on the VPS was simple to deploy, back up, and reason about. If budget and growth expectations had been different, I would have pushed for a managed database from the start.

I would also revisit the forum and authentication model. For the traffic we realistically expected, the safety stack was more than the problem demanded. Next time, with a CMS that already includes forum management, I would require identifiable users rather than building anonymous participation with extra guardrails. It would simplify moderation, accountability, and long term maintenance, even if it costs a little friction at signup.

Client feedback

“As someone who was directly involved in preparing the content for this project, I can confidently say that Vladimir did an excellent job. He was always open to our ideas, offered thoughtful and effective solutions, and successfully turned them into a modern, functional website. Working with him was smooth, efficient, and highly professional.”

Amar Ćuturić ([email protected]), Project Manager at MASTER