<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Digital Garden on Dinko Pehar</title>
    
    
    
    <link>/digital-garden/</link>
    <description>Recent content in Digital Garden on Dinko Pehar</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    
	<atom:link href="/digital-garden/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>Agentic Search Optimization</title>
      <link>/digital-garden/software/agentic-search-optimization/</link>
      <pubDate>Thu, 16 Jul 2026 00:00:00 +0200</pubDate>
      <guid>/digital-garden/software/agentic-search-optimization/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;Agentic Search Optimization is the practice of making content, products, and
services easier for AI agents to discover, evaluate, cite, and act on when they
perform search or research tasks on behalf of users.&lt;/p&gt;
&lt;h2 id=&#34;also-called&#34;&gt;
  Also called
  &lt;a href=&#34;#also-called&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Agent Search Optimization.&lt;/p&gt;
&lt;h2 id=&#34;question-for-expansion&#34;&gt;
  Question for expansion
  &lt;a href=&#34;#question-for-expansion&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;How does agentic search optimization differ from traditional SEO when AI agents
summarize, compare, cite, and take action instead of only sending users to web
pages?&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>BFF vs REST</title>
      <link>/digital-garden/software/bff-vs-rest/</link>
      <pubDate>Thu, 16 Jul 2026 00:00:00 +0200</pubDate>
      <guid>/digital-garden/software/bff-vs-rest/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;BFF means Backend for Frontend: an API layer tailored to one frontend or client
experience. REST is a resource-oriented API style that exposes reusable
endpoints around domain resources.&lt;/p&gt;
&lt;h2 id=&#34;core-difference&#34;&gt;
  Core difference
  &lt;a href=&#34;#core-difference&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;REST usually exposes general resources such as users, orders, products, or
documents. A frontend combines those resources into the shape needed by a page
or workflow.&lt;/p&gt;
&lt;p&gt;A BFF exposes endpoints shaped around a specific frontend use case. Instead of
forcing the client to call many endpoints and assemble the result, the BFF can
return exactly what a screen or interaction needs.&lt;/p&gt;
&lt;h2 id=&#34;tradeoff&#34;&gt;
  Tradeoff
  &lt;a href=&#34;#tradeoff&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;REST favors reuse across clients. The same API can serve a web app, mobile app,
internal tool, or external integration if their needs are similar enough.&lt;/p&gt;
&lt;p&gt;BFF favors frontend ergonomics. It can reduce round trips, hide backend
complexity, centralize auth or session behavior, and keep composition logic on
the server.&lt;/p&gt;
&lt;p&gt;The cost is another layer to own. If every client gets its own BFF, teams must
keep those APIs, tests, deployments, and observability in good shape.&lt;/p&gt;
&lt;h2 id=&#34;when-bff-helps&#34;&gt;
  When BFF helps
  &lt;a href=&#34;#when-bff-helps&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Use a BFF when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;different clients need different data shapes;&lt;/li&gt;
&lt;li&gt;the frontend would otherwise stitch together many REST calls;&lt;/li&gt;
&lt;li&gt;sensitive composition, authorization, or session logic should stay
server-side;&lt;/li&gt;
&lt;li&gt;the UI needs an endpoint shaped around a workflow rather than a single
resource;&lt;/li&gt;
&lt;li&gt;mobile, web, and admin interfaces have genuinely different constraints.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;when-rest-is-enough&#34;&gt;
  When REST is enough
  &lt;a href=&#34;#when-rest-is-enough&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Plain REST is usually enough when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;there is one main client;&lt;/li&gt;
&lt;li&gt;the resource model is stable and maps cleanly to the UI;&lt;/li&gt;
&lt;li&gt;the app is mostly CRUD;&lt;/li&gt;
&lt;li&gt;the frontend does not need many chained calls to render common screens;&lt;/li&gt;
&lt;li&gt;adding another backend layer would create more complexity than value.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;practical-rule&#34;&gt;
  Practical rule
  &lt;a href=&#34;#practical-rule&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;BFF is not a replacement for REST. It is often a client-specific layer in front
of REST endpoints, services, or internal APIs.&lt;/p&gt;
&lt;p&gt;Start with a clear REST API when the domain is simple. Add a BFF when frontend
composition, client-specific needs, or cross-service orchestration become real
friction.&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>Diogenes</title>
      <link>/digital-garden/philosophy/diogenes/</link>
      <pubDate>Thu, 16 Jul 2026 00:00:00 +0200</pubDate>
      <guid>/digital-garden/philosophy/diogenes/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;Diogenes of Sinope was the most famous Cynic philosopher. His philosophy was
not a theoretical system like Plato&amp;rsquo;s or Aristotle&amp;rsquo;s. It was a radical way of
living.&lt;/p&gt;
&lt;h2 id=&#34;core-idea&#34;&gt;
  Core idea
  &lt;a href=&#34;#core-idea&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Diogenes believed that most people are enslaved by fake needs: money, status,
reputation, luxury, social approval, politics, and comfort.&lt;/p&gt;
&lt;p&gt;For him, the good life meant living simply, needing little, obeying nature, and
ignoring stupid social conventions. He wanted to expose how much of civilized
life is artificial.&lt;/p&gt;
&lt;h2 id=&#34;cynicism&#34;&gt;
  Cynicism
  &lt;a href=&#34;#cynicism&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Today, cynical usually means distrustful or bitter. Ancient Cynicism meant
something different.&lt;/p&gt;
&lt;p&gt;The Cynics believed virtue was enough for happiness. A person does not need
wealth, fame, career, beauty, luxury, or public respect. A person needs
self-control, freedom, courage, and honesty.&lt;/p&gt;
&lt;p&gt;Diogenes pushed this idea to the extreme.&lt;/p&gt;
&lt;h2 id=&#34;how-diogenes-lived&#34;&gt;
  How Diogenes lived
  &lt;a href=&#34;#how-diogenes-lived&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Diogenes lived in radical poverty, supposedly in a large ceramic jar or barrel.
He owned almost nothing. One story says he threw away his cup after seeing a
child drink water with his hands, because he realized even the cup was
unnecessary.&lt;/p&gt;
&lt;p&gt;The point was not poverty for its own sake. The point was freedom. If you need
very little, nobody can control you easily.&lt;/p&gt;
&lt;h2 id=&#34;main-beliefs&#34;&gt;
  Main beliefs
  &lt;a href=&#34;#main-beliefs&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id=&#34;freedom-from-desire&#34;&gt;
  Freedom from desire
  &lt;a href=&#34;#freedom-from-desire&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Most people are trapped because they want too much. Diogenes thought desire
makes people weak. A person who needs comfort, praise, money, and approval
becomes dependent on others. A person who needs almost nothing becomes hard to
manipulate.&lt;/p&gt;
&lt;h3 id=&#34;living-according-to-nature&#34;&gt;
  Living according to nature
  &lt;a href=&#34;#living-according-to-nature&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Diogenes thought humans should live more naturally, like animals in some ways:
directly, honestly, and without shame about basic needs.&lt;/p&gt;
&lt;p&gt;He believed many social rules are fake. People pretend to be noble, but are
often vain, greedy, cowardly, and hypocritical.&lt;/p&gt;
&lt;h3 id=&#34;contempt-for-status&#34;&gt;
  Contempt for status
  &lt;a href=&#34;#contempt-for-status&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Diogenes mocked kings, rich men, philosophers, and politicians.&lt;/p&gt;
&lt;p&gt;In a famous story, Alexander the Great visited Diogenes and asked if he wanted
anything. Diogenes supposedly replied: &amp;ldquo;Stand out of my sunlight.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The meaning is direct: even the most powerful man in the world had nothing
Diogenes needed.&lt;/p&gt;
&lt;h3 id=&#34;brutal-honesty&#34;&gt;
  Brutal honesty
  &lt;a href=&#34;#brutal-honesty&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Diogenes practiced &lt;em&gt;parrhesia&lt;/em&gt;, or fearless speech. He said what he thought
directly, even when it offended people.&lt;/p&gt;
&lt;p&gt;He used jokes, insults, public behavior, and shocking actions as philosophical
tools. His goal was to reveal hypocrisy.&lt;/p&gt;
&lt;h3 id=&#34;philosophy-as-practice&#34;&gt;
  Philosophy as practice
  &lt;a href=&#34;#philosophy-as-practice&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Diogenes would have hated philosophy that remained only abstract discussion. He
believed philosophy should change how a person lives.&lt;/p&gt;
&lt;p&gt;The question was not: can you explain virtue?&lt;/p&gt;
&lt;p&gt;The question was: can you live without being owned by fear, comfort, money,
reputation, and other people&amp;rsquo;s opinions?&lt;/p&gt;
&lt;h2 id=&#34;famous-stories&#34;&gt;
  Famous stories
  &lt;a href=&#34;#famous-stories&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;One story says Diogenes walked around Athens with a lantern in daylight, saying
he was looking for an honest man. The point was that society is full of people,
but few are truly honest or free.&lt;/p&gt;
&lt;p&gt;Another story says Plato defined man as a featherless biped. Diogenes brought a
plucked chicken and said, &amp;ldquo;Here is Plato&amp;rsquo;s man.&amp;rdquo; Plato then had to revise the
definition.&lt;/p&gt;
&lt;p&gt;These stories show his style: anti-pretentious, mocking, practical, and
aggressive.&lt;/p&gt;
&lt;h2 id=&#34;difference-from-socrates&#34;&gt;
  Difference from Socrates
  &lt;a href=&#34;#difference-from-socrates&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Diogenes admired Socrates, but took Socrates&amp;rsquo;s simplicity much further.&lt;/p&gt;
&lt;p&gt;Socrates questioned people. Diogenes humiliated illusions publicly. Socrates
still participated in city life. Diogenes stood outside polite society and
attacked it.&lt;/p&gt;
&lt;p&gt;Plato allegedly called Diogenes &amp;ldquo;Socrates gone mad.&amp;rdquo; That is probably the best
short description.&lt;/p&gt;
&lt;h2 id=&#34;what-he-wanted-to-teach&#34;&gt;
  What he wanted to teach
  &lt;a href=&#34;#what-he-wanted-to-teach&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Diogenes wanted people to ask:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Why do I need so much?&lt;/li&gt;
&lt;li&gt;Why do I care what people think?&lt;/li&gt;
&lt;li&gt;Why am I ashamed of natural things?&lt;/li&gt;
&lt;li&gt;Why do I respect powerful people?&lt;/li&gt;
&lt;li&gt;Why do I confuse comfort with happiness?&lt;/li&gt;
&lt;li&gt;Why do I obey customs I never examined?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;His philosophy is basically a war against false needs.&lt;/p&gt;
&lt;h2 id=&#34;in-simple-terms&#34;&gt;
  In simple terms
  &lt;a href=&#34;#in-simple-terms&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Diogenes&amp;rsquo;s philosophy says: you become free when you stop needing what society
trained you to want.&lt;/p&gt;
&lt;p&gt;Money, image, status, luxury, and approval are cages. The philosopher should
break those cages by living simply, honestly, and shamelessly according to
nature.&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>Django Default Tables</title>
      <link>/digital-garden/software/django-default-tables/</link>
      <pubDate>Thu, 16 Jul 2026 00:00:00 +0200</pubDate>
      <guid>/digital-garden/software/django-default-tables/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;Django creates a set of default database tables for authentication,
authorization, admin logging, sessions, content types, and migration tracking.&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Table&lt;/th&gt;
					&lt;th&gt;Purpose&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;auth_user&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Default user accounts&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;auth_group&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;User groups&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;auth_permission&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Permissions such as add, change, delete, and view&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;auth_user_groups&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Many-to-many relation between users and groups&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;auth_user_user_permissions&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Direct permissions assigned to users&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;auth_group_permissions&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Permissions assigned to groups&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;django_content_type&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Tracks installed models by app and model name&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;django_admin_log&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Admin panel action history&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;django_session&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Server-side session storage&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;django_migrations&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Tracks which migrations have already run&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

        
        </description>
    </item>
    
    <item>
      <title>Django Portability, External Workers, and Minimal Hosting</title>
      <link>/digital-garden/software/django-portability-external-workers-minimal-hosting/</link>
      <pubDate>Thu, 16 Jul 2026 00:00:00 +0200</pubDate>
      <guid>/digital-garden/software/django-portability-external-workers-minimal-hosting/</guid>
      <description>
        
          
          
          
        
        
        &lt;h2 id=&#34;goal&#34;&gt;
  Goal
  &lt;a href=&#34;#goal&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Build several unrelated applications quickly with Django and a frontend, host them
economically on one server, and preserve the option to move genuinely slow
components to Go, Rust, or another runtime later.&lt;/p&gt;
&lt;h2 id=&#34;core-architectural-decision&#34;&gt;
  Core architectural decision
  &lt;a href=&#34;#core-architectural-decision&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Start with a modular Django monolith, not microservices. Organize code by
business domain and keep important workflows behind explicit inputs and
outputs.&lt;/p&gt;
&lt;p&gt;Typical layers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTTP views/controllers: authentication, request parsing, status codes and
responses.&lt;/li&gt;
&lt;li&gt;Application use cases: workflows such as &lt;code&gt;place_order()&lt;/code&gt; or
&lt;code&gt;convert_dataset()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Domain logic: business rules expressed with ordinary Python values where
useful.&lt;/li&gt;
&lt;li&gt;Adapters: Django ORM, object storage, email, queues and external APIs.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;mermaid&#34;&gt;

flowchart TD
  A[HTTP views and controllers] --&gt; B[Application use cases]
  B --&gt; C[Domain logic]
  B --&gt; D[Adapters]
  D --&gt; E[Django ORM]
  D --&gt; F[Object storage]
  D --&gt; G[Email]
  D --&gt; H[Queues]
  D --&gt; I[External APIs]

&lt;/div&gt;

&lt;p&gt;Django-specific code does not need to be eliminated. It only needs to be kept
from spreading through every layer. Ordinary CRUD can use Django models
directly; create stronger boundaries around complex workflows and likely
performance hotspots.&lt;/p&gt;
&lt;h2 id=&#34;database-and-orm-guidance&#34;&gt;
  Database and ORM guidance
  &lt;a href=&#34;#database-and-orm-guidance&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Heavy use of Django ORM does not automatically mean it will later need to be
rewritten as raw SQL. First measure the actual bottleneck. Common improvements
are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;fixing N+1 queries with &lt;code&gt;select_related()&lt;/code&gt; and &lt;code&gt;prefetch_related()&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;adding or correcting indexes;&lt;/li&gt;
&lt;li&gt;reducing result and response sizes;&lt;/li&gt;
&lt;li&gt;rewriting only demanding queries as specialized query functions or raw SQL;&lt;/li&gt;
&lt;li&gt;introducing read models for unusually complex reads.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Repository interfaces are useful selectively. They should represent business
queries such as &lt;code&gt;find_unpaid_orders_due_before(date)&lt;/code&gt;, rather than becoming
generic wrappers that imitate the ORM.&lt;/p&gt;
&lt;p&gt;Keep important constraints in PostgreSQL as well as application validation.
Stable IDs, explicit timestamps, transaction boundaries and database
constraints make data easier to use from another language.&lt;/p&gt;
&lt;h2 id=&#34;portable-contracts&#34;&gt;
  Portable contracts
  &lt;a href=&#34;#portable-contracts&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The portable boundary is the protocol, not a Python class. Use explicit,
versioned contracts such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTTP with OpenAPI;&lt;/li&gt;
&lt;li&gt;JSON Schema;&lt;/li&gt;
&lt;li&gt;Protobuf/gRPC when internal binary contracts are justified;&lt;/li&gt;
&lt;li&gt;versioned event schemas for asynchronous jobs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pydantic and Zod do not directly replace one another. Pydantic validates
Python data and Zod validates JavaScript or TypeScript data. Both can implement
the same OpenAPI or JSON Schema contract.&lt;/p&gt;
&lt;p&gt;Do not expose accidental Django internals as public contracts, such as model
serialization, database column names or framework-specific error formats.&lt;/p&gt;
&lt;h2 id=&#34;moving-heavy-processing-to-go-or-rust&#34;&gt;
  Moving heavy processing to Go or Rust
  &lt;a href=&#34;#moving-heavy-processing-to-go-or-rust&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Django can remain the control plane while another language performs
CPU-intensive or independently scalable work.&lt;/p&gt;
&lt;p&gt;Suggested workflow:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The frontend submits a request.&lt;/li&gt;
&lt;li&gt;Django authenticates the user and validates a small metadata payload.&lt;/li&gt;
&lt;li&gt;Django creates a job record and publishes a language-neutral message.&lt;/li&gt;
&lt;li&gt;A Go, Rust or Python worker processes the job.&lt;/li&gt;
&lt;li&gt;The worker stores the result and updates job status or publishes a result
event.&lt;/li&gt;
&lt;li&gt;The frontend polls with backoff or receives progress through SSE/WebSocket.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;mermaid&#34;&gt;

sequenceDiagram
  participant Client as Frontend/client
  participant Django
  participant DB as PostgreSQL
  participant Queue
  participant Worker as Go/Rust/Python worker
  participant Storage as Object storage

  Client-&gt;&gt;Django: Submit job metadata
  Django-&gt;&gt;Django: Authenticate and validate
  Django-&gt;&gt;DB: Create job record
  Django-&gt;&gt;Queue: Publish job message
  Django--&gt;&gt;Client: 202 Accepted with job id
  Worker-&gt;&gt;Queue: Consume job
  Worker-&gt;&gt;Storage: Read input and write result
  Worker-&gt;&gt;DB: Update job status
  Client-&gt;&gt;Django: Poll job status/result

&lt;/div&gt;

&lt;p&gt;Example message:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;job_id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;uuid&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dataset.convert&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;payload&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;dataset_id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;uuid&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;input_object&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;uploads/dataset.gpkg&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;output_format&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;geojson&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Large files and geometry collections should go directly to object storage.
Queue messages should contain identifiers and metadata, not the file contents.&lt;/p&gt;
&lt;h2 id=&#34;queue-options&#34;&gt;
  Queue options
  &lt;a href=&#34;#queue-options&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;RabbitMQ: strong default for cross-language jobs, acknowledgements, retries,
routing and dead-letter queues.&lt;/li&gt;
&lt;li&gt;Redis Streams: simpler when Redis is already required.&lt;/li&gt;
&lt;li&gt;NATS JetStream: lightweight cross-language messaging with persistence.&lt;/li&gt;
&lt;li&gt;Kafka: appropriate for large retained event streams, usually excessive for
early products.&lt;/li&gt;
&lt;li&gt;PostgreSQL jobs table: minimal infrastructure for modest workloads.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Avoid treating Celery&amp;rsquo;s internal task-message format as the cross-language
contract. Celery may use RabbitMQ, but another-language worker is cleaner when
consuming an application-owned JSON or Protobuf message.&lt;/p&gt;
&lt;p&gt;A PostgreSQL worker can claim jobs using &lt;code&gt;FOR UPDATE SKIP LOCKED&lt;/code&gt;. This avoids
another service initially, but requires implementing retries, stale-lock
recovery, cleanup and job state transitions.&lt;/p&gt;
&lt;p&gt;Job handlers should be idempotent because most reliable queues provide
at-least-once delivery. Use unique job IDs, acknowledge only after success,
retry temporary errors with backoff, version schemas and move permanent
failures to a dead-letter state.&lt;/p&gt;
&lt;p&gt;For important jobs, use the Transactional Outbox pattern so a database change
and creation of an outbound event happen in the same transaction.
&lt;code&gt;transaction.on_commit()&lt;/code&gt; is a simpler alternative but cannot guarantee
delivery if publishing fails after the database commit.&lt;/p&gt;
&lt;h2 id=&#34;resource-implications&#34;&gt;
  Resource implications
  &lt;a href=&#34;#resource-implications&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;If Django only performs authentication, small-payload validation, a few
database operations, queue submission and response serialization, it should
remain relatively inexpensive. Pydantic or other serializers are normally not
the bottleneck for small JSON documents.&lt;/p&gt;
&lt;p&gt;The expensive cases are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;large or deeply nested JSON;&lt;/li&gt;
&lt;li&gt;huge GeoJSON payloads;&lt;/li&gt;
&lt;li&gt;N+1 ORM queries;&lt;/li&gt;
&lt;li&gt;large response serialization;&lt;/li&gt;
&lt;li&gt;importing GIS, data science or AI libraries into every web worker;&lt;/li&gt;
&lt;li&gt;clients polling job status too frequently.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Long jobs should return &lt;code&gt;202 Accepted&lt;/code&gt; immediately. Django should not hold an
HTTP request open while a worker runs for tens of seconds. Use a job resource
such as &lt;code&gt;POST /jobs&lt;/code&gt;, &lt;code&gt;GET /jobs/{id}&lt;/code&gt; and &lt;code&gt;GET /jobs/{id}/result&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;why-django-appears-memory-heavy&#34;&gt;
  Why Django appears memory-heavy
  &lt;a href=&#34;#why-django-appears-memory-heavy&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The main cost is usually several Python worker processes, not Gunicorn itself.
Every worker loads the Python interpreter, Django, the app registry, models,
middleware, dependencies and process-local caches.&lt;/p&gt;
&lt;p&gt;A small Django worker may use roughly 40-100 MB when idle; larger applications
can use 150 MB or more per worker. Raw RSS can overstate total usage because
shared pages are counted in multiple processes; proportional set size is a
better measurement.&lt;/p&gt;
&lt;p&gt;Minimal Python frameworks may save tens of megabytes, but once SQLAlchemy,
migrations, authentication, validation, admin tools and monitoring are added,
the difference often shrinks. Switching from Django to FastAPI solely for
memory is therefore rarely compelling.&lt;/p&gt;
&lt;p&gt;Go or Rust can provide a genuinely smaller runtime, but Django includes
valuable product-development facilities: ORM, migrations, authentication,
sessions, permissions and admin.&lt;/p&gt;
&lt;h2 id=&#34;hosting-many-unrelated-apps-on-one-server&#34;&gt;
  Hosting many unrelated apps on one server
  &lt;a href=&#34;#hosting-many-unrelated-apps-on-one-server&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Use a parking configuration for apps that have little traffic:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;one shared Caddy instance;&lt;/li&gt;
&lt;li&gt;one shared PostgreSQL cluster, with a separate database and database user for
each serious app;&lt;/li&gt;
&lt;li&gt;one small Django process per app;&lt;/li&gt;
&lt;li&gt;static frontend builds served directly by Caddy;&lt;/li&gt;
&lt;li&gt;no permanent Redis, RabbitMQ, Celery worker or scheduler unless the workload
requires it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For a WSGI app, a reasonable starting command is:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gunicorn project.wsgi:application &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --worker-class gthread &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --workers &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --threads &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --timeout &lt;span style=&#34;color:#ae81ff&#34;&gt;30&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --max-requests &lt;span style=&#34;color:#ae81ff&#34;&gt;1000&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --max-requests-jitter &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For an ASGI app, a single Uvicorn process supervised by systemd can remove the
small Gunicorn master-process cost. Changing Python servers does not remove
Django&amp;rsquo;s or Python&amp;rsquo;s main memory usage.&lt;/p&gt;
&lt;p&gt;One parked Django app may consume approximately 70-150 MB, depending heavily on
imports. A carefully managed 4 GB server could plausibly host several,
potentially around 8-15, very small, low-traffic apps, but this must be
measured against the real applications.&lt;/p&gt;
&lt;h2 id=&#34;postgresql-and-sqlite-strategy&#34;&gt;
  PostgreSQL and SQLite strategy
  &lt;a href=&#34;#postgresql-and-sqlite-strategy&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Do not run one PostgreSQL server/container per app. Use one PostgreSQL
installation with separate databases and users. Conservative initial settings
can include a small &lt;code&gt;shared_buffers&lt;/code&gt;, low &lt;code&gt;work_mem&lt;/code&gt; and limited
&lt;code&gt;max_connections&lt;/code&gt;; tune from measurements rather than fixed rules.&lt;/p&gt;
&lt;p&gt;SQLite is reasonable for disposable POCs and low-write experiments. Start
directly with PostgreSQL when an app needs PostGIS, substantial concurrency,
complex reporting or serious background processing.&lt;/p&gt;
&lt;p&gt;Suggested progression:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;disposable experiment: SQLite;&lt;/li&gt;
&lt;li&gt;serious candidate product: shared PostgreSQL;&lt;/li&gt;
&lt;li&gt;successful product: dedicated database resources when justified.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;avoid-idle-background-infrastructure&#34;&gt;
  Avoid idle background infrastructure
  &lt;a href=&#34;#avoid-idle-background-infrastructure&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Instead of permanently running Celery workers and Celery Beat for every app:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;store pending jobs in the database;&lt;/li&gt;
&lt;li&gt;run a management command from a systemd timer or cron;&lt;/li&gt;
&lt;li&gt;process a bounded number of jobs and exit;&lt;/li&gt;
&lt;li&gt;convert to a continuously running queue worker only when latency or volume
requires it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The same pattern can start a Go or Rust binary periodically. Keep GIS libraries
such as GDAL, GeoPandas or Rasterio out of Django web-process imports; load
them only in processing workers.&lt;/p&gt;
&lt;h2 id=&#34;migration-strategy&#34;&gt;
  Migration strategy
  &lt;a href=&#34;#migration-strategy&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Use the Strangler pattern rather than rewriting an entire application:&lt;/p&gt;






  &lt;aside class=&#34;wiki-card&#34;&gt;
    &lt;a class=&#34;wiki-card__link&#34; href=&#34;https://en.wikipedia.org/wiki/Strangler_fig_pattern&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;
      &lt;span class=&#34;wiki-card__source&#34;&gt;Wikipedia&lt;/span&gt;
      &lt;span class=&#34;wiki-card__title&#34;&gt;Strangler fig pattern&lt;/span&gt;
      
        &lt;span class=&#34;wiki-card__description&#34;&gt;A migration pattern where a new system gradually replaces parts of an old system.&lt;/span&gt;
      
      &lt;span class=&#34;wiki-card__action&#34;&gt;Open article&lt;/span&gt;
    &lt;/a&gt;
  &lt;/aside&gt;


&lt;ol&gt;
&lt;li&gt;Measure and identify an actual bottleneck.&lt;/li&gt;
&lt;li&gt;Stabilize its input/output contract.&lt;/li&gt;
&lt;li&gt;Add contract, behavior and benchmark tests.&lt;/li&gt;
&lt;li&gt;Reimplement that capability in Go, Rust or another runtime.&lt;/li&gt;
&lt;li&gt;Route a small portion of traffic or jobs to the new implementation.&lt;/li&gt;
&lt;li&gt;Compare correctness, latency, errors and resource usage.&lt;/li&gt;
&lt;li&gt;Increase traffic gradually and remove the old implementation after
confidence is high.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Caddy can route most endpoints to Django and selected hot endpoints to another
service. The frontend does not need to know which language serves an endpoint as
long as the contract remains stable.&lt;/p&gt;
&lt;div class=&#34;mermaid&#34;&gt;

flowchart LR
  A[Frontend/client] --&gt; B[Caddy]
  B --&gt; C[Django monolith]
  B --&gt; D[Go/Rust service]
  C --&gt; E[(Shared database or API contract)]
  D --&gt; E

&lt;/div&gt;

&lt;h2 id=&#34;recommended-practical-path&#34;&gt;
  Recommended practical path
  &lt;a href=&#34;#recommended-practical-path&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Build each product as a modular Django application with a static frontend
frontend.&lt;/li&gt;
&lt;li&gt;Use one Django worker while the product is dormant.&lt;/li&gt;
&lt;li&gt;Use SQLite for disposable POCs or one shared PostgreSQL cluster for serious
apps.&lt;/li&gt;
&lt;li&gt;Avoid Redis, Celery and RabbitMQ until they solve a demonstrated need.&lt;/li&gt;
&lt;li&gt;For early background work, use a database job table and scheduled one-shot
workers.&lt;/li&gt;
&lt;li&gt;For reliable cross-language processing, graduate to RabbitMQ with
application-owned JSON messages.&lt;/li&gt;
&lt;li&gt;Move only proven CPU-heavy or high-concurrency components to Go or Rust.&lt;/li&gt;
&lt;li&gt;Scale worker count, database resources and service separation only after an
app gains traction.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The guiding principle is: optimize the deployment topology first, preserve
explicit boundaries in the code, and rewrite only measured bottlenecks.&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>GeoPackage</title>
      <link>/digital-garden/software/geopackage/</link>
      <pubDate>Thu, 16 Jul 2026 00:00:00 +0200</pubDate>
      <guid>/digital-garden/software/geopackage/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;GeoPackage is an open, SQLite-based file format for storing geospatial data,
including vector features, raster tiles, and related metadata, in a single
portable &lt;code&gt;.gpkg&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;Because it is built on SQLite, a GeoPackage is both a file and a small
relational database. It can store tables, indexes, metadata, coordinate
reference system information, and spatial data in one portable artifact.&lt;/p&gt;
&lt;p&gt;The main use case is exchanging GIS data without needing a running database
server. A &lt;code&gt;.gpkg&lt;/code&gt; file can be copied, attached, archived, emailed, or opened by
GIS tools while still preserving structured geospatial data better than loose
collections of files.&lt;/p&gt;
&lt;p&gt;GeoPackage is often a better interchange format than older shapefile-based
workflows because it avoids spreading one dataset across several sidecar files,
supports longer names and richer metadata, and can hold multiple layers in one
file.&lt;/p&gt;
&lt;p&gt;It is not a replacement for a server database such as PostgreSQL with PostGIS
when many users need concurrent writes, permissions, APIs, backups, and
operational controls. It is better understood as a portable geospatial
container.&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>Heidegger</title>
      <link>/digital-garden/philosophy/heidegger/</link>
      <pubDate>Thu, 16 Jul 2026 00:00:00 +0200</pubDate>
      <guid>/digital-garden/philosophy/heidegger/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;Heidegger focuses on Being, mortality, authenticity, and the problem of living
consciously instead of drifting through inherited routines.&lt;/p&gt;
&lt;h2 id=&#34;core-idea&#34;&gt;
  Core idea
  &lt;a href=&#34;#core-idea&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Thinking about death is not meant to be morbid. It is meant to make life more
serious. Mortality forces the question of whether a person is living from their
own understanding, or merely copying what &amp;ldquo;one&amp;rdquo; does.&lt;/p&gt;
&lt;p&gt;For Heidegger, authenticity begins when a person recognizes that their life is
finite and cannot be lived by anyone else.&lt;/p&gt;
&lt;h2 id=&#34;why-it-matters&#34;&gt;
  Why it matters
  &lt;a href=&#34;#why-it-matters&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The thought of death can clarify choices. If time is limited, then comfort,
approval, and distraction cannot be the only standards for deciding how to
live.&lt;/p&gt;
&lt;h2 id=&#34;questions&#34;&gt;
  Questions
  &lt;a href=&#34;#questions&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Which choices become clearer when mortality is taken seriously?&lt;/li&gt;
&lt;li&gt;Is authenticity possible without some distance from public opinion?&lt;/li&gt;
&lt;/ul&gt;

        
        </description>
    </item>
    
    <item>
      <title>Jesus resurrection and sacrifice</title>
      <link>/digital-garden/philosophy/morality/</link>
      <pubDate>Thu, 16 Jul 2026 00:00:00 +0200</pubDate>
      <guid>/digital-garden/philosophy/morality/</guid>
      <description>
        
          
          
          
        
        
        &lt;h2 id=&#34;uskrsnuće-i-žrtva&#34;&gt;
  Uskrsnuće i žrtva
  &lt;a href=&#34;#uskrsnu%c4%87e-i-%c5%bertva&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;U kršćanskoj logici, bez uskrsnuća bi Isus prvenstveno ostao nepravedno
ubijena žrtva ili moralni mučenik. Mogao bi i dalje biti iznimno plemenit, ali
njegova smrt sama po sebi ne bi dokazala da je njegov put istinit niti da je
smrt pobijeđena.&lt;/p&gt;
&lt;p&gt;Zato Pavao kaže da je vjera prazna ako Krist nije uskrsnuo. Ljudi su se kroz
povijest žrtvovali za narode, ideologije, obitelji, revolucije i druge ljude.
Mnoge od tih žrtava nisu promijenile ništa. Neki su samo iskorišteni,
zaboravljeni ili uništeni.&lt;/p&gt;
&lt;p&gt;Uskrsnuće mijenja značenje križa:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;bez uskrsnuća, zlo je ubilo pravednog čovjeka;&lt;/li&gt;
&lt;li&gt;s uskrsnućem, Bog je potvrdio pravednog čovjeka i pokazao da zlo i smrt
nemaju posljednju riječ.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To ne znači da je svako žrtvovanje opravdano. Kršćanstvo ne bi smjelo učiti:
&amp;ldquo;trpi sve, možda ćeš jednom biti nagrađen.&amp;rdquo; Takva poruka lako postaje
ideologija kojom se žrtve drže poslušnima.&lt;/p&gt;
&lt;p&gt;Isusova žrtva nije prikazana kao pasivno dopuštanje da ga drugi iskorištavaju.
On bira svoj put, govori protiv vlasti i religijskog licemjerja, povlači
granice i ne odriče se istine da bi spasio vlastiti život. Njegova žrtva
proizlazi iz ljubavi i slobode, a ne iz nemoći.&lt;/p&gt;
&lt;p&gt;Obećanje uskrsnuća ne čini svaku žrtvu dobrom. Ali u kršćanstvu sprječava da
Isusova žrtva završi kao besmislen poraz. Uskrsnuće je Božje opravdanje žrtve
i osuda svijeta koji ju je proizveo.&lt;/p&gt;
&lt;p&gt;Bez uskrsnuća križ govori: dobri ljudi ponekad izgube. S uskrsnućem govori:
mogu biti ubijeni, ali njihov poraz nije konačna istina.&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>Kierkegaard</title>
      <link>/digital-garden/philosophy/kierkegaard/</link>
      <pubDate>Thu, 16 Jul 2026 00:00:00 +0200</pubDate>
      <guid>/digital-garden/philosophy/kierkegaard/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;Kierkegaard focuses on the individual, faith, anxiety, despair,
responsibility, and the leap of faith.&lt;/p&gt;
&lt;p&gt;His point is not manifestation or positive thinking. It is that a person must
choose and commit under uncertainty. Faith is not certainty before action, but
the decision to live seriously without having complete proof.&lt;/p&gt;
&lt;h2 id=&#34;who-he-was&#34;&gt;
  Who he was
  &lt;a href=&#34;#who-he-was&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Søren Kierkegaard was a nineteenth-century Danish philosopher and Christian
thinker. He is often called the father of existentialism because he focused on
the individual person rather than abstract philosophical systems.&lt;/p&gt;
&lt;h2 id=&#34;why-he-matters&#34;&gt;
  Why he matters
  &lt;a href=&#34;#why-he-matters&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Kierkegaard shifted philosophy away from questions like &amp;ldquo;How does the universe
work?&amp;rdquo; toward questions like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How should I live?&lt;/li&gt;
&lt;li&gt;What does it mean to be myself?&lt;/li&gt;
&lt;li&gt;How do I make difficult choices?&lt;/li&gt;
&lt;li&gt;What is authentic faith?&lt;/li&gt;
&lt;li&gt;How should I deal with anxiety and despair?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Many later philosophers, both religious and atheist, built on these questions.&lt;/p&gt;
&lt;h2 id=&#34;core-idea&#34;&gt;
  Core idea
  &lt;a href=&#34;#core-idea&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Kierkegaard treats existence as something each person must take responsibility
for directly. A person cannot outsource the most important choices to society,
fashion, institutions, or abstract theory.&lt;/p&gt;
&lt;p&gt;The leap of faith is not irrational confidence that everything will work out.
It is commitment without the safety of final proof.&lt;/p&gt;
&lt;h2 id=&#34;becoming-yourself&#34;&gt;
  Becoming yourself
  &lt;a href=&#34;#becoming-yourself&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Kierkegaard believed that the purpose of life is to become your true self. Many
people simply follow society, tradition, comfort, or the crowd. For
Kierkegaard, that is not authentic living.&lt;/p&gt;
&lt;p&gt;Becoming yourself requires inward responsibility. A person has to face who they
are, what they value, and what they are willing to commit to.&lt;/p&gt;
&lt;h2 id=&#34;choice&#34;&gt;
  Choice
  &lt;a href=&#34;#choice&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;For Kierkegaard, every important choice shapes who a person becomes. Choosing
honesty over lying, commitment over endless possibility, or responsibility over
comfort is not just behavior. It forms the self.&lt;/p&gt;
&lt;p&gt;Not choosing is still a choice. Avoiding decisions can eventually lead to
regret and despair.&lt;/p&gt;
&lt;h2 id=&#34;anxiety&#34;&gt;
  Anxiety
  &lt;a href=&#34;#anxiety&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Kierkegaard saw anxiety as a normal part of freedom. If a person is truly free,
they realize they could choose many different paths. That possibility naturally
creates anxiety.&lt;/p&gt;
&lt;p&gt;The goal is not to escape anxiety completely, but to understand it as part of
being free.&lt;/p&gt;
&lt;h2 id=&#34;despair&#34;&gt;
  Despair
  &lt;a href=&#34;#despair&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Despair is not only sadness. For Kierkegaard, despair is failing to become the
person one is meant to become.&lt;/p&gt;
&lt;p&gt;Someone can appear successful and still live in despair if they are not living
authentically.&lt;/p&gt;
&lt;h2 id=&#34;three-ways-of-living&#34;&gt;
  Three ways of living
  &lt;a href=&#34;#three-ways-of-living&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Kierkegaard described three broad stages or ways of living.&lt;/p&gt;
&lt;h3 id=&#34;aesthetic-life&#34;&gt;
  Aesthetic life
  &lt;a href=&#34;#aesthetic-life&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;The aesthetic life seeks pleasure, avoids commitment, and chases experiences.
It wants possibility without responsibility.&lt;/p&gt;
&lt;h3 id=&#34;ethical-life&#34;&gt;
  Ethical life
  &lt;a href=&#34;#ethical-life&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;The ethical life accepts responsibility, develops character, keeps promises,
and lives according to principles.&lt;/p&gt;
&lt;h3 id=&#34;religious-life&#34;&gt;
  Religious life
  &lt;a href=&#34;#religious-life&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;The religious life involves a personal relationship with God and faith beyond
certainty.&lt;/p&gt;
&lt;p&gt;These stages are not strict mechanical steps. They describe increasingly deeper
ways of living.&lt;/p&gt;
&lt;h2 id=&#34;christianity&#34;&gt;
  Christianity
  &lt;a href=&#34;#christianity&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Kierkegaard was a genuine Christian believer, but he strongly criticized the
Danish state church. He believed many people were Christians only by culture.&lt;/p&gt;
&lt;p&gt;Going to church does not necessarily make someone a Christian. Real
Christianity requires personal commitment to God.&lt;/p&gt;
&lt;h2 id=&#34;the-leap-of-faith&#34;&gt;
  The leap of faith
  &lt;a href=&#34;#the-leap-of-faith&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The leap of faith is Kierkegaard&amp;rsquo;s most famous idea. Reason cannot prove
everything. Eventually, a person must choose whether to believe.&lt;/p&gt;
&lt;p&gt;That choice is not made from complete certainty. It is made under uncertainty,
where commitment becomes unavoidable.&lt;/p&gt;
&lt;h2 id=&#34;the-incarnation&#34;&gt;
  The incarnation
  &lt;a href=&#34;#the-incarnation&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Kierkegaard accepted the Christian belief that Jesus is fully God and fully
human, but he treated it as a paradox. He did not think reason could completely
explain it.&lt;/p&gt;
&lt;p&gt;Faith means accepting the paradox rather than solving it logically.&lt;/p&gt;
&lt;h2 id=&#34;jesus-praying-to-god&#34;&gt;
  Jesus praying to God
  &lt;a href=&#34;#jesus-praying-to-god&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Jesus praying to God is another aspect of the incarnation. As a human, Jesus
experienced suffering, prayed, and even cried on the cross: &amp;ldquo;My God, my God,
why have you forsaken me?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;For Kierkegaard, this does not eliminate the paradox. It illustrates it.&lt;/p&gt;
&lt;h2 id=&#34;questions&#34;&gt;
  Questions
  &lt;a href=&#34;#questions&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;What does it mean to choose when certainty is unavailable?&lt;/li&gt;
&lt;li&gt;Is faith a way of escaping uncertainty, or a way of accepting it?&lt;/li&gt;
&lt;li&gt;Can a person be socially successful and still live in despair?&lt;/li&gt;
&lt;li&gt;What makes Christianity personal rather than merely cultural?&lt;/li&gt;
&lt;/ul&gt;

        
        </description>
    </item>
    
    <item>
      <title>Legacy of Kain: Raziel and Kain</title>
      <link>/digital-garden/philosophy/legacy-of-kain/</link>
      <pubDate>Thu, 16 Jul 2026 00:00:00 +0200</pubDate>
      <guid>/digital-garden/philosophy/legacy-of-kain/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;&lt;img src=&#34;https://static.wikia.nocookie.net/p__/images/4/40/Legacyofkainsoulreaver-2295.jpeg/revision/latest?cb=20120823165435&amp;amp;path-prefix=protagonist&#34; alt=&#34;Raziel&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Legacy of Kain&lt;/em&gt; uses gothic fantasy to question truth, destiny, divinity, and
whether a godlike authority should be trusted simply because it presents itself
as holy.&lt;/p&gt;
&lt;h2 id=&#34;core-idea&#34;&gt;
  Core idea
  &lt;a href=&#34;#core-idea&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The series is not only about vampires, souls, and revenge. It is also about
the collapse of inherited certainty. Characters discover that what looked like
cosmic order may be manipulation, and that the difference between good and evil
is harder to read than the world first suggests.&lt;/p&gt;
&lt;p&gt;Raziel&amp;rsquo;s story begins with being cast out. He is punished for evolving beyond
Kain and thrown into the abyss. That fall turns him into a seeker of truth, but
also into a weapon used by forces he does not fully understand.&lt;/p&gt;
&lt;h2 id=&#34;questioning-god&#34;&gt;
  Questioning God
  &lt;a href=&#34;#questioning-god&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://i.pinimg.com/564x/61/1f/25/611f252bd1b8bd9302b7ab1b85d4420b.jpg&#34; alt=&#34;The Elder God&#34;&gt;&lt;/p&gt;
&lt;p&gt;The Elder God appears as a divine voice, judge, and source of purpose. Raziel is
told that his suffering has meaning because he has been chosen to restore
balance.&lt;/p&gt;
&lt;p&gt;But the deeper question is whether this &amp;ldquo;god&amp;rdquo; is actually good. The series
turns religious obedience into a philosophical problem: if a being claims divine
authority, how can Raziel know whether it is truth, justice, hunger, or
manipulation?&lt;/p&gt;
&lt;h2 id=&#34;raziel&#34;&gt;
  Raziel
  &lt;a href=&#34;#raziel&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Raziel is tragic because he wants truth, but each truth breaks the identity he
had before.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;As Kain&amp;rsquo;s lieutenant, he believes in hierarchy and power.&lt;/li&gt;
&lt;li&gt;After being cast out, he becomes driven by revenge.&lt;/li&gt;
&lt;li&gt;As Raziel learns more, revenge stops being enough: Kain is no longer just the
enemy who betrayed him, but part of a larger web of prophecy, manipulation,
and corrupted divine authority.&lt;/li&gt;
&lt;li&gt;His real struggle becomes understanding who is using him and what freedom is
still possible.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Raziel is a character of disillusionment. He is repeatedly remade by knowledge.
Seeing truth does not make him peaceful; it destroys simpler versions of
himself.&lt;/p&gt;
&lt;h2 id=&#34;kain&#34;&gt;
  Kain
  &lt;a href=&#34;#kain&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Kain is not simply a villain. He is arrogant, violent, and manipulative, but he
also sees farther than many characters around him.&lt;/p&gt;
&lt;p&gt;His role is closer to the rebel tyrant: someone who refuses a destiny written
by others, even if his rebellion causes suffering. Kain&amp;rsquo;s question is whether a
corrupt world should be obeyed, restored, or broken open.&lt;/p&gt;
&lt;p&gt;He understands that prophecy, morality, and divine command can be cages. That
does not make him innocent, but it makes him more than evil.&lt;/p&gt;
&lt;h2 id=&#34;note-for-expansion&#34;&gt;
  Note for expansion
  &lt;a href=&#34;#note-for-expansion&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The main philosophical tension is that Raziel seeks truth through obedience and
then through rebellion, while Kain seeks freedom by defying the structure of
the world itself.&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>Literature Books</title>
      <link>/digital-garden/books/literature-books/</link>
      <pubDate>Thu, 16 Jul 2026 00:00:00 +0200</pubDate>
      <guid>/digital-garden/books/literature-books/</guid>
      <description>
        
          
          
          
        
        
        &lt;h2 id=&#34;to-read--to-update&#34;&gt;
  To read / to update
  &lt;a href=&#34;#to-read--to-update&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;The Great Gatsby&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Povratak Filipa Latinovića&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;The Sound and the Fury&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

        
        </description>
    </item>
    
    <item>
      <title>Miyamoto Musashi</title>
      <link>/digital-garden/philosophy/miyamoto-musashi/</link>
      <pubDate>Thu, 16 Jul 2026 00:00:00 +0200</pubDate>
      <guid>/digital-garden/philosophy/miyamoto-musashi/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;&lt;img src=&#34;https://i.natgeofe.com/n/61a39eeb-c992-44d6-ad46-d4ef7ab4cce0/2PKF0CR.jpg&#34; alt=&#34;Miyamoto Musashi&#34;&gt;&lt;/p&gt;
&lt;p&gt;Miyamoto Musashi was a Japanese swordsman, strategist, and writer, best known
for &lt;em&gt;The Book of Five Rings&lt;/em&gt; and for treating combat as a discipline of
perception, timing, practice, and mental clarity.&lt;/p&gt;
&lt;h2 id=&#34;core-idea&#34;&gt;
  Core idea
  &lt;a href=&#34;#core-idea&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Musashi&amp;rsquo;s philosophy is practical rather than abstract. The point is not to
collect ideas, but to train perception until action becomes direct and
appropriate to the situation.&lt;/p&gt;
&lt;h2 id=&#34;main-themes&#34;&gt;
  Main themes
  &lt;a href=&#34;#main-themes&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id=&#34;discipline&#34;&gt;
  Discipline
  &lt;a href=&#34;#discipline&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Skill comes from repeated practice, not from theory alone. Musashi treats the
way of strategy as something tested in action.&lt;/p&gt;
&lt;h3 id=&#34;timing&#34;&gt;
  Timing
  &lt;a href=&#34;#timing&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Victory depends on reading rhythm: when to move, when to wait, when to pressure,
and when an opponent has already lost balance.&lt;/p&gt;
&lt;h3 id=&#34;adaptability&#34;&gt;
  Adaptability
  &lt;a href=&#34;#adaptability&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Musashi warns against becoming trapped by one weapon, one school, one style, or
one fixed idea. A person should understand principles deeply enough to adapt
when circumstances change.&lt;/p&gt;
&lt;h3 id=&#34;seeing-clearly&#34;&gt;
  Seeing clearly
  &lt;a href=&#34;#seeing-clearly&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;A central Musashi lesson is to see what is actually happening, not what fear,
habit, ego, or tradition tells you is happening.&lt;/p&gt;
&lt;h2 id=&#34;note-for-expansion&#34;&gt;
  Note for expansion
  &lt;a href=&#34;#note-for-expansion&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Musashi is useful as a note on mastery: learn the form, practice seriously, then
move beyond attachment to any single form.&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>Modern Philosophy</title>
      <link>/digital-garden/philosophy/modern-philosophy/</link>
      <pubDate>Thu, 16 Jul 2026 00:00:00 +0200</pubDate>
      <guid>/digital-garden/philosophy/modern-philosophy/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;Modern philosophy often focuses on the human person, existence, mortality,
identity, technology, society, and the loss of traditional certainty.&lt;/p&gt;
&lt;h2 id=&#34;core-idea&#34;&gt;
  Core idea
  &lt;a href=&#34;#core-idea&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Twentieth and twenty-first century philosophy is shaped by modern crises:
industrial war, secularization, Darwinism, political catastrophe, technology,
and the weakening of inherited religious and metaphysical frameworks.&lt;/p&gt;
&lt;p&gt;When old certainties become less stable, philosophy turns more urgently toward
questions of how to live, who we are, what can be trusted, and what kind of
society modern life is producing.&lt;/p&gt;
&lt;h2 id=&#34;why-it-matters&#34;&gt;
  Why it matters
  &lt;a href=&#34;#why-it-matters&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Modern philosophy can feel less like a search for an eternal system and more
like an attempt to understand fractured human life under modern conditions.&lt;/p&gt;
&lt;h2 id=&#34;questions&#34;&gt;
  Questions
  &lt;a href=&#34;#questions&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Why does modern philosophy so often begin from crisis?&lt;/li&gt;
&lt;li&gt;What replaces inherited certainty when religion, tradition, and authority no
longer convince everyone?&lt;/li&gt;
&lt;/ul&gt;

        
        </description>
    </item>
    
    <item>
      <title>Newspeak</title>
      <link>/digital-garden/language/newspeak/</link>
      <pubDate>Thu, 16 Jul 2026 00:00:00 +0200</pubDate>
      <guid>/digital-garden/language/newspeak/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;&lt;img src=&#34;https://fcetier.com/wp-content/uploads/2015/08/newspeak-1.jpg&#34; alt=&#34;Newspeak&#34;&gt;&lt;/p&gt;
&lt;p&gt;Newspeak is the fictional constructed language in George Orwell&amp;rsquo;s
&lt;em&gt;Nineteen Eighty-Four&lt;/em&gt;, designed by Oceania&amp;rsquo;s ruling Party to restrict thought
by restricting language.&lt;/p&gt;
&lt;h2 id=&#34;purpose&#34;&gt;
  Purpose
  &lt;a href=&#34;#purpose&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Newspeak is built on the idea that language shapes what people can think. By
shrinking vocabulary, simplifying grammar, and removing nuance, the Party aims
to make rebellious or unorthodox thought impossible to formulate.&lt;/p&gt;
&lt;p&gt;The goal is not only to control what people say, but to remove the mental tools
needed to question the ideology of Ingsoc. Oldspeak, standard English, is
supposed to disappear once Newspeak becomes complete.&lt;/p&gt;
&lt;h2 id=&#34;key-features&#34;&gt;
  Key features
  &lt;a href=&#34;#key-features&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Vocabulary is reduced with each dictionary edition, deleting words that are
unnecessary or ideologically dangerous.&lt;/li&gt;
&lt;li&gt;Synonyms and antonyms are removed where possible. Opposites are formed with
prefixes like &lt;code&gt;un-&lt;/code&gt;, and intensity with forms like &lt;code&gt;plus-&lt;/code&gt; and &lt;code&gt;doubleplus-&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Political terms are compressed into loaded compound words such as
&lt;code&gt;goodthink&lt;/code&gt;, &lt;code&gt;crimethink&lt;/code&gt;, &lt;code&gt;joycamp&lt;/code&gt;, &lt;code&gt;blackwhite&lt;/code&gt;, and &lt;code&gt;duckspeak&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Grammar is simplified and regularized, reducing irregular forms and
ambiguity.&lt;/li&gt;
&lt;li&gt;Euphemisms hide violence and coercion behind neutral or positive names, as
with the Ministry of Love and the Ministry of Truth.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;legacy&#34;&gt;
  Legacy
  &lt;a href=&#34;#legacy&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Orwell created Newspeak as a warning about language as an instrument of
authoritarian control. The term now describes political euphemism, jargon, and
attempts to restrict debate by manipulating the vocabulary available for it.&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>ORM vs SQL Thinking</title>
      <link>/digital-garden/software/orm-vs-sql-thinking/</link>
      <pubDate>Thu, 16 Jul 2026 00:00:00 +0200</pubDate>
      <guid>/digital-garden/software/orm-vs-sql-thinking/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;ORMs make relations feel like objects inside objects. SQL does not work that
way.&lt;/p&gt;
&lt;p&gt;In SQL, a table row only has columns. Relations are expressed with IDs:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;trips.owner_id &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; users.id
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;trip_days.trip_id &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; trips.id
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;activities.trip_day_id &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; trip_days.id
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The mental shift is moving from object navigation to explicit data access.&lt;/p&gt;
&lt;h2 id=&#34;orm-thinking&#34;&gt;
  ORM thinking
  &lt;a href=&#34;#orm-thinking&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;In Django or another ORM, related data often feels like it lives inside the
object:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;trip&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;owner
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;trip&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;days&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;all()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;day&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;activities&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;all()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That is convenient because the application code can follow relationships in a
natural way. It matches how people often think about domain objects: a trip has
an owner, a trip has days, and a day has activities.&lt;/p&gt;
&lt;p&gt;The risk is that the database work becomes invisible. What looks like simple
attribute access may produce extra queries, large result sets, or an accidental
object graph that is much bigger than the screen actually needs.&lt;/p&gt;
&lt;h2 id=&#34;sql-thinking&#34;&gt;
  SQL thinking
  &lt;a href=&#34;#sql-thinking&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;SQL thinking is more explicit:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Which row in users has id = trips.owner_id?
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Which rows in trip_days have trip_id = trips.id?
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Which rows in activities have trip_day_id = trip_days.id?
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The database gives you rows, not nested objects. Your application decides
whether to keep those rows flat or transform them into nested JSON, DTOs, or
domain objects.&lt;/p&gt;
&lt;p&gt;This is the key distinction. The database stores normalized facts. Queries
produce use-case-specific views of those facts.&lt;/p&gt;
&lt;h2 id=&#34;rows-not-nested-objects&#34;&gt;
  Rows, not nested objects
  &lt;a href=&#34;#rows-not-nested-objects&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;An ORM can make it feel like the database contains this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Trip
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  owner
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  days
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    activities
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But the database usually contains separate tables:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;users
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;trips
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;trip_days
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;activities
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Foreign keys describe how those rows relate. They do not automatically create a
nested structure. Nesting is an application decision.&lt;/p&gt;
&lt;p&gt;That matters because different screens often need different shapes of the same
underlying data. A trip detail page, a trip list page, an admin report, and an
export job should not necessarily load the same object graph.&lt;/p&gt;
&lt;h2 id=&#34;three-patterns-for-related-data&#34;&gt;
  Three patterns for related data
  &lt;a href=&#34;#three-patterns-for-related-data&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id=&#34;join-related-data&#34;&gt;
  Join related data
  &lt;a href=&#34;#join-related-data&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Joins are good for one-to-one or many-to-one data, where each main row has one
related row or a small predictable set of related values.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; trips.id, trips.name, users.email &lt;span style=&#34;color:#66d9ef&#34;&gt;AS&lt;/span&gt; owner_email
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; trips
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;JOIN&lt;/span&gt; users &lt;span style=&#34;color:#66d9ef&#34;&gt;ON&lt;/span&gt; users.id &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; trips.owner_id
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;WHERE&lt;/span&gt; trips.id &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This produces a flat result with exactly the columns needed by the use case.&lt;/p&gt;
&lt;h3 id=&#34;use-multiple-simpler-queries&#34;&gt;
  Use multiple simpler queries
  &lt;a href=&#34;#use-multiple-simpler-queries&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Multiple queries are often better for nested one-to-many data.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; trips &lt;span style=&#34;color:#66d9ef&#34;&gt;WHERE&lt;/span&gt; id &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; trip_days &lt;span style=&#34;color:#66d9ef&#34;&gt;WHERE&lt;/span&gt; trip_id &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; activities &lt;span style=&#34;color:#66d9ef&#34;&gt;WHERE&lt;/span&gt; trip_day_id &lt;span style=&#34;color:#66d9ef&#34;&gt;IN&lt;/span&gt; (...);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then the application assembles the result in code.&lt;/p&gt;
&lt;p&gt;This can be clearer than writing one large query that duplicates parent rows
across many child rows. It also gives the application control over how the
final object or JSON structure is built.&lt;/p&gt;
&lt;h3 id=&#34;use-postgresql-json-aggregation&#34;&gt;
  Use PostgreSQL JSON aggregation
  &lt;a href=&#34;#use-postgresql-json-aggregation&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;PostgreSQL can build nested JSON directly in the query:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  trips.id,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  trips.name,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  json_agg(trip_days.&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;AS&lt;/span&gt; days
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; trips
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;LEFT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;JOIN&lt;/span&gt; trip_days &lt;span style=&#34;color:#66d9ef&#34;&gt;ON&lt;/span&gt; trip_days.trip_id &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; trips.id
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;GROUP&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;BY&lt;/span&gt; trips.id;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This can be useful for APIs, but it is more advanced. It can also make queries
harder to read and test if used too early. Use it when the database is the
right place to shape the response, not just because nesting feels convenient.&lt;/p&gt;
&lt;h2 id=&#34;ask-for-the-data-shape&#34;&gt;
  Ask for the data shape
  &lt;a href=&#34;#ask-for-the-data-shape&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The practical question is not:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;How do I load this object and all its relations?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The better question is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What data shape does this screen or API endpoint need?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;For example, a trip list page might need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;trip id;&lt;/li&gt;
&lt;li&gt;trip name;&lt;/li&gt;
&lt;li&gt;owner name;&lt;/li&gt;
&lt;li&gt;day count;&lt;/li&gt;
&lt;li&gt;member count.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That needs a specific query, not a whole trip object graph.&lt;/p&gt;
&lt;p&gt;The same trip might need a different query for a detail page, another query for
editing, and another query for analytics.&lt;/p&gt;
&lt;h2 id=&#34;core-sql-mindset&#34;&gt;
  Core SQL mindset
  &lt;a href=&#34;#core-sql-mindset&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The core SQL mindset is:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Tables store normalized facts.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Foreign keys define relationships.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Queries produce use-case-specific views.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Application code shapes rows into objects or JSON.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This does not mean abandoning ORMs. It means not letting the ORM hide the shape
and cost of the data access.&lt;/p&gt;
&lt;h2 id=&#34;practical-rule&#34;&gt;
  Practical rule
  &lt;a href=&#34;#practical-rule&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Use ORM navigation when it is simple and clear. For example, ordinary CRUD,
small forms, admin screens, and straightforward model relationships are often
fine with normal ORM code.&lt;/p&gt;
&lt;p&gt;When a screen, endpoint, or job needs a specific shape of data, think in SQL
terms first:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;which rows are needed;&lt;/li&gt;
&lt;li&gt;which columns are needed;&lt;/li&gt;
&lt;li&gt;which relationships are needed;&lt;/li&gt;
&lt;li&gt;whether joins, multiple queries, or aggregation produce the cleanest result;&lt;/li&gt;
&lt;li&gt;where the final shape should be assembled.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You are not replacing Django magic one-to-one. You are becoming explicit about
what data you need, when you need it, and how it should be shaped.&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>Peter Singer</title>
      <link>/digital-garden/philosophy/peter-singer/</link>
      <pubDate>Thu, 16 Jul 2026 00:00:00 +0200</pubDate>
      <guid>/digital-garden/philosophy/peter-singer/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;Peter Singer is a utilitarian philosopher focused on reducing suffering and
taking moral consequences seriously.&lt;/p&gt;
&lt;h2 id=&#34;core-idea&#34;&gt;
  Core idea
  &lt;a href=&#34;#core-idea&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Singer argues that moral concern should not stop at personal preference,
national borders, species membership, or social convenience. If suffering can
be reduced, and the cost of helping is reasonable, then there is a strong moral
reason to act.&lt;/p&gt;
&lt;p&gt;This connects his work on animal ethics, poverty, charitable giving, and
effective altruism.&lt;/p&gt;
&lt;h2 id=&#34;why-it-matters&#34;&gt;
  Why it matters
  &lt;a href=&#34;#why-it-matters&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Singer&amp;rsquo;s philosophy is uncomfortable because it asks whether ordinary comfort
depends on ignoring preventable suffering. It turns ethics from a question of
being personally nice into a question of what actually reduces harm.&lt;/p&gt;
&lt;h2 id=&#34;questions&#34;&gt;
  Questions
  &lt;a href=&#34;#questions&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;How much sacrifice can morality reasonably demand?&lt;/li&gt;
&lt;li&gt;Does distance reduce responsibility when suffering is preventable?&lt;/li&gt;
&lt;/ul&gt;

        
        </description>
    </item>
    
    <item>
      <title>PostgreSQL</title>
      <link>/digital-garden/software/postgresql/</link>
      <pubDate>Thu, 16 Jul 2026 00:00:00 +0200</pubDate>
      <guid>/digital-garden/software/postgresql/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;PostgreSQL is a durable, extensible relational database that often works well
as the primary data store for application systems.&lt;/p&gt;
&lt;h2 id=&#34;extensions-and-adjacent-tools&#34;&gt;
  Extensions and adjacent tools
  &lt;a href=&#34;#extensions-and-adjacent-tools&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id=&#34;postgis&#34;&gt;
  PostGIS
  &lt;a href=&#34;#postgis&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;PostGIS is a real PostgreSQL extension. It adds support for geographic objects
and spatial queries, so PostgreSQL can store and query points, lines, polygons,
rasters, coordinate systems, distances, intersections, containment, and other
GIS data.&lt;/p&gt;
&lt;p&gt;With PostGIS, PostgreSQL can act as a spatial database. This is useful for maps,
routing, boundaries, nearby-search features, geospatial analytics, and formats
such as GeoJSON or GeoPackage workflows.&lt;/p&gt;
&lt;h3 id=&#34;postgrest&#34;&gt;
  PostgREST
  &lt;a href=&#34;#postgrest&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;PostgREST is not a PostgreSQL extension. It is a separate web server that turns
a PostgreSQL database into a REST API.&lt;/p&gt;
&lt;p&gt;PostgREST reads database schemas, tables, views, functions, roles, and
permissions, then exposes them over HTTP. The database remains the source of
truth for authorization and data shape. It is useful when the API can be
modeled cleanly around PostgreSQL relations, views, and stored functions.&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>Religion, Psychology, and Upbringing</title>
      <link>/digital-garden/psychology/religion-psychology-and-upbringing/</link>
      <pubDate>Thu, 16 Jul 2026 00:00:00 +0200</pubDate>
      <guid>/digital-garden/psychology/religion-psychology-and-upbringing/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;Religious belief is shaped not only by arguments, but also by family, culture,
community, need for meaning, and early psychological experience.&lt;/p&gt;
&lt;h2 id=&#34;core-idea&#34;&gt;
  Core idea
  &lt;a href=&#34;#core-idea&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Some people continue to believe and go to church because religion is not only a
set of propositions. It can also be a language of trust, belonging, moral
orientation, ritual, memory, and identity.&lt;/p&gt;
&lt;p&gt;For others, religious belief is harder to inhabit because early experience
damaged the psychological patterns that make trust feel natural.&lt;/p&gt;
&lt;h2 id=&#34;fatherhood-and-religious-authority&#34;&gt;
  Fatherhood and religious authority
  &lt;a href=&#34;#fatherhood-and-religious-authority&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The idea of &amp;ldquo;God the Father&amp;rdquo; can be affected by a person&amp;rsquo;s experience of
fatherhood or its absence. Lack of a father figure, or a painful father
relationship, can make religious authority feel distant, suspicious, or
untrustworthy.&lt;/p&gt;
&lt;p&gt;This does not prove or disprove religion. It shows that belief and unbelief are
often lived through psychological history, not only abstract reasoning.&lt;/p&gt;
&lt;h2 id=&#34;questions&#34;&gt;
  Questions
  &lt;a href=&#34;#questions&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;How much of belief is argument, and how much is trust learned through
experience?&lt;/li&gt;
&lt;li&gt;Can a damaged image of authority be healed without becoming naive?&lt;/li&gt;
&lt;/ul&gt;

        
        </description>
    </item>
    
    <item>
      <title>Startups</title>
      <link>/digital-garden/business/startups/</link>
      <pubDate>Thu, 16 Jul 2026 00:00:00 +0200</pubDate>
      <guid>/digital-garden/business/startups/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;TODO&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>TIL: Herdr</title>
      <link>/digital-garden/software/herdr/</link>
      <pubDate>Thu, 16 Jul 2026 00:00:00 +0200</pubDate>
      <guid>/digital-garden/software/herdr/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;Herdr is a terminal workspace tool, similar in spirit to tmux, that supports
mouse-controlled panes, tabs, persistent sessions, and agent workflows where
agents can inspect panes through the Herdr integration.&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>Unequal Starting Points</title>
      <link>/digital-garden/philosophy/unequal-starting-points/</link>
      <pubDate>Thu, 16 Jul 2026 00:00:00 +0200</pubDate>
      <guid>/digital-garden/philosophy/unequal-starting-points/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;People do not begin life from equal positions. Some start with family, money,
stability, confidence, and social support. Others spend years trying to catch
up.&lt;/p&gt;
&lt;h2 id=&#34;core-idea&#34;&gt;
  Core idea
  &lt;a href=&#34;#core-idea&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;This inequality can be understood through contingency: people are thrown into
conditions they did not choose. Family, class, country, health, temperament,
and early emotional security shape the field before personal choice begins.&lt;/p&gt;
&lt;p&gt;Recognizing this should make judgment more careful. It is too simple to treat
success and failure as pure reflections of character.&lt;/p&gt;
&lt;h2 id=&#34;responsibility-under-unequal-conditions&#34;&gt;
  Responsibility under unequal conditions
  &lt;a href=&#34;#responsibility-under-unequal-conditions&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Unequal beginnings do not remove personal responsibility, but they change how
responsibility should be understood. A person still has to act, choose, and
build a life, but not everyone is acting from the same starting line.&lt;/p&gt;
&lt;p&gt;The hard question is how to hold both truths at once: life is unfair before we
choose, and we are still responsible for what we do with what we were given.&lt;/p&gt;
&lt;h2 id=&#34;questions&#34;&gt;
  Questions
  &lt;a href=&#34;#questions&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;How much responsibility is fair when starting conditions are radically
unequal?&lt;/li&gt;
&lt;li&gt;How can a person avoid both resentment and denial about their starting point?&lt;/li&gt;
&lt;/ul&gt;

        
        </description>
    </item>
    
    <item>
      <title>Wittgenstein</title>
      <link>/digital-garden/philosophy/wittgenstein/</link>
      <pubDate>Thu, 16 Jul 2026 00:00:00 +0200</pubDate>
      <guid>/digital-garden/philosophy/wittgenstein/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;Wittgenstein&amp;rsquo;s later philosophy argues that meaning comes from use, not from a
fixed hidden essence behind words.&lt;/p&gt;
&lt;h2 id=&#34;core-idea&#34;&gt;
  Core idea
  &lt;a href=&#34;#core-idea&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Words make sense inside language games: practical forms of life where people
share habits, expectations, and social rules. A word does not carry one
complete meaning everywhere. Its meaning depends on how it is used.&lt;/p&gt;
&lt;p&gt;Croatian at home, English in Norway, and British English in London are not only
different vocabularies. They are different social situations with different
expectations about tone, politeness, directness, humor, and what counts as
normal speech.&lt;/p&gt;
&lt;h2 id=&#34;why-it-matters&#34;&gt;
  Why it matters
  &lt;a href=&#34;#why-it-matters&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Confusion often happens when people treat language as if every word had one
clean definition outside context. Wittgenstein&amp;rsquo;s point is that understanding a
word usually means understanding the practice it belongs to.&lt;/p&gt;
&lt;h2 id=&#34;questions&#34;&gt;
  Questions
  &lt;a href=&#34;#questions&#34; class=&#34;h-anchor&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Which words change meaning most when they move between cultures?&lt;/li&gt;
&lt;li&gt;How much misunderstanding comes from using the right words in the wrong
language game?&lt;/li&gt;
&lt;/ul&gt;

        
        </description>
    </item>
    
    <item>
      <title>Business Models</title>
      <link>/digital-garden/business/business-models/</link>
      <pubDate>Tue, 14 Jul 2026 00:00:00 +0200</pubDate>
      <guid>/digital-garden/business/business-models/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;TODO&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>Economy</title>
      <link>/digital-garden/business/economy/</link>
      <pubDate>Tue, 14 Jul 2026 00:00:00 +0200</pubDate>
      <guid>/digital-garden/business/economy/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;TODO&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>Engineering Books</title>
      <link>/digital-garden/books/engineering-books/</link>
      <pubDate>Tue, 14 Jul 2026 00:00:00 +0200</pubDate>
      <guid>/digital-garden/books/engineering-books/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;TODO&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>Holographic Brain</title>
      <link>/digital-garden/neuroscience/holographic-brain/</link>
      <pubDate>Tue, 14 Jul 2026 00:00:00 +0200</pubDate>
      <guid>/digital-garden/neuroscience/holographic-brain/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;The holographic brain is an idea that memory and perception may be distributed
across many parts of the brain instead of stored in one exact location.&lt;/p&gt;
&lt;p&gt;It is useful as a metaphor for a digital garden: one note can participate in
several connected topics without belonging to only one rigid category.&lt;/p&gt;
&lt;p&gt;Questions to explore:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What does neuroscience support about distributed memory?&lt;/li&gt;
&lt;li&gt;Where does the holographic comparison stop being useful?&lt;/li&gt;
&lt;li&gt;How should this influence links and topics in a personal knowledge system?&lt;/li&gt;
&lt;/ul&gt;

        
        </description>
    </item>
    
    <item>
      <title>Kettlebell Training</title>
      <link>/digital-garden/self-improvement/kettlebell-training/</link>
      <pubDate>Tue, 14 Jul 2026 00:00:00 +0200</pubDate>
      <guid>/digital-garden/self-improvement/kettlebell-training/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;Kettlebell training combines strength, conditioning, coordination, and grip
work through movements such as swings, presses, squats, carries, and get-ups.&lt;/p&gt;
&lt;p&gt;Questions to explore:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which movements best match a particular training goal?&lt;/li&gt;
&lt;li&gt;How should technique practice relate to load and volume?&lt;/li&gt;
&lt;li&gt;What is a sustainable weekly progression?&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
			&lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/oNnQjab42nw?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
		&lt;/div&gt;


        
        </description>
    </item>
    
    <item>
      <title>Loose Notes</title>
      <link>/digital-garden/loose-notes/loose-notes/</link>
      <pubDate>Tue, 14 Jul 2026 00:00:00 +0200</pubDate>
      <guid>/digital-garden/loose-notes/loose-notes/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;TODO&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>Nietzsche</title>
      <link>/digital-garden/philosophy/nietzsche/</link>
      <pubDate>Tue, 14 Jul 2026 00:00:00 +0200</pubDate>
      <guid>/digital-garden/philosophy/nietzsche/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;TODO&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>Productivity</title>
      <link>/digital-garden/self-improvement/productivity/</link>
      <pubDate>Tue, 14 Jul 2026 00:00:00 +0200</pubDate>
      <guid>/digital-garden/self-improvement/productivity/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;TODO&lt;/p&gt;

        
        </description>
    </item>
    
    <item>
      <title>Travel</title>
      <link>/digital-garden/travel/travel/</link>
      <pubDate>Tue, 14 Jul 2026 00:00:00 +0200</pubDate>
      <guid>/digital-garden/travel/travel/</guid>
      <description>
        
          
          
          
        
        
        &lt;p&gt;TODO&lt;/p&gt;

        
        </description>
    </item>
    
  </channel>
</rss>