~ajhalili2006's personal website, built with Zensical (successor of Material for Mkdocs) [old repo name got bugged while attempting to do manual knot migration via repo deletion] andreijiroh.dev
zensical mkdocs-material website

chore(mkdocs): setup PostHog + Cloudflare Web Analytics integration

Also updated the rest of configurations behind the scenes

Signed-off-by: Andrei Jiroh Halili <ajhalili2006@andreijiroh.dev>

Changed files
+42 -256
markdown
assets
javascripts
overrides
partials
integrations
analytics
+23
markdown/assets/javascripts/feedback.js
···
+
document$.subscribe(function() {
+
var feedback = document.forms.feedback
+
if (typeof feedback === "undefined") return
+
+
feedback.hidden = false
+
+
feedback.addEventListener("submit", function(ev) {
+
ev.preventDefault()
+
+
var page = document.location.pathname
+
var data = ev.submitter.getAttribute("data-md-value")
+
+
posthog.capture("page_feedback", { page, data })
+
+
feedback.firstElementChild.disabled = true
+
+
var note = feedback.querySelector(
+
".md-feedback__note [data-md-value='" + data + "']"
+
)
+
if (note)
+
note.hidden = false
+
})
+
}
+1
mkdocs.readthedocs.yml
···
deployment: staging # for the announcement banner
extra_javascript:
- assets/javascripts/rtd.js
+
- assets/javascripts/feedback.js
+6 -2
mkdocs.yml
···
- "Donations and Sponsorships": contact/donations.md
- "Work with Andrei Jiroh": contact/work.md
- "Found a security issue?": contact/security.md
-
- "Aything else":
+
- "Anything else":
- contact/else.md
-
- "See all available contact methods": contact/details.md
+
- "Show all contact details": contact/details.md
- "PGP and SSH keys": keys.md
- Legal:
- Security policy: security.md
···
link: https://linkedin.com/in/ajhalili2006
name: ~ajhalili2006 on linkedin for employers
analytics:
+
provider: custom
# provider: plausible
# property: andreijiroh.eu.org
# url: "https://analytics.projectsegfau.lt"
+
+
extra_javascript:
+
- assets/javascripts/feedback.js
-254
overrides/base.html
···
-
{#-
-
This file was automatically generated - do not edit
-
-#}
-
{% import "partials/language.html" as lang with context %}
-
<!doctype html>
-
<html lang="{{ lang.t('language') }}" class="no-js">
-
<head>
-
{% block site_meta %}
-
<meta charset="utf-8">
-
<meta name="viewport" content="width=device-width,initial-scale=1">
-
{% if page.meta and page.meta.description %}
-
<meta name="description" content="{{ page.meta.description }}">
-
{% elif config.site_description %}
-
<meta name="description" content="{{ config.site_description }}">
-
{% endif %}
-
{% if page.meta and page.meta.author %}
-
<meta name="author" content="{{ page.meta.author }}">
-
{% elif config.site_author %}
-
<meta name="author" content="{{ config.site_author }}">
-
{% endif %}
-
{% if page.canonical_url %}
-
<link rel="canonical" href="{{ page.canonical_url }}">
-
{% endif %}
-
{% if page.previous_page %}
-
<link rel="prev" href="{{ page.previous_page.url | url }}">
-
{% endif %}
-
{% if page.next_page %}
-
<link rel="next" href="{{ page.next_page.url | url }}">
-
{% endif %}
-
{% if "rss" in config.plugins %}
-
<link rel="alternate" type="application/rss+xml" title="{{ lang.t('rss.created') }}" href="{{ 'feed_rss_created.xml' | url }}">
-
<link rel="alternate" type="application/rss+xml" title="{{ lang.t('rss.updated') }}" href="{{ 'feed_rss_updated.xml' | url }}">
-
{% endif %}
-
<link rel="icon" href="{{ config.theme.favicon | url }}">
-
<meta name="generator" content="mkdocs-{{ mkdocs_version }}, mkdocs-material-9.6.14">
-
{% endblock %}
-
{% block htmltitle %}
-
{% if page.meta and page.meta.title %}
-
<title>{{ page.meta.title }} - {{ config.site_name }}</title>
-
{% elif page.title and not page.is_homepage %}
-
<title>{{ page.title | striptags }} - {{ config.site_name }}</title>
-
{% else %}
-
<title>{{ config.site_name }}</title>
-
{% endif %}
-
{% endblock %}
-
{% block styles %}
-
<link rel="stylesheet" href="{{ 'assets/stylesheets/main.342714a4.min.css' | url }}">
-
{% if config.theme.palette %}
-
{% set palette = config.theme.palette %}
-
<link rel="stylesheet" href="{{ 'assets/stylesheets/palette.06af60db.min.css' | url }}">
-
{% endif %}
-
{% include "partials/icons.html" %}
-
{% endblock %}
-
{% block libs %}
-
{% for script in config.extra.polyfills %}
-
{{ script | script_tag }}
-
{% endfor %}
-
{% endblock %}
-
{% block fonts %}
-
{% if config.theme.font != false %}
-
{% set text = config.theme.font.text | d("Roboto", true) %}
-
{% set code = config.theme.font.code | d("Roboto Mono", true) %}
-
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
-
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family={{
-
text | replace(' ', '+') + ':300,300i,400,400i,700,700i%7C' +
-
code | replace(' ', '+') + ':400,400i,700,700i'
-
}}&display=fallback">
-
<style>:root{--md-text-font:"{{ text }}";--md-code-font:"{{ code }}"}</style>
-
{% endif %}
-
{% endblock %}
-
{% for path in config.extra_css %}
-
<link rel="stylesheet" href="{{ path | url }}">
-
{% endfor %}
-
{% include "partials/javascripts/base.html" %}
-
{% block analytics %}
-
{% include "partials/integrations/analytics.html" %}
-
{% endblock %}
-
{% if page.meta and page.meta.meta %}
-
{% for tag in page.meta.meta %}
-
<meta {% for key, value in tag | items %} {{ key }}="{{value}}" {% endfor %}>
-
{% endfor %}
-
{% endif %}
-
{% block extrahead %}{% endblock %}
-
</head>
-
{% set direction = config.theme.direction or lang.t("direction") %}
-
{% if config.theme.palette %}
-
{% set palette = config.theme.palette %}
-
{% if not palette is mapping %}
-
{% set palette = palette | first %}
-
{% endif %}
-
{% set scheme = palette.scheme | d("default", true) %}
-
{% set primary = palette.primary | d("indigo", true) %}
-
{% set accent = palette.accent | d("indigo", true) %}
-
<body dir="{{ direction }}" data-md-color-scheme="{{ scheme | replace(' ', '-') }}" data-md-color-primary="{{ primary | replace(' ', '-') }}" data-md-color-accent="{{ accent | replace(' ', '-') }}">
-
{% else %}
-
<body dir="{{ direction }}">
-
{% endif %}
-
{% set features = config.theme.features or [] %}
-
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
-
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
-
<label class="md-overlay" for="__drawer"></label>
-
<div data-md-component="skip">
-
{% if page.toc | first is defined %}
-
{% set skip = page.toc | first %}
-
<a href="{{ skip.url | url }}" class="md-skip">
-
{{ lang.t("action.skip") }}
-
</a>
-
{% endif %}
-
</div>
-
<div data-md-component="announce">
-
{% if self.announce() %}
-
<aside class="md-banner">
-
<div class="md-banner__inner md-grid md-typeset">
-
{% if "announce.dismiss" in features %}
-
<button class="md-banner__button md-icon" aria-label="{{ lang.t('announce.dismiss') }}">
-
{% set icon = config.theme.icon.close or "material/close" %}
-
{% include ".icons/" ~ icon ~ ".svg" %}
-
</button>
-
{% endif %}
-
{% block announce %}{% endblock %}
-
</div>
-
{% if "announce.dismiss" in features %}
-
{% include "partials/javascripts/announce.html" %}
-
{% endif %}
-
</aside>
-
{% endif %}
-
</div>
-
{% if config.extra.version %}
-
<div data-md-color-scheme="default" data-md-component="outdated" hidden>
-
{% if self.outdated() %}
-
<aside class="md-banner md-banner--warning">
-
<div class="md-banner__inner md-grid md-typeset">
-
{% block outdated %}{% endblock %}
-
</div>
-
{% include "partials/javascripts/outdated.html" %}
-
</aside>
-
{% endif %}
-
</div>
-
{% endif %}
-
{% block header %}
-
{% include "partials/header.html" %}
-
{% endblock %}
-
<div class="md-container" data-md-component="container">
-
{% block hero %}{% endblock %}
-
{% block tabs %}
-
{% if "navigation.tabs.sticky" not in features %}
-
{% if "navigation.tabs" in features %}
-
{% include "partials/tabs.html" %}
-
{% endif %}
-
{% endif %}
-
{% endblock %}
-
<main class="md-main" data-md-component="main">
-
<div class="md-main__inner md-grid">
-
{% block site_nav %}
-
{% if nav %}
-
{% if page.meta and page.meta.hide %}
-
{% set hidden = "hidden" if "navigation" in page.meta.hide %}
-
{% endif %}
-
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" {{ hidden }}>
-
<div class="md-sidebar__scrollwrap">
-
<div class="md-sidebar__inner">
-
{% include "partials/nav.html" %}
-
</div>
-
</div>
-
</div>
-
{% endif %}
-
{% if "toc.integrate" not in features %}
-
{% if page.meta and page.meta.hide %}
-
{% set hidden = "hidden" if "toc" in page.meta.hide %}
-
{% endif %}
-
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" {{ hidden }}>
-
<div class="md-sidebar__scrollwrap">
-
<div class="md-sidebar__inner">
-
{% include "partials/toc.html" %}
-
</div>
-
</div>
-
</div>
-
{% endif %}
-
{% endblock %}
-
{% block container %}
-
<div class="md-content" data-md-component="content">
-
<article class="md-content__inner md-typeset">
-
{% block content %}
-
{% include "partials/content.html" %}
-
{% endblock %}
-
</article>
-
</div>
-
{% endblock %}
-
{% include "partials/javascripts/content.html" %}
-
</div>
-
{% if "navigation.top" in features %}
-
{% include "partials/top.html" %}
-
{% endif %}
-
</main>
-
{% block footer %}
-
{% include "partials/footer.html" %}
-
{% endblock %}
-
</div>
-
<div class="md-dialog" data-md-component="dialog">
-
<div class="md-dialog__inner md-typeset"></div>
-
</div>
-
{% if "navigation.instant.progress" in features %}
-
{% include "partials/progress.html" %}
-
{% endif %}
-
{% if config.extra.consent %}
-
<div class="md-consent" data-md-component="consent" id="__consent" hidden>
-
<div class="md-consent__overlay"></div>
-
<aside class="md-consent__inner">
-
<form class="md-consent__form md-grid md-typeset" name="consent">
-
{% include "partials/consent.html" %}
-
</form>
-
</aside>
-
</div>
-
{% include "partials/javascripts/consent.html" %}
-
{% endif %}
-
{% block config %}
-
{% set _ = namespace() %}
-
{% set _.tags = config.extra.tags %}
-
{%- if config.extra.version -%}
-
{%- set mike = config.plugins.mike -%}
-
{%- if not mike or mike.config.version_selector -%}
-
{%- set _.version = config.extra.version -%}
-
{%- endif -%}
-
{%- endif -%}
-
<script id="__config" type="application/json">
-
{{- {
-
"base": base_url,
-
"features": features,
-
"translations": {
-
"clipboard.copy": lang.t("clipboard.copy"),
-
"clipboard.copied": lang.t("clipboard.copied"),
-
"search.result.placeholder": lang.t("search.result.placeholder"),
-
"search.result.none": lang.t("search.result.none"),
-
"search.result.one": lang.t("search.result.one"),
-
"search.result.other": lang.t("search.result.other"),
-
"search.result.more.one": lang.t("search.result.more.one"),
-
"search.result.more.other": lang.t("search.result.more.other"),
-
"search.result.term.missing": lang.t("search.result.term.missing"),
-
"select.version": lang.t("select.version")
-
},
-
"search": "assets/javascripts/workers/search.d50fe291.min.js" | url,
-
"tags": _.tags or none,
-
"version": _.version or none
-
} | tojson -}}
-
</script>
-
{% endblock %}
-
{% block scripts %}
-
<script src="{{ 'assets/javascripts/bundle.13a4f30d.min.js' | url }}"></script>
-
{% for script in config.extra_javascript %}
-
{{ script | script_tag }}
-
{% endfor %}
-
{% endblock %}
-
</body>
-
</html>
+12
overrides/partials/integrations/analytics/custom.html
···
+
<!-- posthog -->
+
<script>
+
!function(t,e){var o,n,p,r;e.__SV||(window.posthog && window.posthog.__loaded)||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.crossOrigin="anonymous",p.async=!0,p.src=s.api_host.replace(".i.posthog.com","-assets.i.posthog.com")+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="init hi Er $r ui br Sr capture Ri calculateEventProperties Tr register register_once register_for_session unregister unregister_for_session Or getFeatureFlag getFeatureFlagPayload isFeatureEnabled reloadFeatureFlags updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures on onFeatureFlags onSurveysLoaded onSessionId getSurveys getActiveMatchingSurveys renderSurvey displaySurvey canRenderSurvey canRenderSurveyAsync identify setPersonProperties group resetGroups setPersonPropertiesForFlags resetPersonPropertiesForFlags setGroupPropertiesForFlags resetGroupPropertiesForFlags reset get_distinct_id getGroups get_session_id get_session_replay_url alias set_config startSessionRecording stopSessionRecording sessionRecordingStarted captureException loadToolbar get_property getSessionProperty Rr Pr createPersonProfile Cr mr Fr opt_in_capturing opt_out_capturing has_opted_in_capturing has_opted_out_capturing get_explicit_consent_status is_capturing clear_opt_in_out_capturing kr debug L Ir getPageViewId captureTraceFeedback captureTraceMetric".split(" "),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]);
+
posthog.init('phc_26rfldEPG6RQtg8FJCxLOWx2QiHpAYRodEibEQbWPqu', {
+
api_host: 'https://us.i.posthog.com',
+
defaults: '2025-05-24',
+
person_profiles: 'identified_only', // or 'always' to create profiles for anonymous users as well
+
})
+
</script>
+
+
<!-- Cloudflare Web Analytics -->
+
<script defer src='https://static.cloudflareinsights.com/beacon.min.js' data-cf-beacon='{"token": "8713a6d3d69b4e80b2ef78f17f699afa"}'></script>