[{"content":"This is a private site and serves no commercial purpose.\nContact Christopher Horn E-mail: info@c-horn.de\nLiability for content As a service provider I am responsible for my own content on these pages under the general laws pursuant to § 7 (1) DDG. Under §§ 8 to 10 DDG, however, I am not obliged to monitor transmitted or stored third-party information, or to investigate circumstances that indicate illegal activity. Obligations to remove or block the use of information under the general laws remain unaffected. Any liability in this respect starts only from the point at which a concrete infringement becomes known. Upon notification of such violations I will remove the content immediately.\nLiability for links This site contains links to external websites over whose content I have no control. I therefore cannot accept any responsibility for that third-party content. The respective provider or operator of the linked pages is always responsible for their content. The linked pages were checked for possible legal violations at the time of linking; unlawful content was not recognisable at that time. Permanent monitoring of the linked pages is not reasonable without concrete evidence of an infringement. Upon notification of violations I will remove such links immediately.\nCopyright The content and works created by the site operator on these pages are subject to German copyright law. Reproduction, adaptation, distribution and any kind of exploitation outside the limits of copyright require the written consent of the respective author. Downloads and copies of this site are permitted for private, non-commercial use only. Where the content on this site was not created by the operator, the copyrights of third parties are respected.\n","permalink":"https://c-horn.de/contact/","summary":"\u003cp\u003eThis is a private site and serves no commercial purpose.\u003c/p\u003e\n\u003ch2 id=\"contact\"\u003eContact\u003c/h2\u003e\n\u003cp\u003eChristopher Horn\nE-mail: \u003ca href=\"mailto:info@c-horn.de\"\u003einfo@c-horn.de\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"liability-for-content\"\u003eLiability for content\u003c/h2\u003e\n\u003cp\u003eAs a service provider I am responsible for my own content on these pages under\nthe general laws pursuant to § 7 (1) DDG. Under §§ 8 to 10 DDG, however, I am\nnot obliged to monitor transmitted or stored third-party information, or to\ninvestigate circumstances that indicate illegal activity. Obligations to remove\nor block the use of information under the general laws remain unaffected. Any\nliability in this respect starts only from the point at which a concrete\ninfringement becomes known. Upon notification of such violations I will remove\nthe content immediately.\u003c/p\u003e","title":"Contact"},{"content":"Controller The controller for data processing on this website is the operator named in the contact page.\nScope of processing This is a static website. There are no user accounts, no comment function, no forms, no analytics and no embedded third-party content. All fonts, stylesheets and scripts are served from my own server.\nCookies This website sets no cookies. The choice between the light and dark theme is stored locally in the browser (localStorage) only and is never sent to the server.\nServer log files When pages are requested, the web server automatically logs data your browser transmits:\nshortened IP address date and time of the request requested address and amount of data transferred referrer URL browser type and operating system This data is technically necessary to deliver the site and to ensure its stability and security. The legal basis is legitimate interest pursuant to Art. 6 (1) lit. f GDPR. It is not merged with other data sources and not evaluated for analytics.\nThe full IP address is never stored: nginx shortens it as it writes the log. IPv4 loses its last octet, IPv6 everything beyond the first two blocks. It can no longer be traced back to a person. The logs are deleted automatically after 14 days.\nHosting The site runs on a dedicated server at netcup GmbH, Emmy-Noether-Straße 10, 76131 Karlsruhe, Germany. netcup provides the hardware, connectivity and data centre; the web server itself is operated and administered by me. Because netcup has technical access to the systems, a data processing agreement pursuant to Art. 28 GDPR is in place.\nEncryption All traffic is transmitted over HTTPS.\nYour rights You have the right to information (Art. 15 GDPR), rectification (Art. 16 GDPR), erasure (Art. 17 GDPR), restriction of processing (Art. 18 GDPR), data portability (Art. 20 GDPR) and objection (Art. 21 GDPR). Please use the address given in the imprint. You also have the right to lodge a complaint with a data protection supervisory authority.\n","permalink":"https://c-horn.de/privacy/","summary":"\u003ch2 id=\"controller\"\u003eController\u003c/h2\u003e\n\u003cp\u003eThe controller for data processing on this website is the operator named in the\n\u003ca href=\"/contact/\"\u003econtact page\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"scope-of-processing\"\u003eScope of processing\u003c/h2\u003e\n\u003cp\u003eThis is a static website. There are no user accounts, no comment function, no\nforms, no analytics and no embedded third-party content. All fonts, stylesheets\nand scripts are served from my own server.\u003c/p\u003e\n\u003ch2 id=\"cookies\"\u003eCookies\u003c/h2\u003e\n\u003cp\u003eThis website sets no cookies. The choice between the light and dark theme is\nstored locally in the browser (\u003ccode\u003elocalStorage\u003c/code\u003e) only and is never sent to the\nserver.\u003c/p\u003e","title":"Privacy Policy"},{"content":"terraform-provider-netcup A Terraform provider for netcup, written in Go on the Terraform Plugin Framework. It covers both of netcup\u0026rsquo;s APIs: DNS zones and records through the CCP DomainWebservice, and reverse DNS, SSH keys, firewall policies, snapshots and failover routing through the SCP REST API. The source is on GitHub.\nTemp Mail Service A disposable-mailbox service, written in Python on FastAPI. It manages a mail domain of its own, hands out throwaway addresses on it and serves whatever arrives back over a REST API; Postfix takes the incoming mail and passes it to the app over LMTP, which keeps it in SQLite until the mailbox expires. Traefik terminates TLS and rate-limits, the API key comes out of Vault at deploy time, and the DNS (MX, SPF, DKIM, DMARC, MTA-STS and TLS-RPT) is Terraform-managed through the netcup provider above. It exists to feed end-to-end tests: a Playwright/Cucumber suite asks for an address, drives a signup flow, and reads the confirmation mail back out of the API.\nLogi Battery Indicator A GNOME Shell extension that puts the battery level of Logitech input devices into the top bar: MX Master, MX Keys and their relatives, connected through a Unifying/Bolt receiver or paired directly over Bluetooth. It speaks HID++ 2.0 to the devices' /sys/class/hidraw interface itself, which makes Solaar unnecessary, and it redraws when a device sends a notification instead of on a timer. The source is on GitHub.\n","permalink":"https://c-horn.de/projects/","summary":"\u003ch2 id=\"terraform-provider-netcup\"\u003eterraform-provider-netcup\u003c/h2\u003e\n\u003cp\u003eA \u003ca href=\"https://registry.terraform.io/providers/hornc-greedy/netcup/latest\"\u003eTerraform provider for netcup\u003c/a\u003e,\nwritten in Go on the Terraform Plugin Framework. It covers both of netcup\u0026rsquo;s\nAPIs: DNS zones and records through the CCP DomainWebservice, and reverse DNS,\nSSH keys, firewall policies, snapshots and failover routing through the SCP\nREST API. The \u003ca href=\"https://github.com/hornc-greedy/terraform-provider-netcup\"\u003esource\u003c/a\u003e\nis on GitHub.\u003c/p\u003e\n\u003ch2 id=\"temp-mail-service\"\u003eTemp Mail Service\u003c/h2\u003e\n\u003cp\u003eA disposable-mailbox service, written in Python on FastAPI. It manages a mail\ndomain of its own, hands out throwaway addresses on it and serves whatever\narrives back over a REST API; Postfix takes the incoming mail and passes it to\nthe app over LMTP, which keeps it in SQLite until the mailbox expires. Traefik\nterminates TLS and rate-limits, the API key comes out of Vault at deploy time,\nand the DNS (MX, SPF, DKIM, DMARC, MTA-STS and TLS-RPT) is Terraform-managed\nthrough the netcup provider above. It exists to feed end-to-end tests: a\nPlaywright/Cucumber suite asks for an address, drives a signup flow, and reads\nthe confirmation mail back out of the API.\u003c/p\u003e","title":"Projects"}]