<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Selected work on Jovan Djukic</title><link>https://www.jovandjukic.com/projects/</link><description>Recent content in Selected work on Jovan Djukic</description><generator>Hugo -- gohugo.io</generator><language>en-US</language><copyright>2024 &amp;copy; Jovan Djukic All rights reserved</copyright><atom:link href="https://www.jovandjukic.com/projects/index.xml" rel="self" type="application/rss+xml"/><item><title>ScreamJS: explicit boundaries in a TypeScript framework</title><link>https://www.jovandjukic.com/projects/screamjs/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.jovandjukic.com/projects/screamjs/</guid><description>An educational framework project exploring server-rendered HTML applications, constructor injection, and a compiler/rendering boundary.</description><content>&lt;h2 id="what-i-am-building"&gt;What I am building&lt;/h2&gt;
&lt;p&gt;ScreamJS is my TypeScript framework project for server-rendered, database-backed web applications. It is actively developed and intended for education and testing; it is not production-ready.&lt;/p&gt;
&lt;p&gt;The design question is how to provide useful framework behavior while keeping application dependencies and assembly explicit. The current project favors constructor injection and module boundaries, with additional layers introduced when they solve a concrete problem.&lt;/p&gt;
&lt;h2 id="one-decision-separate-template-compilation-from-rendering"&gt;One decision: separate template compilation from rendering&lt;/h2&gt;
&lt;p&gt;The template compiler loads named views, tokenizes and parses source, and resolves layout inheritance. The renderer consumes the compiled representation and a render context to produce HTML through its evaluator and generator.&lt;/p&gt;
&lt;p&gt;This separates structural template work from rendering with request-specific data. It also creates places to report errors such as missing templates, unknown block overrides, and inheritance cycles.&lt;/p&gt;
&lt;h2 id="why-keep-the-boundaries-explicit"&gt;Why keep the boundaries explicit?&lt;/h2&gt;
&lt;p&gt;The compiler receives its loader, tokenizer, and parser through its constructor. The renderer receives its evaluator and generator. A reader can see those collaborators without a dependency container or runtime discovery.&lt;/p&gt;
&lt;p&gt;That clarity has a cost: I maintain more small contracts and compose them explicitly. I would not claim that this makes every application faster or that building a framework is the best choice for every product. Here, the framework itself is the subject of the work.&lt;/p&gt;
&lt;h2 id="evidence-and-limits"&gt;Evidence and limits&lt;/h2&gt;
&lt;p&gt;The public repository contains the compiler, renderer, and tests at the template-engine boundary. The tests demonstrate expected behavior; this note does not claim the entire current test suite has been run or independently audited.&lt;/p&gt;
&lt;p&gt;The useful outcome to inspect is the implementation and its boundaries. I have no production-adoption or benchmark result to claim here.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/JovanDj/scream.js"&gt;Explore ScreamJS on GitHub&lt;/a&gt; · &lt;a href="https://www.jovandjukic.com/posts/interface-method-vs-function/"&gt;Read the interface-method article&lt;/a&gt; · &lt;a href="https://www.jovandjukic.com/resume/"&gt;Resume&lt;/a&gt;&lt;/p&gt;</content><summary>An educational framework project exploring server-rendered HTML applications, constructor injection, and a compiler/rendering boundary.</summary></item><item><title>Bandgrid: discovering and managing cultural events</title><link>https://www.jovandjukic.com/projects/bandgrid/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.jovandjukic.com/projects/bandgrid/</guid><description>A cultural-events application combining public discovery with authenticated event-management workflows.</description><content>&lt;h2 id="the-product"&gt;The product&lt;/h2&gt;
&lt;p&gt;Bandgrid brings bands, venues, and events into one application. Visitors can browse public content, while authenticated workflows support management and subscriptions.&lt;/p&gt;
&lt;p&gt;My work spans the application&amp;rsquo;s data model, web experience, deployment, and maintenance. This is an example of the broader application ownership described on my resume.&lt;/p&gt;
&lt;h2 id="one-decision-keep-related-workflows-in-one-application"&gt;One decision: keep related workflows in one application&lt;/h2&gt;
&lt;p&gt;The current application uses AdonisJS, TypeScript, PostgreSQL, and server-rendered Edge views, with browser assets built through Vite. Public pages and authenticated workflows live in the same application.&lt;/p&gt;
&lt;p&gt;That keeps ordinary product changes close to the data and server-rendered interface they affect. It also means boundaries and authorization rules need to be clear inside the application; a single deployment does not remove that responsibility.&lt;/p&gt;
&lt;h2 id="data-relationships-support-the-experience"&gt;Data relationships support the experience&lt;/h2&gt;
&lt;p&gt;An event relates to the artists and venue involved. Public discovery needs to respect whether content is visible, while management workflows need to distinguish the people allowed to change it.&lt;/p&gt;
&lt;p&gt;The engineering work is therefore more than presenting an event card: it involves consistent relationships, input validation, visibility, and authorization across different entry points.&lt;/p&gt;
&lt;h2 id="scope-and-limits"&gt;Scope and limits&lt;/h2&gt;
&lt;p&gt;This note describes an event-discovery and management product. It does not claim that Bandgrid processes ticket payments, has a particular number of customers, or achieves a measured performance improvement.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://app.bandgrid.com/"&gt;Visit Bandgrid&lt;/a&gt; · &lt;a href="https://www.jovandjukic.com/resume/"&gt;Read my resume&lt;/a&gt; · &lt;a href="https://www.linkedin.com/in/jovandj/"&gt;Contact me on LinkedIn&lt;/a&gt;&lt;/p&gt;</content><summary>A cultural-events application combining public discovery with authenticated event-management workflows.</summary></item></channel></rss>