Skip to content

FAET

Every page of the old site migrated, 2 trained editors, more faculties in discussion, and internal votes already run on its voting engine

FAET is the Faculty of Air navigation, Electronics and Telecommunications at Kyiv Aviation Institute, KAI for short. It's also my own faculty. In spring 2026 I built its new website and the content management system behind it, and I built both as a platform that any faculty of the university can take and run as its own.

Before that, the faculty lived on a Google Sites page. It carried everything the faculty publishes, the news, the departments, the educational programs, the conferences, the events, the staff and a document library, in two languages, and none of it was structured content a real backend could hold. There was no code behind it and no earlier build to start from.

It started with a conversation. I have a good relationship with the Dean, and at some point I was talking with someone from the Dean's office and found out the faculty wanted a new website. I thought, okay, that's a great idea, and it's something I can certainly help with. So I offered. And once we started talking about it for real, the idea got bigger. KAI has a lot of faculties, and they all need pretty much the same thing. Instead of one website for one faculty, we decided to build something every faculty of the university could use.

That decision shaped the whole build, because a site made for one faculty has to be made again for the next one. Nothing in the product assumes which faculty it serves. I took FAET's name out of the code, so what's left is a plain "faculty" that any of them can be, and FAET runs one copy of it with its own name, content and editors. The platform packages into a starter kit with FAET's content inside as an example pack. Another faculty clears that out, puts in its own, and deploys its own copy. More faculties are in discussion about it.

The old content came across first. In early April 2026 I collected everything from the old Google Sites property with Playwright in one automated pass and migrated it straight into the CMS. The whole pass took under 20 minutes. It brought over 178 news articles, 16 educational programs, 11 staff entries, 8 conferences and 5 departments. It also attempted 898 images, and the images were really the messy part of it. And it was a full migration. All 213 pages of the old site came across, and every one of them is up on the new site.

pages migrated
213
the whole old site, every page of it up on the new one
news articles migrated
178
with 16 educational programs, 11 staff entries, 8 conferences and 5 departments in the same pass
images attempted
898
collected from the old Google Sites page in early April 2026

From there, the faculty runs the content itself. I trained 2 editors, and the 2 of them run the whole website. Every page on the site is a list of content blocks that an editor arranges in the CMS, and one renderer draws any page from that list. There are a few dozen kinds of block, and the same set builds a department page, an educational program, a news post or the home page. So a new page is an editor's job. The only thing that still needs me is a genuinely new kind of block.

flowchart LR E[Faculty editor] --> Z[Composes a page from blocks] Z --> C[Content service] C --> R[One renderer for every block] R --> P[Any page at this faculty] P --> K[Packaged as a starter kit] K --> N[Any page at the next faculty]

What a visitor finds there depends on who they are. Someone checking on the faculty gets a news feed with categories, the departments, the educational programs, conferences and events, and a staff directory. An applicant can take a career-orientation quiz and look around in 360-degree panorama virtual tours. Graduates can register as alumni, and that form has bot protection on it. There's also a document library.

The site speaks Ukrainian first and English second. Routing goes through next-intl and the translations through Tolgee, the same base I build all my multi-language sites on. It installs as a progressive web app, and every route carries JSON-LD structured data for search engines and its own generated Open Graph preview image. It has its own light and dark themes, every page change animates with its own transition, and the home page opens with a splash that draws the faculty mark.

The faculty also runs awards campaigns on the platform, in three campaign modes, and voting is the part where you really can't be casual. A voter signs in with Google Workspace, so each ballot belongs to a real account and not to an anonymous click. The vote itself is cast in one atomic step, which closes the race that would let one person vote twice, even when two clicks land at the same moment. Voting is rate limited, and it reads the client IP address in a way the client can't forge from behind the trusted proxy. That IP check belongs to voting only, the alumni registration doesn't use it. 90 days after a campaign ends, a scheduled task anonymizes the vote records. That's the constant in the code. The faculty's published privacy policy sets 12 months as the outer bound, and the code never gets near it.

The build ran from late March to early June 2026. The site is Next.js, React and TypeScript, styled with Tailwind CSS and shadcn/ui, and it talks to the content service over GraphQL through Apollo Client. The content service is Strapi on PostgreSQL, and files sit in SeaweedFS, which is S3-compatible storage. And of course, it all runs on a Kubernetes cluster, deployed through GitOps with ArgoCD.

faet.kai.edu.ua

The faculty's marks and its published pages belong to the faculty.

Stack

  • Next.js
  • React
  • TypeScript
  • Tailwind CSS
  • shadcn/ui
  • Apollo Client
  • GraphQL
  • Strapi
  • PostgreSQL
  • SeaweedFS
  • next-intl
  • Tolgee
  • Playwright
  • Kubernetes
  • ArgoCD

Credits

    • Faculty of Air navigation, Electronics and Telecommunications, Kyiv Aviation Institute
    • Kyiv Aviation Institute
    faet.kai.edu.ua
    • Faculty wordmark, reversed white variant
    • Faculty wordmark, navy variant
    • Kyiv Aviation Institute wordmark
    • Captured public pages of the faculty site

So, what's broken?

Tell me the problem, a rough budget, and a timeline if you have one. I reply within 24h on weekdays.

Rough budgetoptional
* required