Give each partial one job

Keep navigation, project cards and the footer in separate partials. A shared card makes changes consistent across the homepage and project previews.

Choose how values become HTML

Use <%= value %> for ordinary text because it escapes output. Reserve <%- include(...) %> for trusted template markup. A submitted biography should remain text, even when it contains HTML.

Prepare data before rendering

Let the route select published content and language. Give the template explicit fields rather than passing the entire request query into rendering.

Further reading

EJS — Template tags and includes ↗
Discuss your project ↗