Skip to content
Jacek Rudnicki — CV & Creative Work
Website

Jacek Rudnicki — CV & Creative Work

A personal site for a physician, lecturer and author — CV, books, lectures and a gallery in one place.

Live and maintained — jacekrudnicki.pl ·

  • React
  • Vite
  • MUI
  • i18n
  • Lightbox
Short description

A personal showcase: academic career, downloadable books and lectures, in three languages.

Screenshots

Drag the strip sideways to browse. Click a screenshot to enlarge it, then use the arrow keys.

Full description

The personal website of Prof. dr hab. n. med. Jacek Rudnicki — a pediatrician, neonatologist and lecturer at the Pomeranian Medical University in Szczecin, and also a composer, book author and song lyricist. A single-page site that has to hold two different careers at once: scientific and artistic.

A CV THAT IS MORE THAN A CV

The "About" section pairs a photo with role chips ("Pediatrician & Neonatologist," "Professor at PUM," "Composer," "Author & Artist") and a multi-part biography — because one job title can't carry a career spanning neonatology, student music festivals, satirical press drawings, and lyrics for a Juliusz Machulski film.

BOOKS AND LECTURES, ONE CLICK AWAY

Fifteen books (PDF and DOCX) and twenty-three lecture decks (PPTX, DOCX) — each one a separate static file, no CMS anywhere. Lectures get a title search box and an expandable list, so two dozen entries don't overwhelm the page at once.

A GALLERY WITH A LIGHTBOX

Portraits, drawings and photographs filterable by category, with a full-screen view on click.

THREE LANGUAGES, ONE TRANSLATIONS OBJECT

Polish, English and German, switchable without a page reload — no i18n library, just one hand-rolled React context.

CONTACT ALONGSIDE SOCIAL CHANNELS

Email and phone sit next to a YouTube channel link and an Empik bookstore search — because some visitors arrive here from a book, not a business card.


Technology

Scope of work: Personal project — design, frontend implementation, deployment

Frontend application
  • React 19
  • Vite
  • MUI (Material UI) v7
  • Emotion
  • yet-another-react-lightbox
Testing
  • ESLint
  • Hand-rolled i18n context (PL/EN/DE)
  • Responsive breakpoints
Delivery
  • Static hosting
  • Own domain
  • Content shipped as static files

Case study — architecture and technology

7 min

The project in one paragraph

This is a personal project — the website of my father, Prof. dr hab. n. med. Jacek Rudnicki: a pediatrician and neonatologist, a professor at the Pomeranian Medical University in Szczecin, and at the same time a composer, the author of more than a dozen books, and a songwriter. The brief was easy to state and hard to get right: one single-page site that has to hold a scientific career and an artistic one at the same time, without reading as two business cards stapled together.

One person, two biographies

The CV section opens with four chips — "Pediatrician & Neonatologist," "Professor at PUM," "Composer," "Author & Artist" — because no single job title carries this career. The biography that follows is split into six paragraphs, each covering a different thread: education and the military medical academy, running the Department of Neonatal Pathology and foreign fellowships, research topics (neonatal encephalopathy, stem cells in neonatology, the relationship between medicine, philosophy and art), books and song lyrics for several bands and for Juliusz Machulski's film V.I.P., music awards and satirical press drawings, and finally small, personal details — long hair, because it was impossible during his studies at the military medical academy; a bow tie worn in the style of an uncle. That last sentence is there on purpose: a CV with no room for those details would simply be untrue to the person it describes.

Fifteen books, zero CMS

Every book is one entry in a JavaScript array — title, cover, file path — rendered as a card whose cover reveals a download badge on hover. The file downloads directly (download, target="_blank", rel="noopener noreferrer") straight from a static folder. Adding another book is one line in a data file and dropping a PDF into a folder — no database, no admin panel, because for a single author's site that he will never manage day to day himself, that would be more architecture than the problem needs.

Lectures that had to be sorted out first

Twenty-three presentations spanning years of lecturing — from neonatology through sociology to "Art on Doping" — in PPTX, PPTM and DOCX. The component detects the file type from the path's extension alone and assigns it an icon and a chip color (orange for presentations, blue for documents) — no separate metadata field, since the extension already carries that information. A search box filters the list by title live (useMemo), and the grid shows only the first few entries by default — the count depends on screen width (3 on phone, 4 on tablet, 6 on desktop, via useMediaQuery with MUI's breakpoints) — with a "Show more" button that states exactly how many entries are still hidden. Collapsing it back smooth-scrolls to the top of the section, so a long lecture list never leaves the visitor stranded somewhere in the middle of the page.

A gallery as its own collection, not a CV afterthought

Portraits, drawings and photographs, filtered by category through a single allPhotos array with a category field on each entry. Clicking a thumbnail opens a full-screen view via yet-another-react-lightbox — one library, zero custom code for keyboard handling, gestures, or arrow-key navigation, because that's exactly the kind of feature not worth writing from scratch for a personal showcase site.

Hand-rolled i18n instead of a library

Three languages — Polish, English, German — as one nested JavaScript object and a small React context with a t function. Instead of i18next or react-intl, a few dozen lines of custom code, because the site has a fixed, known-in-advance set of strings rather than dynamically loaded content. An interesting detail: some values in that object aren't strings at all, they're functions — expand takes a number and returns ready-made text like "Show more (5)", and noResults takes the typed query and returns "No lectures found matching…" — a simple way to interpolate without reaching for a full pluralization system that three languages and a handful of dynamic messages simply don't need.

A header that knows when to hide

The navigation is transparent over the full-screen hero photo, but once scrolled (useScrollTrigger with a 100px threshold) it gains a semi-transparent dark background and shrinks from 80 to 60 pixels tall — a subtle but deliberate choice: the navigation shouldn't visually compete with the photo until the visitor has actually started scrolling the content.

Contact with no implied hierarchy

Four contact channels — email, phone, YouTube, an Empik publication search — shown as four equal-weight round icons, with no "primary" versus "secondary" split. That's deliberate: some visitors land on this page after reading a book and are looking for the YouTube channel or another publication, not a business contact, so none of the four channels deserves a privileged spot.

What this project actually taught me

The strongest lesson from this site: not every project needs architecture sized for scale it will never reach. Fifteen books and twenty-three lectures as static files in a JavaScript array isn't a shortcut taken for lack of time — it's a solution deliberately sized to match the problem: one author, content that changes rarely, zero need for a CMS or a database. The thing I'd repeat: before reaching for a library or an architectural pattern, ask whether this specific project will ever grow to the size that would justify it — and if not, a few dozen lines of your own code beat a dependency you'll have to maintain.


Let's talk about the planned project

The first consultation is free and without obligation. A short description of the process and the expected outcome is enough.

Let's talk about the project