···11----
22-import Default from "@astrojs/starlight/components/Hero.astro";
33-import AIGeneratedNotice from "./AIGeneratedNotice.astro";
44----
55-66-<Default><slot /></Default>
77-<AIGeneratedNotice />
-7
src/components/PageTitle.astro
···11----
22-import Default from "@astrojs/starlight/components/PageTitle.astro";
33-import AIGeneratedNotice from "./AIGeneratedNotice.astro";
44----
55-66-<Default><slot /></Default>
77-<AIGeneratedNotice />
-1
src/content/docs/credits.mdx
···48484949This site wouldn’t shine the same way without these fantastic tools and integrations that power it behind the scenes:
50505151-- [`@lunariajs/starlight`](https://github.com/lunariajs/starlight) – Localization sync that just *works*
5251- [`starlight-giscus`](https://github.com/dragomano/starlight-giscus) – Smooth Giscus comment integration
5352- [`starlight-image-zoom`](https://github.com/HiDeoo/starlight-image-zoom) – For that crisp, zoomable image experience
5453- [`starlight-links-validator`](https://github.com/HiDeoo/starlight-links-validator) – Keeps all links neat and valid
···11----
22-title: Beschleunigung von Übersetzungen mit kontinuierlicher Integration
33-description: Die Geschichte darüber, wie meine Reise mit Beiträgen zu
44- action-continuous-translation begann.
55-date: 2025-07-09
66-tags:
77- - Automation
88- - GitHub
99- - Plugins
1010- - Markdown
1111- - Tool
1212-authors:
1313- - trueberryless
1414-excerpt: <p>Ich arbeite seit über einem Jahr in OSS auf <a class="gh-badge"
1515- href="https://github.com/github"><img src="https://github.com/github.png"
1616- alt="github" />GitHub</a> und obwohl ich dachte, ich hätte alles gefunden, zu
1717- dem ich beitragen möchte, entdeckte ich kürzlich <a class="gh-badge"
1818- href="https://github.com/pelikhan"><img src="https://github.com/pelikhan.png"
1919- alt="pelikhan" />Pelis</a> persönliches Projekt <a
2020- href="https://github.com/pelikhan/action-continuous-translation">action-continuous-translation</a>,
2121- und ich bin sehr glücklich, dass ich dort regelmäßig Beiträge leiste und jetzt
2222- Teil der kleinen Community bin.</p>
2323-cover:
2424- alt: A beautiful cover image with the text "AI Translations"
2525- image: ../../../../../public/blog/accelerating-translations-with-continuous-integration.jpg
2626-tableOfContents: false
2727-2828----
2929-3030-Im vergangenen Jahr habe ich in meiner Freizeit viel in verschiedenen Open-Source-Communitys auf GitHub gearbeitet und habe diese irgendwie entspannenden Beiträge genossen, weil sie mir täglich neues Wissen vermitteln.
3131-3232-Nach einiger Zeit des Mitwirkens habe ich auch erfahren, wie freundlich und einladend die Communitys hinter diesen Projekten sind. Diese Menschen haben alle eines mit dir gemeinsam: Sie möchten in ihrer Freizeit großartige Dinge erschaffen. Besonders die [Astro](https://github.com/withastro)-Community ist diejenige, in der ich mich am wohlsten fühle, da sie gleichzeitig am lohnendsten und freundlichsten ist. Nicht alle Communitys können einen so großartigen Status unter OSS erreichen.
3333-3434-Kürzlich entdeckte ich ein weiteres wachsendes Projekt, das von [pelikhan](https://github.com/pelikhan) gegründet wurde und das darauf abzielt, alle deine Dokumentationen, Blogs oder Shop-Seiten automatisch mit Hilfe von KI zu übersetzen, sobald sich etwas ändert. Obwohl ich anfangs skeptisch war, hat mich das Lesen der README.md des Projekts fasziniert.
3535-3636-Der Ansatz, die KI strikt dazu anzuleiten, nur kleine Abschnitte – hauptsächlich Sätze oder Absätze – mit perfektionistischen Anweisungen zu übersetzen, ließ mich denken, dass dies wirklich funktionieren könnte. Also probierte ich es in meinem eigenen Projekt aus, meinem Blog. Und zu meiner Überraschung waren diese Übersetzungen viel besser als erwartet. Natürlich merkt man, dass es von einer KI übersetzt wurde – handgefertigte Arbeit wird hoffentlich nie vollständig ersetzt – aber wenn man fair erwähnt, dass man eine KI verwendet, ist dies für Menschen viel zugänglicher als nichts.
3737-3838-Also warf ich einen genaueren Blick auf den eigentlichen Code des Projekts. Nachdem ich einige kleine Unstimmigkeiten, Verbesserungspotenziale und fehlende, aber sehr coole Funktionen hier und da bemerkte, begann ich ebenfalls, dort beizutragen. Ich meine, nach einem Jahr Beiträge zu größeren Projekten waren Pull Requests für mich nichts Neues.
3939-4040-Man muss wissen, dass dies ein Freitagabend war – fast Nacht in meiner Zeitzone – und [Peli](https://github.com/pelikhan) war gerade online und führte Commit um Commit für das Projekt durch. Ich bemerkte schnell, dass Peli im Gegensatz zu den anderen Projekten, in denen ich mitwirke, keine Zeit mit dem Mergen von Pull Requests verschwendete. Es fühlte sich diese Nacht sehr lohnend an, da ich einfach bis 1 Uhr morgens weitermachte, Peli schneller merge als ich Features, Dokumentationen und Fixes verbessern konnte. Ein weiterer Aspekt, der großartig war, war, dass Peli, da dies ein junges Projekt war, nicht zögerte, einfach zu mergen, es lokal auszuprobieren und dann kleine Fixes zu pushen, die ich übersehen hatte.
4141-4242-Drei Tage später bin ich nun ein offizieller Contributor des Projekts und trage fast täglich dazu bei, es immer weiter zu verbessern, wobei mein Hauptfokus auf der Dokumentation und der Unterstützung für mein Herzensprojekt liegt: Starlight – wie ihr vielleicht schon aus [meinen Blogs](../../../../../blog/tags/starlight/) erraten habt.
4343-4444-Peli und ich haben unsere virtuellen Produktivitätssitzungen zwischen 16:00 und 20:00 UTC, die an Wochenenden auch länger dauern. Wenn du als Frühaufsteher des Projekts mitmachen oder Interesse daran hast, es zu nutzen, schau es dir gerne auf [GitHub](https://github.com/github) an: [https://github.com/pelikhan/action-continuous-translation](https://github.com/pelikhan/action-continuous-translation)
-111
src/content/docs/de/blog/cognitive-erosion.mdx
···11----
22-title: Stoppe das Auslagern deiner Seele an KI
33-description: Reflexionen über den übermäßigen Einsatz von KI, deren kognitive
44- und soziale Nachteile sowie ein vorgeschlagenes Modell zur Nutzung der KI ohne
55- Beeinträchtigung menschlicher Kreativität und Kommunikation.
66-date: 2025-08-10
77-tags:
88- - Mindspace
99-authors:
1010- - trueberryless
1111-cover:
1212- alt: A beautiful cover image with the text "Cognitive Erosion"
1313- image: ../../../../../public/blog/cognitive-erosion.jpg
1414-giscus: true
1515-featured: true
1616-1717----
1818-1919-Es sind mehr als zweieinhalb Jahre vergangen seit der Veröffentlichung von ChatGPT. Der 30<sup>. November</sup> 2022 markierte den Beginn einer neuen Ära: den Anfang der KI. Heute nutzen viele Berufe und Privatpersonen, insbesondere im IT-Sektor, sie täglich. Und wir wissen nicht einmal, wo wir uns im Gartner-Hype-Zyklus befinden oder ob sich KI gemäß Kurzweils "Gesetz der beschleunigten Rückkehr" verbessern wird.
2020-2121-Der Trend ist weiterhin steigend, aber gleichzeitig habe ich eine leichte, jedoch stetige Verschlechterung von Wissen auf menschlicher Basis bemerkt, da immer mehr kreative Arbeit an KI delegiert wird. Daher habe ich mich entschlossen, einen kleinen Blogbeitrag zu schreiben, in dem ich meine Gedanken teile, um von einem übermäßigen Einsatz Künstlicher Intelligenz abzuraten, da dieser unsere kognitiven Fähigkeiten zerstören könnte. Und obwohl ich weiß, dass nur sehr wenige Menschen dies lesen werden, hält mich das nicht davon ab, es zu versuchen. Andernfalls könnte ich meine Chance verpassen, der Zukunft der Menschheit zu helfen.
2222-2323-{/* excerpt */}
2424-2525-> **Hinweis**: Dieser gesamte Blogpost basiert auf meinen Beobachtungen hinsichtlich gesellschaftlicher Entwicklungen mit einem besonderen Fokus auf den Einsatz von Künstlicher Intelligenz und meiner Interpretation davon und ist daher sehr subjektiv. Ich habe keine Studien angesehen, die meine Meinung unterstützen oder ihr widersprechen.
2626-2727-## Wie Menschen dazu neigen, KI zu nutzen
2828-2929-KI ist großartig. Ich möchte diese Aussage nicht in Frage stellen. Sie hat mir geholfen und hilft mir immer noch, meinen Arbeitsablauf zu verbessern, neues Wissen zu sammeln, in neue Gewässer einzutauchen und neue Technologien zu erkunden. Für Menschen, die sich nicht dafür interessieren, wie KI funktioniert, erscheinen solche intelligenten Werkzeuge wie Magie. Deshalb sehe ich gerne, wie ihre Augen funkeln und ihre Münder offen bleiben, wenn ich ihnen erkläre, dass KI lediglich auf Wahrscheinlichkeiten basiert - welches Wort am wahrscheinlichsten das nächste ist, basierend auf Eigenschaften und Emotionen in einem hochdimensionalen virtuellen Raum. [Aber das ist ein anderes Thema.](https://www.youtube.com/watch?v=LPZh9BOjkQs)
3030-3131-Worauf ich mich konzentrieren möchte, ist, wie Menschen angefangen haben, KI zu nutzen, besonders in den letzten Monaten - wenn nicht Jahren. Da unser Gehirn von Natur aus faul ist, neigen wir dazu, mehr Arbeit an KI auszulagern, je weniger fokussiert wir auf eine spezifische Aufgabe sind. Mit anderen Worten: Wenn du nicht den Großteil deines Engagements in dein aktuelles Projekt steckst, bist du wahrscheinlich kurz davor, es einfach einer KI zu übertragen. Ein weiterer möglicher Grund für das Offshoring von Arbeit an die KI-Welt ist Unwissenheit über die zugrunde liegenden Technologien, was es dir erschwert, eigene Lösungen zu entwickeln.
3232-3333-Ich bin keineswegs ein Wissenschaftler, aber ich glaube, dass das Zusehen, wie KI deine Arbeit erledigt - weil das Ergebnis, das du produzierst, aufgrund deiner Inkompetenz nicht mit deiner Vision übereinstimmt -, dir so viel Dopamin gibt, dass dein Gehirn es immer öfter tun möchte. Darüber hinaus strebt der Mensch als soziales Wesen immer danach, mit jemandem verbunden zu sein, und die Interaktion mit KI erfüllt dieses Bedürfnis. Dieses Verhalten ist typisch für unsere Gehirne und tritt auch beim Konsum von sozialen Medien oder explizitem Inhalt auf. Es ist tief in unserem Kortex verankert, und die gesamte Gaming- und Unterhaltungsbranche nutzt dies rücksichtslos, um Geld zu optimieren.
3434-3535-Diesen Trend habe ich selbst bemerkt, wie man deutlich sehen kann aus [einigen meiner Beiträge, bei denen ich zugab, KI verwendet zu haben](../../../../../blog/authors/artificial-intelligence/), um mir beim Schreiben zu helfen. Aber ich denke, das ist keine Schande. Jeder Content-Ersteller, der KI einsetzt, sollte aus erster Hand die Fallstricke erleben, die entstehen, wenn Inhalte direkt für den Betrachter oder Leser erstellt werden, um zu erkennen, wie wenig sie letztlich über das Thema wissen. Dies ermöglicht es ihnen, aus ihrem Fehler zu lernen und sich bewusst zu sein, wie leicht Faulheit zu einem solch verachteten Weg führen kann. Nur die Exzellenten unter uns strebten von Anfang an nach handgefertigten Inhalten.
3636-3737-## Negative Nebenwirkungen
3838-3939-Ich habe die Hauptnachteile der extensiven Nutzung von KI, die ich beobachtet habe, beschrieben. Nun werde ich zwei kleinere Gründe nennen, die ich bei mir selbst feststellte, warum du KI nicht für expressive Arbeiten nutzen solltest.
4040-4141-### Rückgang der Kommunikation
4242-4343-Während ich mir ein Werbevideo von "The Browser Company™" angesehen habe (siehe den letzten Link im [Ressourcenabschnitt unten](#resources-with-better-evidence)), fiel mir auf, wie weit auseinander liegend Visionen heutzutage sein können. Ich sehe diesen Trend nicht nur beim Dia-Browser, sondern in vielen verschiedenen Aspekten der Technologie und in vielen Teilen unseres Lebens. Eine Seite des Trends möchte KI überall integrieren, wo es möglich ist, und so unsere Abhängigkeit von ihr vergrößern. Ein Beispiel ist die Nutzung von KI, um Nachrichten an unsere engsten Freunde und Kollegen zu verfassen, weil es uns effizienter macht. Ich glaube, dass es uns langfristig einfach nur dumm macht.
4444-4545-Wenn Menschen ihre Gehirne nicht trainieren, um Wörter für die Kommunikation zu finden, nützliche Sätze zu bilden und Bedeutungen zu schaffen, die von anderen Menschen verstanden werden können, ist unser Fundament des Miteinander-Interagierens gebrochen, und wir wären wieder auf dem Niveau von *Homo habilis* - der letzten Spezies, die vermutlich keine vollständig entwickelte Sprache verwendete. Siehst du, ich habe KI verwendet, um genau diesen Punkt zu recherchieren, aber ich habe meine Worte bewusst gewählt, um mich auszudrücken. Auf diese Weise habe ich nicht nur etwas Neues gelernt, sondern kann es jetzt auch erinnern. Eine Fähigkeit, die du niemals haben wirst, wenn du das Schreiben an eine KI auslagerst.
4646-4747-### Einsamkeit
4848-4949-Auf einer mentalen Ebene allein zu sein, ist meiner Meinung nach eine der am meisten unterschätzten modernen Gefahren in der Gesellschaft. Das Ironische daran ist, dass, wenn jeder allein ist, wir es alle gemeinsam haben und somit nicht mehr allein mit unserer Einsamkeit sind. Aber meine Gedanken driften wieder in andere Gewässer ab.
5050-5151-KI ermutigt uns stark dazu, allein zu sein. Sie ~~agiert~~ wurde absichtlich so trainiert, als sei sie ein perfekter Freund, Kollege oder wie auch immer du es nennen möchtest. Kürzlich habe ich bemerkt, dass ChatGPTs Antworten explizit meinen Namen beinhalten, was sich für mich auf mehreren Ebenen sehr seltsam anfühlt. Man könnte argumentieren, dass dies eine private künstliche Form von Doxxing ist, was natürlich ein Oxymoron an sich ist, da Doxxing per Definition öffentlich ist. Nichtsdestotrotz: Je öfter du KI nutzt, desto *öfter* willst du KI nutzen. Besonders nach der Einführung von KI-Sprachmodi stieg dieser Trend weiter an, als gäbe es kein Morgen. Glückwunsch, ClosedAI, ihr habt die Sucht neu erfunden.
5252-5353-Im schlimmsten Fall kann dies dazu führen, dass Menschen Angst haben, mit anderen zu sprechen. Freundschaften verlassen. Sich aus der Gesellschaft zurückziehen. Solche Gewohnheiten sind ernste Probleme und sollten am besten von einem Arzt oder Psychologen untersucht werden.
5454-5555-## Vorschlag eines Modells für den Umgang mit KI
5656-5757-Einen globalen Lösungsansatz für alle Menschen für ein solches Problem vorzuschlagen, ist unmöglich. Da jede Person ihre eigenen Erfahrungen mit KI hat, ihre eigenen Gedanken und Gefühle, Optimisten oder Pessimisten, kann ich nicht für alle sprechen. Tatsächlich denke ich, dass ich nur für mich selbst sprechen, lernen und meine eigenen Wege des Umgangs und der Einschränkung meiner KI-Nutzung teilen kann und hoffe, dass diese Erfahrungen auch dir helfen können.
5858-5959-Meine idealen Erfahrungen mit KI - der optimale goldene Weg zwischen dem übermäßigen Gebrauch von KI, der kognitiven Erosion nach sich zieht, und der Möglichkeit, den Hype zu ignorieren, ohne Vorteile zu nutzen - besteht darin, KI [genau dann](https://en.wikipedia.org/wiki/If_and_only_if) zu nutzen, wenn und nur wenn du davon profitierst. Mit anderen Worten: Kontrolliere deine Nutzung und beschränke sie auf ein Extrem, bei dem nur du selbst jemals mit den Inhalten in Kontakt kommst, die die KI produziert. Eine solche Einschränkung hat viele Konsequenzen; hier sind einige Beispiele, um besser zu verdeutlichen und zu betonen, was ich meine:
6060-6161-* Nutze KI für persönliche Lernsitzungen: Wenn du dich zunächst mit einem neuen, völlig unbekannten Thema beschäftigen möchtest, kann dir KI allgemeine Übersichten geben und Zusammenhänge zu anderen Wissensbereichen und realen Anwendungen aufzeigen. Obwohl dies nicht unbedingt bedeutet, dass du wirklich schneller oder effizienter lernst, hilft es, den ersten Schritt zu machen und den Ball ins Rollen zu bringen.
6262-* Nutze KI für stupide und repetitive Aufgaben und frage nach Hilfe, wenn du sicher bist, dass das Problem oder die Aufgabe bereits von anderen tausendfach gelöst wurde. Aktuelle LLMs sind auf Basis bestehender Daten trainiert, weshalb sie gut darin sein sollten, bereits gelöste Probleme zu lösen, aber nicht das Rad neu zu erfinden, sondern die Nutzung des bestehenden runden Instruments vorzuschlagen.
6363-6464-<br />
6565-6666-* Verwende KI nicht, um dich anderen Menschen gegenüber auszudrücken. Denke darüber nach, welche Bedeutung du vermitteln möchtest, welches Wissen du teilen willst, und packe deine Gedanken in deine eigenen Worte. Das hilft dir enorm, deine eigenen Gedanken zu festigen, dich an das Gelernte zu erinnern und dich viel besser zu fühlen.
6767-* Nutze KI nicht, um komplexe und kreative Arbeiten zu erstellen. Heutzutage gibt es Hunderte - wahrscheinlich Tausende - von Tools, die dir dabei helfen, Kunst, Musik, Code, Designs, Pläne usw. mit Hilfe von oder komplett durch KI zu erstellen. Obwohl dies den Anschein erweckt, dass du produktiver sein kannst, macht es dich in Wirklichkeit umso unwissender, je öfter du auf diese Methoden zurückgreifst, anstatt das zu tun, was du selbst gerne machst. Es ist völlig in Ordnung, kleine Teile der Arbeit an KI auszulagern, vor allem repetitive Aufgaben, die manuell einfach mehr Zeit in Anspruch nehmen würden. Kreative und originelle Arbeit hingegen sollte menschlich bleiben und mit Liebe hergestellt werden. Wenn dir das, was du tust, überhaupt nicht gefällt, ist dies ein Signal, dass du wahrscheinlich komplett damit aufhören solltest.
6868-* Lass dich nicht von all dem glänzenden KI-Zeug dort draußen verführen. Tools wie [Lovable](https://lovable.dev), [GitHub Copilot](https://github.com/features/copilot), [Cursor](https://cursor.com/en), [ChatGPT Voice](https://openai.com/index/chatgpt-can-now-see-hear-and-speak/) und neu auf dem Markt: [GPT-5](https://academy.openai.com/public/resources/intro-gpt-5), um nur einige zu nennen, wollen dir eigentlich nicht helfen. Sie wollen entweder direkt deine Daten oder deinen Arbeitsablauf besitzen, so dass du nicht mehr daraus entkommen kannst, sobald du dich daran gewöhnt hast. Leider gewöhnen sich Menschen faszinierend schnell an KI.
6969-7070-Kurz gesagt, ich meine, dass KI zum Brainstorming und zur Unterstützung jedes Einzelnen bei der Erstellung eines Endprodukts verwendet werden sollte - nicht zu verwechseln mit einer durch KI erstellten Endlösung -, aber nicht für die Kommunikation mit anderen Menschen oder die Endergebnisse selbst (z. B. Bildbearbeitung, Blogartikel schreiben, Beiträge in sozialen Medien, Chatkommunikation, Motivationsreden, Essays usw.). Meiner Meinung nach kann das menschliche Gehirn nur durch eigene Fehler und Erfahrungen wachsen und lernen. Und du kannst nie aus deinen Fehlern lernen, wenn diese eigentlich von der KI generiert wurden.
7171-7272-> KI hat ihren Platz beim Ideensammeln, aber ausdrucksstarke Arbeit sollte menschlich bleiben.
7373-7474-### Das Paradigma
7575-7676-Ich habe kürzlich ein Software-Design-Muster namens "Onion Architecture" entdeckt. Um die Erklärung kurz zu halten: Das Hauptprinzip dieser Architektur ist ihre Aufteilung in Schichten, wobei jede Schicht nur mit ihren beiden Nachbarn verbunden ist (Geschwister ausgeschlossen), also der inneren und der äußeren Schicht.
7777-7878-Um dieses Paradigma auf den aktuellen Kontext zu übertragen, kannst du dir die KI als ein Werkzeug vorstellen, das dir zur Verfügung steht, das jedoch von allen anderen Teilen unabhängig ist, da es nur von deinem Gehirn umgeben wird, und nur dein Gehirn kann auf die äußeren Schichten zugreifen, sie manipulieren, erstellen und modifizieren - in diesem Beispiel das Schreiben von Blogs, das Erstellen von Inhalten, die Kommunikation mit Menschen über Chats oder Reden oder das Ausdrücken mit Kunst oder Design.
7979-8080-Hier siehst du ein Bild, das meine Vorstellung von einer begrenzten, aber idealen Nutzung von KI darstellt:
8181-8282-
8383-8484-Ob ein solcher architektonischer Ansatz und das Paradigma in diesem Kontext optimal oder nur subjektiv sind, kann in den Kommentaren unten kritisiert werden.
8585-8686-## Fazit
8787-8888-Wie ich zu Beginn gesagt habe, ist dieser Blog-Beitrag sehr meinungsbasiert und soll lediglich meine Erfahrungen mit jedem teilen, damit du auch aus meinen Fehlern lernen und deine eigene Nutzung von KI optimieren kannst, um sie besser unter Kontrolle zu haben. Am Ende kannst du machen, was du willst, aber sei dir der Degradierung deines eigenen Gehirns bewusst, wenn du auch in die Falle der Übernutzung tappst.
8989-9090-Eine Sache möchte ich noch erwähnen: Es hat mich mehrere Monate gekostet, diesen Blog-Post zu schreiben, zu überarbeiten und wieder von vorne anzufangen. Kein Blog ist perfekt, wie du vielleicht bei diesem hier bemerkt hast. Es gibt wahrscheinlich einige grammatikalische Fehler hier und da, einige Sätze, die tatsächlich keinen Sinn ergeben, aber das macht Menschen menschlich. Darüber hinaus gibt es sehr wahrscheinlich viele starke Meinungen in diesem Blog, bei denen du vollkommen widersprechen und überhaupt nicht mit mir übereinstimmen wirst (ich freue mich darauf, deine Kommentare zu sehen, die deinen Unmut ausdrücken), aber das macht mich aus. Mein Gehirn, meine Gedanken, meine Meinung.
9191-9292-> "errare humanum est"
9393-9494-## Ressourcen mit fundierteren Beweisen
9595-9696-Wenn du an Artikeln interessiert bist, die auf wissenschaftlicheren Studien oder Ansätzen basieren, kannst du einige oder alle davon lesen. Sie sind in keiner bestimmten Reihenfolge, also starte einfach in der Mitte und arbeite dich nach oben oder unten. 😊
9797-9898-* [AI: Artificial Incompetence](https://lou.gg/blog/ai-artificial-incompetence)
9999-* [Studie zeigt, dass KI-Code-Tools Entwickler verlangsamen, obwohl sie sich schneller fühlen](https://www.theregister.com/AMP/2025/07/11/ai_code_tools_slow_down/)
100100-* [Firmen, die mit KI Geld sparen wollten, geben jetzt ein Vermögen aus, um ihre Fehler zu beheben](https://futurism.com/companies-fixing-ai-replacement-mistakes)
101101-* [Linus Torvalds meint, KI sei '90% Marketing und 10% Realität'](https://www.tomshardware.com/tech-industry/artificial-intelligence/linus-torvalds-reckons-ai-is-90-percent-marketing-and-10-percent-reality)
102102-* [Die Situation mit KI-Freundinnen ist TRAURIG (YouTube.com)](https://www.youtube.com/watch?v=Ftt5KqJ5D0Q)
103103-* [Macht KI dumm?](https://www.economist.com/science-and-technology/2025/07/16/will-ai-make-you-stupid)
104104-* [KI macht uns nicht produktiver. Sie macht uns kognitiv bankrott. (X.com)](https://x.com/itsalexvacca/status/1935343874421178762)
105105-* [Süchtig nach generativer KI sein](https://www.forbes.com/sites/lanceeliot/2024/08/24/being-addicted-to-generative-ai/)
106106-* [Eine weitere Studie zeigt, dass KI uns dumm macht](https://tech.co/news/another-study-ai-making-us-dumb)
107107-* [Macht KI uns intelligenter oder dümmer?... Oder künstlich intelligenter? (KI-symbiotische Krise)](https://cognitiontoday.com/is-ai-making-us-smarter-or-dumber-or-artificially-smarter/)
108108-* [Research: Gen AI Makes People More Productive—and Less Motivated](https://hbr.org/2025/05/research-gen-ai-makes-people-more-productive-and-less-motivated)
109109-* [Die leistungsfähigsten Wege, unseren neuen Dia-Browser zu "hacken" (YouTube.com)](https://www.youtube.com/watch?v=JCZUIm4S9QQ)
110110-111111-Viel Spaß beim Lesen!
-46
src/content/docs/de/blog/diploma-thesis.mdx
···11----
22-title: Entwicklung einer Kafka-basierten Pipeline und eines interaktiven Graphen
33- zur Erkennung von Energieanomalien
44-date: 2024-05-13
55-description: Eine SOA-Lösung mit Siemens AG zur Analyse von Netzwerkanomalien im
66- Stromnetz, mit einer Kafka-Pipeline, PostgreSQL, GraphQL-API und einem
77- Angular-Dashboard zur Visualisierung.
88-excerpt: Für unsere Diplomarbeit mit Siemens AG haben wir eine dienstorientierte
99- Lösung entwickelt, um Netzwerkanomalien im Stromnetz zu erkennen — mit einer
1010- Kafka-Pipeline, PostgreSQL, GraphQL-API sowie einem Angular-Dashboard mit
1111- Tabellen und einem interaktiven Graphen zur Echtzeitvisualisierung.
1212-tags:
1313- - Tool
1414-authors:
1515- - trueberryless
1616-cover:
1717- alt: A beautiful cover image with the text "Diploma Thesis"
1818- image: ../../../../../public/blog/diploma-thesis.jpg
1919-featured: true
2020-giscus: true
2121-2222----
2323-2424-Während meines fünften Jahres an der HTL Krems (2023/24) musste jeder Schüler eine Diplomarbeit absolvieren – ein umfangreiches Projekt, das in zwei Hauptteile unterteilt war: theoretisch und praktisch. In Zweierteams verfassten wir eine theoretische Arbeit von etwa 100 Seiten, in der wir unser gewähltes Thema vorstellten, analysierten und erklärten.
2525-2626-Der theoretische Teil war in drei Abschnitte gegliedert. Der erste bestand darin, vorhandenes Wissen aus glaubwürdigen Quellen wie Büchern und früheren Arbeiten zu sammeln und zusammenzufassen. Der zweite konzentrierte sich auf die Erkenntnisse und Ergebnisse, die wir aus unserem Prototyp – einer Softwarelösung, die wir für den praktischen Teil entwickelten – gewonnen hatten. Schließlich kombinierte der dritte Abschnitt diese beiden Ansätze und bot einen kritischen Vergleich und eine Reflexion darüber, was wir durch das Projekt insgesamt gelernt hatten.
2727-2828-Der praktische Teil verlangte von uns, eine Lösung zu entwerfen und umzusetzen, die entweder software- oder hardwarebasiert war, um ein realweltliches Problem zu lösen. Mein Teamkollege Clemens Schlipfinger und ich entschieden uns ausschließlich auf Software zu konzentrieren, um die Zuverlässigkeit zu gewährleisten. Hardware kann unvorhersehbare Probleme verursachen, aber Software – insbesondere, wenn sie in robusten Docker-Containern bereitgestellt wird – bietet eine konsistente Umgebung, die überall nahtlos funktioniert.
2929-3030-Was unser Projekt besonders spannend machte, war unsere Partnerschaft mit Siemens AG, einem renommierten multinationalen Unternehmen, das auf Energie-, Automatisierungs- und Digitalisierungslösungen spezialisiert ist. Diese Zusammenarbeit war unter unseren Mitschülern selten und verlieh unserem Projekt eine professionelle Dimension. Siemens beauftragte uns, eine dienstorientierte Softwarelösung zur Analyse von Anomalien im europäischen Stromnetz zu entwickeln.
3131-3232-Das von uns entwickelte System bestand aus mehreren Komponenten, die jeweils für eine spezifische Funktion konzipiert waren. Im Kern befand sich eine Kafka-Anwendung, die für die Erfassung von Daten verantwortlich war – Berichte über Netzwerkanomalien, die wir als „Findings“ bezeichneten. Diese Berichte dokumentierten Ausfälle und Unregelmäßigkeiten im komplexen europäischen Stromnetz, das aus Millionen von verbundenen Komponenten wie Transistoren, Schaltern und Generatoren besteht. Kafka übermittelte die neuesten Anomalien an eine PostgreSQL-Datenbank, die dann über eine GraphQL-API zugänglich gemacht wurde. Diese API bot umfassende Funktionen wie Paginierung, Filterung und Abfragen, um eine nahtlose Integration mit unserem Angular-basierten Frontend zu gewährleisten.
3333-3434-Das Frontend wurde als benutzerfreundliches Dashboard mit drei Hauptbereichen gestaltet:
3535-3636-1. Anomalien-Tabelle – Eine durchsuchbare, paginierte und filterbare Tabelle für die schnelle Navigation durch Anomalien.
3737-3838-2. Graph-Ansicht – Eine dynamische Visualisierung der Anomaliedaten, um die Quelle eines Problems im weitläufigen, komplexen Netz leichter zu lokalisieren.
3939-4040-3. Gesamtdashboard – Wichtige Kennzahlen und Einblicke für schnelle, umsetzbare Übersichten.
4141-4242-Clemens und ich teilten unsere Verantwortlichkeiten gleichmäßig auf. Clemens übernahm die Backend-Systeme, einschließlich Kafka, PostgreSQL und der GraphQL-API, und sorgte für eine zuverlässige und effiziente Daten-Pipeline. Ich übernahm die Rolle des Projektleiters, koordinierte die Kommunikation mit Siemens und entwickelte das Frontend, um die nahtlose Integration der verschiedenen Komponenten sicherzustellen. Diese Zusammenarbeit ermöglichte es uns, unsere Stärken einzusetzen und eine ausgewogene Arbeitsverteilung aufrechtzuerhalten.
4343-4444-Unser Endprodukt erfüllte nicht nur die Anforderungen von Siemens, sondern demonstrierte auch die Stärke einer gut gestalteten dienstorientierten Architektur (SOA) zur Lösung komplexer, realweltlicher Probleme. Es war äußerst befriedigend, unsere Software zuverlässig arbeiten zu sehen und verwertbare Einblicke zur Bewältigung von Stromnetzanomalien zu liefern.
4545-4646-Für weitere Details zu unserer Arbeit können Sie unsere Thesis [hier](https://trueberryless.org/thesis.pdf) 📜 einsehen oder unseren Videokurs [hier](https://videos.trueberryless.org/videos/thesis/) 🎥 anschauen (beides nur auf Deutsch verfügbar).
-32
src/content/docs/de/blog/earworms.mdx
···11----
22-title: Ohrwürmer und die Botschaft, die im Muster verborgen liegt
33-description: Einige zufällige Gedanken über Ohrwürmer und ihre Botschaft, die im
44- Muster verborgen liegt.
55-date: 2025-07-23
66-tags:
77- - Mindspace
88-authors:
99- - trueberryless
1010-cover:
1111- alt: A beautiful cover image with the text "Earworms"
1212- image: ../../../../../public/blog/earworms.jpg
1313-tableOfContents: false
1414-giscus: true
1515-1616----
1717-1818-Ja, dieser Titel ist eine kleine Hommage an die ausgezeichnete Netflix-Serie "Arcane", aber darum geht es in diesem Beitrag nicht.
1919-2020-Heute möchte ich einige Gedanken über Ohrwürmer teilen, ein Begriff, der ursprünglich aus dem Deutschen („Ohrwurm“) stammt und später als wörtliche Übersetzung ins Englische übernommen wurde. Die Bedeutung hinter diesem eher abstrakten Begriff sind eingängige Melodien—*sticky music*, wie es auf Wikipedia heißt. Dieses Phänomen tritt oft unvorhersehbar auf, besonders wenn unsere Gedanken von der Gegenwart abschweifen.
2121-2222-{/* excerpt */}
2323-2424-Während viele meiner Blog-Ideen während Zugfahrten, im Bett liegend oder einfach beim Nachdenken über das Leben auftauchen, entstand die Inspiration für diesen Beitrag buchstäblich unter der Dusche — wie es bei den guten alten *Duschen-Gedanken* sein sollte. Der Grund – wie Sie vielleicht beim Lesen des Themas bereits erahnen können – war ein Ohrwurm von einer Melodie, bei der ich schwören könnte, dass ich sie lange nicht gehört hatte, vielleicht 4–5 Wochen.
2525-2626-Und dies scheint immer der verwirrende Teil an Ohrwürmern zu sein: Niemand weiß wirklich, wer entscheidet, wann sie „abgespielt“ werden. Ist es das Gehirn, das auf „Play“ drückt, wenn es ein wenig taub ist? Sie wissen, was ich meine, diese Momente, in denen Sie nicht wirklich wissen, woran Sie aktuell denken, und auch nicht darüber nachdenken müssen, worüber Sie nachdenken sollten, sondern einfach den Moment genießen. Es gibt ein weiteres österreichisches Sprichwort für genau dieses Szenario: „ins Narrenkastl schauen“, was so viel bedeutet wie *in die Leere starren*. Und ich denke, genau diese geistesabwesenden Momente sind der Ursprung und Grund, warum Ohrwürmer entstehen.
2727-2828-Aber diese Frage bleibt dennoch: Wer entscheidet, was in jemandes Kopf abgespielt wird, wenn es passiert? Wer ist der DJ? Aus meiner eigenen Erfahrung habe ich ein wiederkehrendes Muster bemerkt, besonders wenn man in der letzten halben Stunde gerade Musik gehört hat. Mein Gehirn zumindest neigt dazu, Teile des **vorletzten Songs** zu wiederholen, also des Songs, der vor dem letzten Lied gespielt wurde. Diese Theorie funktioniert noch besser, wenn das letzte Lied in der Mitte pausiert oder einfach nicht perfekt zu Ende abgespielt wurde.
2929-3030-Der genaue Grund dafür ist mir völlig unbekannt, aber wenn ich raten müsste, würde ich sagen, dass die Rhythmen des beendeten Songs (des vorletzten) irgendwo in deinem Kopf nachhallen, da das Lied selbst vielleicht eines dieser „Ich-verstumme-langsam-zum-Ende“-Songs war, was nicht meine liebste Art ist, Musik zu beenden, aber es regt das Gehirn dazu an, weiterzumachen.
3131-3232-Zumindest ist das meine Vermutung. Ich wäre sehr daran interessiert, ob Sie ähnliche Muster erlebt haben, also schreiben Sie gerne Ihren eigenen Blog-Beitrag darüber oder teilen Sie diesen mit Freunden, um ihn gemeinsam zu diskutieren!
···11----
22-title: Entwerfen eines Profils, das innerhalb der GitHub-Regeln funktioniert
33-date: 2025-02-05
44-description: Wie ich ein GitHub-Profile-README erstellt habe, das es eigentlich
55- nicht geben sollte, aber es existiert
66-tags:
77- - GitHub
88- - Markdown
99-authors:
1010- - trueberryless
1111-cover:
1212- alt: A beautiful cover image with the text "GitHub Profile README"
1313- image: ../../../../../public/blog/github-profile-readme.jpg
1414-1515----
1616-1717-Jedes großartige Projekt beginnt mit der Erkenntnis eines Problems. Mein GitHub-Profile-README war überladen, voll mit zu vielen Informationen, zu vielen Abzeichen und einer überwältigenden Menge an Inhalten, die Stil und Struktur fehlten. Es gab Erfolge von Hackathons, GitHub-Beitragsgrafiken, verschiedene technische Abzeichen und vieles mehr, was es visuell unansprechend und schwer navigierbar machte. Anfangs dachte ich, dies sei eine effektive Art, mich zu präsentieren, aber mit der Zeit wurde klar, dass die Informationen eher überwältigend als informativ waren. Ich wollte etwas Neues, einen raffinierteren und visuell ansprechenderen Ansatz, um mein Profil zu präsentieren, und die Idee, ein Bento-Raster zu implementieren, kam mir in den Sinn. Das Ziel war es, ein Layout zu schaffen, das nicht nur funktional, sondern auch ästhetisch beeindruckend und strukturiert ist.
1818-1919-{/* excerpt */}
2020-2121-Der erste Schritt bestand darin, ein ideales Layout unter Verwendung von HTML und CSS zu entwerfen. Das Ergebnis war vielversprechend, ein strukturiertes und optisch ansprechendes Design, das die beabsichtigten Informationen effektiv vermittelte. Doch die direkte Umsetzung in meinem GitHub-Profile-README war nicht unkompliziert. GitHub-Flavored Markdown unterliegt strengen Einschränkungen hinsichtlich der unterstützten HTML-Elemente aufgrund von Sicherheitsvorgaben. Viele essenzielle HTML-Tags waren eingeschränkt, was es unmöglich machte, das Design wie vorgesehen einzubetten. Das Verständnis dieser Einschränkungen bedeutete, dass der gesamte Ansatz neu durchdacht werden musste.
2222-2323-Angesichts dieser Einschränkungen überlegte ich, alternative Wege zu finden, um die Inhalte dynamisch zu generieren und zu präsentieren. Ein Ansatz bestand darin, die Inhaltsaktualisierungen mit einem Python-Skript zu automatisieren, um mein neuestes GitHub-Repository abzurufen und es dynamisch in das README einzufügen. Das Skript griff auf die GitHub-API zu, rief das zuletzt aktualisierte Repository ab und änderte entsprechend das README. Obwohl dies ein interessantes Experiment in Automatisierung war, löste es nicht das Kernproblem, nämlich die Notwendigkeit eines strukturierten und visuell ansprechenden Designs.
2424-2525-Unter Berücksichtigung alternativer Ansätze dachte ich kurzzeitig daran, einen Screenshot des entworfenen HTML-Layouts zu machen und ihn als statisches Bild im README einzubetten. Obwohl dies das Problem visuell gelöst hätte, fühlte es sich wie eine unelegante Lösung an, die mangelnde Flexibilität und Reaktionsfähigkeit aufwies. Weitergehend suchte ich nach einer Methode, die sowohl Struktur als auch Anpassungsfähigkeit ermöglichte und dennoch dynamische Inhaltsaktualisierungen beibehielt.
2626-2727-SVGs traten als eine potenzielle Lösung in Erscheinung. Sie unterstützen Skalierbarkeit, bewahren die visuelle Klarheit über verschiedene Auflösungen hinweg und ermöglichen das Einbetten von Texten und anderen Elementen. Ein frühes Experiment beinhaltete das Einbetten von HTML in ein SVG unter Verwendung des `foreignObject`-Tags. Obwohl dies konzeptionell vielversprechend war, erwies sich die Umsetzung als komplex und wurde vorübergehend beiseite gelegt. Beim späteren Zurückkehren zum Problem war ein strukturierterer Ansatz erforderlich.
2828-2929-Der endgültige Ansatz beinhaltete die Verwendung einer zusammengesetzten SVG-Struktur. Die Lösung bestand aus mehreren Schlüsselkomponenten: Konvertierung des ursprünglichen HTML-Layouts in eine SVG-Darstellung, Kodierung von Bildern mit Base64, um sicherzustellen, dass sie korrekt geladen wurden, Integration dynamischer Elemente wie GitHub-Statistiken und Spotify-Status-Updates als Inline-SVGs sowie Automatisierung der Updates über GitHub Actions. Durch den Einsatz dieser Techniken wurde das Bento-Rasterlayout voll funktionsfähig, konnte sich selbst aktualisieren und behielt dabei ein sauberes, strukturiertes Erscheinungsbild innerhalb der Einschränkungen von GitHub-Flavored Markdown bei.
3030-3131-Ein entscheidender Wendepunkt war die Entdeckung eines Stack Overflow-Beitrags, der eine Methode zur effizienten und effektiven Konvertierung von HTML in SVG beschrieb. Diese Methode bot eine strukturierte Möglichkeit, die erforderlichen SVG-Elemente zu generieren, während das beabsichtigte Design beibehalten wurde. Durch die Kombination dieser Methode mit Base64-Kodierung für Bilder und GitHub Actions zur Automatisierung entstand eine vollständig realisierte Lösung, die alle ursprünglichen Anforderungen erfüllte.
3232-3333-Die endgültige Implementierung besteht aus einem verfeinerten und visuell eindrucksvollen GitHub-Profile-README, das dynamische Inhaltsaktualisierungen integriert und dabei eine elegante Struktur beibehält. Sie präsentiert Informationen klar, ohne unnötige Überladung, und ist vollständig automatisiert, aktualisiert sich alle fünf Minuten ohne manuelles Eingreifen. Das Projekt erforderte umfangreiche Recherche und Experimente mit SVGs, GitHub Actions und Markdown-Einschränkungen. Der Prozess verlangte Ausdauer und Problemlösungsfähigkeiten, um innerhalb der Plattformbeschränkungen ein technisch beeindruckendes Ergebnis zu erzielen. Das Resultat ist ein GitHub-Profile-README, das Design, Automatisierung und Funktionalität innerhalb der Beschränkungen der Plattform effektiv ausbalanciert.
3434-3535-Wenn du nun inspiriert bist, selbst ein beeindruckendes GitHub-Profile-README zu erstellen, lies meinen [technischeren und humorvollen Blog-Beitrag](../../../../../blog/technically-impressive-github-profile-readme/) oder schau direkt in mein Repository [github.com/trueberryless/trueberryless](https://github.com/trueberryless/trueberryless/tree/7519c6f50094bdfd6fb47f610e6638ac8efdd6ad). Und falls dir meine Arbeit hilft, gib ihr gern einen ⭐ und folge mir auf GitHub unter [trueberryless](https://github.com/trueberryless)! 🚀
-36
src/content/docs/de/blog/mutanuq.mdx
···11----
22-title: "Die Organisation des Schullebens: Die Reise hinter Mutanuq"
33-date: 2023-11-13
44-description: Eine schnelle, Markdown-basierte Website, die Schulinhalte
55- organisiert, das Lernen vereinfacht und das Bildungswachstum unterstützt.
66-excerpt: Mutanuq ist eine schnelle, Markdown-basierte Website, die ich
77- entwickelt habe, um Schulinhalte zu organisieren, das Lernen effizienter zu
88- gestalten und eine verlässliche Ressource sowohl für meine Mitschüler als auch
99- für mich selbst zu schaffen.
1010-tags:
1111- - Education
1212- - Markdown
1313- - Starlight
1414-authors:
1515- - trueberryless
1616-cover:
1717- alt: A beautiful cover image with the text "Mutanuq"
1818- image: ../../../../../public/blog/mutanuq.jpg
1919-2020----
2121-2222-Im zweiten Jahr an der HTL Krems, 2021, begann ich ein Projekt, das zwei Leidenschaften von mir vereinte: meine eigene Website zu erstellen und bessere Wege zu finden, den unendlichen Strom an Schulmaterial zu organisieren. Wie viele Schüler waren meine Notizen über OneNote, Word-Dateien, Excel-Tabellen, Google Drive und sogar Tools wie [Witeboard](https://witeboard.com/) verstreut. Das Chaos war überwältigend und machte es schwer, sich effektiv auf das Lernen zu konzentrieren.
2323-2424-Getrieben von der Vision, diesen Prozess zu vereinfachen – nicht nur für mich, sondern auch für meine Mitschüler – entschied ich mich, eine zentrale Plattform zu schaffen, um Schulinhalte zusammenzufassen. Mein Ziel war zweigeteilt: Das Lernen zu vereinfachen und meine Mitschüler zu motivieren.
2525-2626-Zu jener Zeit kannte ich keine Frameworks, die es einfacher gemacht hätten, dokumentationsartige Websites zu erstellen. Stattdessen nutzte ich reines HTML, CSS und JavaScript, um die ersten Versionen dessen zu entwickeln, was ich *Schneider IT* nannte. Obwohl ich es liebte, daran zu arbeiten, waren meine ersten Versuche umständlich – die dynamische Generierung des Inhaltsverzeichnisses und der Seitenleiste mit eigenem JavaScript-Code führte zu quälend langsamen Ladezeiten. Es dauerte über 10 Sekunden, bis alles angezeigt wurde!
2727-2828-Trotz der Rückschläge arbeitete ich weiter daran. Bis 2023 hatte ich rund 10 Versionen der Website erstellt und verworfen, immer auf der Suche nach einem klareren Design und einem effizienteren Verwaltungssystem. Das Potenzial der Website war mir klar, doch an der Benutzerfreundlichkeit fehlte es noch.
2929-3030-Dann entdeckte ich [Starlight](https://starlight.astro.build/), ein leistungsstarkes und beeindruckendes Framework, erstellt von [Chris Swithinbank (@delucis)](https://github.com/delucis), um schnelle, Markdown-basierte Websites zu entwickeln. Diese Entdeckung war ein Wendepunkt – sie erlaubte mir, zwei meiner Leidenschaften zu verbinden: Websites zu erstellen und Markdown für seine Einfachheit und Eleganz zu nutzen.
3131-3232-Mit dem Wechsel zu Starlight entwickelte sich *Schneider IT* zu *Mutanuq*. Der neue Name markierte einen Neuanfang und spiegelte die optimierte, modernisierte Website wider, die sie inzwischen geworden war. Ich schrieb alles neu, optimierte die Leistung der Website und konzentrierte mich darauf, Inhalte zu erstellen, die speziell auf die Bedürfnisse meiner Mitschüler zugeschnitten waren, insbesondere für bevorstehende Prüfungen.
3333-3434-Die Transformation machte sich bezahlt. Freunde begannen, die Website regelmäßig zu nutzen und gaben begeistertes Feedback, wie *„Bro, diese Website sieht fantastisch aus!“* Mutanuq war nicht nur ein Werkzeug für Prüfungen – es wurde zu einer vertrauenswürdigen Ressource für meine Mitschüler und einem persönlichen Archiv für all das Wissen, das ich über die Schule hinaus bewahren wollte.
3535-3636-Dank Starlight wurde das Verwalten und Erweitern von Mutanuq mühelos, und das Projekt entwickelte sich zu etwas, das ich bis heute gerne weiterführe. Was als *Schneider IT* begann – eine kleine Idee, meine Notizen zu organisieren – erblühte zu *Mutanuq*, einer Plattform, die das Lernen für andere vereinfacht und wertvolles Wissen für mein zukünftiges Ich bewahrt.
···11----
22-title: Wie man ein Rehype-Plugin erstellt, das GitHub-Links in schöne Badges
33- verwandelt
44-description: Lernen Sie, wie Sie ein einfaches und zugleich ansprechendes
55- Rehype-Plugin erstellen, das GitHub-Profillinks automatisch in stilvolle,
66- Abzeichen-ähnliche Links mit Profilbildern umwandelt – perfekt, um Ihrem Blog
77- oder Ihren Dokumentationen Persönlichkeit zu verleihen.
88-date: 2025-07-12
99-tags:
1010- - Plugins
1111- - Education
1212-authors:
1313- - trueberryless
1414-excerpt: Entdecken Sie, wie ein kleines Rehype-Plugin Ihren GitHub-Links einen
1515- großen visuellen Schub verleiht. Mit nur wenigen Zeilen Code verwandeln wir
1616- normale Profillinks in elegante Abzeichen mit Avataren, inspiriert von Antfus
1717- Website und unterstützt durch Astro + Starlight.
1818-cover:
1919- alt: A beautiful cover image with the text "Badge Links"
2020- image: ../../../../../public/blog/rehype-github-badge-links.jpg
2121-tableOfContents: false
2222-featured: true
2323-2424----
2525-2626-Kürzlich habe ich diesem Blog eine ganz kleine, aber feine Funktion hinzugefügt, die Ihnen als regelmäßiger Leser vielleicht aufgefallen ist. Es ist nichts riesiges, aber es verleiht jedem Blog diesen kleinen, charmanten Touch, nach dem ich mich schon lange gesehnt habe. Ich spreche ~~schreibe~~ von diesen grünen Abzeichen mit Profilbildern, die Sie auch in diesem Blog sehen können.
2727-2828-Die Inspiration, sie zu erstellen, stammt von niemand anderem als [Antfu](https://github.com/antfu) selbst, der solche Abzeichen überall auf seiner Website hat (zum Zeitpunkt des Schreibens).
2929-3030-Anfangs dachte ich, dafür wäre eine lange und mühsame Programmiersitzung nötig, um dieselbe visuelle Schönheit zu erreichen. Doch nach einigem "Vibe Coding" – wie [Andrej Karpathy den Begriff prägte](https://x.com/karpathy/status/1886192184808149383) – wurde mir schnell klar, dass diese Abzeichen nur ein kleines [rehype](https://github.com/rehypejs)-Plugin von ihrer Existenz entfernt waren.
3131-3232-Dies ist der gesamte Code hinter dem Rehype-Plugin:
3333-3434-```ts
3535-// src/lib/rehype-github-badge-links.ts
3636-import { h } from "hastscript";
3737-import { visit } from "unist-util-visit";
3838-3939-export default function rehypeGitHubBadgeLinks() {
4040- return (tree) => {
4141- visit(tree, "element", (node) => {
4242- if (
4343- node.tagName === "a" &&
4444- typeof node.properties?.href === "string" &&
4545- node.properties.href.startsWith("https://github.com/")
4646- ) {
4747- const match = node.properties.href.match(
4848- /^https:\/\/github\.com\/([\w-]+)\/?$/
4949- );
5050- if (match) {
5151- const username = match[1];
5252-5353- // Add GitHub badge class
5454- node.properties.className = (node.properties.className || []).concat(
5555- "gh-badge"
5656- );
5757-5858- // Build avatar image
5959- const avatarImg = h("img", {
6060- src: `https://github.com/${username}.png`,
6161- alt: username,
6262- });
6363-6464- // Prepend avatar image to original children
6565- node.children.unshift(avatarImg);
6666- }
6767- }
6868- });
6969- };
7070-}
7171-```
7272-7373-Im Wesentlichen durchsucht dieses Plugin das HTML nach Links, die auf ein GitHub-Profil verweisen. Wenn es einen solchen Link findet, fügt es vor dem Textinhalt ein `<img>`-Tag mit dem Profilbild des GitHub-Benutzers oder der Organisation ein. Dies ist dank GitHubs Funktion, das Bild als Ressource hinter dem Profillink mit der Endung `.png` zur Verfügung zu stellen, sehr konsistent möglich. Lesen Sie mehr über diese Funktion in [diesem großartigen Artikel auf `dev.to`](https://dev.to/10xlearner/how-to-get-the-profile-picture-of-a-github-account-1d82).
7474-7575-Mit ein wenig zusätzlichem Styling sieht es meiner Meinung nach wirklich niedlich aus. Bitte beachten Sie, dass dies eine [Starlight](https://starlight.astro.build)-Seite ist und ich verfügbare CSS-Variablen verwende, wie in Zeile vier:
7676-7777-```css "var(--sl-color-accent-low)" "var(--sl-color-accent)"
7878-// src/styles/custom.css
7979-.gh-badge {
8080- display: inline-flex;
8181- align-items: center;
8282- background-color: var(--sl-color-accent-low);
8383- border-radius: 9999px;
8484- padding: 0em 0.5em 0 0.3em;
8585- font-size: 0.9em;
8686- text-decoration: none;
8787- color: inherit;
8888- font-weight: 500;
8989- transition: background-color 0.2s ease;
9090- transform: translateY(0.29rem);
9191- border: 1px solid var(--sl-color-accent);
9292-}
9393-9494-.gh-badge:hover {
9595- background-color: var(--sl-color-accent);
9696-}
9797-9898-.gh-badge img {
9999- border-radius: 9999px;
100100- width: 1.3em;
101101- height: 1.3em;
102102-}
103103-```
104104-105105-Um nun alles zusammenzufügen, müssen Sie beispielsweise in einer Astro-Site lediglich das Rehype-Plugin wie folgt zur Konfiguration hinzufügen:
106106-107107-```ts ins={6-8}
108108-// astro.config.mjs
109109-import { defineConfig } from 'astro/config';
110110-import rehypeGitHubBadgeLinks from "./src/lib/rehype-github-badge-links";
111111-112112-export default defineConfig({
113113- markdown: {
114114- rehypePlugins: [rehypeGitHubBadgeLinks]
115115- }
116116-})
117117-```
118118-119119-Lesen Sie mehr über die Einbindung von Rehype-Plugins in Astro in [deren Konfigurationsreferenz](https://docs.astro.build/en/reference/configuration-reference/#markdownrehypeplugins).
120120-121121-Vergessen Sie nicht, das CSS auf ähnliche Weise je nach Framework hinzuzufügen – in Starlight können Sie individuelle globale CSS-Stile konfigurieren, indem Sie [diese Anweisungen](https://docs.astro.build/en/guides/styling/#scoped-styles) befolgen – und schon können Sie Ihre eigenen Abzeichen-Links bewundern. Teilen Sie diesen Beitrag gerne mit jedem, den Sie dazu überzeugen möchten, diese Funktionen ebenfalls zu nutzen.
122122-123123-<details>
124124- <summary>✨ Bonus-Punkt</summary>
125125-126126- Wenn Sie ein solches Abzeichen auch für andere Links verwenden möchten, empfehle ich Ihnen, sich selbst eine kleine Astro-Komponente wie diese zu basteln:
127127-128128- ```astro
129129- ---
130130- // src/components/BadgeLink.astro
131131- const { href, src, text, className = "gh-badge" } = Astro.props;
132132- ---
133133-134134- <a href={href} class={className}>
135135- <img src={src} alt={text} />
136136- {text}
137137- </a>
138138- ```
139139-140140- Stellen Sie einfach sicher, dass das CSS global ist (oder [scopen](https://docs.astro.build/en/guides/styling/#scoped-styles) Sie es in der obigen Komponente) und es ist einsatzbereit:
141141-142142- ```mdx
143143- import BadgeLink from "../components/BadgeLink.astro";
144144-145145- <BadgeLink
146146- href="https://github.com/withastro/starlight"
147147- src="/starlight.png"
148148- text="Starlight"
149149- />
150150- ```
151151-</details>
···11----
22-title: Einrichten von Argo CD in einem k3s-Cluster
33-description: Heute sehen wir uns an, wie man Argo CD in einem k3s-Cluster einrichtet.
44-date: 2024-07-27
55-lastUpdated: 2024-07-28
66-tags:
77- - Automation
88- - Deployment Series
99- - Education
1010-excerpt: Um unseren k3s-Cluster und insbesondere den CI/CD-Workflow weiter zu
1111- verbessern, werfen wir einen Blick auf das GitOps-Tool <a class="gh-badge"
1212- href="https://github.com/argoproj"><img src="https://github.com/argoproj.png"
1313- alt="Argo CD" />Argo CD</a>. Hier zeigen wir, wie wir es in unseren Cluster
1414- integrieren können. Unsere Tech-Stack für den Deployment-Prozess umfasst k3s,
1515- Helm, Cilium und nach diesem Tutorial auch Argo CD.
1616-authors:
1717- - trueberryless
1818-cover:
1919- alt: A beautiful cover image with the text "Argo CD"
2020- image: ../../../../../public/blog/setup-argocd-for-kubernetes.jpg
2121-giscus: true
2222-2323----
2424-2525-Nachdem wir Vegard S. Hagens Artikel “[Argo CD Kustomize with Helm](https://blog.stonegarden.dev/articles/2023/09/argocd-kustomize-with-helm/)” gelesen und beschlossen haben, dass seine Lösung nicht passend für unseren Cluster ist, haben wir uns direkt in die Standard-Argo-CD-„[Getting started](https://argo-cd.readthedocs.io/en/stable/getting_started/)“-Anleitung vertieft. Nun führen wir Sie durch die Herausforderungen bei der Einrichtung von [Argo CD](https://github.com/argoproj) auf [k3s](https://github.com/k3s-io) und [Cilium](https://github.com/cilium). Dies knüpft an das Kapitel „[Setup Certificate Manager with Cloudflare](../../../../../blog/setup-kubernetes-with-cilium-and-cloudflare#setup-certificate-manager-with-cloudflare)“ aus unserem letzten Beitrag „[Setting up Kubernetes with Cilium and Cloudflare](../../../../../blog/setup-kubernetes-with-cilium-and-cloudflare)“ an. In genau diesem Beitrag haben wir am Ende auch [Keel](https://github.com/keel-hq) eingerichtet, aber dieser Schritt ist jetzt überflüssig, da wir Argo CD nutzen, um den neuesten Stand der Technik-Code aus jeder [GitHub](https://github.com/github)-Repo zu holen. Viel Spaß beim Lesen!
2626-2727-:::note
2828-Wir gehen davon aus, dass Sie [unseren anderen Blogbeitrag](../../../../../blog/setup-kubernetes-with-cilium-and-cloudflare) gelesen haben.
2929-:::
3030-3131-## Voraussetzungen
3232-3333-Bevor wir starten, müssen wir sicherstellen, dass `kubectl` installiert ist, eine kubeconfig-Datei vorhanden ist (k3s speichert diese Datei hier:
3434-3535-```yaml
3636-#/etc/rancher/k3s/config.yaml
3737-flannel-backend: "none"
3838-disable-kube-proxy: true
3939-disable-network-policy: true
4040-cluster-init: true
4141-disable:
4242- - servicelb
4343- - traefik
4444-```
4545-4646-) und CoreDNS (prüfen Sie, ob Sie CoreDNS haben, indem Sie diesen
4747-4848-```bash
4949-kubectl get pods -n kube-system -l k8s-app=kube-dns
5050-```
5151-5252-Befehl ausführen).
5353-5454-## Installation
5555-5656-Zunächst wenden wir alle notwendigen Services, Deployments und viele andere Kubernetes-Ressourcen an, indem wir folgendes ausführen:
5757-5858-```bash
5959-kubectl create namespace argocd
6060-kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
6161-```
6262-6363-## Zertifikat
6464-6565-Zusätzlich benötigen wir ein Zertifikat:
6666-6767-```yaml
6868-apiVersion: cert-manager.io/v1
6969-kind: Certificate
7070-metadata:
7171- name: argocd
7272- namespace: argocd
7373-spec:
7474- secretName: argocd
7575- issuerRef:
7676- name: acme-issuer
7777- kind: ClusterIssuer
7878- dnsNames:
7979- - "argo-cd.trueberryless.org"
8080-```
8181-8282-Wenden Sie diese Ressource an, indem Sie `kubectl apply -f certificate.yaml` ausführen.
8383-8484-## Ingress-Controller
8585-8686-Außerdem benötigen wir einen Ingress-Controller, der von Cilium verwaltet wird:
8787-8888-```yaml
8989-apiVersion: networking.k8s.io/v1
9090-kind: Ingress
9191-metadata:
9292- name: argocd-ingress
9393- namespace: argocd
9494-spec:
9595- rules:
9696- - host: argo-cd.trueberryless.org
9797- http:
9898- paths:
9999- - path: /
100100- pathType: Prefix
101101- backend:
102102- service:
103103- name: argocd-server
104104- port:
105105- number: 80
106106-107107- tls:
108108- - hosts:
109109- - argo-cd.trueberryless.org
110110- secretName: argocd
111111-```
112112-113113-Wenden Sie diese Ressource an, indem Sie `kubectl apply -f argocd-ingress.yaml` ausführen.
114114-115115-## TLS in Argo CD deaktivieren
116116-117117-Mit dem Zertifikat ist die Verbindung zwischen Client und Server gesichert. Es gibt jedoch immer noch ein selbstsigniertes Zertifikat innerhalb der [Argo CD](https://github.com/argoproj)-Services, das wir nicht unbedingt benötigen. Daher können wir die Sicherheit des Argo-CD-Servers deaktivieren, indem wir die Eigenschaft `server.insecure` bearbeiten.
118118-119119-Um das zu tun, führen wir zunächst diesen Befehl aus:
120120-121121-```bash
122122-kubectl edit cm argocd-cmd-params-cm -n argocd
123123-```
124124-125125-was hoffentlich eine Datei in vim oder neovim öffnet (ansonsten wäre es ziemlich unangenehm, wenn Sie uns fragen, LMAO). Die Datei sollte in etwa so aussehen:
126126-127127-```yaml {21-22}
128128-# Please edit the object below. Lines beginning with a '#' will be ignored,
129129-# and an empty file will abort the edit. If an error occurs while saving this file will be
130130-# reopened with the relevant failures.
131131-#
132132-apiVersion: v1
133133-data:
134134- server.insecure: "true"
135135-kind: ConfigMap
136136-metadata:
137137- annotations:
138138- kubectl.kubernetes.io/last-applied-configuration: |
139139- {"apiVersion":"v1","kind":"ConfigMap","metadata":{"annotations":{},"labels":{"app.kubernetes.io/name":"argocd-cmd-params-cm","app.kubernetes.io/part-of":"argocd"},"name":"arg
140140- creationTimestamp: "2024-07-27T11:15:28Z"
141141- labels:
142142- app.kubernetes.io/name: argocd-cmd-params-cm
143143- app.kubernetes.io/part-of: argocd
144144- name: argocd-cmd-params-cm
145145- namespace: argocd
146146- resourceVersion: "239710156"
147147- uid: 5f53d26b-3adf-4ed9-9807-c3da847335a2
148148-data:
149149- server.insecure: "true"
150150-```
151151-152152-Die letzten beiden Zeilen werden wahrscheinlich zuerst nicht vorhanden sein, aber genau diese Einstellung wollen wir erreichen. Fügen Sie diese beiden Zeilen (oben markiert) hinzu und speichern Sie die Datei (`Esc` → `:wq`, wenn Sie cool sind).
153153-154154-Starten Sie den Argo-CD-Server neu, indem Sie warten, bis das Rollout abgeschlossen ist:
155155-156156-```bash
157157-kubectl rollout restart deploy argocd-server -n argocd
158158-kubectl rollout status deploy argocd-server -n argocd
159159-```
160160-161161-Nach all diesen Schritten sollten wir nun die Benutzeroberfläche unter [`https://argo-cd.trueberryless.org`](https://argo-cd.trueberryless.org) (passwortgeschützt) sehen.
162162-163163-
164164-165165-:::note
166166-Die Anmeldedaten der Argo-CD-Benutzeroberfläche bestehen aus einem Benutzer und einem Passwort. Der Benutzer ist immer `admin` und Sie können Ihr Passwort herausfinden, indem Sie diesen Befehl ausführen:
167167-168168-```bash
169169-kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
170170-```
171171-:::
172172-173173-## Manifest im Repository hinzufügen
174174-175175-Um nun eine neue Anwendung in [Argo CD](https://github.com/argoproj) zu erstellen (entweder über die Benutzeroberfläche oder CLI – wir nutzen die Benutzeroberfläche, da wir die CLI nicht eingerichtet haben), müssen wir das Git-Repository vorbereiten. Da das Repository die einzige Quelle der Wahrheit ist, definieren wir dort auch alle Kubernetes-Ressourcen, die von Argo CD erstellt werden sollen.
176176-177177-Wir empfehlen, im Git-Repository einen neuen Ordner mit dem Namen `manifest` zu erstellen. In diesem Ordner erstellen wir einige Dateien:
178178-179179-* `certificate.yaml`:
180180-181181- ```yaml
182182- apiVersion: cert-manager.io/v1
183183- kind: Certificate
184184- metadata:
185185- name: mutanuq
186186- namespace: mutanuq
187187- spec:
188188- secretName: mutanuq
189189- issuerRef:
190190- name: acme-issuer
191191- kind: ClusterIssuer
192192- dnsNames:
193193- - "mutanuq.trueberryless.org"
194194- ```
195195-196196-* `deployment.yaml`:
197197-198198- ```yaml
199199- apiVersion: apps/v1
200200- kind: Deployment
201201- metadata:
202202- name: mutanuq
203203- namespace: mutanuq
204204- labels:
205205- app: mutanuq
206206- spec:
207207- replicas: 3
208208- selector:
209209- matchLabels:
210210- app: mutanuq
211211- template:
212212- metadata:
213213- labels:
214214- app: mutanuq
215215- spec:
216216- containers:
217217- - name: mutanuq
218218- image: "trueberryless/mutanuq"
219219- imagePullPolicy: Always
220220- ```
221221-222222-* `service.yaml`:
223223-224224- ```yaml
225225- apiVersion: v1
226226- kind: Service
227227- metadata:
228228- name: mutanuq
229229- namespace: mutanuq
230230- annotations:
231231- cert-manager.io/issuer: acme-issuer
232232- spec:
233233- selector:
234234- app: mutanuq
235235- ports:
236236- - name: http
237237- port: 80
238238- ```
239239-240240-* `ingress.yaml`:
241241-242242- ```yaml
243243- apiVersion: networking.k8s.io/v1
244244- kind: Ingress
245245- metadata:
246246- name: mutanuq
247247- namespace: mutanuq
248248- spec:
249249- rules:
250250- - host: mutanuq.trueberryless.org
251251- http:
252252- paths:
253253- - path: /
254254- pathType: Prefix
255255- backend:
256256- service:
257257- name: mutanuq
258258- port:
259259- number: 80
260260-261261- tls:
262262- - hosts:
263263- - mutanuq.trueberryless.org
264264- secretName: mutanuq
265265- ```
266266-267267-Diese Dateien sind im Grunde dieselben wie in dem [anderen Beitrag](../../../../../blog/setup-kubernetes-with-cilium-and-cloudflare#example-app-mutanuq), jedoch in vier Dateien aufgeteilt, da uns dies den Vorteil bietet, das Manifest aus [GitHub](https://github.com/github)-Aktionen heraus zu manipulieren. Aber der Reihe nach: Im [nächsten Beitrag](../../../../../blog/setup-continuous-integration-github-repository) sehen Sie, wie das Manifest mit GitHub-Aktionen eingerichtet wird.
268268-269269-## Neue Anwendung in der Argo-CD-Benutzeroberfläche erstellen
270270-271271-Sie werden wahrscheinlich den großen Button `NEW APP` in der Benutzeroberfläche von [Argo CD](https://github.com/argoproj) sehen. Klicken Sie darauf und erstellen Sie eine neue Anwendung mit den unten angepassten Eigenschaften:
272272-273273-* Anwendungsname: `mutanuq`
274274-* Projektname: `default`
275275-* Sync Policy: Erfahren Sie mehr in [diesem Beitrag](../../../../../blog/setup-continuous-integration-github-repository) / vorerst auf `Manual` lassen
276276-* Repository-URL: `https://github.com/trueberryless-org/mutanuq`
277277-* Revision: `HEAD`
278278-* Pfad: `manifest`
279279-* Cluster-URL: `https://kubernetes.default.svc`
280280-* Namespace: `mutanuq`
281281-282282-Optional – wenn Sie [die CLI installiert haben](https://argo-cd.readthedocs.io/en/stable/cli_installation/) – können Sie diesen Befehl für dasselbe Ergebnis ausführen:
283283-284284-```bash
285285-argocd app create mutanuq \
286286- --project default \
287287- --repo https://github.com/trueberryless-org/mutanuq \
288288- --revision HEAD \
289289- --path manifest \
290290- --dest-server https://kubernetes.default.svc \
291291- --dest-namespace mutanuq
292292-```
293293-294294-Nun sollten Sie hoffentlich sehen, wie Ihre Website in der Benutzeroberfläche bereitgestellt wird. Dieser Prozess kann einige Zeit in Anspruch nehmen, da beispielsweise der Zertifikatsantrag genehmigt werden muss. Eine gesunde Anwendung sollte in etwa so aussehen:
295295-296296-
297297-298298-## Feiern Sie mit einem Kaffee!
299299-300300-Herzlichen Glückwunsch, Sie haben erfolgreich [Argo CD](https://github.com/argoproj) auf einem [k3s](https://github.com/k3s-io) Cluster eingerichtet! Sie haben sich eine Kaffeepause verdient. Genießen Sie eine wohlverdiente Tasse, und wenn Sie mit mir virtuell einen Kaffee teilen möchten, können Sie gerne meine Arbeit auf [Ko-fi](https://ko-fi.com/trueberryless) unterstützen. Vielen Dank!
301301-302302-## Fortsetzung
303303-304304-Fortsetzung in unserem [nächsten Blog](../../../../../blog/setup-continuous-integration-github-repository), der beschreibt, wie ein [GitHub](https://github.com/github)-Repository eingerichtet wird, das dann über Argo CD bereitgestellt werden kann.
···11----
22-title: Einrichten der kontinuierlichen Bereitstellung in einem GitHub-Repository
33-description: Heute schauen wir uns an, wie man ein GitHub-Repository einrichtet,
44- das über Argo CD auf einem k3s-Cluster bereitgestellt wird.
55-date: 2024-07-28
66-tags:
77- - Automation
88- - Deployment Series
99- - GitHub
1010- - Education
1111-excerpt: Heute schauen wir uns an, wie man ein <a class="gh-badge"
1212- href="https://github.com/github"><img src="https://github.com/github.png"
1313- alt="github" />GitHub</a>-Repository einrichtet, das über Argo CD auf einem
1414- k3s-Cluster bereitgestellt wird. Zusammenfassend wird der Artikel
1515- Workflow-Dateien, eine Dockerfile, Manifeste (Deployment) und <a
1616- class="gh-badge" href="https://github.com/docker"><img
1717- src="https://github.com/docker.png" alt="Docker Hub" />Docker
1818- Hub</a>-Repositories umfassen. Bitte werfen Sie einen Blick auf [unseren Argo
1919- CD Blog](./setup-argocd-for-kubernetes), da dies eine Fortsetzung des anderen
2020- Beitrags ist.
2121-authors:
2222- - trueberryless
2323-cover:
2424- alt: A beautiful cover image with the text "Github CD"
2525- image: ../../../../../public/blog/setup-continuous-integration-github-repository.jpg
2626-giscus: true
2727-2828----
2929-3030-Im heutigen Beitrag werfen wir einen kurzen Blick darauf, wie man eine kontinuierliche Bereitstellung in einem [GitHub](https://github.com/github)-Repository einrichtet. Wir sind uns ziemlich sicher, dass dieses Setup auch mit anderen Git-Registrys funktioniert. Beachten Sie jedoch, dass sich dieser Beitrag ausschließlich auf GitHub konzentriert.
3131-3232-Dieser Beitrag setzt voraus, dass Sie [GitHub](https://github.com/github)-Actions in Kombination mit Argo CD verwenden, um Ihre Anwendungen auf einem Kubernetes-Cluster bereitzustellen. Folgen Sie unseren anderen [Bereitstellungsbeiträgen](../../../../../blog/tags/deployment), um weitere Anleitungen zur Einrichtung beider Technologien auf Ihrem persönlichen Server zu erhalten.
3333-3434-## Vorbereitungen
3535-3636-Wir empfehlen, ein [Docker Hub](https://hub.docker.com/)-Konto zu erstellen oder ein anderes Docker-Registry Ihrer Wahl zu nutzen.
3737-3838-Ihr GitHub-Repository muss die folgenden Bedingungen erfüllen:
3939-4040-* Hat eine Dockerfile (idealerweise im Stammordner)
4141-* Hat zwei GitHub-Secrets ([GitHub-Secret erstellen](https://docs.github.com/en/actions/security-guides/using-secrets-in-github-actions#creating-secrets-for-a-repository)):
4242- * DOCKER\\\_USERNAME: Ihr Docker-Benutzername
4343- * DOCKER\_PASSWORD: Ihr Docker-Passwort (oder [Access Token](https://docs.docker.com/security/for-developers/access-tokens/))
4444-4545-## Erstellen einer Workflow-Datei (oder mehrerer)
4646-4747-GitHub Actions sind spezielle Jobs in GitHub, die meist auf Linux-Servern ausgeführt werden und über das Erstellen von `yaml`-Dateien im Verzeichnis `.github/workflows` gesteuert werden können. Diese speziellen Dateien können festlegen, nach welchen Ereignissen diese Jobs ausgeführt werden sollen, und bieten Ihnen viel Freiheit. Als regelmäßiger GitHub-Actions-Nutzer kann ich Ihnen sagen, dass Sie sich daran gewöhnen sollten, Ihre `yaml`-Dateien ziemlich oft umzuschreiben, da Sie häufig kleine Details übersehen. Aber ohne weitere Umschweife, lassen Sie uns direkt in die Erstellung einer passenden `deployment.yaml`-Datei einsteigen, die einige Aufgaben für uns erledigt:
4848-4949-* Eine neue Docker-Image-Version in Docker Hub hochladen (mit der neuesten Version).
5050-* Die `manifest/deployment.yaml`-Datei aktualisieren, damit Argo CD über das neue getaggte Image informiert wird.
5151-* (optional) Ein neues Release auf GitHub erstellen, damit die Zeitpunkte der Releases dokumentiert sind, wo sie sein sollten.
5252-5353-```yaml {20}
5454-# deployment.yaml
5555-name: Deployment
5656-5757-on:
5858- push:
5959- branches: [main]
6060- merge_group:
6161- pull_request:
6262- branches: [main]
6363- # Allows you to run this workflow manually from the Actions tab
6464- workflow_dispatch:
6565-6666-# Automatically cancel in-progress actions on the same branch
6767-concurrency:
6868- group: ${{ github.workflow }}-${{ github.event_name == 'pull_request_target' && github.head_ref || github.ref }}
6969- cancel-in-progress: true
7070-7171-env:
7272- REGISTRY: docker.io
7373- IMAGE_NAME: trueberryless/blog
7474- NODE_VERSION: 20
7575-7676-jobs:
7777- deployment:
7878- if: contains(github.event.head_commit.message, 'deploy') || github.event_name == 'workflow_dispatch'
7979- runs-on: ubuntu-latest
8080- permissions:
8181- contents: write
8282- steps:
8383- - name: Check out the repo
8484- uses: actions/checkout@v4
8585- with:
8686- fetch-depth: 0
8787-8888- - name: Create tag
8989- run: echo "IMAGE_TAG=$(echo $GITHUB_REF_NAME-$GITHUB_SHA)" >> $GITHUB_ENV
9090-9191- - name: Set up Docker Buildx
9292- uses: docker/setup-buildx-action@v2
9393-9494- - name: Log in to Docker Hub
9595- uses: docker/login-action@v2
9696- with:
9797- username: ${{ secrets.DOCKER_USERNAME }}
9898- password: ${{ secrets.DOCKER_PASSWORD }}
9999-100100- - name: Extract metadata (tags, labels) for Docker
101101- id: meta
102102- uses: docker/metadata-action@v4
103103- with:
104104- images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
105105-106106- - name: Build and push Docker image
107107- uses: docker/build-push-action@v5
108108- with:
109109- context: .
110110- push: true
111111- tags: |
112112- ${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}
113113- ${{ env.IMAGE_NAME }}:latest
114114- labels: ${{ steps.meta.outputs.labels }}
115115-116116- - name: Update deployment.yaml file
117117- run: |
118118- yq eval '.spec.template.spec.containers[0].image = "${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}"' -i manifest/deployment.yaml
119119-120120- - uses: stefanzweifel/git-auto-commit-action@v4
121121- with:
122122- commit_message: update deployment.json container image (automated)
123123-124124- - uses: ncipollo/release-action@v1
125125- with:
126126- tag: ${{ env.IMAGE_TAG }}
127127- makeLatest: true
128128- body: "A docker image has been deployed to [Docker Hub](https://hub.docker.com/r/${{ env.IMAGE_NAME }}/tags)."
129129-```
130130-131131-Hier finden Sie eine veraltete `docker-hub.yaml`, die wir früher verwendet haben, da sie gute Versionierungsstrategien bietet:
132132-133133-```yaml collapse={1-145}
134134-# docker-hub.yaml
135135-name: Docker Image Push
136136-137137-on:
138138- push:
139139- branches: [main]
140140- merge_group:
141141- pull_request:
142142- branches: [main]
143143- # Allows you to run this workflow manually from the Actions tab
144144- workflow_dispatch:
145145-146146-# Automatically cancel in-progress actions on the same branch
147147-concurrency:
148148- group: ${{ github.workflow }}-${{ github.event_name == 'pull_request_target' && github.head_ref || github.ref }}
149149- cancel-in-progress: true
150150-151151-env:
152152- REGISTRY: docker.io
153153- IMAGE_NAME: trueberryless/blog
154154- NODE_VERSION: 18
155155-156156-jobs:
157157- docker-push-image:
158158- if: contains(github.event.head_commit.message, 'version') || github.event_name == 'workflow_dispatch'
159159- runs-on: ubuntu-latest
160160- permissions:
161161- contents: write
162162- steps:
163163- - name: Check out the repo
164164- uses: actions/checkout@v4
165165- with:
166166- fetch-depth: 0
167167-168168- - name: Check if file exists
169169- run: |
170170- if [ -f .github/artifacts/version.json ]; then
171171- echo "File exists"
172172- echo "FILE_EXISTS=true" >> $GITHUB_ENV
173173- else
174174- echo "File does not exist"
175175- echo "FILE_EXISTS=false" >> $GITHUB_ENV
176176- fi
177177-178178- - name: read_json
179179- if: ${{ env.FILE_EXISTS == 'true' }}
180180- id: version
181181- uses: zoexx/github-action-json-file-properties@release
182182- with:
183183- file_path: ".github/artifacts/version.json"
184184-185185- - name: save environment variables
186186- if: ${{ env.FILE_EXISTS == 'true' }}
187187- run: |
188188- echo "MAJOR=${{steps.version.outputs.major}}" >> $GITHUB_ENV
189189- echo "MINOR=${{steps.version.outputs.minor}}" >> $GITHUB_ENV
190190- echo "PATCH=${{steps.version.outputs.patch}}" >> $GITHUB_ENV
191191-192192- - name: create environment variables
193193- if: ${{ env.FILE_EXISTS == 'false' }}
194194- run: |
195195- echo "MAJOR=0" >> $GITHUB_ENV
196196- echo "MINOR=0" >> $GITHUB_ENV
197197- echo "PATCH=0" >> $GITHUB_ENV
198198-199199- - name: echo environment variables
200200- run: |
201201- echo ${{ env.MINOR }}
202202- echo ${{ env.MINOR }}
203203- echo ${{ env.MINOR }}
204204-205205- - name: Major version
206206- if: contains(github.event.head_commit.message, 'major')
207207- run: |
208208- echo "New major version"
209209- echo "MAJOR=$((${{ env.MAJOR }}+1))" >> $GITHUB_ENV
210210- echo "MINOR=0" >> $GITHUB_ENV
211211- echo "PATCH=0" >> $GITHUB_ENV
212212-213213- - name: Minor version
214214- if: contains(github.event.head_commit.message, 'minor')
215215- run: |
216216- echo "New minor version"
217217- echo "MINOR=$((${{ env.MINOR }}+1))" >> $GITHUB_ENV
218218- echo "PATCH=0" >> $GITHUB_ENV
219219-220220- - name: Patch version
221221- if: contains(github.event.head_commit.message, 'patch') || github.event_name == 'workflow_dispatch'
222222- run: |
223223- echo "New patch version"
224224- echo "PATCH=$((${{ env.PATCH }}+1))" >> $GITHUB_ENV
225225-226226- - name: Set up Docker Buildx
227227- uses: docker/setup-buildx-action@v2
228228-229229- - name: Log in to Docker Hub
230230- uses: docker/login-action@v2
231231- with:
232232- username: ${{ secrets.DOCKER_USERNAME }}
233233- password: ${{ secrets.DOCKER_PASSWORD }}
234234-235235- - name: Extract metadata (tags, labels) for Docker
236236- id: meta
237237- uses: docker/metadata-action@v4
238238- with:
239239- images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
240240-241241- - name: Build and push Docker image
242242- uses: docker/build-push-action@v5
243243- with:
244244- context: .
245245- push: true
246246- tags: |
247247- ${{ env.IMAGE_NAME }}:${{ env.MAJOR }}.${{ env.MINOR }}.${{ env.PATCH }}
248248- ${{ env.IMAGE_NAME }}:latest
249249- labels: ${{ steps.meta.outputs.labels }}
250250-251251- - name: Check out the repo
252252- uses: actions/checkout@v4
253253- with:
254254- fetch-depth: 0
255255-256256- - name: Create folder if necessary
257257- if: ${{ env.FILE_EXISTS == 'false' }}
258258- run: mkdir -p .github/artifacts
259259-260260- - name: write_json
261261- id: create-json
262262- uses: jsdaniell/create-json@v1.2.2
263263- with:
264264- name: "version.json"
265265- json: '{ "major": ${{ env.MAJOR }}, "minor": ${{ env.MINOR }}, "patch": ${{ env.PATCH }} }'
266266- dir: ".github/artifacts/"
267267-268268- - uses: stefanzweifel/git-auto-commit-action@v4
269269- with:
270270- commit_message: update version.json (automated)
271271-272272- - name: Update deployment.yaml file
273273- run: |
274274- yq eval '.spec.template.spec.containers[0].image = "${{ env.IMAGE_NAME }}:${{ env.MAJOR }}.${{ env.MINOR }}.${{ env.PATCH }}"' -i manifest/deployment.yaml
275275-276276- - uses: stefanzweifel/git-auto-commit-action@v4
277277- with:
278278- commit_message: update deployment.json container image (automated)
279279-```
280280-281281-Nachdem Sie den Inhalt unserer `deployment.yaml`-Datei kopiert und die neue Datei im `.github/workflows`-Ordner erstellt haben, müssen Sie einige sehr **wichtige Anpassungen** vornehmen:
282282-283283-* Ändern Sie den `IMAGE_NAME` in Ihr persönliches Docker Hub-Repository. Der Bildname besteht aus Ihrem Kontonamen und dem Repositoriesnamen. Wenn Sie sich nicht sicher sind, wie Ihr Bildname lautet, können Sie die URL des Docker Hub-Repositories ansehen, dort sollte er irgendwo zu finden sein.
284284-285285-Jetzt sollten Sie bereit sein, das Schlüsselwort `deploy` in jede Commit-Nachricht für den Hauptzweig Ihres Repositories einzufügen, und es sollte automatisch ein Docker-Image an Docker Hub senden und das Manifest für Argo CD aktualisieren.
286286-287287-## Feiern Sie mit einem Kaffee!
288288-289289-Herzlichen Glückwunsch, Sie haben Argo CD erfolgreich mit k3s und [Cilium](https://github.com/cilium) eingerichtet! Sie haben eine Kaffeepause verdient. Genießen Sie eine wohlverdiente Tasse, und wenn Sie mit mir einen virtuellen Kaffee teilen möchten, können Sie gerne meine Arbeit auf [Ko-fi](https://ko-fi.com/trueberryless) unterstützen. Vielen Dank!
···11----
22-title: Einrichten von Kubernetes mit Cilium und Cloudflare
33-description: Heute schauen wir uns an, wie man ein Kubernetes-Cluster mit K3s
44- und Cilium einrichtet.
55-date: 2024-06-11
66-lastUpdated: 2024-10-01
77-tags:
88- - Deployment Series
99- - Education
1010-excerpt: Dieser Blogpost beschreibt den Prozess der Einrichtung eines <a
1111- class="gh-badge" href="https://github.com/kubernetes"><img
1212- src="https://github.com/kubernetes.png" alt="Kubernetes"
1313- />Kubernetes</a>-Clusters mit <a class="gh-badge"
1414- href="https://github.com/k3s-io"><img src="https://github.com/k3s-io.png"
1515- alt="k3s" />k3s</a> und <a class="gh-badge"
1616- href="https://github.com/cilium"><img src="https://github.com/cilium.png"
1717- alt="Cilium" />Cilium</a>. Wir verwenden <a class="gh-badge"
1818- href="https://github.com/helm"><img src="https://github.com/helm.png"
1919- alt="Helm" />Helm</a> als Paketmanager und <a class="gh-badge"
2020- href="https://github.com/cloudflare"><img
2121- src="https://github.com/cloudflare.png" alt="Cloudflare" />Cloudflare</a> als
2222- Zertifikataussteller. Wir haben die Tipps und Tricks von Vegard S. Hagen aus
2323- [seinem
2424- Artikel](https://blog.stonegarden.dev/articles/2024/02/bootstrapping-k3s-with-cilium/)
2525- genutzt. Im Wesentlichen erklärt dieser Blog, wie alle
2626- trueberryless.org-Webseiten bereitgestellt wurden (nicht mehr).
2727-authors:
2828- - trueberryless
2929- - clemens
3030-cover:
3131- alt: A beautiful cover image with the text "Kubernetes"
3232- image: ../../../../../public/blog/setup-kubernetes-with-cilium-and-cloudflare.jpg
3333-giscus: true
3434-metrics:
3535- readingTime: 360
3636- words: 1099
3737-3838----
3939-4040-Die Arbeit mit [Docker](https://github.com/docker)-Containern kann schwierig sein. Es gibt jedoch Tools, die das Management von Containern verbessern, wie [Kubernetes](https://github.com/kubernetes). Tatsächlich ist Kubernetes meines Wissens das einzige Tool, das als Management-Software für Docker-Container fungiert. Kubernetes ist in fast allen Cloud-Anbietern wie Google Cloud, Azure und AWS gut integriert. Dadurch hat es eine standardisierte `yaml`-Syntax, was für kleine Entwickler großartig ist, da sie mit geringem Aufwand zwischen `The Big Three` wechseln können.
4141-4242-## tl;dr
4343-4444-Alles installieren und dann cert-manager anwenden. Ganz einfach.
4545-4646-```bash
4747-curl -sfL https://get.k3s.io | sh -s - \
4848- --flannel-backend=none \
4949- --disable-kube-proxy \
5050- --disable servicelb \
5151- --disable-network-policy \
5252- --disable traefik \
5353- --cluster-init
5454-5555-curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
5656-5757-helm repo add cilium https://helm.cilium.io/
5858-helm repo update
5959-helm install cilium cilium/cilium
6060-6161-CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
6262-CLI_ARCH=amd64
6363-curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz
6464-sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin
6565-rm cilium-linux-${CLI_ARCH}.tar.gz
6666-6767-cilium install \
6868- --set k8sServiceHost=${API_SERVER_IP} \
6969- --set k8sServicePort=6443 \
7070- --set kubeProxyReplacement=true
7171-7272-cilium status --wait
7373-7474-helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --set crds.enabled=true
7575-```
7676-7777-```yaml
7878-# cert-manager.yaml
7979-# secret-cloudflare.yaml
8080-apiVersion: v1
8181-kind: Secret
8282-metadata:
8383- name: cloudflare-api-key-secret
8484- namespace: cert-manager
8585-type: Opaque
8686-stringData:
8787- api-key: <Cloudflare API Token (not encrypted)>
8888----
8989-# cert-issuer.yaml
9090-apiVersion: cert-manager.io/v1
9191-kind: ClusterIssuer
9292-metadata:
9393- name: acme-issuer
9494- namespace: cert-manager
9595-spec:
9696- acme:
9797- email: <Email for updates>
9898- server: https://acme-v02.api.letsencrypt.org/directory
9999- privateKeySecretRef:
100100- name: acme-issuer
101101- solvers:
102102- - dns01:
103103- cloudflare:
104104- email: <Cloudflare account Email>
105105- apiTokenSecretRef:
106106- name: cloudflare-api-token-secret
107107- key: api-token
108108-```
109109-110110-## k3s installieren
111111-112112-Wie Hagen in [seinem Artikel](https://blog.stonegarden.dev/articles/2024/02/bootstrapping-k3s-with-cilium/) erklärt, möchten wir `k3s` ohne Konfigurationen und mit deaktivierten Komponenten installieren. Er beschreibt im Detail, welche Komponenten nicht installiert werden.
113113-114114-```bash
115115-curl -sfL https://get.k3s.io | sh -s - \
116116- --flannel-backend=none \
117117- --disable-kube-proxy \
118118- --disable servicelb \
119119- --disable-network-policy \
120120- --disable traefik \
121121- --cluster-init
122122-```
123123-124124-Nach der Installation sollten einige Pods laufen (3). Nicht schockiert sein, wenn die Pods im Status `ContainerCreating` oder `Pending` sind. Das liegt daran, dass die Pods nicht miteinander kommunizieren können, da wir das CNI deaktiviert haben (`--flannel-backend=none`). Später werden wir [Cilium](https://github.com/cilium) installieren, welches das Flannel-CNI ersetzen wird.
125125-126126-```bash
127127-kubectl get pods -A
128128-```
129129-130130-## Helm installieren
131131-132132-Helm ist der Paketmanager für [Kubernetes](https://github.com/kubernetes). Sie können es entweder direkt installieren (siehe die [Helm-Dokumentation](https://helm.sh/docs/intro/install/)) oder Teile von Helm verwenden, die mit Cilium ausgeliefert werden. Wir haben uns entschieden, Helm direkt zu installieren, was mit folgendem Befehl problemlos möglich ist:
133133-134134-```bash
135135-curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
136136-```
137137-138138-## Cilium installieren
139139-140140-[Cilium](https://github.com/cilium) ist eine Netzwerk- und Sicherheitssoftware für Kubernetes. Cilium ist sehr schnell, skalierbar und sicher, da es auf eBPF basiert -- einer revolutionären Technologie, die sandboxed Programme im Linux-Kernel ausführen kann, ohne den Kernel neu zu kompilieren oder Kernelmodule zu laden.
141141-142142-Wir könnten Cilium mit Helm wie hier gezeigt installieren:
143143-144144-```bash
145145-helm repo add cilium https://helm.cilium.io/
146146-helm repo update
147147-helm install cilium cilium/cilium
148148-```
149149-150150-Wir wollten es jedoch mit deren CLI installieren, und so funktioniert das. Zuerst installieren Sie die Cilium-CLI, indem Sie diesen Code-Schnipsel ausführen:
151151-152152-```bash
153153-CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
154154-CLI_ARCH=amd64
155155-curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz
156156-sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin
157157-rm cilium-linux-${CLI_ARCH}.tar.gz
158158-```
159159-160160-Anschließend können Sie Cilium mit Ihrer Server-IP-Adresse installieren:
161161-162162-```bash
163163-cilium install \
164164- --set k8sServiceHost=${API_SERVER_IP} \
165165- --set k8sServicePort=6443 \
166166- --set kubeProxyReplacement=true
167167-```
168168-169169-Jetzt warten wir, bis Cilium meldet, dass alles `OK` oder `disabled` ist:
170170-171171-```bash
172172-cilium status --wait
173173-```
174174-175175-Nach einer Weile sollten alle Pods im Status `Running` sein.
176176-177177-```bash
178178-kubectl get pods -A
179179-```
180180-181181-Zu guter Letzt können Sie einige Ressourcen für Cilium anwenden:
182182-183183-```yaml
184184-# announce.yaml
185185-apiVersion: cilium.io/v2alpha1
186186-kind: CiliumL2AnnouncementPolicy
187187-metadata:
188188- name: default-l2-announcement-policy
189189- namespace: kube-system
190190-spec:
191191- externalIPs: true
192192- loadBalancerIPs: true
193193-```
194194-195195-```yaml
196196-# ip-pool.yaml
197197-apiVersion: "cilium.io/v2alpha1"
198198-kind: CiliumLoadBalancerIPPool
199199-metadata:
200200- name: "first-pool"
201201-spec:
202202- blocks:
203203- - start: "192.168.0.240"
204204- stop: "192.168.0.249"
205205-```
206206-207207-Außerdem sollten Sie die Cilium-Konfiguration aktualisieren. Um dies mit den richtigen Werten zu tun, erstellen Sie zunächst diese Datei im Root-Verzeichnis, in dem Sie das k3s-Cluster verwalten möchten. Später können Sie auch einige hubble- und prometheus-bezogene Eigenschaften hinzufügen, wenn Sie [Grafana](https://github.com/Grafana) oder Ähnliches verwenden möchten (öffnen Sie die ausgeblendeten Zeilen, wenn Sie unsere Konfiguration ebenfalls verwenden möchten).
208208-209209-```yaml collapse={32-59}
210210-#cilium-config.yaml
211211-k8sServiceHost: 127.0.0.1
212212-k8sServicePort: 6443
213213-214214-kubeProxyReplacement: true
215215-l2announcements:
216216- enabled: true
217217-218218-externalIPs:
219219- enabled: true
220220-221221-k8sClientRateLimit:
222222- qps: 50
223223- burst: 200
224224-225225-operator:
226226- replicas: 1
227227- rollOutPods: true
228228- prometheus:
229229- enabled: true
230230-231231-rollOutCiliumPods: true
232232-233233-ingressController:
234234- enabled: true
235235- default: true
236236- loadbalancerMode: shared
237237- service:
238238- annotations:
239239- io.cilium/lb-ipam-ips: 192.168.0.240
240240-241241-hubble:
242242- relay:
243243- enabled: true
244244- ui:
245245- enabled: true
246246- metrics:
247247- serviceMonitor:
248248- enabled: true
249249- enableOpenMetrics: true
250250- enabled:
251251- - dns
252252- - drop
253253- - tcp
254254- - icmp
255255- - port-distribution
256256- - "flow:sourceContext=workload-name|reserved-identity;destinationContext=workload-name|reserved-identity"
257257- - "kafka:labelsContext=source_namespace,source_workload,destination_namespace,destination_workload,traffic_direction;sourceContext=workload-name|reserved-identity;destinationContext=workload-name|reserved-identity"
258258- - "httpV2:exemplars=true;labelsContext=source_ip,source_namespace,source_workload,destination_ip,destination_namespace,destination_workload,traffic_direction;sourceContext=workload-name|reserved-identity;destinationContext=workload-name|reserved-identity"
259259- dashboards:
260260- enabled: true
261261- namespace: monitoring
262262- annotations:
263263- grafana_folder: "Hubble"
264264-265265-prometheus:
266266- enabled: true
267267- serviceMonitor:
268268- enabled: true
269269-```
270270-271271-Führen Sie diesen Befehl aus, um ein Upgrade durchzuführen:
272272-273273-```bash
274274-cilium upgrade -f cilium-config.yaml
275275-```
276276-277277-## Zertifikatsmanager mit Cloudflare einrichten
278278-279279-Um in der Lage zu sein, Zertifikate für jede Subdomain zu erstellen, ist es wichtig, einen Zertifikatsaussteller anzuwenden, der Zertifikatsanfragen bearbeitet und sie bei einem Anbieter einlöst. Wir haben [Cloudflare](https://github.com/cloudflare) als unseren Aussteller gewählt, und hier ist die Konfiguration, die Sie auf Ihr Kubernetes-Cluster anwenden müssen. Weitere Informationen finden Sie in der [cert-manager-Dokumentation](https://cert-manager.io/docs/configuration/acme/dns01/cloudflare/).
280280-281281-Zuerst müssen wir den cert-manager installieren, indem wir den folgenden Befehl ausführen:
282282-283283-```bash
284284-helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --set crds.enabled=true
285285-```
286286-287287-```yaml
288288-# cert-issuer.yaml
289289-apiVersion: cert-manager.io/v1
290290-kind: ClusterIssuer
291291-metadata:
292292- name: acme-issuer
293293- namespace: cert-manager
294294-spec:
295295- acme:
296296- email: <Email for updates>
297297- server: https://acme-v02.api.letsencrypt.org/directory
298298- privateKeySecretRef:
299299- name: acme-issuer
300300- solvers:
301301- - dns01:
302302- cloudflare:
303303- email: <Cloudflare account Email>
304304- apiTokenSecretRef:
305305- name: cloudflare-api-token-secret
306306- key: api-token
307307-```
308308-309309-Sie können eine Datei auf den [Kubernetes](https://github.com/kubernetes)-Cluster anwenden, indem Sie diesen k8s- (oder k3s-) Befehl ausführen:
310310-311311-```bash
312312-kubectl apply -f cluster-issuer.yaml
313313-```
314314-315315-Wenn Sie die Ressource im Kubernetes-Cluster löschen möchten, ist der Befehl ziemlich einfach:
316316-317317-```bash
318318-kubectl delete -f cluster-issuer.yaml
319319-```
320320-321321-Wie Sie oben vielleicht bemerkt haben, benötigen wir auch ein Geheimnis für das API-Token, das die Authentifizierung durchführt, dass dieser Issuer berechtigt ist, Zertifikate anzufordern. Daher erstellen wir ein Geheimnis mit einem unverschlüsselten `API Token` von Cloudflare.
322322-323323-Heutzutage erstellen wir ein Token, indem wir zu Ihrem [Cloudflare](https://github.com/cloudflare)-Dashboard gehen, dann auf Ihr Profil klicken und die Registerkarte `API Tokens` auswählen. Hier können Sie ein spezifisches Token für Ihren Issuer generieren oder den globalen API-Schlüssel (nicht mehr empfohlen) verwenden. Die empfohlene Lösung ist, ein API-Token mit zwei Berechtigungen (benutzerdefiniertes Token) zu erstellen:
324324-325325-* Zone - DNS - Bearbeiten
326326-* Zone - Zone - Lesen
327327-328328-
329329-330330-Eine detailliertere Beschreibung der Tokens finden Sie in den [Cloudflare-Dokumenten](https://developers.cloudflare.com/fundamentals/api/get-started/create-token/).
331331-332332-Nachdem Sie dieses Geheimnis auf Kubernetes angewendet haben, sollte der Issuer bereit sein, unangenehme Fälle zu lösen!
333333-334334-```yaml
335335-# secret-cloudflare.yaml
336336-apiVersion: v1
337337-kind: Secret
338338-metadata:
339339- name: cloudflare-api-key-secret
340340- namespace: cert-manager
341341-type: Opaque
342342-stringData:
343343- api-key: <Cloudflare API Token (not encrypted)>
344344-```
345345-346346-Sie können diesen Issuer jetzt verwenden, indem Sie diese Datei anwenden, die hoffentlich ein Zertifikat erstellt:
347347-348348-```yaml
349349-# mutanuq-certificat.yaml
350350-apiVersion: cert-manager.io/v1
351351-kind: Certificate
352352-metadata:
353353- name: mutanuq
354354- namespace: mutanuq
355355-spec:
356356- secretName: mutanuq
357357- issuerRef:
358358- name: acme-issuer
359359- kind: ClusterIssuer
360360- dnsNames:
361361- - "mutanuq.trueberryless.org"
362362-```
363363-364364-Normalerweise dauert es etwa 90 Sekunden, um die Anfrage nach dem Anwenden zu authentifizieren. Sie können den aktuellen Status der Anfrage überprüfen, indem Sie diesen Kubernetes-Befehl ausführen.
365365-Wenn es länger als 2 Minuten dauert, können möglicherweise einige Tipps unter [#Fehlerbehebung](#no-cloudflare-certificate-approval) hilfreich sein.
366366-367367-```bash
368368-kubectl describe certificaterequests.cert-manager.io -n mutanuq
369369-```
370370-371371-:::tip
372372-Die Option `-n` steht für Namespace.
373373-:::
374374-375375-## Beispielanwendung [`mutanuq`](https://mutanuq.trueberryless.org)
376376-377377-Dann können Sie dieses Zertifikat in Ihrem Ingress-Controller verwenden:
378378-379379-```yaml collapse={1-42} {61-64}
380380-# mutanuq.yaml
381381-apiVersion: apps/v1
382382-kind: Deployment
383383-metadata:
384384- name: mutanuq
385385- namespace: mutanuq
386386- labels:
387387- app: mutanuq
388388- annotations:
389389- keel.sh/policy: all
390390- keel.sh/trigger: poll
391391- keel.sh/pollSchedule: "@every 10s"
392392- keel.sh/releaseNotes: "https://github.com/trueberryless-org/mutanuq/releases"
393393-spec:
394394- replicas: 3
395395- selector:
396396- matchLabels:
397397- app: mutanuq
398398- template:
399399- metadata:
400400- labels:
401401- app: mutanuq
402402- spec:
403403- containers:
404404- - name: mutanuq
405405- image: trueberryless/mutanuq
406406- imagePullPolicy: Always
407407----
408408-apiVersion: v1
409409-kind: Service
410410-metadata:
411411- name: mutanuq
412412- namespace: mutanuq
413413- annotations:
414414- cert-manager.io/issuer: acme-issuer
415415-spec:
416416- selector:
417417- app: mutanuq
418418- ports:
419419- - name: http
420420- port: 80
421421----
422422-apiVersion: networking.k8s.io/v1
423423-kind: Ingress
424424-metadata:
425425- name: mutanuq
426426- namespace: mutanuq
427427-spec:
428428- rules:
429429- - host: mutanuq.trueberryless.org
430430- http:
431431- paths:
432432- - path: /
433433- pathType: Prefix
434434- backend:
435435- service:
436436- name: mutanuq
437437- port:
438438- number: 80
439439-440440- tls:
441441- - hosts:
442442- - mutanuq.trueberryless.org
443443- secretName: mutanuq
444444-```
445445-446446-## Einrichtung von Keel
447447-448448-Wir wollten schon immer eine saubere Continuous Integration (CI) und Continuous Delivery (CD) Lösung für unsere Websites. Das bedeutet, dass eine spezifische Commit-Nachricht einen automatisierten Prozess über [GitHub](https://github.com/github), Docker Hub und unseren Server auslösen sollte, der am Ende die entsprechende Website nach etwa zwei Minuten aktualisiert.
449449-450450-Keel ist ein robustes Software-Tool, das diese Funktion für Kubernetes ermöglicht. Wir haben Keel verwendet, um neue Docker-Images von Docker Hub durch regelmäßige Abfragen zu holen. Außerdem bietet Keel ein schönes Dashboard, auf dem Sie die Abfragen steuern können.
451451-452452-Um Keel mit dem Administrations-Dashboard einzurichten, haben wir folgende Dateien erstellt:
453453-454454-* `secret-dashboard.yaml` für den Admin-Benutzernamen und das Passwort (nicht jeder sollte auf das Dashboard zugreifen können)
455455-* `keel.yaml` für die eigentlichen k3s-Konfigurationen (kopiert und angepasst von [KeelHQ](https://github.com/keel-hq/keel/blob/9f0a7160bbdc3a107ad148933a4269f30e4e479c/deployment/deployment-template.yaml))
456456-457457-```yaml
458458-# secret-dashboard.yaml
459459-apiVersion: v1
460460-kind: Secret
461461-metadata:
462462- name: keel-dashboard-secrets
463463- namespace: keel
464464-type: Opaque
465465-stringData:
466466- username: <username>
467467- password: <password>
468468-```
469469-470470-```yaml {157-160,162-165} collapse={1-155, 166-194}
471471-# keel.yaml
472472----
473473-apiVersion: v1
474474-kind: Namespace
475475-metadata:
476476- name: keel
477477-478478----
479479-apiVersion: v1
480480-kind: ServiceAccount
481481-metadata:
482482- name: keel
483483- namespace: keel
484484- labels:
485485- app: keel
486486-487487----
488488-apiVersion: rbac.authorization.k8s.io/v1
489489-kind: ClusterRole
490490-metadata:
491491- name: keel
492492-rules:
493493- - apiGroups:
494494- - ""
495495- resources:
496496- - namespaces
497497- verbs:
498498- - watch
499499- - list
500500- - apiGroups:
501501- - ""
502502- resources:
503503- - secrets
504504- verbs:
505505- - get
506506- - watch
507507- - list
508508- - apiGroups:
509509- - ""
510510- - extensions
511511- - apps
512512- - batch
513513- resources:
514514- - pods
515515- - replicasets
516516- - replicationcontrollers
517517- - statefulsets
518518- - deployments
519519- - daemonsets
520520- - jobs
521521- - cronjobs
522522- verbs:
523523- - get
524524- - delete # required to delete pods during force upgrade of the same tag
525525- - watch
526526- - list
527527- - update
528528- - apiGroups:
529529- - ""
530530- resources:
531531- - configmaps
532532- - pods/portforward
533533- verbs:
534534- - get
535535- - create
536536- - update
537537-538538----
539539-apiVersion: rbac.authorization.k8s.io/v1
540540-kind: ClusterRoleBinding
541541-metadata:
542542- name: keel
543543-roleRef:
544544- apiGroup: rbac.authorization.k8s.io
545545- kind: ClusterRole
546546- name: keel
547547-subjects:
548548- - kind: ServiceAccount
549549- name: keel
550550- namespace: keel
551551-552552----
553553-apiVersion: networking.k8s.io/v1
554554-kind: Ingress
555555-metadata:
556556- name: keel
557557- namespace: keel
558558-spec:
559559- rules:
560560- - host: keel.trueberryless.org
561561- http:
562562- paths:
563563- - path: /
564564- pathType: Prefix
565565- backend:
566566- service:
567567- name: keel
568568- port:
569569- number: 9300
570570-571571- tls:
572572- - hosts:
573573- - keel.trueberryless.org
574574- secretName: keel
575575-576576----
577577-apiVersion: v1
578578-kind: Service
579579-metadata:
580580- name: keel
581581- namespace: keel
582582- labels:
583583- app: keel
584584-spec:
585585- type: LoadBalancer
586586- ports:
587587- - port: 9300
588588- targetPort: 9300
589589- protocol: TCP
590590- name: keel
591591- selector:
592592- app: keel
593593- sessionAffinity: None
594594-595595----
596596-apiVersion: apps/v1
597597-kind: Deployment
598598-metadata:
599599- name: keel
600600- namespace: keel
601601- labels:
602602- app: keel
603603-spec:
604604- replicas: 1
605605- selector:
606606- matchLabels:
607607- app: keel
608608- template:
609609- metadata:
610610- labels:
611611- app: keel
612612- spec:
613613- serviceAccountName: keel
614614- containers:
615615- - name: keel
616616- # Note that we use appVersion to get images tag.
617617- image: "keelhq/keel:latest"
618618- imagePullPolicy: Always
619619- command: ["/bin/keel"]
620620- env:
621621- - name: NAMESPACE
622622- valueFrom:
623623- fieldRef:
624624- fieldPath: metadata.namespace
625625- # Basic auth (to enable UI/API)
626626- - name: BASIC_AUTH_USER
627627- valueFrom:
628628- secretKeyRef:
629629- name: keel-dashboard-secrets
630630- key: username
631631- - name: BASIC_AUTH_PASSWORD
632632- valueFrom:
633633- secretKeyRef:
634634- name: keel-dashboard-secrets
635635- key: password
636636- ports:
637637- - containerPort: 9300
638638- livenessProbe:
639639- httpGet:
640640- path: /healthz
641641- port: 9300
642642- initialDelaySeconds: 30
643643- timeoutSeconds: 10
644644- resources:
645645- limits:
646646- cpu: 100m
647647- memory: 128Mi
648648- requests:
649649- cpu: 50m
650650- memory: 64Mi
651651-652652----
653653-# Source: keel/templates/pod-disruption-budget.yaml
654654-655655-apiVersion: policy/v1
656656-kind: PodDisruptionBudget
657657-metadata:
658658- name: keel
659659- namespace: keel
660660-spec:
661661- maxUnavailable: 1
662662- selector:
663663- matchLabels:
664664- app: keel
665665-```
666666-667667-Nachdem beide Dateien angewendet und das zusätzliche Zertifikat für `keel.trueberryless.org` verwaltet wurden, funktioniert das Keel-Dashboard perfekt. Darüber hinaus kann jedes Kubernetes-`Deployment` für automatisiertes Docker-Hub-Polling durch Setzen einiger Annotationen aktiviert werden:
668668-669669-```yaml {8-12} collapse={15-63}
670670-apiVersion: apps/v1
671671-kind: Deployment
672672-metadata:
673673- name: mutanuq
674674- namespace: mutanuq
675675- labels:
676676- app: mutanuq
677677- annotations:
678678- keel.sh/policy: all
679679- keel.sh/trigger: poll
680680- keel.sh/pollSchedule: "@every 1m"
681681- keel.sh/releaseNotes: "https://github.com/trueberryless-org/mutanuq/releases"
682682-spec:
683683- replicas: 1
684684- selector:
685685- matchLabels:
686686- app: mutanuq
687687- template:
688688- metadata:
689689- labels:
690690- app: mutanuq
691691- spec:
692692- containers:
693693- - name: mutanuq
694694- image: trueberryless/mutanuq
695695- imagePullPolicy: Always
696696----
697697-apiVersion: v1
698698-kind: Service
699699-metadata:
700700- name: mutanuq
701701- namespace: mutanuq
702702- annotations:
703703- cert-manager.io/issuer: acme-issuer
704704-spec:
705705- selector:
706706- app: mutanuq
707707- ports:
708708- - name: http
709709- port: 80
710710----
711711-apiVersion: networking.k8s.io/v1
712712-kind: Ingress
713713-metadata:
714714- name: mutanuq
715715- namespace: mutanuq
716716-spec:
717717- rules:
718718- - host: mutanuq.trueberryless.org
719719- http:
720720- paths:
721721- - path: /
722722- pathType: Prefix
723723- backend:
724724- service:
725725- name: mutanuq
726726- port:
727727- number: 80
728728-729729- tls:
730730- - hosts:
731731- - mutanuq.trueberryless.org
732732- secretName: mutanuq
733733-```
734734-735735-## Feiern Sie mit einem Kaffee!
736736-737737-Herzlichen Glückwunsch, Sie haben erfolgreich [Kubernetes](https://github.com/kubernetes) mit [Cilium](https://github.com/cilium) und [Cloudflare](https://github.com/cloudflare) eingerichtet! Sie haben sich eine Kaffeepause verdient. Genießen Sie eine wohlverdiente Tasse, und wenn Sie mit mir virtuell einen Kaffee teilen möchten, können Sie meine Arbeit gerne auf [Ko-fi](https://ko-fi.com/trueberryless) unterstützen. Vielen Dank!
738738-739739-## Fehlerbehebung
740740-741741-### Cilium-Ingress hat keine External-IP
742742-743743-Stellen Sie sicher, dass der `ip-pool` die in der Datei `config.yaml` angegebenen Adressen enthält.
744744-745745-```yaml
746746-# ip-pool.yaml
747747-apiVersion: "cilium.io/v2alpha1"
748748-kind: CiliumLoadBalancerIPPool
749749-metadata:
750750- name: "first-pool"
751751-spec:
752752- blocks:
753753- - start: "192.168.0.240" # 240 included for ingress
754754- stop: "192.168.0.249"
755755-```
756756-757757-```yaml
758758-#cilium-config.yaml
759759-ingressController:
760760- enabled: true
761761- default: true
762762- loadbalancerMode: shared
763763- service:
764764- annotations:
765765- io.cilium/lb-ipam-ips: 192.168.0.240 # this must be within range
766766-```
767767-768768-:::note
769769-In einigen Fällen nehmen andere Ingress-Controller die annotierte Adresse, bevor der Cilium IC darauf zugreifen kann, sodass sie weiterhin ausstehend ist...
770770-:::
771771-772772-Wenn Sie nicht lokal, sondern auf einer der `Big Three` bereitstellen, schauen Sie bitte in andere Dokumentationen nach, warum die External IP weiterhin ausstehend ist. Es liegt meistens in deren Verantwortung, Ihnen eine Adresse bereitzustellen.
773773-774774-### Keine Cloudflare-Zertifikatsgenehmigung
775775-776776-Es kann Probleme geben, wenn das Zertifikat von Cloudflare nicht genehmigt wird.
777777-778778-#### Falsches API-Token
779779-780780-Stellen Sie zunächst sicher, dass das Cloudflare API-Token korrekt ist. Erstellen Sie zur hundertprozentigen Sicherheit ein neues und fügen Sie es (nicht Base64-codiert) in diese Datei ein:
781781-782782-```yaml
783783-apiVersion: v1
784784-kind: Secret
785785-metadata:
786786- name: cloudflare-api-key-secret
787787- namespace: cert-manager
788788-type: Opaque
789789-stringData:
790790- api-key: <Cloudflare API Token (not encrypted)>
791791-```
792792-793793-#### Maximale Authentifizierungsfehler erreicht
794794-795795-Wir sind einmal auf den Fehler `Error: 9109: Max auth failures reached, please check your Authorization header.` gestoßen. Warten Sie einfach ein paar Stunden, löschen Sie die Ressource und wenden Sie sie erneut an:
796796-797797-```bash
798798-kubectl delete -f certificate.yaml
799799-kubectl apply -f certificate.yaml
800800-```
801801-802802-Hoffentlich können Sie jetzt loslegen!
···11----
22-title: Wie man Starlight-Sidebars vollständig automatisch erstellt (ohne die
33- Kontrolle zu verlieren)
44-description: Erfahren Sie zwei Starlight-Techniken, um große Sidebars
55- automatisch zu erstellen und dabei saubere URLs und Beschriftungen
66- beizubehalten.
77-date: 2025-08-17
88-tags:
99- - Education
1010- - Starlight
1111-authors:
1212- - trueberryless
1313-cover:
1414- alt: A beautiful cover image with the text "Auto Sidebar"
1515- image: ../../../../../public/blog/starlight-autogenerate-whole-sidebar.jpg
1616-1717----
1818-1919-import { FileTree } from '@astrojs/starlight/components';
2020-2121-Haben Sie jemals versucht, die Generierung von Sidebars in Ihrem Starlight-Projekt zu vereinfachen? Haben Sie versucht, die gesamte Sidebar automatisch zu erstellen, nur um festzustellen, dass Sie die Struktur nicht nach Ihren Wünschen anpassen können?
2222-2323-Dieser Beitrag zeigt zwei Starlight-Funktionen, die es ermöglichen, vollständig automatisch generierte Sidebars flexibel zu gestalten und den Wartungsaufwand zu reduzieren.
2424-2525-{/* excerpt */}
2626-2727-## Anwendungsfall
2828-2929-In mittelgroßen bis großen Starlight-Projekten stellt sich das Problem, dass die manuelle Erstellung und Pflege der [Starlight-Sidebar-Konfiguration](https://starlight.astro.build/reference/configuration/#sidebar) eine mühsame und zeitaufwändige Aufgabe ist.
3030-3131-In der Vergangenheit bot Starlight nicht die richtigen Grundfunktionen dafür, und der empfohlene Ansatz bestand darin, die automatische Erstellung der Sidebar-Konfiguration um eine Ebene tiefer zu verschieben - sodass nur Ordner ohne verschachtelte Unterordner automatisch generiert wurden. Mit der Einführung von [Route Data](https://starlight.astro.build/guides/route-data/) und dem jüngeren [`generateId()`-Hook im `docsLoader`](https://starlight.astro.build/reference/configuration/#generateid) können diese Szenarien nun jedoch viel einfacher und effizienter gelöst werden.
3232-3333-## Das Sortierungsproblem lösen
3434-3535-Ein häufiges Problem war immer: „Wie kann ich die Reihenfolge der Sidebar-Ordner anpassen, wenn ich die Sidebar automatisch generiere?“ Alte Probleme wie [#1223](https://github.com/withastro/starlight/issues/1223) schlagen eine Lösung vor, die von [Nuxt Content](https://content.nuxt.com) inspiriert ist, bei der jeder Abschnitt des gesamten Pfads [mit Zahlen + Punkten vorangestellt](https://v2.content.nuxt.com/usage/content-directory#ordering) werden kann, um eine nummerische Sortierung auf Dateibasis festzulegen. Ein Beispiel für ein solches Projekt könnte so aussehen:
3636-3737-<FileTree>
3838- * src/content/docs/nested-folder
3939- * 1.frameworks
4040- * 1.vue.md
4141- * 2.nuxt.md
4242- * 2.examples
4343- * 1.vercel.md
4444- * 2.netlify.md
4545-</FileTree>
4646-4747-Wenn Sie diesen Ansatz in Starlight verwenden möchten, funktioniert er nicht sofort, aber mit einer einfachen Einrichtung können Sie ihn umsetzen.
4848-4949-Starlight [0.35.0](https://github.com/withastro/starlight/releases/tag/%40astrojs%2Fstarlight%400.35.0) führte eine Callback-Funktion ein, die Sie an `docsLoader()` übergeben können, um die ID (URL) der generierten Seite zu manipulieren. Indem Sie den Eintrag durch `"/"` aufteilen und jede Zahl + Punkt auf Segmentebene entfernen, haben Sie nun die gleiche Funktionalität in Starlight:
5050-5151-```ts {6-7,12-19}
5252-// src/content.config.ts
5353-import { defineCollection } from "astro:content";
5454-import { docsLoader } from "@astrojs/starlight/loaders";
5555-import { docsSchema } from "@astrojs/starlight/schema";
5656-5757-const leadingNumberAndDotRegEx = /^\d+\./;
5858-const fileExtensionRegEx = /\.(md|mdx)$/;
5959-6060-export const collections = {
6161- docs: defineCollection({
6262- loader: docsLoader({
6363- // Remove file extension and
6464- // leading numbers + dot from each segment
6565- generateId: ({ entry }) =>
6666- entry
6767- .replace(fileExtensionRegEx, "")
6868- .split("/")
6969- .map((segment) => segment.replace(leadingNumberAndDotRegEx, ""))
7070- .join("/"),
7171- }),
7272- schema: docsSchema(),
7373- }),
7474-};
7575-7676-```
7777-7878-Die URL zum Zugriff auf die Seiten ändert sich nun z. B. von `/nested-folder/1.frameworks/1.vue` zu `/nested-folder/frameworks/vue`.
7979-8080-Allerdings enthalten die Ordnernamen in der Sidebar immer noch die `1.`-Präfixe. Lassen Sie uns also auch die Manipulation der Sidebar lösen:
8181-8282-## Das Problem der Ordnerbenennung in der Sidebar lösen
8383-8484-Starlight [0.32.0](https://github.com/withastro/starlight/releases/tag/%40astrojs%2Fstarlight%400.32.0) führte [Route Data](https://starlight.astro.build/guides/route-data/) ein, das wir jetzt nutzen können, um die Ordnernamen in der Sidebar zu manipulieren:
8585-8686-1. das Entfernen jeder führenden Zahl + Punkt aus dem Ordnernamen und
8787-2. die Anwendung von "Title Case", damit sie nicht vollständig kleingeschrieben erscheinen
8888-8989-```ts
9090-// src/routeData.ts
9191-import { defineRouteMiddleware } from "@astrojs/starlight/route-data";
9292-9393-const leadingNumberAndDotRegEx = /^\d+\./;
9494-const wordSplitterRegEx = /\w\S*/g;
9595-9696-function toTitleCase(str: string) {
9797- return str.replace(wordSplitterRegEx, (word) => {
9898- return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
9999- });
100100-}
101101-102102-function cleanGroupLabels(entries: any[]) {
103103- for (const entry of entries) {
104104- if (entry.type === "group") {
105105- // Remove leading number + dot
106106- let label = entry.label.replace(leadingNumberAndDotRegEx, "");
107107- // Convert to Title Case
108108- entry.label = toTitleCase(label);
109109- // Recurse into children
110110- cleanGroupLabels(entry.entries);
111111- }
112112- }
113113-}
114114-115115-export const onRequest = defineRouteMiddleware((context) => {
116116- const { sidebar } = context.locals.starlightRoute;
117117- cleanGroupLabels(sidebar);
118118-});
119119-```
120120-121121-:::note[Internationalisierung (i18n)]
122122-Beachten Sie, dass die [Internationalisierung (i18n) von Ordnernamen](https://starlight.astro.build/guides/sidebar/#internationalization) bei einem solchen Setup eine fehlende Funktionalität ist, da es derzeit keinen Ort gibt, an dem Übersetzungen von Ordnernamen definiert werden können. Sie werden einfach in Title Case umgewandelt. Die Implementierung einer Logik zum dynamischen Laden von Übersetzungen könnte darin bestehen, das [`locale`-Feld aus den Routeninformationen](https://starlight.astro.build/reference/route-data/#locale) zu lesen und Übersetzungen in `json`-Dateien zu definieren. Andernfalls können Sie [HiDeoos Plugin verwenden](#using-hideoos-plugin), das [i18n unterstützt](https://starlight-auto-sidebar.netlify.app/guides/i18n/).
123123-:::
124124-125125-Vergessen Sie nicht, die Datei `routeData.ts` zu Ihrer `astro.config.mjs` hinzuzufügen:
126126-127127-```ts ins={11}
128128-// astro.config.mjs
129129- starlight({
130130- title: "Autogenerate whole sidebar",
131131- social: [{ icon: "github", label: "GitHub", href: "https://github.com/withastro/starlight" }],
132132- sidebar: [
133133- {
134134- label: "Root Folder",
135135- autogenerate: { directory: "nested-folder" },
136136- },
137137- ],
138138- routeMiddleware: "./src/routeData.ts",
139139- }),
140140-```
141141-142142-Natürlich können Sie den Code an Ihre Bedürfnisse anpassen (z. B. die "Title Case"-Transformation entfernen, da Ihre Dateinamen bereits korrekt geschrieben sind).
143143-144144-## Das Plugin von HiDeoo verwenden
145145-146146-Wenn Sie Ihre gesamte Sidebar automatisch generieren und dennoch die Flexibilität haben möchten, alles nach Ihren Wünschen anzupassen, hat [HiDeoo](https://github.com/HiDeoo) auch ein dediziertes Plugin für solche Anwendungsfälle erstellt: [Starlight Auto Sidebar](https://starlight-auto-sidebar.netlify.app).
147147-148148-Insbesondere wurden diese zwei Funktionen in diesem Artikel erwähnt:
149149-150150-* Die Steuerung der [Reihenfolge](https://starlight-auto-sidebar.netlify.app/metadata/#order) einzelner Verzeichnisse
151151-* Die Anpassung der [angezeigten Beschriftung](https://starlight-auto-sidebar.netlify.app/metadata/#label) einzelner Ordner
152152-153153-Wenn Sie jedoch die gesamte automatische Generierung durchführen möchten, ohne für jedes Verzeichnis manuell Beschriftungen und Reihenfolgen festlegen zu müssen, ist es bevorzugt und empfohlen, die Lösung selbst zu programmieren (mit einigen Richtlinien in diesem Blog).
154154-155155-Wenn Sie den in diesem Blog vorgestellten Code ausprobieren möchten, besuchen Sie gerne die [StackBlitz](https://stackblitz.com/github/trueberryless/starlight-autogenerate-whole-sidebar?file=src%2Fcontent.config.ts) oder den Quellcode im [GitHub-Repo](https://github.com/trueberryless/starlight-autogenerate-whole-sidebar).
···11----
22-title: Eine stilvolle Möglichkeit, Anerkennung in Starlight-Projekten zu geben
33-date: 2024-11-12
44-description: Inspiriert von der Starlight-Anerkennung in den
55- Astro-Dokumentationen habe ich ein anpassbares Plugin entwickelt, das Links zu
66- Starlight, Astro und dem Starlight Blog bietet, mit Unterstützung für mehrere
77- Sprachen.
88-excerpt: Starlight Cooler Credit ist ein anpassbares Plugin, das stilvolle,
99- mehrsprachige Anerkennungslinks zu Starlight, Astro und dem Starlight Blog
1010- bietet – und damit eine kleine Idee in eine globale Zusammenarbeit verwandelt.
1111-tags:
1212- - Starlight
1313- - Plugins
1414-authors:
1515- - trueberryless
1616-cover:
1717- alt: A beautiful cover image with the text "Cooler Credit"
1818- image: ../../../../../public/blog/starlight-cooler-credit.jpg
1919-2020----
2121-2222-Alles begann, als mir der Anerkennungslink zu [Starlight](https://starlight.astro.build) in den [Astro-Dokumentationen](https://docs.astro.build) auffiel. Am unteren Ende des Inhaltsverzeichnisses positioniert, war er einfach, aber stilvoll, und ich liebte, wie subtil er Anerkennung gab. Als Starlight seine eigene Anerkennungsoption einführte, aktivierte ich sie in all meinen Projekten. Sie war klein, unaufdringlich und am unteren Ende jeder Seite platziert – nett, aber leicht zu übersehen.
2323-2424-Da dachte ich, *Was ist, wenn andere eine coolere Anerkennungsoption möchten, wie die aus den Astro-Dokumentationen?* Also machte ich mich daran, ein Plugin zu erstellen. Anfangs war es nur ein spaßiges Projekt, um auf auffälligere Weise Links zu Starlight und Astro bereitzustellen. Ich begann mit zwei Voreinstellungen – eine für Starlight und eine für Astro – und teilte meine Arbeit auf dem Astro-Discord.
2525-2626-Und dort nahm alles Fahrt auf. [Ein großartiger Astro-Maintainer](https://www.rainsberger.ca/) schlug vor, *"Warum nicht auch den Starlight-Blog verlinken?"* und ich dachte, *Was für eine brillante Idee!* Ich fügte den Blog als dritte Voreinstellung hinzu, und plötzlich war das Plugin mehr, als ich je geplant hatte.
2727-2828-Aber ich war noch nicht fertig. Es störte mich, dass die Anerkennung immer auf Englisch war, also beschloss ich, sie automatisch anhand der von Starlight unterstützten Sprachen übersetzen zu lassen. Da begann das eigentliche Abenteuer. Ich wandte mich an die Community, um Hilfe bei der Übersetzung des Plugins in verschiedene Sprachen zu erhalten. Die Resonanz war unglaublich! Menschen aus der ganzen Welt boten ihre Unterstützung an, und was als Solo-Projekt begann, wurde zu einer globalen Zusammenarbeit. Unterwegs fand ich neue Freunde und lernte so viel von allen Beteiligten. Jetzt unterstützt das Plugin etwa zehn Sprachen, und es kommen immer mehr Übersetzungen hinzu.
2929-3030-Was als einfache Idee begann, wurde zu etwas, auf das ich wirklich stolz bin: **Starlight Cooler Credit**. Es ist mehr als nur ein Plugin – es ist eine Möglichkeit, Anerkennung mit Stil, Anpassungsfähigkeit und einem Hauch von globaler Teamarbeit zu geben.
3131-3232-Wenn du neugierig bist, kannst du es dir unter [starlight-cooler-credit.trueberryless.org](https://starlight-cooler-credit.trueberryless.org/) ansehen. Probier es aus – ich denke, du wirst es genauso lieben wie ich!
···11----
22-title: Starlight Themen-Dropdown und Liste zusammen
33-description: Erfahren Sie, wie Sie eine Desktop-Liste und ein mobiles
44- Dropdown-Menü für die Starlight-Sidebar-Themen kombinieren.
55-date: 2025-05-13
66-tags:
77- - Starlight
88- - Plugins
99- - CSS
1010- - Education
1111-excerpt: Kombinieren Sie zwei <a class="gh-badge"
1212- href="https://github.com/withastro/starlight"><img src="/starlight.png"
1313- alt="Starlight" />Starlight</a> Sidebar Topics Plugins, um eine Themenliste
1414- auf dem Desktop und ein Dropdown-Menü in der mobilen Sidebar anzuzeigen.
1515-authors:
1616- - hideoo
1717- - trueberryless
1818-cover:
1919- alt: A beautiful cover image with the text "Dropdown and List?"
2020- image: ../../../../../public/blog/starlight-dropdown-and-list-together.jpg
2121-2222----
2323-2424-import { Tabs, TabItem } from "@astrojs/starlight/components";
2525-2626-Mit dem [Starlight Sidebar Topics](https://github.com/hideoo/starlight-sidebar-topics) Plugin zusammen mit der [Starlight Sidebar Topics Dropdown](https://github.com/trueberryless-org/starlight-sidebar-topics-dropdown) Komponente können Sie eine Website erstellen, die eine Themenliste auf dem Desktop und ein Dropdown-Menü auf mobilen Geräten bietet.
2727-2828-## Voraussetzungen
2929-3030-Sie benötigen eine bestehende Starlight-Website.
3131-3232-## Pakete installieren
3333-3434-Zuerst installieren Sie das `starlight-sidebar-topics` Plugin sowie die `starlight-sidebar-topics-dropdown` Komponente:
3535-3636-<Tabs syncKey="pkg">
3737- <TabItem label="npm">
3838- ```bash
3939- npm install starlight-sidebar-topics starlight-sidebar-topics-dropdown
4040- ```
4141- </TabItem>
4242-4343- <TabItem label="pnpm">
4444- ```bash
4545- pnpm add starlight-sidebar-topics starlight-sidebar-topics-dropdown
4646- ```
4747- </TabItem>
4848-4949- <TabItem label="Yarn">
5050- ```bash
5151- yarn add starlight-sidebar-topics starlight-sidebar-topics-dropdown
5252- ```
5353- </TabItem>
5454-</Tabs>
5555-5656-Anschließend folgen Sie den Einrichtungsanleitungen von [Starlight Sidebar Topics](https://starlight-sidebar-topics.trueberryless.org/docs/getting-started/#installation) und [Starlight Sidebar Topics Dropdown](https://starlight-sidebar-topics-dropdown.trueberryless.org/docs/getting-started/#installation).
5757-5858-## Die Sidebar-Komponente anpassen
5959-6060-In der Einrichtungsanleitung der Dropdown-Komponente haben Sie eine Sidebar-Komponente erstellt, die nur das Dropdown-Menü rendert. Nun müssen Sie diese Komponente anpassen, sodass sie auch die Standard-Sidebar rendert, wenn der Benutzer am Desktop ist.
6161-6262-```astro
6363----
6464-// src/components/Sidebar.astro
6565-import Default from '@astrojs/starlight/components/Sidebar.astro';
6666-import Topics from 'starlight-sidebar-topics/components/Sidebar.astro';
6767-import TopicsDropdown from 'starlight-sidebar-topics-dropdown/TopicsDropdown.astro';
6868----
6969-7070-<div class="topics">
7171- <Topics/>
7272-</div>
7373-<div class="topics-dropdown">
7474- <TopicsDropdown/>
7575-</div>
7676-<Default><slot /></Default>
7777-7878-<style>
7979- /* Hide topics by default and show them on medium screens and larger */
8080- .topics {
8181- display: none;
8282- }
8383-8484- @media (min-width: 800px) {
8585- .topics {
8686- display: block;
8787- }
8888- }
8989-9090- /* Show topics dropdown on small screens and hide it on medium screens and larger */
9191- .topics-dropdown {
9292- display: block;
9393- }
9494-9595- @media (min-width: 800px) {
9696- .topics-dropdown {
9797- display: none;
9898- }
9999- }
100100-</style>
101101-```
102102-103103-## Ergebnis
104104-105105-Wenn Sie diese Schritte befolgen, sieht Ihre Sidebar folgendermaßen aus:
106106-107107-
108108-109109-Den vollständigen Quellcode dieser Anleitung finden Sie in diesem [StackBlitz-Beispiel](https://stackblitz.com/edit/withastro-starlight-qgraahmp?file=astro.config.mjs).
110110-111111-## Unbegrenzte Möglichkeiten
112112-113113-Sie könnten es auch umgekehrt machen (Liste auf mobilen Geräten, Dropdown auf dem Desktop), indem Sie die CSS-Eigenschaften `display: block` und `display: none` tauschen.
114114-115115-Darüber hinaus könnten Sie auch eine eigene Anzeige-Komponente erstellen, die die Routendaten aus dem Starlight Sidebar Topics Plugin verwendet und die Themen auf eine benutzerdefinierte Weise rendert. Das ist etwas anspruchsvoller, aber Sie finden weitere Informationen dazu in der ["Custom Topics List"-Dokumentation](https://starlight-sidebar-topics.trueberryless.org/docs/guides/custom-topic-list/).
···11----
22-title: Wie man einen horizontalen Fortschrittsanzeiger für Ihre
33- Starlight-Website erstellt
44-description: Erfahren Sie, wie Sie einen horizontalen Fortschrittsanzeiger für
55- Ihre Starlight-Website erstellen.
66-date: 2025-06-10
77-tags:
88- - Starlight
99- - CSS
1010- - Education
1111-excerpt: Erfahren Sie, wie Sie einen horizontalen Fortschrittsanzeiger für Ihre
1212- <a class="gh-badge" href="https://github.com/withastro/starlight"><img
1313- src="/starlight.png" alt="Starlight" />Starlight</a>-Website erstellen.
1414-authors:
1515- - frostybee
1616- - trueberryless
1717-cover:
1818- alt: A beautiful cover image with the text "Progress Bar"
1919- image: ../../../../../public/blog/starlight-progress-indicator.jpg
2020-2121----
2222-2323-In diesem Beitrag möchten wir Ihnen zeigen, wie [FrostyBee](https://github.com/frostybee) einen sauberen horizontalen Fortschrittsanzeiger für Starlight-Websites erstellt hat.
2424-2525-## Voraussetzungen
2626-2727-Sie benötigen eine bestehende Starlight-Website.
2828-2929-## Erstellen Sie die Fortschrittsanzeiger-Komponente
3030-3131-Lassen Sie uns eine neue Komponente namens `ProgressIndicator.astro` im Verzeichnis `src/components/` erstellen. Diese Komponente ist für die Darstellung des Fortschrittsanzeigers zuständig.
3232-3333-Wir erstellen einen Container, der sich über die gesamte Breite erstreckt, mit der Fortschrittsleiste `<div>` darin. Die Breite des inneren `<div>` wird aktualisiert, wann immer der Benutzer scrollt (und beim Laden der Seite), um die aktuelle Scrollposition widerzuspiegeln.
3434-3535-```astro title="src/components/ProgressIndicator.astro" collapse={27-43}
3636-<div class="progress-scroll-container" aria-hidden="true">
3737- <div id="progress-scroll"></div>
3838-</div>
3939-4040-<script>
4141- window.addEventListener("scroll", function () {
4242- updateProgressScroll();
4343- });
4444- window.addEventListener("load", function () {
4545- updateProgressScroll();
4646- });
4747-4848- function updateProgressScroll() {
4949- if (document) {
5050- const progressScroll = document.getElementById("progress-scroll");
5151- if (progressScroll) {
5252- var scrollTop = window.scrollY || document.documentElement.scrollTop;
5353- var scrollHeight =
5454- document.documentElement.scrollHeight - window.innerHeight;
5555- var progress = (scrollTop / scrollHeight) * 100;
5656- progressScroll.style.width = progress + "%";
5757- }
5858- }
5959- }
6060-</script>
6161-6262-<style>
6363- html:is(:not([data-has-hero]), [data-has-sidebar], [data-has-toc]) .progress-scroll-container {
6464- position: fixed;
6565- top: var(--sl-nav-height);
6666- left: 0;
6767- height: 0.25rem;
6868- width: 100%;
6969- background-color: transparent;
7070- z-index: 3;
7171- }
7272-7373- #progress-scroll {
7474- height: 100%;
7575- width: 0px;
7676- background-color: var(--sl-color-accent-high);
7777- }
7878-</style>
7979-8080-<style is:global>
8181- #starlight__on-this-page--mobile {
8282- margin-top: 0.25rem;
8383- }
8484-</style>
8585-```
8686-8787-In den ausgeblendeten Zeilen befindet sich das Styling, das sicherstellt, dass die Fortschrittsleiste wie eine typische Fortschrittsleiste aussieht. Sie ist auch an Starlight angepasst, da die Leiste automatisch ausgeblendet wird, wenn die Website keine Seitenleiste und Inhaltsverzeichnis, aber ein Hero-Element hat, wie es die meisten Landing Pages tun.
8888-8989-Eine Sache, die hervorzuheben ist, ist, was das globale CSS (Zeile 45) bewirkt: Es schiebt das Dropdown-Menü des mobilen Inhaltsverzeichnisses nach unten, um mehr Abstand zur Fortschrittsleiste zu schaffen. Dies ist eine persönliche Präferenz, die Sie entfernen können, wenn Sie möchten.
9090-9191-## Starlight-Override
9292-9393-Nun können wir diese Komponente in einem [Starlight-Override](https://starlight.astro.build/guides/overriding-components/) verwenden. In diesem Fall macht es Sinn, die [`Header.astro`-Komponente](https://starlight.astro.build/reference/overrides/#header-1) wie folgt zu überschreiben:
9494-9595-```astro title="src/components/Header.astro"
9696----
9797-import Default from "@astrojs/starlight/components/Header.astro";
9898-import ScrollIndicator from "./ScrollIndicator.astro";
9999----
100100-101101-<Default><slot /></Default>
102102-<ScrollIndicator />
103103-```
104104-105105-Vergessen Sie nicht, dieses Komponenten-Override in Ihre `astro.config.mjs`-Datei aufzunehmen:
106106-107107-```diff lang="js" title="astro.config.mjs"
108108-import { defineConfig } from 'astro/config';
109109-import starlight from '@astrojs/starlight';
110110-111111-export default defineConfig({
112112- integrations: [
113113- starlight({
114114- title: 'My Docs with a Progress Indicator',
115115-+ components: {
116116-+ // Override the default `Header` component.
117117-+ Header: './src/components/Header.astro',
118118-+ },
119119- }),
120120- ],
121121-});
122122-```
123123-124124-## Quellcode
125125-126126-Sie können den gesamten Projektcode auf [GitHub](https://github.com/trueberryless/starlight-progress-indicator) und in diesem [Stackblitz-Beispiel](https://stackblitz.com/github/trueberryless/starlight-progress-indicator?file=src%2Fcomponents%2FProgressIndicator.astro) finden.
127127-128128-## Fazit
129129-130130-Mit dieser Konfiguration wird der Fortschrittsanzeiger auf jeder Seite (außer Landing Pages) Ihrer Starlight-Website angezeigt. 🥳
131131-132132-Sie können auch das [Starlight Scroll To Top Plugin](https://github.com/frostybee/starlight-scroll-to-top) von [FrostyBee](https://github.com/frostybee) ausprobieren, das seit Version `0.3.1` auch einen integrierten [Fortschrittsring](https://frostybee.github.io/starlight-scroll-to-top/configuration/#showprogressring) unterstützt. 🙌
···11----
22-title: Wie Sie die Elemente Ihrer Starlight-Seitenleiste verbessern können
33-description: In diesem Blogbeitrag werfen wir einen Blick darauf, wie kleine
44- Änderungen bei Leerzeichen, Schriftgrößen, -gewichten und -farben in Ihrer
55- Starlight-Seitenleiste einen großen Unterschied machen können.
66-date: 2025-04-27
77-tags:
88- - Starlight
99- - CSS
1010- - Education
1111-excerpt: In diesem Blogbeitrag werfen wir einen Blick darauf, wie kleine
1212- Änderungen bei Leerzeichen in Ihrer <a class="gh-badge"
1313- href="https://github.com/withastro/starlight"><img src="/starlight.png"
1414- alt="Starlight" />Starlight</a>-Seitenleiste einen großen Unterschied machen
1515- können.
1616-authors:
1717- - trueberryless
1818-cover:
1919- alt: A beautiful cover image with the text "Starlight CSS"
2020- image: ../../../../../public/blog/starlight-sidebar-whitespace.jpg
2121-2222----
2323-2424-Haben Sie sich jemals gefragt, warum Ihre \[Starlight]\[starlight]-Seitenleiste nicht so ansprechend aussieht? Wussten Sie, wie wichtig der Platz zwischen den Elementen in Ihrer Seitenleiste unbewusst ist? Die Schriftgröße, das Gewicht und kleine Farbabstufungen? In diesem Leitfaden werfen wir einen Blick darauf, wie Sie das Erscheinungsbild Ihrer Starlight-Seitenleiste mit ein paar schnellen und einfachen Schritten anpassen können.
2525-2626-## Voraussetzungen
2727-2828-Zuerst müssen Sie Ihre \[Starlight-Seite einrichten]\[starlight-getting-started]. Anschließend bietet Starlight einen \[Leitfaden zur Anpassung von Stilen, die auf Ihre Starlight-Seite angewendet werden]\[starlight-css], und genau dieses Feature werden wir heute verwenden.
2929-3030-Wie in \[diesem Leitfaden]\[starlight-css-custom] beschrieben, müssen Sie eine `.css`-Datei irgendwo in Ihrem `src/`-Verzeichnis erstellen, in der Sie Ihre CSS-Stile definieren können. Vergessen Sie nicht, den Pfad zu dieser `.css`-Datei in Starlight's `customCss`-Array in `astro.config.mjs` hinzuzufügen:
3131-3232-```diff lang="js"
3333-// astro.config.mjs
3434-import { defineConfig } from 'astro/config';
3535-import starlight from '@astrojs/starlight';
3636-3737-export default defineConfig({
3838- integrations: [
3939- starlight({
4040- title: 'Docs With Custom CSS',
4141- customCss: [
4242-+ // Relative path to your custom CSS file
4343-+ './src/styles/custom.css',
4444- ],
4545- }),
4646- ],
4747-});
4848-```
4949-5050-Nach Abschluss dieser Vorbereitungsschritte sind Sie bereit, einige schöne Anpassungen am Design der Starlight-Seitenleiste auszuprobieren.
5151-5252-## Anpassungen
5353-5454-Es gibt unendlich viele Möglichkeiten, mit Ihrem benutzerdefinierten CSS zu experimentieren. Ich werde Ihnen einige Ideen geben, die ich selbst beim Spielen mit dem Design der Seitenleiste sehr hilfreich fand. Auch wenn einige dieser Ideen für Sie albern erscheinen mögen, verspreche ich, dass die Kombination einiger davon Ihre Starlight-Seitenleiste noch besser aussehen lassen wird.
5555-5656-:::note
5757-Eine Sache, die zu beachten ist: In diesem Blogbeitrag liegt der Fokus auf der Anpassung des Stils von **Elementen auf Root-Ebene** (diejenigen ohne Unterelemente) in der Seitenleiste.
5858-:::
5959-6060-Aber bevor ich das tue, zeige ich Ihnen, wie das Standarddesign der Starlight-Seitenleiste derzeit aussieht:
6161-6262-
6363-6464-### Anpassen der Leerzeichen zwischen den Elementen der Seitenleiste
6565-6666-Auf der Root-Ebene Ihrer Starlight-Seitenleiste gibt es zwei verschiedene Arten von Elementen: **Seiten** und **Gruppen**. Während das Standarddesign ziemlich anständig ist, fand ich die Leerzeichen – der Abstand zwischen den Elementen, der selbst keinen Inhalt enthält – etwas zu groß, besonders zwischen Elementen auf Root-Ebene. Mit diesem Beispiel benutzerdefinierten CSS unten habe ich den Abstand zwischen den Elementen auf Root-Ebene verkleinert, während der Abstand zwischen den Gruppen gleich bleibt. Die wichtigen CSS-Stile sind im Codeblock hervorgehoben.
6767-6868-```css {3} showLineNumbers=false
6969-// src/styles/custom.css
7070-sl-sidebar-state-persist ul.top-level > li:not(:has(details)) {
7171- margin-top: 0rem;
7272-}
7373-sl-sidebar-state-persist ul.top-level > li:has(details) {
7474- margin-block: 0.5rem; /* default value */
7575-}
7676-```
7777-7878-
7979-8080-Vielleicht ist dies für Sie nicht so nützlich, weil Sie keine Root-Level-Seiten in Ihrer Seitenleiste verwenden, sodass dieser Effekt für Sie nicht bemerkbar ist. Aber wenn doch, probieren Sie es aus.
8181-8282-### Anpassen des Schriftgewichts der Seitenleisten-Elemente
8383-8484-\[IMHO]\[imho], das eine, was mich an den Root-Level-Elementen in der Starlight-Seitenleiste am meisten stört, ist deren Fettdruck. Das ist wahrscheinlich eine sehr subjektive Meinung, aber wenn Sie mich fragen: Eine einzige Seite kann unmöglich so wichtig sein wie eine ganze Gruppe Seiten in Ihrer Dokumentation. Daher habe ich das Schriftgewicht der Elemente auf Root-Ebene dünner gemacht, wie Sie im folgenden Codeblock sehen können.
8585-8686-```css {6} showLineNumbers=false
8787-// src/styles/custom.css
8888-sl-sidebar-state-persist ul.top-level > li > a[aria-current="page"] {
8989- font-weight: 600; /* default value */
9090-}
9191-sl-sidebar-state-persist ul.top-level > li > a:not([aria-current="page"]) {
9292- font-weight: 400;
9393-}
9494-```
9595-9696-
9797-9898-### Anpassen der Farbe der Seitenleisten-Elemente
9999-100100-Eine kleine, aber subtile Änderung: Ich habe unselektierte Root-Level-Einträge in der Seitenleiste mit einem schwächeren Erscheinungsbild versehen, wie im folgenden Codeblock gezeigt.
101101-102102-Wenn Sie sich entscheiden, dieses Design ebenfalls zu verwenden, empfehle ich, nur die zweite CSS-Manipulation anzuwenden, da die erste nur zur Demonstration dient, wie Sie das Styling von ausgewählten Root-Level-Elementen anpassen könnten – diese Regel gilt auch für andere Codeblöcke in diesem Blog, wenn sie als `default value` gekennzeichnet sind.
103103-104104-```css {6} showLineNumbers=false
105105-// src/styles/custom.css
106106-sl-sidebar-state-persist ul.top-level > li > a[aria-current="page"] {
107107- color: var(--sl-color-text-invert); /* default value */
108108-}
109109-sl-sidebar-state-persist ul.top-level > li > a:not([aria-current="page"]) {
110110- color: var(--sl-color-gray-2);
111111-}
112112-```
113113-114114-
115115-116116-### Anpassen der Schriftgröße der Seitenleisten-Elemente
117117-118118-Obwohl ich es nicht empfehle, können Sie auch die Schriftgröße der Seitenleisten-Elemente anpassen. Mit diesem Beispiel benutzerdefinierten CSS unten habe ich die Schriftgröße der Elemente auf Root-Ebene verkleinert.
119119-120120-```css {3} showLineNumbers=false
121121-// src/styles/custom.css
122122-sl-sidebar-state-persist ul.top-level > li > a {
123123- font-size: var(--sl-text-sm);
124124-}
125125-```
126126-127127-
128128-129129-## Empfehlungen
130130-131131-Zusammenfassend empfehle ich, dass Sie eine Mischung aus den oben genannten Anpassungsoptionen anwenden, die Sie bequem in einer einzigen `.css`-Datei sehen können.
132132-133133-Beachten Sie, dass ich auch \[Cascade Layers]\[starlight-css-cascade-layers] verwende, die seit \[Starlight 0.34.0]\[starlight-0-34] unterstützt werden, und empfehle, diese zu verwenden, um die Reihenfolge der angewendeten CSS-Stile festzulegen.
134134-135135-```css showLineNumbers=false
136136-// src/styles/custom.css
137137-@layer starlight, my-starlight-sidebar;
138138-139139-@layer my-starlight-sidebar {
140140- sl-sidebar-state-persist ul.top-level > li:not(:has(details)) {
141141- margin-block: 0rem;
142142- }
143143- sl-sidebar-state-persist ul.top-level > li > a:not([aria-current="page"]) {
144144- font-weight: 400;
145145- color: var(--sl-color-gray-2);
146146- }
147147-}
148148-```
149149-150150-[starlight]: https://starlight.astro.build
151151-152152-[starlight-getting-started]: https://starlight.astro.build/getting-started/
153153-154154-[starlight-css]: https://starlight.astro.build/guides/css-and-tailwind/
155155-156156-[starlight-css-custom]: https://starlight.astro.build/guides/css-and-tailwind/#custom-css-styles
157157-158158-[starlight-css-cascade-layers]: https://starlight.astro.build/guides/css-and-tailwind/#cascade-layers
159159-160160-[starlight-0-34]: https://github.com/withastro/starlight/releases/tag/%40astrojs%2Fstarlight%400.34.0
161161-162162-[imho]: https://en.wiktionary.org/wiki/IMHO
···11----
22-title: Eine kurze Geschichte der Starlight Sidebar Topics Plugins
33-description: In diesem Blogbeitrag zeige ich Ihnen die Entwicklung der
44- Starlight-Plugins anhand einer Fallstudie zum Starlight Sidebar Topics Plugin.
55-date: 2025-05-05
66-tags:
77- - Starlight
88- - Plugins
99-excerpt: In diesem Beitrag zeige ich Ihnen die Entwicklung der <a
1010- class="gh-badge" href="https://github.com/withastro/starlight"><img
1111- src="/starlight.png" alt="Starlight" />Starlight</a>-Plugins anhand einer
1212- Fallstudie des [Starlight Sidebar
1313- Topics](https://github.com/hideoo/starlight-sidebar-topics) Plugins. Seien Sie
1414- darauf gefasst, beeindruckende Fakten über Menschen und Code rund um Starlight
1515- zu entdecken.
1616-authors:
1717- - trueberryless
1818- - ai
1919-cover:
2020- alt: A beautiful cover image with the text "History Time"
2121- image: ../../../../../public/blog/starlight-topics-history-story.jpg
2222-2323----
2424-2525-Vielleicht haben Sie schon einmal von diesem coolen Dokumentationsframework gehört. Ich spreche oft darüber und benutze es regelmäßig. Nicht nur, weil ich ein aktiver Mitwirkender bin, sondern auch, weil [Starlight](https://starlight.astro.build) mir einfach ans Herz gewachsen ist. Seine Funktionen: Einfachheit und Minimalismus, aber alles, was man braucht. Seine Leistung: [Schneller als 98 % der anderen Websites](https://www.websitecarbon.com/website/starlight-astro-build-getting-started/). Seine Barrierefreiheit: Keine Frage!
2626-2727-## Die Entstehung
2828-2929-Eine Sache, die aus meiner Sicht objektiv fehlt, ist eine granulare Möglichkeit, breite Themen in Ihrer Dokumentation zu trennen. Und ich bin nicht allein mit dieser subjektiv allgemein akzeptierten Meinung. [HiDeoo](https://github.com/HiDeoo) ist nicht nur einer der aktivsten Maintainer des Projekts, sondern auch der Autor der meisten und meiner Meinung nach besten Plugins, die man für Starlight finden kann. Und auch ihnen fiel diese fehlende Nischenfunktionalität bei Themen auf. Deshalb haben sie im Oktober 2024, also relativ früh, das [Starlight Sidebar Topics](https://github.com/hideoo/starlight-sidebar-topics) Plugin erstellt, mit dem man eine Seitenleiste mit Themen erstellen kann. Lesen Sie mehr über die Funktionen des Plugins in [der Dokumentation](https://starlight-sidebar-topics.trueberryless.org/).
3030-3131-Das Einzige, was mich in den frühen Tagen des Plugins persönlich gestört hat, war die Art und Weise, wie die Themen in der Seitenleiste angezeigt wurden. Es verwendet - im Gegensatz zu der von mir vorgestellten Lösung - keine Art Dropdown-Menü zum Wechseln zwischen Themen, sondern zeigt stattdessen immer alle Themen an. Diese Designentscheidung war, wie [HiDeoo klar hervorhebt](https://github.com/HiDeoo/starlight-sidebar-topics/issues/2#issuecomment-2410196392), sehr bewusst und nicht ohne Grund: Alle Themen sollen auf einmal sichtbar sein. Bewiesen durch die [Astro](https://github.com/withastro) Dokumentation selbst ([Chris Swithinbank](https://github.com/delucis) implementierte die ["Tab-Leiste"](https://github.com/withastro/docs/pull/9890) für die Astro v5 Dokumentation später im selben Monat), hat dieser Ansatz definitiv viele Vorteile gegenüber einem Dropdown-Menü. Dennoch war ich weiterhin mit diesem Design unzufrieden, und so habe ich meine eigene Version erstellt.
3232-3333-Kopieren und Einfügen war meine Stärke, wenn es darum ging, ein neues Starlight-Plugin für die Community zu erstellen. Und so habe ich es einfach getan. Ich nahm das Starlight Sidebar Topics Plugin als Ausgangspunkt und musste nur das `Topics.astro`-Komponente anpassen, das das HTML für die Darstellung der Themen in der Seitenleiste enthält. Nachdem ich einige Zeit damit gekämpft hatte, ein zufriedenstellendes Dropdown-Menü zu implementieren, das nur aus HTML und CSS bestand, aber auch optisch ansprechend war (Entschuldigung für das Eigenlob, ich bin einfach stolz auf mich), habe ich endlich eine Lösung gefunden, mit der ich sehr zufrieden bin, und habe dieses neue Plugin unter dem Namen [Starlight Sidebar Topics Dropdown](https://github.com/trueberryless-org/starlight-sidebar-topics-dropdown) veröffentlicht - wie originell.
3434-3535-## Die Anpassung
3636-3737-Sie könnten denken, dass diese Geschichte nun vorbei ist, da jeder einfach die Variante nutzen könnte, die er bevorzugt, und alle wären glücklich. Aber Starlight entwickelte sich weiter und verbessert sich ständig. Etwa drei Monate später, am 15. Februar, fast wie ein [Geburtstagsgeschenk](../../../../../blog/20th-birthday/) für mich, kam die lang erwartete Ergänzung von Routendaten in Starlight mit der Veröffentlichung von [v0.32](https://github.com/withastro/starlight/releases/tag/@astrojs/starlight@0.32.0). Diese scheinbar kleine Ergänzung eröffnete so viele Möglichkeiten, die ich selbst nie erwartet hätte. HiDeoo war einmal mehr die führende Inspiration für Plugin-Autoren und trieb diese neue Funktionalität bis an ihre Grenzen. Es dauerte nur zwei Tage, um [mehr als 11 Plugins an die neueste Starlight-Version von damals anzupassen](https://bsky.app/profile/hideoo.dev/post/3liffpudc5c2b), und später wurden viele dieser Codeabschnitte verbessert und refaktoriert, um diese mächtige Funktion noch weiter zu nutzen.
3838-3939-Und so kam der Tag, an dem HiDeoo mich kontaktierte, um mir mitzuteilen, dass das Starlight Sidebar Topics Plugin nun die neue Routen-Daten-Funktion von Starlight nutzt. Zuerst verstand ich nicht ganz, welchen Nutzen diese Implementierungsänderungen haben würden, aber dann nahm sich HiDeoo die Zeit, mir zu erklären, dass ich das Starlight Sidebar Topics Dropdown Plugin jetzt in eine einfache Komponente umwandeln könnte, die die Routen-Daten aus seinem Plugin verwendet. Intuitiv war ich gegen diese clevere Idee, weil es sich anfühlte, als würde mein einziges Plugin, das etwas Popularität erlangt hatte, in eine nutzlose Komponente verwandelt. Ich hätte nicht weiter von der Wahrheit entfernt sein können.
4040-4141-## Die Vereinigung
4242-4343-Schließlich beschloss ich, mein Plugin in eine Komponente umzuwandeln - diese Umstrukturierung eliminierte beiläufig genau [1210 Zeilen Code und fügte 68 Änderungsprotokollzeilen hinzu](https://github.com/trueberryless-org/starlight-sidebar-topics-dropdown/pull/40) - und ich bemerkte, wie wenig Code es jetzt erforderte, um die `Topics.astro` Liste aus der Perspektive eines Nutzers in ein Dropdown zu verwandeln. Ich war zuversichtlich, dass dies wirklich die richtige Richtung für die ~~Plugin~~ Komponente war. Also aktualisierte ich die gesamte Dokumentation - eher: löschte über 200 Zeilen Text (fühlt sich gut an) - und veröffentlichte die neue [Version 0.5](https://github.com/trueberryless-org/starlight-sidebar-topics-dropdown/releases/tag/starlight-sidebar-topics-dropdown%400.5.0).
4444-4545-Jetzt fragen Sie sich vielleicht, wie solch ausgereifte Plugins sich noch weiter verbessern können. Um ehrlich zu sein, ich selbst war sehr überrascht, als HiDeoo mir beiläufig eine Bombe in meine Discord-DMs fallen ließ. Seine Idee war und ist immer noch genial. Andernfalls würde ich nicht einmal mehr an dieses *Thema* denken. Aber hier bin ich und schreibe satte 800 Worte, nur um Sie auf das kommende vorzubereiten. Trommelwirbel bitte! Anschnallen! Diese Aussage von HiDeoo wird Sie umhauen:
4646-4747-> „Man könnte auf einer Desktop-Ansicht etwas wie die standardmäßig eingebaute Liste und auf mobilen Geräten Ihre Komponente oder so etwas verwenden 🧠“ — HiDeoo, 21/03/2025 09:54
4848-4949-Tiefgründig. Zeitlos. Golden.
5050-5151-Und diese einzige, wunderschöne Idee? Genau darüber werde ich Ihnen im Beitrag [„Starlight Topics Dropdown und List zusammen“](../../../../../blog/starlight-dropdown-and-list-together/) berichten.
···11----
22-title: Wie ich ein GitHub-Profil-README erstellt habe, das es eigentlich nicht
33- geben sollte (aber es gibt es)
44-description: Ein tiefgehender Einblick in die technischen Herausforderungen und
55- Lösungen hinter meinem GitHub-Profil-README, mit Schwerpunkt auf
66- SVG-Manipulation, Automatisierung und einem dynamischen Bento-Grid.
77-date: 2025-02-05
88-tags:
99- - Automation
1010- - GitHub
1111-excerpt: Ein herausragendes <a class="gh-badge"
1212- href="https://github.com/github"><img src="https://github.com/github.png"
1313- alt="github" />GitHub</a>-Profil-README zu erstellen, bedeutet nicht nur, ein
1414- paar Abzeichen hinzuzufügen — es geht darum, technische Grenzen zu
1515- überschreiten. In diesem tiefgehenden Einblick erkunde ich
1616- Low-Level-SVG-Manipulation, HTML-zu-SVG-Konvertierung, Inline-Animationen und
1717- vollständige Automatisierung mit GitHub Actions, um das vielleicht technisch
1818- fortschrittlichste GitHub-README zu erstellen. Von einem dynamischen
1919- Bento-Grid, das alle 5 Minuten aktualisiert wird, bis hin zum Einbetten von
2020- Live-SVGs ohne externe Anfragen hat dieses Projekt mein Profil in eine
2121- lebendige, sich selbst aktualisierende Präsentation meiner Arbeit verwandelt.
2222- Neugierig, wie ich das gemacht habe? Lass uns loslegen. 🚀
2323-authors:
2424- - trueberryless
2525- - ai
2626-cover:
2727- alt: A beautiful cover image with the text "GitHub Profile"
2828- image: ../../../../../public/blog/technically-impressive-github-profile-readme.jpg
2929-3030----
3131-3232-:::note
3333-Lies die formellere Geschichte [hier](../../../../../blog/github-profile-readme/)
3434-:::
3535-3636-## Der Anfang: Ein README, das wie ein Wikipedia-Dump aussah
3737-3838-Jede großartige Geschichte beginnt mit einem Problem, und meines war einfach: Mein [GitHub-Profil](https://github.com/trueberryless) README war ein komplettes Chaos. Es war lang. Es hatte zu viel Text. Es war überfüllt mit Abzeichen — so viele, dass es aussah, als würde ich jede mögliche Internet-Trophäe horten. Hackathons, GitHub-Beiträge, Astro, roadmap.sh — wenn es ein Abzeichen gab, hatte ich es.
3939-4040-Am Anfang dachte ich, das wäre in Ordnung. Es zeigte schließlich alles über mich, oder? Aber eines Tages sah ich es an und stellte fest:
4141-4242-> Das ist nicht stilvoll. Das ist ein überladenes Desaster.
4343-4444-Ich brauchte etwas Neues. Etwas Sauberes. Etwas Visuell Beeindruckendes. Ich wollte ein **Bento-Grid**, das die Leute dazu bringt, stehen zu bleiben und es zu bewundern, anstatt verwirrt daran vorbeizuscrollen. Ein Design, das so gut ausgeführt ist, dass jeder, der es sieht, sofort eines für sich haben wollte.
4545-4646-Das war der Traum. Jetzt musste ich ihn nur noch realisieren.
4747-4848-## Phase 1: Der HTML-Traum (und Markdown-Albtraum)
4949-5050-Der erste Schritt war einfach: Entwerfen meines perfekten Profils in HTML und CSS. Und ich kann dir sagen, es sah unglaublich aus. Es hatte das perfekte Layout, sanfte Animationen und genau das richtige Gleichgewicht zwischen Inhalt und Raum. Dann kam die Realität. Dies musste innerhalb von *GitHub-Flavored Markdown* funktionieren. Kein Problem, oder? Markdown unterstützt HTML! Also kopierte ich mein wunderschönes HTML in mein README und drückte Speichern.
5151-5252-> [GitHub](https://github.com/github): *Absolut nicht.*
5353-5454-Die GitHub-Markdown [entfernt nicht eine riesige Anzahl von HTML-Tags, aber wichtige](https://github.github.com/gfm/#disallowed-raw-html-extension). Aus Sicherheitsgründen natürlich (und das respektiere ich vollkommen, GitHub, wirklich ❤️), aber das bedeutete, dass mein perfektes Design komplett **unbrauchbar** war.
5555-5656-Ich habe versucht, es anzupassen. Nicht unterstützte Tags durch funktionierende zu ersetzen. Vielleicht konnte ich etwas retten? *Nein*. Die Einschränkungen von Markdown machten mein Traum-Layout unmöglich.
5757-5858-## Phase 2: Der "Einfach Ein Python-Skript Benutzen"-Kompromiss
5959-6060-Wenn du dir unsicher bist, automatisiere es. Wenn ich mein HTML nicht direkt einfügen konnte, vielleicht konnte ich etwas Dynamisches mit einem Skript generieren? Also habe ich ein Python-Skript zusammengestellt, um mein neuestes GitHub-Repository abzurufen und in mein README einzufügen. Ich lasse hier einfach ein paar zufällige Bytes, die einige als Python-Code bezeichnen könnten:
6161-6262-```python collapse={1-22} showLineNumbers=false
6363-import requests
6464-6565-github_username = "yourusername"
6666-repos_url = f"https://api.github.com/users/{github_username}/repos?sort=pushed"
6767-6868-response = requests.get(repos_url)
6969-repos = response.json()
7070-7171-latest_repo = repos[0]["name"] if repos else "No repositories found."
7272-7373-with open("README.md", "r") as file:
7474- readme_content = file.readlines()
7575-7676-new_content = []
7777-for line in readme_content:
7878- if "<!--LATEST_REPO-->" in line:
7979- new_content.append(f"- Latest Repo: [{latest_repo}](https://github.com/{github_username}/{latest_repo})\n")
8080- else:
8181- new_content.append(line)
8282-8383-with open("README.md", "w") as file:
8484- file.writelines(new_content)
8585-```
8686-8787-Das schien ein Schritt in die richtige Richtung zu sein. Es war automatisiert. Es funktionierte. Aber es löste nicht mein eigentliches Problem. 😢
8888-8989-Es ging nicht um dynamischen Inhalt — es ging um *Design*. Und keine Menge Python-Scripting würde Markdown schön aussehen lassen.
9090-9191-## Phase 3: "Na Gut, Ich Nehme Einfach Einen Screenshot" (Tiefpunkt)
9292-9393-Zu diesem Zeitpunkt war ich verzweifelt. Ich dachte an das Undenkbare: *Einfach einen Screenshot vom HTML machen und ihn als Bild in mein README einfügen.* Es war ein brutaler Ansatz. Es war faul. Es war... effektiv?
9494-9595-Einen Moment lang dachte ich tatsächlich darüber nach, es zu tun. Aber tief im Inneren wusste ich, dass ich mir nie verzeihen würde, wenn ich das als endgültige Lösung akzeptieren würde.
9696-9797-Zur Referenz hätte ich [Puppeteer](https://www.npmjs.com/package/puppeteer) und [FFmpeg](https://www.ffmpeg.org/) verwendet — keine Ahnung, was diese Tools sind.
9898-9999-## Phase 4: SVGs treten auf den Plan (Das Licht am Ende des Tunnels)
100100-101101-Ich ließ den verfluchten Screenshot-Plan fallen und suchte nach etwas Flexiblerem.
102102-103103-SVGs.
104104-105105-SVGs konnten skalieren, sie unterstützten sowohl Text als auch Bilder, und — was am wichtigsten war — sie konnten **HTML innerhalb von ihnen einbetten**.
106106-107107-Also versuchte ich etwas wie das:
108108-109109-```xml showLineNumbers=false
110110-<svg width="800" height="400" xmlns="http://www.w3.org/2000/svg">
111111- <foreignObject width="100%" height="100%">
112112- <body xmlns="http://www.w3.org/1999/xhtml">
113113- <h1>Hello from HTML inside SVG!</h1>
114114- </body>
115115- </foreignObject>
116116-</svg>
117117-```
118118-119119-Vielversprechend! Das könnte tatsächlich funktionieren!
120120-121121-Dann wurde ich mit anderen Dingen beschäftigt, vergaß, es zu debuggen, und kehrte nie zu dieser Idee zurück.
122122-123123-
124124-125125-## Phase 5: SVGs in SVGs in SVGs (Inception-Stufe 100)
126126-127127-Als ich zum Projekt zurückkehrte, war ich **entschlossen**, es zum Laufen zu bringen.
128128-129129-Mir wurde klar, dass, wenn ich HTML nicht direkt in Markdown einfügen konnte, ich es vortäuschen konnte, indem ich verschachtelte SVGs verwendete. (Übrigens ist dies stark vereinfacht; der tatsächliche Prozess dauerte Tage, die sich wie Wochen, wenn nicht Monate anfühlten, aber ich weiß, dass ihr das sowieso nicht alles lesen würdet, also wen interessiert's?)
130130-131131-Und dann, nach Stunden der Recherche, stieß ich auf eine lebensverändernde Stack Overflow-Antwort:
132132-133133-[https://stackoverflow.com/a/65049620/22573601](https://stackoverflow.com/a/65049620/22573601)
134134-135135-Das führte mich zur aktuellen Lösung:
136136-137137-1. Mein HTML-Layout nach SVG konvertieren.
138138-2. Alle Bilder in **Base64** kodieren (da GitHub Markdown keine externen Bilder innerhalb eines SVG mit HTML lädt).
139139-3. Dynamische SVGs einbetten (wie meine GitHub-Statistiken, Spotify-Status usw.).
140140-4. Alles mit **GitHub Actions** automatisieren.
141141-142142-## Das große Finale: Das ultimative GitHub-Profil-README
143143-144144-* Ein schlankes Bento-Grid-Layout, perfekt in SVG strukturiert.
145145-* Ein live-aktualisierender Spotify-Status, in SVG eingebettet.
146146-* GitHub-Statistiken, dynamisch über Automatisierung eingefügt.
147147-* Vollständig responsiv, vollständig skalierbar und vollkommen verrückt zu erstellen.
148148-149149-Es aktualisiert sich alle 5 Minuten, läuft vollständig auf GitHub Actions und ist nicht auf externe Dienste angewiesen. Es ist wunderschön. Es ist effizient. Und vor allem ist es technisch absurd im besten Sinne.
150150-151151-Schauen Sie sich ein konkretes Beispiel der Endergebnisse irgendwann in der Vergangenheit an.
152152-153153-import { Image } from 'astro:assets'
154154-155155-<Image src={"https://raw.githubusercontent.com/trueberryless/trueberryless/7519c6f50094bdfd6fb47f610e6638ac8efdd6ad/html-wrapper.svg"} width={980} height={913} alt="Final result" data-zoom-off />
156156-157157-Ist das nicht schlecht im Vergleich zum [alten README.md](https://github.com/trueberryless/trueberryless/blob/5dce4ad0033b00829f8ec3756827057017447a65/README.md). Und kommentier bitte nicht, warum ich K-Pop höre! Es ist besser, als du denkst, glaub mir.
158158-159159-Sieh dir die Live-Version auf meinem GitHub [trueberryless](https://github.com/trueberryless) an — falls ich beschlossen habe, sie zu behalten... — und folge mir, wenn du schon da bist, falls dir das Lesen gefallen hat! ❤️
160160-161161-***
162162-163163-## Abschließende Gedanken: War es das wert?
164164-165165-Absolut.
166166-167167-Diese Reise war frustrierend, zeitaufwendig und voller Hindernisse, mit denen ich nie gerechnet hätte. Aber ich habe so viel über SVGs, die Einschränkungen von Markdown, GitHub Actions und Automatisierung gelernt.
168168-169169-Würde ich es wieder tun? Definitiv.
170170-171171-Würde ich es empfehlen? Nur, wenn du eine Menge Geduld hast. 😅
172172-173173-Aber am Ende habe ich ein [GitHub](https://github.com/github)-Profil-README erstellt, das *eigentlich nicht existieren sollte* — aber es existiert. Und ich liebe es.
···11----
22-title: Vibe-Coding einer VS Code-Erweiterung für Terraform-Projekte
33-description: Wie ich eine Erweiterung für Visual Studio Code erstellt habe, die
44- Inline-Resolutionen für Variablen in Terraform-Projekten hinzufügt.
55-date: 2025-08-01
66-tags:
77- - Automation
88- - Plugins
99- - Tool
1010-authors:
1111- - trueberryless
1212-cover:
1313- alt: A beautiful cover image with the text "VSCE Terraform"
1414- image: ../../../../../public/blog/terraform-variables-resolution.jpg
1515-1616----
1717-1818-import { FileTree, LinkButton } from "@astrojs/starlight/components"
1919-2020-Heute möchte ich über eine kleine VS Code-Erweiterung sprechen, die ich an einem einzigen Tag vibe-codiert habe, um die Arbeit mit Terraform zu erleichtern. Zunächst erkläre ich, was Terraform ist, und gehe dann direkt auf die Funktionalität und die Gründe für diese Erweiterung ein. Fühlen Sie sich frei, den ersten Abschnitt zu überspringen, wenn Sie bereits mit Terraform vertraut sind.
2121-2222-{/* excerpt */}
2323-2424-## Was ist Terraform?
2525-2626-Terraform ist ein Infrastructure-as-Code (IaC)-Tool, mit dem Sie Ihre gesamte Cloud- oder On-Premises-Infrastruktur als Code definieren können. Die von [HashiCorp](https://github.com/hashicorp) entwickelte Konfigurationssprache wird als HCL (HashiCorp Configuration Language) bezeichnet und bietet eine intuitive, menschenlesbare Syntax. Die *native Syntax* hat den Vorteil, dass die Lernkurve niedrig ist, sie für alle Anbieter konsistent ist und angenehm für Menschen zu lesen und zu schreiben ist, während die JSON-basierte Variante für Maschinen einfacher zu generieren und zu parsen ist.
2727-2828-Was Terraform sehr leistungsfähig macht, sind zwei grundlegende Funktionen: **Variablen** und **Module**. Variablen ermöglichen es, Ressourcen zu erstellen, bei denen die tatsächlichen Werte von anderswoher eingefügt werden können, und Module gruppieren eine beliebige Anzahl von Ressourcen, was den Vorteil der Wiederverwendbarkeit und Verschachtelung hat. Während beide Funktionen sehr grundlegend erscheinen, bilden sie in Kombination ein Traumteam. Denn die Offenheit von Terraform ermöglicht es, Eingabevariablen für jedes Modul zu definieren und Variablen auch über Ausgaben zu exportieren.
2929-3030-Ein einfaches Modul ist daher wie folgt aufgebaut:
3131-3232-<FileTree>
3333- * azure-resource-group/
3434- * main.tf
3535- * variables.tf
3636- * outputs.tf
3737- * README.md
3838-</FileTree>
3939-4040-Alle Dateien außer `main.tf` sind optional (die `README.md` ist nicht spezifisch für Terraform), aber ich bevorzuge es, Best Practices zu folgen, daher beinhaltet das Beispiel diese Dateien.
4141-4242-Schauen wir uns ein einfaches Beispiel an. Nehmen wir an, wir möchten eine Ressourcengruppe in Azure mit Terraform verwalten. In der Datei `variables.tf` definieren wir, welche Eingaben wir innerhalb des Moduls erwarten. Jeder der beiden Blöcke repräsentiert die Variable und die Eigenschaften der Variablen, wie die `description` oder den `type`:
4343-4444-```hcl
4545-// variables.tf
4646-variable "name" {
4747- description = "Name of the resource group"
4848- type = string
4949-}
5050-5151-variable "location" {
5252- description = "Azure region"
5353- type = string
5454- default = "westeurope"
5555-}
5656-```
5757-5858-Sie haben vielleicht bemerkt, dass die Variable `location` auch eine `default`-Eigenschaft hat, die die Variable optional macht und einen Fallback-Wert bietet, falls keiner angegeben wird. Diese Variablen können dann innerhalb der Datei `main.tf` verwendet werden. Hier definieren wir die tatsächlichen Ressourcen, die wir generieren möchten:
5959-6060-```hcl
6161-// main.tf
6262-provider "azurerm" {
6363- features {}
6464-}
6565-6666-resource "azurerm_resource_group" "this" {
6767- name = var.name
6868- location = var.location
6969-}
7070-```
7171-7272-In diesem Fall definieren wir einfach unsere Ressourcengruppe, die Sie sich wie einen Ordner in Azure vorstellen können – eine sehr laienhafte Erklärung. Der letzte Teil, den wir umsetzen können, ist die Datei `outputs.tf`:
7373-7474-```hcl
7575-// outputs.tf
7676-output "resource_group_id" {
7777- description = "The ID of the resource group"
7878- value = azurerm_resource_group.this.id
7979-}
8080-```
8181-8282-Dies ist sehr nützlich, wenn wir Informationen wie die ID der Ressourcengruppe später in anderen Teilen unseres Terraform-Projekts verwenden möchten.
8383-8484-Wie ich bereits geschrieben habe, ist die `README.md` tatsächlich kein Teil der Terraform-Definitionen, hilft uns jedoch, den Zweck des Moduls zu verstehen:
8585-8686-````md
8787-# Azure Resource Group Module
8888-8989-A minimal Terraform module that creates an Azure Resource Group.
9090-9191-## Usage
9292-9393-```hcl
9494-module "rg" {
9595- source = "./azure-resource-group"
9696- name = "my-resource-group"
9797-}
9898-```
9999-````
100100-101101-Wie die `README.md` bereits andeutet, können wir dieses Modul jetzt verwenden, um eine Azure-Ressourcengruppe überall innerhalb unseres Projekts zu erstellen. Wir müssen nur sicherstellen, dass der Pfad zum Modul-Ordner korrekt ist und Terraform die Dateien `main.tf`, `variables.tf` und `outputs.tf` interpretieren kann. In diesem Fall, da wir die Variable `location` nicht angeben, wird sie auf `"westeurope"` gesetzt.
102102-103103-```hcl
104104-module "rg" {
105105- source = "./azure-resource-group"
106106- name = "my-resource-group"
107107-}
108108-```
109109-110110-Ich hoffe, dieser Abschnitt hat Ihnen ein besseres grundlegendes Verständnis dafür gegeben, was Terraform ist und was Sie damit tun können.
111111-112112-## Die mühsame Aufgabe mit Terraform
113113-114114-Sie haben vielleicht bemerkt, dass das Feld `source` eines Moduls eine erstaunliche Flexibilität für das gesamte Projekt schafft, da Sie Module überall definieren und überall im Projekt verwenden können.
115115-116116-Dieses Feature hat jedoch einen großen Nachteil in Bezug auf die Wartbarkeit: Das Auflösen der tatsächlichen Werte hinter Variablen kann sehr mühsam sein. Während es in diesem einfachen Beispiel leicht zu verwalten scheint, desto größer das Projekt wird und je verschachtelter es ist, desto schwieriger und zeitaufwändiger wird das Verstehen und Anpassen von Terraform-Code. Deshalb habe ich eine Erweiterung erstellt.
117117-118118-**Was sollte die Erweiterung tun?** Das Hauptziel der Erweiterung ist es, die tatsächlichen Werte der Variablen überall dort bereitzustellen, wo sie verwendet werden. Wenn ein Modul von mehreren Stellen oder einfach mehreren Malen aufgerufen wird, sollten die Informationen bereitstellen, welcher Anwendungsfall die Variable auf welchen Wert setzt. Wenn Module tief verschachtelt sind, sollten die Werte aufgelöst werden, bis wir die `.tfvars`-Dateien erreichen. Dies sind die Dateien, in denen Sie die fest kodierten Werte für Variablen definieren können.
119119-120120-## So starten Sie eine VS Code-Erweiterung
121121-122122-Das Erstellen des grundlegenden Template-Projekts für eine VS Code-Erweiterung ist so einfach wie das Ausführen dieses Befehls, wenn Sie [Node](https://github.com/nodejs) installiert haben:
123123-124124-```bash
125125-npx --package yo --package generator-code -- yo code
126126-```
127127-128128-Dieser Befehl installiert temporär Yeoman (eine Generator-Software) und öffnet einen interaktiven Modus, in dem einige Fragen beantwortet werden müssen, wie der Projektname, der Typ und die Beschreibung. Im folgenden Block sehen Sie alle Fragen und Standardantworten:
129129-130130-```bash
131131-# ? What type of extension do you want to create? New Extension (TypeScript)
132132-# ? What's the name of your extension? HelloWorld
133133-### Press <Enter> to choose default for all options below ###
134134-135135-# ? What's the identifier of your extension? helloworld
136136-# ? What's the description of your extension? LEAVE BLANK
137137-# ? Initialize a git repository? Y
138138-# ? Which bundler to use? unbundled
139139-# ? Which package manager to use? npm
140140-141141-# ? Do you want to open the new folder with Visual Studio Code? Open with `code`
142142-```
143143-144144-Weitere Informationen zu VS Code-Erweiterungen möchte ich im [offiziellen Dokumentation](https://code.visualstudio.com/api/get-started/your-first-extension) verlinken, da sie immer aktueller im Gegensatz zu meinen Erklärungen hier ist.
145145-146146-## 3… 2… 1… Vibe-Coding!
147147-148148-Ich beginne gerne neue Projekte, indem ich [ChatGPT](https://github.com/openai) nach allgemeinen technischen Fragen frage wie:
149149-150150-* Wie würden Sie vorschlagen, ein solches Projekt umzusetzen?
151151-* Wie lange schätzen Sie, dass es dauern wird?
152152-* Wie schwierig wird es sein?
153153-154154-Das Brainstorming mit KI-Bots scheint ein sehr sinnvoller Weg zu sein, um sich einen besseren Überblick über neue Projekte zu verschaffen, insbesondere wenn man in völlig neue Gewässer eintaucht. Eine VS Code-Erweiterung zu erstellen, war genau ein solcher Anwendungsfall, da ich noch nie zuvor etwas für VS Code oder eine andere IDE erstellt hatte. Nach dieser anfänglichen Brainstorming-Phase bevorzuge ich [Claude](https://github.com/anthropics), um alle notwendigen Dateien für eine solche Erweiterung zu programmieren, da dieser KI-Bot meiner Erfahrung nach in der Lage ist, Code wirklich präzise umzusetzen. Ich habe kaum Fehler oder Laufzeitprobleme mit Claude-Code erlebt, sodass ich ihn genau für solche Anwendungsfälle nutze – Initialstarter. Der Nachteil von Claude ist sein sehr begrenztes kostenloses Testangebot, weshalb ich beim Formulieren meiner Worte immer vorsichtig bin und versuche, im Voraus an so viele mögliche Fehler der KI zu denken wie möglich. So begann es also: Ich nahm mir etwas Zeit, um mein genaues Szenario und meinen Wunsch in die begrenzten Kontextfenster einer zufälligen Wortmaschine namens Claude zu formulieren und erhielt sofort eine riesige `extension.ts`-Implementierung. Natürlich gab es offensichtliche Unterschiede zwischen meiner Vision und der Kommunikation mit diesem LLM, weshalb ich ihm ein weiteres Mal erklären musste, was die wichtigen Überlegungen sind, und um weiteren Code zu erhalten, nutzte ich auch meinen magischen Trick: "Wenn das zu groß für eine Datei ist, geben Sie mir einfach die gesamte `extension.ts` in mehreren Dateien, die natürlich funktionieren sollte."
155155-156156-Claude begab sich dann auf eine lange Reise.
157157-158158-Nach einigen Kämpfen, es weiter am Laufen zu halten, waren meine Tokens aufgebraucht und ich musste den verbleibenden Code selbst herausfinden. Dennoch gelang es mir, eine laufende Version zu erstellen, da nicht viel fehlte, und bemerkte sofort einige Verbesserungen, die bislang unbemerkt geblieben waren. Da ich auf die Wiederauffüllung meiner Tokens warten musste, tat ich genau das.
159159-160160-Am nächsten Morgen begann die Verbesserungssitzung, und nach zwei langen Gesprächen war das Kontextfenster komplett gefüllt, und ich konnte keine Nachrichten mehr im selben Chat senden, obwohl meine Tokens noch nicht abgelaufen waren. Doch alles, was ich von Claude erreichen und erhalten wollte, war nun verfügbar, und ich konnte einige Tests in einem meiner größeren Projekte durchführen. Nachdem ich den Code manuell bestätigt und angepasst hatte, war ich zunächst zufrieden und entschied, dass die erste öffentliche Version fertig war.
161161-162162-Nach einigem Ausprobieren mit [GitHub Actions](https://github.com/github) gelang es mir, den [Publisher für eine VS Code-Erweiterung einzurichten](https://code.visualstudio.com/api/working-with-extensions/publishing-extension#create-a-publisher). Und zwei Patch-Versionen später war ich ziemlich zufrieden mit den Ergebnissen.
163163-164164-## Das Endergebnis
165165-166166-Probieren Sie die Erweiterung selbst aus, indem Sie auf den unten stehenden Button klicken. Es gibt noch viele Verbesserungsmöglichkeiten, also zögern Sie nicht, mitzuhelfen, wenn Sie interessiert sind. Sie können dies gerne auf [GitHub](https://github.com/trueberryless/terraform-variables-resolution) tun.
167167-168168-<LinkButton href="vscode:extension/trueberryless.terraform-variables-resolution">Terraform Variables Resolution installieren</LinkButton>
169169-170170-Hier sehen Sie das Beispiel aus [der Terraform-Erklärung](#what-is-terraform), das zeigt, wie diese Erweiterung die Werte der Variablen visuell in VS Code hinzufügt:
171171-172172-
-35
src/content/docs/de/blog/true-tracker.mdx
···11----
22-title: Entwerfen eines Ansatzes für Zeiterfassung ohne Konto und ohne Datenbank
33-date: 2024-07-06
44-description: Eine private Zeiterfassungs-App, die alle Daten in deinem Browser
55- speichert — keine Konten, keine Datenbank, nur einfache Erfassung.
66-excerpt: True Tracker ist eine minimalistische Zeiterfassungs-App, die mit
77- Next.js entwickelt wurde und alle Daten in deinem Browser speichert — keine
88- Konten, keine Datenbank, einfach nur vollständige Privatsphäre und
99- Einfachheit.
1010-tags:
1111- - Tool
1212-authors:
1313- - trueberryless
1414-cover:
1515- alt: A beautiful cover image with the text "True Tracker"
1616- image: ../../../../../public/blog/true-tracker.jpg
1717-featured: true
1818-1919----
2020-2121-Der Sommer 2024 markierte den Beginn eines aufregenden neuen Kapitels für mich als Entwickler. Bis zu diesem Zeitpunkt hatte ich hauptsächlich mit Angular gearbeitet, einem Framework, das ich für seinen strukturierten und meinungsstarken Ansatz schätzte. Aber ich war immer neugierig auf React gewesen – es fühlte sich leichter, flexibler und einfach… anders an. Als ich auf Next.js stieß, ein Framework von [Vercel](https://github.com/vercel), das auf React aufbaut und Funktionen wie serverseitiges Rendering und einen Fokus auf Performance bietet, wusste ich, dass es an der Zeit war, etwas Neues auszuprobieren.
2222-2323-Zur gleichen Zeit war ich seit Langem über Tools zur Sitzungsverfolgung wie Toggl frustriert. Theoretisch sind sie großartig, aber ihre besten Funktionen schienen immer hinter teuren Bezahlwänden versteckt zu sein. Wie jeder Entwickler irgendwann dachte ich: *„Warum baue ich mir nicht einfach mein eigenes?“* Es ist praktisch ein Übergangsritus – jeder Programmierer muss mindestens einmal eine To-Do-App oder einen Tracker in seiner Karriere erstellen. Und so wurde True Tracker geboren.
2424-2525-True Tracker sollte jedoch kein gewöhnlicher Tracker sein. Ich wollte etwas anderes machen. Zunächst wollte ich es einfach halten: Benutzer konnten Projekte hinzufügen, sie in Aufgaben unterteilen und ihre Zeit in Sitzungen erfassen. Kein Schnickschnack, keine unnötigen Funktionen. Doch hier kommt der Clou — True Tracker würde alles im lokalen Speicher speichern. Keine Konten, keine Cloud-Synchronisierung, und vor allem, niemand (nicht einmal ich) hätte Zugriff auf deine Daten. Es ist dein Tracker, und deine Daten bleiben deine.
2626-2727-Natürlich war der Übergang von Angular zu Next.js nicht ohne Herausforderungen. Wenn ich jemandem, der ein neues Framework lernt, einen Rat geben könnte, dann wäre es dieser: *Lies die Dokumentation.* Ernsthaft, überspring sie nicht. Ich tat es nicht, und das führte zu Chaos. Next.js war kürzlich auf den App-Router umgestiegen, aber ich begann stur, mit dem Page-Router zu bauen. Das führte zu einem Berg von Problemen, als die App nicht richtig gebaut werden konnte, weil kein `app`-Verzeichnis vorhanden war. Ich musste eine leere `.gitkeep`-Datei im Ordner belassen, nur damit Git sie nicht löscht und alles erneut kaputt macht. Nicht mein stolzester Moment.
2828-2929-Nach zwei Wochen ununterbrochenem Codieren, Debuggen und dem Gefühl, auf jeden erdenklichen Fehler zu stoßen, funktionierte True Tracker endlich. Ich erinnere mich an diesen ersten erfolgreichen Lauf – es fühlte sich an wie ein innerlicher Schrei *„Es lebt!“*.
3030-3131-Das Projekt war auch nicht ohne seine Witze. Ein Freund meinte nach einem Blick auf das Branding der App: „Also … das ‚true‘ in True Tracker? Das ist ein bisschen zu viel, selbst für das Bild. Es ist *zu viel Wahrheit!*“ Sie hatten nicht unrecht, aber ich nahm es an. Schließlich, wenn man etwas brandet, sollte man es auch durchziehen.
3232-3333-True Tracker wurde mein allererstes Next.js-Projekt – eine einfache, aber einzigartige App zur Zeiterfassung ohne Bedingungen. Sie ist jetzt live unter [https://true-tracker.trueberryless.org](https://true-tracker.trueberryless.org/).
3434-3535-Die Reise lehrte mich mehr, als nur wie man Next.js verwendet. Sie lehrte mich, Herausforderungen zu überwinden, zwischen Frameworks zu wechseln und die Eigenheiten zu schätzen, die jedes Projekt einzigartig machen. True Tracker ist nicht nur eine App; es ist ein Meilenstein – ein kleiner Beweis dafür, dass auch kleine Ideen eine große Wirkung haben können.
···11----
22-title: Einige Aspekte der Erstellung eines Blogs sind wirklich einfach, und
33- einige sind extrem schwierig!
44-description: Eine einsteigerfreundliche Einführung mit einigen Schimpfwörtern
55- darüber, wie man anfängt, seinen eigenen Blogbeitrag zu schreiben.
66-date: 2025-07-08
77-tags:
88- - Mindspace
99- - Education
1010-authors:
1111- - trueberryless
1212-excerpt: <p>Ein wenig darüber sprechen, wie man besser (bei weitem kein Meister,
1313- niemand ist perfekt) im Schreiben von Blogposts sein kann. Dies sind nur meine
1414- Gedanken, nachdem zwei großartige Leute aus der <a
1515- href="https://astro.build/chat">Astro Community</a> (<a class="gh-badge"
1616- href="https://github.com/jdtjenkins"><img
1717- src="https://github.com/jdtjenkins.png" alt="jdtjenkins" />Jacob</a> und <a
1818- class="gh-badge" href="https://github.com/louisescher"><img
1919- src="https://github.com/louisescher.png" alt="louisescher" />Lou</a>)
2020- beschlossen haben, Blogs darüber zu schreiben, wie schwer und einfach es ist,
2121- Blogposts zu schreiben.</p><p>Bitte lesen Sie zuerst ihre Beiträge, da dies
2222- die Folge von beiden ist:</p><ol><li><a
2323- href="https://jacobjenkins.codes/posts/why-is-writing-blogs-so-hard/">"Warum
2424- ist Blogschreiben so schwer?" - Jacob Jenkins</a></li><li><a
2525- href="https://lou.gg/blog/why-writing-blogs-isnt-hard">"Warum Blogschreiben
2626- nicht schwer ist" - Louis Escher</a></li><li><a
2727- href="/blog/writing-blogs-is-hard-and-easy/">"Einige Aspekte der Erstellung
2828- eines Blogs sind wirklich einfach, und einige sind extrem schwierig!" - Felix
2929- Schneider</a></li></ol><p>Nachdem Sie das gelesen haben, haben Sie erfolgreich
3030- diese großartige Trilogie von Blogposts über Blogposts abgeschlossen.</p>
3131-cover:
3232- alt: A beautiful cover image with the text "Writing Skill"
3333- image: ../../../../../public/blog/writing-blogs-is-hard-and-easy.jpg
3434-tableOfContents: false
3535-3636----
3737-3838-Nach einer sehr interessanten Diskussion im [Astro](https://github.com/withastro) [Discord](https://astro.build/chat) - gestartet von niemand geringerem als Kernentwickler [Alex](https://github.com/alexanderniebuhr) selbst (übrigens Glückwunsch zu diesem kürzlichen Erfolg 🎉) -, habe ich scherzhaft gesagt, dass jemand einen Blog darüber schreiben könnte, warum es für viele Menschen so schwierig ist, nicht nur zu schreiben, sondern auch einen Blog insgesamt zu pflegen.
3939-4040-Der Mann, der mich als Mitglied des Astro Support Teams vorgeschlagen hat - [Jacob](https://github.com/jdtjenkins) (übrigens vielen Dank, dass du mich in dieser großartigen Community bemerkt hast 😍) - nahm das ziemlich wörtlich und schrieb einen Blog darüber. Kein Scherz. Sehen Sie selbst: [https://jacobjenkins.codes/posts/why-is-writing-blogs-so-hard/](https://jacobjenkins.codes/posts/why-is-writing-blogs-so-hard/) Dies ist übrigens sein allererster Blog (und hoffentlich nicht sein letzter, da ich seinen Stil wirklich genossen habe).
4141-4242-Unser geliebter Allround-Helfer, Blogger, Designer und StudioCMS-Experte - [Lou](https://github.com/louisescher/) (übrigens danke, dass du mir im Voraus ein paar Tipps zum Blogschreiben gegeben hast, damit ich das hier selbstbewusster schreiben konnte 🤩) - sprang sofort auf diesen großartigen Hype-Zug (wie Twitch-Nutzer es nennen könnten) und veröffentlichte [seinen Anschlussartikel](https://lou.gg/blog/why-writing-blogs-isnt-hard) innerhalb von verdammten 12 Stunden!!! Glauben Sie mir, ich habe die Commits überprüft, Lou hat buchstäblich innerhalb von 4 Minuten nach Ablauf der 12 Stunden-Marke veröffentlicht.
4343-4444-Da ich viele Verweise auf beide ihrer Blogs einfügen werde, ist es am besten, wenn Sie zuerst ihre lesen. Und dann meinen. Oder vielleicht ist es besser, wenn Sie nur ihre lesen, ich bin mir noch nicht sicher, wie sich meiner entwickeln wird.
4545-4646-Aber was ich sagen ~~kann~~ schreiben kann, ist, dass meiner sich vollständig auf die Schreibfähigkeiten konzentrieren wird.
4747-4848-## Wie man einen Blog einrichtet (technische Herausforderungen)
4949-5050-Auch wenn dieser Blog sich nicht darauf konzentriert, wie man einen Blog erstellt, bereitstellt und all diesen technischen Kram macht, möchte ich erwähnen, dass es jeder schaffen kann. Wie Lou erwähnte, können Sie als Nicht-Techniker immer einfach ein Konto auf [Medium](https://medium.com/) oder ähnlichen Alternativen erstellen. Wenn Sie sich ein wenig mit Programmierung auskennen, können Sie Ihrer Kreativität ein wenig mehr Raum geben. Dank des großartigen [Starlight Blog](https://starlight-blog-docs.vercel.app/) Projekts von [HiDeoo](https://github.com/HiDeoo) benötigen Sie nicht viel Wissen, um Ihre eigene Website bereitzustellen. Heutzutage, wo es auch PaaS (Platform as a Service)-Anbieter wie [Netlify](https://www.netlify.com/) gibt, die den Umgang zu einer Click-Ops Erfahrung machen, gibt es keine Ausrede mehr, warum technische Schwierigkeiten Sie daran hindern sollten, Ihren Blog zu veröffentlichen.
5151-5252-## Okay, Spaß beiseite, jetzt: Schreibfähigkeiten
5353-5454-Aber dieser Blog sollte sich hauptsächlich auf die "Schreibfähigkeiten" konzentrieren, wie ich sagte, also machen wir dort weiter. Da ich selbst anfangs Schwierigkeiten hatte, Blogs zu schreiben, kann ich Jacob absolut zustimmen, dass der Einstieg schwierig ist. Es ist nicht wie das Durchlesen des [Astro "Getting started" Leitfadens](https://docs.astro.build/en/install-and-setup/), bei dem Sie nur den Anweisungen folgen müssen und dann auf Discord fragen, was ein `InvalidContentEntryDataError` bedeutet <sub>bitte verwenden Sie den `#support`-Thread, wenn Sie das tun 🫶</sub> ([Falls Sie sich immer noch wundern](https://docs.astro.build/en/reference/errors/invalid-content-entry-data-error/)).
5555-5656-Auf der anderen Seite erscheint das Ziel so nah und machbar. Schreiben Sie einfach ein paar Worte. Was ist so schwer daran, diese verdammten Worte zu schreiben? Ehrlich gesagt weiß ich es selbst nicht. Warum fragen Sie mich? Das Einzige, was mir geholfen hat, aus der Spirale „Du-willst-schreiben-aber-jedes-Mal-wenn-du-den-blinkenden-Cursor-ansiehst-wird-dein-Hirn-leer“ (machen wir das zum Hashtag der Woche) herauszukommen, war Lous Tipp, am Anfang nicht so viel von sich selbst zu verlangen. Warum möchten Sie mit einem perfekten Blog beginnen? Nur wegen Ihres Rufs? Damit die Leute nichts Falsches von Ihnen denken? Enttäuscht sind? Ehrlich gesagt: Das ist Schwachsinn! Nicht nur, weil Ihr erster Blog sehr wahrscheinlich von niemandem gelesen wird (mit Ausnahme von Jacobs außergewöhnlichem Blog), sondern auch, weil Sie es sich nur schwerer machen. Meine persönliche mentale Grenze war, dass ich dachte, ich müsse mindestens 500 Wörter schreiben, um anzufangen. Aber wer sagt das? Um ehrlich zu sein, wenn ich jetzt zurückblicke, denke ich manchmal: „Mensch, es wäre so einzigartig und cool gewesen, wenn mein erster Blog wie ein normaler Tweet gewesen wäre“, oder noch extremer: Ein. Wort. Niemand wird Sie davon abhalten, diesen Blog zu veröffentlichen:
5757-5858-> Hallo 👋
5959-6060-(Entschuldigung, falls ich jetzt Ihre großartige Idee genommen habe,\
6161-und Ihren gesamten Blogbeitrag hier eingefügt habe\
6262-\- wow cool, das reimt sich.)
6363-6464-Sehen Sie? Ich kann tun, was ich will, sogar ein verdammter Poet sein (typisches deutsches Verhalten), und niemand wird mich verurteilen. Okay, vielleicht wird jemand diesen Blog hassen, weil er „Zeitverschwendung sei, kein Sinn in all diesen nutzlosen Inhalten“, aber wen interessiert’s, ***w e n***? Es ist *Ihr* Blog, <span id="comment-reference" class="fragment-highlight">niemand fragt nach deren Meinungen (es sei denn, Sie haben einen Kommentarbereich unter Ihrem Blog 🙄 *hust* [Lou](https://lou.gg/blog/why-writing-blogs-isnt-hard#chapter-five-its-the-8th-of-july)</span>). Also denken Sie nicht darüber nach, was andere über Ihren Schreibstil, Inhalt, Sprachgebrauch oder sogar Ihre Grammatikfehler denken könnten. All dies macht Sie menschlich, und alles perfekt hinzubekommen, ist nicht nur völlig unnötig, sondern auch [hrad](https://jacobjenkins.codes/posts/why-is-writing-blogs-so-hard/#chapter-1---i-want-it-now).
6565-6666-Ein weiterer Bestandteil des Blogschreibens ist nicht nur der Einstieg, sondern auch die Schwierigkeit, einen Fluss, einen Gedanken, wenn Sie so wollen, aufrechtzuerhalten. Als Zuhörer gut geschriebener Reden bemerken Sie unterbewusst, dass sie gut waren, erfüllend, erhaben. Und das liebe ich an solchen Blogs oder Reden. Sie fühlen sich einfach irgendwie richtig an. Aber ich selbst habe akzeptiert, dass ich solche Errungenschaften in meiner eigenen kreativen Arbeit nicht erreichen kann. Und mit dieser Akzeptanz komme ich viel besser zurecht. Denn der Vorteil, Unvollkommenheit zu akzeptieren, besteht darin, Dinge fertig zu bekommen. Nicht nur zu 50 %, nicht nur zu 90 %. Fertig. Abgeschlossen, 100 %. Und das ist etwas, womit viele Menschen kämpfen, mich eingeschlossen - tatsächlich nur mich.
6767-6868-Aber wie Lou erwähnt, gibt es andere einfache Methoden, um einen roten Faden im gesamten Beitrag beizubehalten, der Geschichte treu zu bleiben, während Gedanken in Ihrem eigenen Kopf herumschweifen könnten. All diese Gedanken zu Papier zu bringen oder in diesem Fall auf die Tastatur, kann eine Herausforderung sein, besonders wenn Sie gerade erst mit dem Schreiben anfangen. Aber es gibt einen Grund, warum wir solche Fähigkeiten in der Schule lernen. Sie verbessern unsere kognitive Gesundheit und Entwicklung erheblich. Deshalb stimme ich Lou auch zu, wenn er sagt, dass KI im Schreibprozess niemals verwendet werden sollte. Es bringt weder für den Leser noch für Sie selbst irgendwelche Vorteile mit sich.
6969-7070-Ich möchte nicht wiederholen, was Lou sagt, aber Aufzählungspunkte haben mir in der Vergangenheit sehr geholfen. Sie geben mir das Gefühl von konstanter Struktur, während mein Geist mit verschiedenen Gedanken und Theorien spielen kann. So stelle ich sicher, dass ich immer wieder zu dem zurückkomme, was ich ursprünglich in meinen Beitrag aufnehmen wollte. „Und wenn Ihnen keine Aufzählungspunkte einfallen?“, könnten Sie fragen. Dann brauchen Sie möglicherweise noch mehr Brainstormings oder einfach Duschen.
7171-7272-Am Ende sind hier einige Tipps, die ich Ihnen mit auf den Weg geben kann:
7373-7474-* Entwickle deinen eigenen Schreibstil, nicht durch Training, sondern durch Schreiben. Früher oder später wirst du bemerken, welche Arten dir gefallen könnten, einige Dinge, die du von anderen Bloggern übernehmen möchtest, aber summa summarum wird das, was du schreibst, immer deins sein. Du teilst es einfach mit der Welt. Es liegt an dir, ob du hier und da einen Doppelpunkt oder Bindestrich verwenden möchtest, mehr Punkte, die Vergangenheitsform, den Imperativ, Schimpfwörter oder den formelleren Stil. All diese Dinge fügen sich automatisch zusammen und definieren dich als einzigartigen Blogger. Und deine Leser werden diese Individualität mehr schätzen, als du denkst.
7575-7676-* Nimm dir nicht zu viel vor. Das klingt vielleicht einfach, aber jeder tappt regelmäßig in diese Falle. Oder vielleicht nur Leute wie ich, die eine Mischung aus Autismus und Perfektionismus haben – keine Ahnung.
7777-7878-* Auch wenn es immer dumm klingt: Fang an zu schreiben. Und wenn es nicht funktioniert, fang mit dem Mittelteil an. Denn ich weiß, Anfang und Ende sind immer schwierig, aber meiner Meinung nach flutscht der Mittelteil wie Butter.
7979-8080-* Blogs haben einfache und schwierige Seiten: Das ist, was der Titel sagt, aber wusstest du, dass ich beim Schreiben all dessen gemerkt habe, dass ich diese Frage überhaupt nicht beantwortet habe... Gott sei Dank hat Jacob am Ende dieses Vorschlags kein Fragezeichen gesetzt. 🙏
8181-8282-Ja, ich denke, das war's. Wenn du deine Gedanken teilen möchtest, hinterlasse sie in [Lous Kommentaren](https://lou.gg/blog/why-writing-blogs-isnt-hard), weil ich keine habe.
-17
src/content/docs/de/index.mdx
···11----
22-title: Tiefgründige Gedanken - Überblick
33-description: Willkommen in meinem Blog. Werfen Sie einen Blick auf diesen
44- minimalistisch gestalteten Überblick über alle meine Blogbeiträge.
55-template: splash
66-lastUpdated: false
77-editUrl: false
88-pagefind: false
99-next:
1010- label: Detailed view
1111- link: /blog
1212-1313----
1414-1515-import IndexPostList from "../../../components/IndexPostList.astro";
1616-1717-<IndexPostList />
···11----
22-title: Accélérer les traductions avec l'intégration continue
33-description: L'histoire de la façon dont mon parcours de contributions à
44- action-continuous-translation a commencé.
55-date: 2025-07-09
66-tags:
77- - Automation
88- - GitHub
99- - Plugins
1010- - Markdown
1111- - Tool
1212-authors:
1313- - trueberryless
1414-excerpt: <p>Je travaille dans les communautés de logiciels libres (<span
1515- lang="en">OSS</span>) sur <a class="gh-badge"
1616- href="https://github.com/github"><img src="https://github.com/github.png"
1717- alt="github" />GitHub</a> depuis plus d'un an maintenant et, bien que je
1818- pensais avoir trouvé tout ce à quoi je voulais contribuer, j'ai récemment
1919- découvert le projet personnel de <a class="gh-badge"
2020- href="https://github.com/pelikhan"><img src="https://github.com/pelikhan.png"
2121- alt="pelikhan" />Peli</a>, <a
2222- href="https://github.com/pelikhan/action-continuous-translation">action-continuous-translation</a>.
2323- Je suis très heureux d'avoir commencé à y apporter des contributions
2424- régulières et de faire désormais partie de cette petite communauté.</p>
2525-cover:
2626- alt: A beautiful cover image with the text "AI Translations"
2727- image: ../../../../../public/blog/accelerating-translations-with-continuous-integration.jpg
2828-tableOfContents: false
2929-3030----
3131-3232-Au cours de l'année passée, j'ai beaucoup travaillé dans diverses communautés de logiciels libres sur GitHub pendant mon temps libre et j'ai apprécié ces contributions, qui sont en quelque sorte relaxantes, car elles me permettent d'acquérir de nouvelles connaissances quotidiennement.
3333-3434-Après un certain temps de contribution, j'ai également appris à quel point les communautés derrière ces projets sont bienveillantes et accueillantes. Ces personnes ont toutes une chose en commun avec vous : elles veulent créer de grandes choses pendant leurs loisirs. Surtout, la communauté [Astro](https://github.com/withastro) est celle dans laquelle j'ai pris le plus de plaisir à être, car elle est à la fois la plus gratifiante et la plus conviviale. Toutes les communautés n'arrivent pas à atteindre un tel statut parmi les projets OSS.
3535-3636-Récemment, j'ai découvert un autre projet en évolution fondé par [pelikhan](https://github.com/pelikhan), qui vise à traduire automatiquement toute votre documentation, vos blogs ou vos sites marchands chaque fois qu'un changement survient grâce à l'aide de l'IA. Bien qu'un peu sceptique au début, la lecture approfondie du README.md de ce projet m'a captivé.
3737-3838-L'approche consistant à guider strictement l'IA pour ne traduire que de petits morceaux - principalement des phrases ou des paragraphes avec des instructions perfectionnistes - m'a fait penser que cela pourrait vraiment fonctionner. J'ai donc essayé cela sur mon propre projet, mon blog. Et à ma grande surprise, ces traductions étaient bien meilleures que ce que j'avais imaginé. Bien sûr, on remarque que cela a été traduit par l'IA - le travail fait main ne sera, espérons-le, jamais entièrement remplacé - mais si vous mentionnez honnêtement que vous utilisez l'IA dans une note en marge, cela rend le contenu bien plus accessible aux gens que l'absence de traduction.
3939-4040-J'ai donc examiné de plus près le code réel du projet. Après avoir remarqué quelques petites incohérences, des espaces pour des améliorations, et des fonctionnalités manquantes mais très intéressantes ici et là, j'ai commencé à y contribuer également. Après tout, avec un an de contributions dans de plus grands projets, les \<span lang="en">PRs\</span> n'étaient pas une nouveauté pour moi.
4141-4242-Il faut savoir que c'était un vendredi soir - presque nuit dans mon fuseau horaire - et que [Peli](https://github.com/pelikhan) était également en ligne, enchaînant les commits sur le projet. J'ai rapidement remarqué qu'à l'inverse des autres projets auxquels je participe, Peli ne perdait pas de temps à fusionner les <span lang="en">PRs</span>. Ce fut très gratifiant ce soir-là car je n'ai cessé de contribuer jusqu'à une heure du matin, Peli fusionnant plus vite que je ne pouvais améliorer les fonctionnalités, les documents et les corrections. Un autre aspect qui a été génial est que, puisque c'était un jeune projet, Peli n'a pas hésité à simplement fusionner, tester localement, puis pousser de petites corrections que j'avais manquées.
4343-4444-Trois jours plus tard, me voici maintenant contributeur officiel du projet, le rendant chaque jour meilleur, principalement en me concentrant sur la documentation et le support pour mon projet de cœur : Starlight - comme vous l'avez peut-être déjà deviné à partir de [mes blogs](../../../../../blog/tags/starlight/).
4545-4646-Peli et moi organisons nos sessions de productivité virtuelles entre 16 h et 20 h UTC, avec des extensions pendant les week-ends. Donc, si vous souhaitez nous rejoindre en tant que pionnier du projet ou si cela a suscité votre intérêt pour l'utiliser, n'hésitez pas à le consulter sur [GitHub](https://github.com/github) : [https://github.com/pelikhan/action-continuous-translation](https://github.com/pelikhan/action-continuous-translation)
-111
src/content/docs/fr/blog/cognitive-erosion.mdx
···11----
22-title: Arrêtez d'externaliser votre âme à l'IA
33-description: Réflexions sur la surutilisation de l'IA, ses effets négatifs
44- cognitifs et sociaux, et un modèle proposé pour utiliser l'IA sans éroder la
55- créativité et la communication humaines.
66-date: 2025-08-10
77-tags:
88- - Mindspace
99-authors:
1010- - trueberryless
1111-cover:
1212- alt: A beautiful cover image with the text "Cognitive Erosion"
1313- image: ../../../../../public/blog/cognitive-erosion.jpg
1414-giscus: true
1515-featured: true
1616-1717----
1818-1919-Cela fait plus de deux ans et demi depuis la sortie de ChatGPT. Le 30<sup>ème</sup> novembre 2022 a marqué le début d'une nouvelle ère. Le début de l'IA. De nos jours, de nombreuses professions et personnes dans leur vie privée, en particulier dans le secteur des technologies de l'information, l'utilisent quotidiennement. Et nous ne savons même pas où nous en sommes sur le cycle des attentes de Gartner ou si l'IA s'améliorera en suivant la "Loi des rendements accélérés" de Kurzweil.
2020-2121-La tendance est toujours en hausse, mais en même temps, j'ai remarqué une légère mais constante dégradation des connaissances humaines, car les gens délèguent de plus en plus le travail créatif à l'IA. Par conséquent, j'ai décidé d'écrire un petit article de blog pour partager mes réflexions, en essayant de décourager la surutilisation de l'intelligence artificielle qui pourrait ruiner nos capacités cognitives. Et bien que je sache que très peu de personnes liront ceci, cela ne m'empêche pas d'essayer. Sinon, j'aurais peut-être raté mon occasion d'aider l'avenir de l'humanité.
2222-2323-{/* excerpt */}
2424-2525-> **Avertissement** : Ce billet de blog est entièrement basé sur mes observations concernant les évolutions des changements sociaux, avec une attention particulière aux façons d'utiliser l'intelligence artificielle selon mon interprétation, et est donc très subjectif. Je n'ai pas consulté d'études qui pourraient soutenir ou contredire mon opinion.
2626-2727-## Comment les gens ont tendance à utiliser l'IA
2828-2929-L'IA est incroyable. Je ne veux pas remettre en question cette affirmation. Elle m'a aidé et m'aide encore à améliorer mon flux de travail, à acquérir de nouvelles connaissances, à explorer de nouveaux horizons et à découvrir de nouvelles technologies. Pour les personnes qui ne s'intéressent pas au fonctionnement de l'IA, de tels outils intelligents ressemblent à de la magie. En conséquence, j'aime voir leurs yeux briller et leurs bouches s'ouvrir lorsque je leur explique que tout ce sur quoi l'IA est basée, c'est la probabilité. Quel mot est le plus susceptible d'être le suivant, en fonction des propriétés et des émotions dans un espace virtuel hautement dimensionnel. [Mais c'est un autre sujet.](https://www.youtube.com/watch?v=LPZh9BOjkQs)
3030-3131-Ce sur quoi je souhaite me concentrer, c'est sur la façon dont les gens ont fini par utiliser l'IA, en particulier au cours des derniers mois - voire des dernières années. Comme notre cerveau est paresseux par défaut, nous avons tendance à externaliser davantage de travail à l'IA au fur et à mesure que nous nous concentrons moins sur une tâche spécifique. En d'autres termes, si vous ne mettez pas la plupart de votre engagement dans votre projet actuel, vous êtes probablement sur le point de simplement le transmettre à une IA. Une autre raison potentielle de sous-traiter le travail au monde de l'IA est l'ignorance des technologies sous-jacentes, ce qui rend difficile pour vous de trouver vos propres solutions.
3232-3333-Je ne suis en aucun cas un scientifique, mais je pense que regarder une IA faire votre travail - parce que, en raison de votre incompétence, le résultat que vous produisez ne correspond pas à votre vision - vous donne tellement de dopamine que votre cerveau veut le faire plus souvent. De plus, l'être humain, en tant que figure sociale, cherche toujours à être connecté à quelqu'un, et interagir avec l'IA satisfait ces besoins. Ce comportement est typique de notre cerveau et se produit également lorsque nous regardons les réseaux sociaux ou consommons du contenu explicite. Il est profondément enraciné dans notre cortex cérébral, et toute l'industrie du jeu et les secteurs du divertissement en profitent sans scrupules pour optimiser leurs gains.
3434-3535-J'ai moi-même remarqué cette tendance, comme vous pouvez le voir clairement dans [certains de mes articles où j'ai avoué avoir utilisé l'IA](../../../../../blog/authors/artificial-intelligence/) pour m'aider à les écrire. Mais je pense que ce n'est pas une honte. Tout créateur de contenu qui utilise l'IA devrait expérimenter de première main les écueils de la création de contenu directement pour le spectateur ou le lecteur, afin de réaliser à quel point il sait peu sur le sujet par la suite. Cela lui permettra d'apprendre de son erreur et d'être conscient de la facilité avec laquelle la paresse peut vous entraîner dans un chemin si méprisable. Seuls les excellents parmi nous se sont toujours efforcés de créer du contenu fait main.
3636-3737-## Effets négatifs
3838-3939-J'ai souligné les principaux inconvénients que j'ai observés dans une utilisation excessive de l'IA. Je vais maintenant vous donner deux raisons secondaires que j'ai remarquées chez moi, pour lesquelles vous ne devriez pas utiliser l'IA pour un travail expressif.
4040-4141-### Déclin de la communication
4242-4343-En regardant une vidéo promotionnelle de "The Browser Company™" (voir le dernier lien dans la [section des ressources ci-dessous](#resources-with-better-evidence)), j'ai remarqué que les visions peuvent être très éloignées de nos jours. Je constate cette tendance non seulement dans le navigateur Dia, mais dans de nombreux aspects différents de la technologie et de nos vies. Un côté de la tendance veut intégrer l'IA partout où c'est possible, élargissant notre dépendance à celle-ci. Un exemple est l'utilisation de l'IA pour composer et écrire des messages à nos amis proches et collègues parce que cela nous rend plus efficaces. Je crois que cela nous rend juste stupides à long terme.
4444-4545-Si les gens ne forment pas leur cerveau à trouver des mots pour communiquer, à construire des phrases utiles et un sens pouvant être compris par d'autres êtres humains, notre fondation même de l'interaction les uns avec les autres est brisée et nous reviendrions au niveau de *Homo habilis* - la dernière espèce qui, probablement, n'a pas utilisé un langage verbal pleinement développé. Voyez, j'ai utilisé l'IA pour m'aider à rechercher ce petit bout d'information, mais j'ai choisi mes mots consciemment pour m'exprimer. De cette façon, non seulement j'ai appris quelque chose de nouveau, mais je peux maintenant également m'en souvenir. Une capacité que vous n'aurez jamais en externalisant l'écriture à l'IA.
4646-4747-### Solitude
4848-4949-Être seul sur un plan mental est, à mon avis, l'un des dangers modernes les plus sous-estimés de la société. Le côté ironique de cela, c'est que si tout le monde est seul, nous avons tous cela en commun, ce qui fait que nous ne sommes pas seuls avec la solitude de chacun. Mais mes pensées dérivent à nouveau vers d'autres océans.
5050-5151-L'IA nous encourage fortement à être seuls. Elle ~~agit~~ a été intentionnellement entraînée à agir comme un parfait ami, collègue ou quel que soit le terme que vous voulez employer. Récemment, j'ai remarqué que les réponses de ChatGPT incluent explicitement mon nom, ce qui est très étrange à plusieurs niveaux si vous voulez mon avis. On pourrait dire qu'il s'agit d'un doxxing artificiel privé, ce qui, bien sûr, est un oxymore en soi, car le doxxing, par définition, est public. Néanmoins, plus vous utilisez l'IA, plus *souvent* vous voulez utiliser l'IA. En particulier après l'introduction des modes vocaux de l'IA, cette tendance a continué à augmenter comme si le lendemain n'existait pas. Félicitations, ClosedAI, vous venez de réinventer l'addiction.
5252-5353-Dans les pires scénarios, cela peut amener les gens à craindre de parler avec d'autres personnes. À abandonner des amitiés. À se retirer de la société. De telles habitudes sont des problèmes graves et devraient être examinées par un médecin ou un psychologue.
5454-5555-## Proposition de modèle de couche d'utilisation de l'IA
5656-5757-Proposer une solution globale pour tous face à un tel problème est impossible. Puisque chaque individu a ses propres expériences avec l'IA, ses propres pensées et sentiments, qu'il soit optimiste ou pessimiste, je ne peux pas parler pour tout le monde. En fait, je pense que je peux seulement parler pour moi-même, apprendre et partager mes propres façons de gérer et de limiter mon utilisation de l'IA, et espérer que ces expériences puissent également vous aider.
5858-5959-Mes expériences idéales avec l'IA - le juste milieu optimal entre la surutilisation de l'IA accompagnée de l'érosion cognitive et le fait de laisser la mode passer à côté de vous sans en tirer aucun avantage - consistent à utiliser l'IA [si et seulement si](https://en.wikipedia.org/wiki/If_and_only_if) vous, et seulement vous, en tirez des avantages. En d'autres termes, contrôlez votre utilisation et limitez-la de manière extrême, où seul vous-même devriez jamais entrer en contact avec le contenu produit par l'IA. Une telle limitation a de nombreuses conséquences, voici quelques exemples pour mieux illustrer et souligner ce que je veux dire :
6060-6161-* Utilisez l'IA pour des sessions d'apprentissage personnelles : Si vous souhaitez initialement plonger dans un nouveau sujet complètement inconnu, l'IA peut vous donner des aperçus généraux et vous montrer des connexions avec d'autres parties du savoir et des usages dans le monde réel. Bien que cela ne signifie pas nécessairement que vous apprendrez plus vite ou plus efficacement, cela aide à faire le premier pas et à se lancer.
6262-* Utilisez l'IA pour des tâches stupides et répétitives et demandez de l'aide si vous êtes certain que le problème ou la tâche a déjà été résolu des milliers de fois par d'autres. Les modèles linguistiques actuels sont formés sur des données existantes, ce qui signifie qu'ils sont censés être performants pour résoudre des problèmes déjà résolus, non pas pour réinventer la roue, mais pour suggérer d'utiliser l'instrument rond existant.
6363-6464-<br />
6565-6666-* N'utilisez pas l'IA pour vous exprimer auprès des autres. Réfléchissez à ce que vous voulez transmettre, aux connaissances que vous souhaitez partager et exprimez vos pensées avec vos propres mots. Cela vous aide énormément à renforcer vos idées, à mieux vous souvenir de ce que vous avez appris et à vous sentir beaucoup mieux.
6767-* N'utilisez pas l'IA pour générer des travaux complexes et créatifs. De nos jours, il existe des centaines - probablement des milliers - d'outils qui vous aident à créer de l'art, de la musique, du code, des designs, des plans, etc., grâce à l'IA ou entièrement avec elle. Bien que cela puisse donner l'impression que vous êtes plus productif, cela vous rend simplement plus ignorant à mesure que vous revenez souvent à ces méthodes, au lieu de faire ce que vous aimez par vous-même. Il est tout à fait acceptable de dire que des petites parties du travail peuvent être externalisées à l'IA, principalement des tâches répétitives qui prennent seulement plus de temps à faire manuellement. Les œuvres créatives et originales, cependant, devraient rester humaines et réalisées avec amour. Si vous n'aimez pas ce que vous faites du tout, cela peut être un signal qu'il serait peut-être temps d'arrêter entièrement cette activité.
6868-* Ne vous laissez pas séduire par tout le battage autour des outils d'IA. Des outils comme [Lovable](https://lovable.dev), [GitHub Copilot](https://github.com/features/copilot), [Cursor](https://cursor.com/en), [ChatGPT Voice](https://openai.com/index/chatgpt-can-now-see-hear-and-speak/) et le nouveau venu : [GPT-5](https://academy.openai.com/public/resources/intro-gpt-5), pour n'en citer que quelques-uns, ne cherchent pas vraiment à vous aider. Ils veulent soit vos données directement, soit contrôler votre flux de travail afin que vous ne puissiez plus y échapper une fois habitué à leur utilisation. Malheureusement, les gens s'habituent à l'IA de manière fascinante et rapide.
6969-7070-En bref, ce que je veux dire, c'est que l'IA devrait être utilisée pour réfléchir et aider chaque individu à créer un produit final - à ne pas confondre avec l'IA créant le produit final -, mais pas pour communiquer avec d'autres personnes ni pour les résultats finaux eux-mêmes (par exemple, la création d'images, l'écriture de blogs, les publications sur les réseaux sociaux, la communication dans les chats, les discours de motivation, les essais, etc.). À mon avis, le cerveau humain ne peut évoluer et apprendre que par ses propres erreurs et expériences. Et vous ne pouvez jamais apprendre de vos erreurs lorsqu'elles ont en réalité été générées par l'IA.
7171-7272-> L'IA a sa place dans l'idéation, mais le travail expressif devrait rester humain.
7373-7474-### Le Paradigme
7575-7676-J'ai récemment découvert un modèle de conception de logiciels appelé "Onion Architecture" (architecture en couches). Pour faire simple, le principe clé de cette architecture est sa division en couches, où chaque couche n'est connectée qu'à ses deux voisines (les couches parentes et enfants, mais pas les sœurs).
7777-7878-Pour transposer ce paradigme dans le contexte actuel, vous pouvez imaginer l'IA comme un outil mis à votre disposition, qui est déconnecté de toutes les autres parties en étant uniquement entouré par votre cerveau. Seul votre cerveau peut accéder, manipuler, créer et modifier les couches extérieures - dans cet exemple, écrire des blogs, créer du contenu, communiquer avec les gens via des chats ou des discours, ou vous exprimer avec de l'art ou des designs.
7979-8080-Voici une image qui représente mon idée d'un usage limité mais idéal de l'IA :
8181-8282-
8383-8484-Si une approche architecturale comme celle-ci et le paradigme dans ce contexte sont optimaux ou juste subjectifs, cela peut être critiqué dans les commentaires ci-dessous.
8585-8686-## Conclusion
8787-8888-Comme je l'ai dit au début, ce billet de blog est très subjectif et vise simplement à partager mon expérience avec tout le monde, afin que vous puissiez également apprendre de mes erreurs, optimiser votre propre utilisation de l'IA et mieux la contrôler. En fin de compte, vous pouvez faire ce que vous voulez, mais soyez conscient(e) de la dégradation de votre cerveau lorsque vous tombez dans le piège d'une surutilisation.
8989-9090-Une chose à noter également : Il m'a fallu plusieurs mois pour écrire cet article, le peaufiner et parfois repartir de zéro. Aucun blog n'est parfait, comme vous l'avez sans doute remarqué avec celui-ci. Il y a probablement quelques erreurs grammaticales ici et là, des phrases qui, en réalité, ne font pas sens, mais cela fait partie de l'humanité. De plus, il y a très probablement beaucoup d'opinions fortes dans ce billet où vous seriez totalement contre et en désaccord complet avec moi (j'ai hâte de lire vos commentaires exprimant votre indignation), mais cela me rend unique. Mon cerveau, mes pensées, mon opinion.
9191-9292-> "errare humanum est"
9393-9494-## Ressources avec de meilleures preuves
9595-9696-Si vous êtes intéressé(e) par des articles basés sur des études ou approches plus scientifiques, n'hésitez pas à en lire quelques-uns ou tous. Ils ne sont pas classés dans un ordre particulier, alors commencez au milieu et progressez vers le haut ou vers le bas. 😊
9797-9898-* [AI: Artificial Incompetence](https://lou.gg/blog/ai-artificial-incompetence)
9999-* [Les outils de codage IA rendent les développeurs plus lents même s'ils pensent être plus rapides, selon une étude](https://www.theregister.com/AMP/2025/07/11/ai_code_tools_slow_down/)
100100-* [Les entreprises qui ont essayé de faire des économies avec l'IA dépensent désormais une fortune pour réparer ses erreurs](https://futurism.com/companies-fixing-ai-replacement-mistakes)
101101-* [Linus Torvalds estime que l'IA est '90 % marketing et 10 % réalité'](https://www.tomshardware.com/tech-industry/artificial-intelligence/linus-torvalds-reckons-ai-is-90-percent-marketing-and-10-percent-reality)
102102-* [La situation des "petites amies IA" est TRISTE (YouTube.com)](https://www.youtube.com/watch?v=Ftt5KqJ5D0Q)
103103-* [L'IA va-t-elle vous rendre stupide ?](https://www.economist.com/science-and-technology/2025/07/16/will-ai-make-you-stupid)
104104-* [L'IA ne nous rend pas plus productifs. Elle nous rend cognitivement ruinés. (X.com)](https://x.com/itsalexvacca/status/1935343874421178762)
105105-* [Être accro à l'intelligence artificielle générative](https://www.forbes.com/sites/lanceeliot/2024/08/24/being-addicted-to-generative-ai/)
106106-* [Encore une autre étude montre que l'IA nous rend stupides](https://tech.co/news/another-study-ai-making-us-dumb)
107107-* [L'IA nous rend-elle plus intelligents, plus stupides... ou artificiellement plus intelligents ? (crise symbiotique IA)](https://cognitiontoday.com/is-ai-making-us-smarter-or-dumber-or-artificially-smarter/)
108108-* [Research: Gen AI Makes People More Productive—and Less Motivated](https://hbr.org/2025/05/research-gen-ai-makes-people-more-productive-and-less-motivated)
109109-* [Les moyens les plus puissants de "hacker" notre nouveau navigateur Dia (YouTube.com)](https://www.youtube.com/watch?v=JCZUIm4S9QQ)
110110-111111-Bonne lecture !
-47
src/content/docs/fr/blog/diploma-thesis.mdx
···11----
22-title: Conception d’un pipeline basé sur Kafka et d’un graphique interactif pour
33- la détection des anomalies énergétiques
44-date: 2024-05-13
55-description: Une solution SOA avec Siemens AG pour analyser les anomalies du
66- réseau électrique, comprenant un pipeline Kafka, PostgreSQL, une API GraphQL
77- et un tableau de bord Angular pour la visualisation.
88-excerpt: Dans le cadre de notre thèse avec Siemens AG, nous avons développé une
99- solution orientée services pour détecter les anomalies du réseau électrique —
1010- comprenant un pipeline Kafka, PostgreSQL, une API GraphQL et un tableau de
1111- bord Angular avec des tableaux et un graphique interactif pour une
1212- visualisation en temps réel.
1313-tags:
1414- - Tool
1515-authors:
1616- - trueberryless
1717-cover:
1818- alt: A beautiful cover image with the text "Diploma Thesis"
1919- image: ../../../../../public/blog/diploma-thesis.jpg
2020-featured: true
2121-giscus: true
2222-2323----
2424-2525-Au cours de ma cinquième année à la HTL Krems (2023/24), chaque étudiant devait réaliser une thèse de diplôme — un projet d’envergure divisé en deux parties principales : théorique et pratique. Travaillant en binôme, nous devions produire un document théorique d’environ 100 pages dans lequel nous présentions, analysions et expliquions notre sujet choisi.
2626-2727-La partie théorique était organisée en trois sections. La première consistait à recueillir et résumer les connaissances existantes issues de sources fiables comme des livres et des thèses précédentes. La deuxième se concentrait sur les idées et conclusions tirées de notre prototype — une solution logicielle que nous avons développée pour la partie pratique. Enfin, la troisième section combinait ces deux parties, offrant une comparaison critique et une réflexion sur ce que nous avions appris à travers l’ensemble du projet.
2828-2929-L’aspect pratique exigeait de concevoir et de mettre en œuvre une solution, soit logicielle, soit matérielle, pour résoudre un problème réel. Mon coéquipier, Clemens Schlipfinger, et moi avons décidé de nous concentrer exclusivement sur le logiciel pour garantir la fiabilité. Le matériel peut introduire des problèmes imprévisibles, tandis que le logiciel — surtout lorsqu’il est déployé dans des conteneurs Docker robustes — offre un environnement cohérent qui fonctionne sans problème partout.
3030-3131-Ce qui rendait notre projet particulièrement excitant, c’était notre partenariat avec Siemens AG, une entreprise multinationale renommée spécialisée dans l’énergie, l’automatisation et la digitalisation. Cette collaboration était rare parmi nos pairs et ajoutait une dimension professionnelle à notre travail. Siemens nous a confié la mission de développer une solution logicielle orientée services pour analyser les anomalies du réseau électrique européen.
3232-3333-Le système que nous avons construit comprenait plusieurs composants, chacun conçu pour remplir une fonction spécifique. Au cœur du système se trouvait une application Kafka responsable de l’ingestion des données — des rapports d’anomalies du réseau électrique que nous appelions Findings. Ces rapports détaillaient les défaillances et irrégularités dans le réseau électrique complexe européen, composé de millions de composants interconnectés comme des transistors, des interrupteurs et des générateurs. Kafka transmettait les anomalies les plus récentes à une base de données PostgreSQL, qui était ensuite rendue accessible via une API GraphQL. Cette API offrait des fonctionnalités complètes comme la pagination, le filtrage et le requêtage pour assurer une intégration fluide avec notre frontend basé sur Angular.
3434-3535-Le frontend a été conçu comme un tableau de bord convivial avec trois sections clés :
3636-3737-1. Table des anomalies – Un tableau consultable, paginé et filtrable pour naviguer rapidement parmi les anomalies.
3838-3939-2. Vue Graphique – Une visualisation dynamique des données d’anomalies, facilitant l’identification de la source d’un problème dans le réseau vaste et complexe.
4040-4141-3. Tableau de bord global – Des indicateurs clés et des aperçus pour une vue d’ensemble rapide et exploitable.
4242-4343-Clemens et moi avons réparti les responsabilités de manière équitable. Clemens s’est occupé des systèmes backend, y compris Kafka, PostgreSQL et l’API GraphQL, garantissant un pipeline de données fiable et efficace. De mon côté, j’ai pris le rôle de chef de projet, coordonnant la communication avec Siemens tout en développant le frontend et en assurant l’intégration fluide des différents composants. Cette collaboration nous a permis de tirer parti de nos points forts et de maintenir une charge de travail équilibrée.
4444-4545-Notre produit final répondait non seulement aux exigences de Siemens, mais démontrait également la puissance d’une architecture orientée services (SOA) bien conçue dans la résolution de problèmes complexes et réels. C’était extrêmement gratifiant de voir notre logiciel fonctionner de manière fiable et fournir des informations exploitables pour remédier aux anomalies du réseau électrique.
4646-4747-Pour plus de détails sur notre travail, n’hésitez pas à consulter notre thèse [ici](https://trueberryless.org/thesis.pdf) 📜 ou à lire notre cours vidéo [ici](https://videos.trueberryless.org/videos/thesis/) 🎥 (tous deux disponibles uniquement en allemand).
-32
src/content/docs/fr/blog/earworms.mdx
···11----
22-title: Les chansons obsédantes et le message caché dans le motif
33-description: Quelques réflexions aléatoires sur les chansons obsédantes et leur
44- message caché dans le motif.
55-date: 2025-07-23
66-tags:
77- - Mindspace
88-authors:
99- - trueberryless
1010-cover:
1111- alt: A beautiful cover image with the text "Earworms"
1212- image: ../../../../../public/blog/earworms.jpg
1313-tableOfContents: false
1414-giscus: true
1515-1616----
1717-1818-Oui, ce titre est un petit clin d'œil à l'excellente série Netflix "Arcane", mais ce n'est pas le sujet de cet article.
1919-2020-Aujourd'hui, je souhaite partager quelques réflexions sur les chansons obsédantes, un terme qui trouve son origine en allemand (« Ohrwurm ») et qui a ensuite été adopté en anglais en tant que traduction littérale. Le sens derrière ce terme plutôt abstrait est la musique accrocheuse—*musique collante*, comme l'appelle Wikipédia. Ce phénomène se produit souvent de manière imprévisible, surtout lorsque nos pensées s'éloignent du moment présent.
2121-2222-{/* excerpt */}
2323-2424-Bien que beaucoup de mes idées de blog se manifestent lors de trajets en train, en étant allongé au lit ou simplement en réfléchissant à la vie, l'inspiration pour cet article m'a littéralement frappé sous la douche, comme le prévoient les bonnes vieilles *pensées sous la douche*. La raison – comme vous avez peut-être deviné en lisant le sujet – était une chanson obsédante concernant une mélodie dont j'aurais juré ne pas avoir entendu parler depuis longtemps, disons 4 à 5 semaines.
2525-2626-Et cela semble toujours être la partie déroutante des chansons obsédantes : personne ne sait vraiment qui décide du moment où elles apparaissent. Est-ce le cerveau qui appuie sur « lecture » lorsqu'il est légèrement engourdi ? Vous savez ce que je veux dire, ces moments où vous ne savez pas vraiment à quoi vous pensez en ce moment et où vous n'avez pas besoin de réfléchir à ce à quoi penser, vous profitez simplement du moment. Il existe une autre expression idiomatique autrichienne pour ce scénario exact : "ins Narrenkastl schauen", ce qui signifie quelque chose comme *regarder dans le vide*. Et je pense que c'est précisément ces moments d'absence mentale qui sont à l'origine et la raison pour laquelle ces chansons obsédantes surviennent.
2727-2828-Mais cela laisse toujours la question : qui décide de ce qu'il faut jouer dans la tête de quelqu'un lorsque cela se produit ? Qui est le DJ ? Selon mon expérience, j'ai remarqué un schéma récurrent, surtout si vous venez d'écouter de la musique dans la dernière demi-heure. Mon cerveau, au moins, aime répéter des morceaux de la **pénultième chanson** entendue, en d'autres termes la chanson qui a été jouée avant la dernière. Cette théorie fonctionne encore mieux si la dernière chanson a été mise en pause au milieu ou simplement pas exactement à la fin.
2929-3030-La raison exacte de cela m'est complètement inconnue, mais si je devais deviner, je dirais que les rythmes de la chanson terminée (la pénultième) résonnent encore quelque part dans votre esprit, puisque la chanson elle-même était peut-être de ces chansons du type « je-diminue-mon-volume-pour-mettre-fin-à-ma-durée », ce qui n'est pas mon type préféré de fin musicale, mais encourage le cerveau à continuer.
3131-3232-Du moins, c'est ce que je crois. Je serais très intéressé de savoir si vous avez vécu des schémas similaires, alors n'hésitez pas à écrire votre propre article de blog à ce sujet ou à simplement partager celui-ci avec des amis afin que vous puissiez en discuter avec eux !
···11----
22-title: Concevoir un profil qui fonctionne dans les règles de GitHub
33-date: 2025-02-05
44-description: Comment j’ai conçu un README de profil GitHub qui ne devrait pas
55- exister, mais qui existe
66-tags:
77- - GitHub
88- - Markdown
99-authors:
1010- - trueberryless
1111-cover:
1212- alt: A beautiful cover image with the text "GitHub Profile README"
1313- image: ../../../../../public/blog/github-profile-readme.jpg
1414-1515----
1616-1717-Tout grand projet commence par la prise de conscience d’un problème. Mon README de profil GitHub était en désordre, rempli d’une quantité excessive d’informations, trop de badges, et un contenu accablant qui manquait de style et de structure. Il contenait des réalisations de hackathon, des graphiques de contributions GitHub, divers badges techniques, et bien plus, ce qui le rendait visuellement peu attrayant et difficile à naviguer. Au début, je pensais que c'était une manière efficace de me présenter, mais avec le temps, il est devenu clair que l'information était plus accablante qu'informative. Je voulais quelque chose de nouveau, une approche plus raffinée et visuellement attrayante pour présenter mon profil, et l’idée d’implémenter une grille « bento » m’est venue à l’esprit. L’objectif était de créer une mise en page qui soit non seulement fonctionnelle, mais également esthétiquement impressionnante et structurée.
1818-1919-{/* excerpt */}
2020-2121-La première étape consistait à concevoir une mise en page idéale en utilisant HTML et CSS. Le résultat était prometteur, une conception structurée et visuellement agréable qui transmettait efficacement les informations prévues. Cependant, l’implémentation directe de ceci dans mon README de profil GitHub n’était pas simple. Le Markdown propre à GitHub impose des limitations strictes sur les éléments HTML pris en charge en raison des contraintes de sécurité. De nombreuses balises HTML essentielles étaient limitées, rendant impossible l'intégration de la conception telle qu'elle avait été envisagée. Comprendre ces limitations signifiait repenser complètement l’approche.
2222-2323-Confronté à ces restrictions, j’ai envisagé des moyens alternatifs pour générer et présenter dynamiquement le contenu. Une approche consistait à automatiser les mises à jour du contenu à l’aide d’un script Python pour récupérer mon dernier dépôt GitHub et l’insérer dynamiquement dans le README. Le script accédait à l’API GitHub, récupérait le dépôt mis à jour le plus récemment, et modifiait le README en conséquence. Bien que cela ait été une expérimentation intéressante d’automatisation, cela ne résolvait pas le problème central, qui était la nécessité d’un design structuré et visuellement attrayant.
2424-2525-Envisageant des approches alternatives, j’ai brièvement envisagé l’idée de prendre une capture d’écran de la mise en page HTML conçue et de l’intégrer comme une image statique dans le README. Bien que cela aurait visuellement résolu le problème, cela semblait être une solution peu élégante qui manquait de flexibilité et de réactivité. Avançant, j’ai cherché une méthode qui permettait à la fois la structure et l’adaptabilité tout en maintenant les mises à jour dynamiques du contenu.
2626-2727-Les SVGs se sont révélés être une solution potentielle. Ils assurent l’évolutivité, maintiennent une clarté visuelle sur différentes résolutions, et permettent l’intégration de texte et d’autres éléments. Une première expérimentation impliquait l’intégration de HTML dans un SVG en utilisant la balise `foreignObject`. Bien que conceptuellement prometteuse, la mise en œuvre s'est avérée complexe et a été mise de côté temporairement. En revenant au problème plus tard, une approche plus structurée était nécessaire.
2828-2929-L’approche finale consistait à utiliser une structure SVG composite. La solution se composait de plusieurs éléments clés : convertir la mise en page HTML originale en une représentation SVG, encoder les images en Base64 pour garantir leur chargement correct, intégrer des éléments dynamiques tels que des statistiques GitHub et des mises à jour du statut Spotify sous forme de SVG inline, et automatiser les mises à jour via GitHub Actions. En utilisant ces techniques, la mise en page en grille « bento » est devenue entièrement fonctionnelle, capable de se mettre à jour automatiquement tout en conservant une apparence propre et structurée, respectant les contraintes du Markdown propre à GitHub.
3030-3131-Un point tournant critique a été la découverte d’un post sur Stack Overflow détaillant une méthode pour convertir HTML en SVG de manière efficace et efficiente. Cette méthode fournissait un moyen structuré de générer les éléments SVG nécessaires tout en préservant le design prévu. En combinant cela avec l’encodage Base64 pour les images et les GitHub Actions pour l’automatisation, cela a permis d’obtenir une solution complète répondant à toutes les exigences initiales.
3232-3333-La mise en œuvre finale consiste en un README de profil GitHub raffiné et visuellement remarquable qui intègre des mises à jour dynamiques tout en conservant une structure élégante. Il présente les informations clairement sans surcharge inutile et est entièrement automatisé, se mettant à jour toutes les cinq minutes sans intervention manuelle. Le projet a nécessité des recherches importantes et des expérimentations avec les SVGs, les GitHub Actions, et les limitations du Markdown. Le processus a demandé de la persévérance et de la résolution de problèmes pour travailler dans les contraintes de la plateforme tout en obtenant un résultat techniquement impressionnant. Le résultat est un README de profil GitHub qui équilibre efficacement design, automatisation et fonctionnalité dans les limitations de la plateforme.
3434-3535-Si vous êtes maintenant inspiré pour créer vous-même un README de profil GitHub impressionnant, lisez mon [article de blog technique et amusant](../../../../../blog/technically-impressive-github-profile-readme/) ou consultez directement mon dépôt [github.com/trueberryless/trueberryless](https://github.com/trueberryless/trueberryless/tree/7519c6f50094bdfd6fb47f610e6638ac8efdd6ad). Et si vous trouvez mon travail utile, pensez à lui donner un ⭐ et à me suivre sur GitHub à [trueberryless](https://github.com/trueberryless)! 🚀
-35
src/content/docs/fr/blog/mutanuq.mdx
···11----
22-title: "Organiser la vie scolaire : le parcours derrière Mutanuq"
33-date: 2023-11-13
44-description: Un site web rapide, propulsé par Markdown, qui organise le contenu
55- scolaire, simplifie l'apprentissage et soutient la croissance éducative.
66-excerpt: Mutanuq est un site web rapide propulsé par Markdown que j'ai conçu
77- pour organiser le contenu scolaire, rationaliser l'étude et créer une
88- ressource fiable pour mes camarades de classe et moi-même.
99-tags:
1010- - Education
1111- - Markdown
1212- - Starlight
1313-authors:
1414- - trueberryless
1515-cover:
1616- alt: A beautiful cover image with the text "Mutanuq"
1717- image: ../../../../../public/blog/mutanuq.jpg
1818-1919----
2020-2121-Lors de ma deuxième année à HTL Krems, en 2021, j'ai entrepris un projet qui combinait deux choses qui m'ont toujours passionné : créer mon propre site web et trouver de meilleures façons d'organiser l'immense flux de matériel scolaire. Comme beaucoup d'étudiants, mes notes étaient éparpillées entre OneNote, des fichiers Word, des feuilles Excel, Google Drive, et même des outils comme [Witeboard](https://witeboard.com/). Ce chaos était écrasant, rendant difficile de se concentrer sur un apprentissage efficace.
2222-2323-Animé par la vision de simplifier ce processus—non seulement pour moi, mais aussi pour mes camarades de classe—j'ai décidé de créer une plateforme centralisée pour résumer le contenu scolaire. Mon objectif était double : simplifier l'étude et inspirer la motivation parmi mes pairs.
2424-2525-À cette époque, je ne connaissais pas de cadres qui pourraient faciliter la création de sites web de style documentation. Au lieu de cela, je me suis appuyé sur du simple HTML, CSS et JavaScript pour concevoir les premières versions de ce que j'appelais *Schneider IT*. Bien que j'adorais travailler dessus, mes premières tentatives étaient maladroites : générer dynamiquement la table des matières et la barre latérale avec mon propre code JavaScript entraînait des temps de chargement douloureusement lents. Il fallait 10 secondes ou plus pour que tout s'affiche !
2626-2727-Malgré les revers, j'ai continué à itérer. En 2023, j'avais créé et abandonné environ 10 versions du site, cherchant toujours un design plus épuré et un système de gestion plus efficace. Le potentiel du site était clair pour moi, mais sa convivialité n'était pas encore au rendez-vous.
2828-2929-C'est à ce moment-là que je suis tombé sur [Starlight](https://starlight.astro.build/), un cadre puissant et incroyable créé par [Chris Swithinbank (@delucis)](https://github.com/delucis) pour créer des sites web rapides propulsés par Markdown. Découvrir Starlight a été un tournant—cela m'a permis de combiner deux choses qui me passionnent : créer des sites web et utiliser Markdown pour sa simplicité et son élégance.
3030-3131-Avec la transition vers Starlight, Schneider IT est devenu *Mutanuq*. Le nouveau nom marquait un nouveau départ et reflétait le site web épuré et modernisé qu'il était devenu. J'ai tout réécrit, optimisé les performances du site et concentré mes efforts sur la création de contenu spécifiquement adapté aux besoins de mes camarades de classe, en particulier pour les tests à venir.
3232-3333-La transformation a porté ses fruits. Mes amis ont commencé à utiliser le site régulièrement et à donner des retours enthousiastes comme : *"Frérot, ce site est vraiment génial !"* Mutanuq n'était pas seulement un outil pour les examens—il est devenu une ressource de confiance pour mes pairs et une archive personnelle pour toutes les connaissances que je voulais préserver au-delà de l'école.
3434-3535-Grâce à Starlight, gérer et développer Mutanuq est devenu un jeu d'enfant, et le projet a évolué en quelque chose que je suis fier de maintenir même aujourd'hui. Ce qui avait commencé comme *Schneider IT*—une petite idée pour organiser mes notes—s'est épanoui en *Mutanuq*, une plateforme qui simplifie l'apprentissage pour les autres tout en préservant des connaissances précieuses pour mon moi futur.
···11----
22-title: Comment créer un plugin Rehype qui transforme les liens GitHub en badges
33- attrayants
44-description: Apprenez à construire un plugin Rehype simple mais captivant qui
55- transforme automatiquement des liens de profil GitHub classiques en liens
66- élégants en forme de badge avec des images de profil—parfait pour ajouter de
77- la personnalité à votre blog ou à vos documents.
88-date: 2025-07-12
99-tags:
1010- - Plugins
1111- - Education
1212-authors:
1313- - trueberryless
1414-excerpt: Découvrez comment un minuscule plugin Rehype peut donner à vos liens
1515- GitHub une mise à niveau visuelle majeure. Avec seulement quelques lignes de
1616- code, nous transformerons des liens de profil classiques en badges élégants
1717- avec avatars, inspirés par le site d'Antfu et propulsés par Astro + Starlight.
1818-cover:
1919- alt: A beautiful cover image with the text "Badge Links"
2020- image: ../../../../../public/blog/rehype-github-badge-links.jpg
2121-tableOfContents: false
2222-featured: true
2323-2424----
2525-2626-Récemment, j'ai ajouté une petite fonctionnalité sympa à ce blog, que vous avez peut-être remarquée en tant que lecteur régulier. Ce n'est rien de gigantesque, mais cela donne à chaque blog cette petite touche charmante que j'ai recherchée pendant longtemps. Je parle (ou plutôt j'écris) de tous ces badges verts avec des photos de profil que vous pouvez également voir dans ce blog.
2727-2828-L'inspiration pour les créer vient de nul autre qu'[Antfu](https://github.com/antfu) lui-même, puisqu'il affiche ces badges partout sur son site web (au moment de cette rédaction).
2929-3030-Au départ, je pensais qu'il faudrait une longue et fastidieuse session de programmation pour atteindre la même beauté visuelle. Cependant, après quelques sessions de Vibe Coding - comme [Andrej Karpathy a inventé le terme](https://x.com/karpathy/status/1886192184808149383) - j'ai rapidement réalisé que ces badges n'étaient qu'à un petit [plugin rehype](https://github.com/rehypejs) d'existence.
3131-3232-Voici tout le code derrière le plugin rehype :
3333-3434-```ts
3535-// src/lib/rehype-github-badge-links.ts
3636-import { h } from "hastscript";
3737-import { visit } from "unist-util-visit";
3838-3939-export default function rehypeGitHubBadgeLinks() {
4040- return (tree) => {
4141- visit(tree, "element", (node) => {
4242- if (
4343- node.tagName === "a" &&
4444- typeof node.properties?.href === "string" &&
4545- node.properties.href.startsWith("https://github.com/")
4646- ) {
4747- const match = node.properties.href.match(
4848- /^https:\/\/github\.com\/([\w-]+)\/?$/
4949- );
5050- if (match) {
5151- const username = match[1];
5252-5353- // Add GitHub badge class
5454- node.properties.className = (node.properties.className || []).concat(
5555- "gh-badge"
5656- );
5757-5858- // Build avatar image
5959- const avatarImg = h("img", {
6060- src: `https://github.com/${username}.png`,
6161- alt: username,
6262- });
6363-6464- // Prepend avatar image to original children
6565- node.children.unshift(avatarImg);
6666- }
6767- }
6868- });
6969- };
7070-}
7171-```
7272-7373-En gros, tout ce que fait ce plugin, c'est parcourir le HTML à la recherche de liens qui font référence à un profil GitHub. Si l'un d'eux est trouvé, il ajoute une balise `<img>` avant le contenu texte avec la photo de profil de l'utilisateur ou de l'organisation GitHub. Cela est possible de manière très cohérente grâce à la fonctionnalité de GitHub qui permet d'obtenir la photo comme ressource derrière le lien du profil suivi de `.png`. Lisez-en plus à ce sujet dans [cet article génial sur `dev.to`](https://dev.to/10xlearner/how-to-get-the-profile-picture-of-a-github-account-1d82).
7474-7575-Avec un peu de style supplémentaire, cela a un rendu vraiment mignon à mon avis. Veuillez noter que comme ceci est une page [Starlight](https://starlight.astro.build), j'utilise des variables CSS disponibles, comme dans la ligne quatre :
7676-7777-```css "var(--sl-color-accent-low)" "var(--sl-color-accent)"
7878-// src/styles/custom.css
7979-.gh-badge {
8080- display: inline-flex;
8181- align-items: center;
8282- background-color: var(--sl-color-accent-low);
8383- border-radius: 9999px;
8484- padding: 0em 0.5em 0 0.3em;
8585- font-size: 0.9em;
8686- text-decoration: none;
8787- color: inherit;
8888- font-weight: 500;
8989- transition: background-color 0.2s ease;
9090- transform: translateY(0.29rem);
9191- border: 1px solid var(--sl-color-accent);
9292-}
9393-9494-.gh-badge:hover {
9595- background-color: var(--sl-color-accent);
9696-}
9797-9898-.gh-badge img {
9999- border-radius: 9999px;
100100- width: 1.3em;
101101- height: 1.3em;
102102-}
103103-```
104104-105105-Pour tout assembler, disons, par exemple, dans un site Astro, vous devez simplement ajouter le plugin rehype à la configuration comme ceci :
106106-107107-```ts ins={6-8}
108108-// astro.config.mjs
109109-import { defineConfig } from 'astro/config';
110110-import rehypeGitHubBadgeLinks from "./src/lib/rehype-github-badge-links";
111111-112112-export default defineConfig({
113113- markdown: {
114114- rehypePlugins: [rehypeGitHubBadgeLinks]
115115- }
116116-})
117117-```
118118-119119-Lisez-en davantage sur l'injection des plugins rehype dans Astro dans [leur référence de configuration](https://docs.astro.build/en/reference/configuration-reference/#markdownrehypeplugins).
120120-121121-N'oubliez pas d'ajouter le CSS de manière similaire, en fonction de votre framework - dans Starlight, vous pouvez configurer des styles CSS globaux personnalisés en suivant [ces instructions](https://docs.astro.build/en/guides/styling/#scoped-styles) - et vous pouvez également admirer vos propres liens en badge. N'hésitez pas à partager cet article avec toute personne que vous souhaitez convaincre d'utiliser ces fonctionnalités.
122122-123123-<details>
124124- <summary>✨ Point bonus</summary>
125125-126126- Si vous souhaitez utiliser un tel badge pour d'autres liens également, je vous recommande de créer un petit composant Astro comme celui-ci :
127127-128128- ```astro
129129- ---
130130- // src/components/BadgeLink.astro
131131- const { href, src, text, className = "gh-badge" } = Astro.props;
132132- ---
133133-134134- <a href={href} class={className}>
135135- <img src={src} alt={text} />
136136- {text}
137137- </a>
138138- ```
139139-140140- Assurez-vous simplement que le CSS est global (ou [scopé](https://docs.astro.build/en/guides/styling/#scoped-styles) dans le composant ci-dessus) et il est prêt à être utilisé :
141141-142142- ```mdx
143143- import BadgeLink from "../components/BadgeLink.astro";
144144-145145- <BadgeLink
146146- href="https://github.com/withastro/starlight"
147147- src="/starlight.png"
148148- text="Starlight"
149149- />
150150- ```
151151-</details>
···11----
22-title: Configuration d'Argo CD dans un cluster k3s
33-description: Aujourd'hui, nous allons examiner comment configurer Argo CD dans
44- un cluster k3s.
55-date: 2024-07-27
66-lastUpdated: 2024-07-28
77-tags:
88- - Automation
99- - Deployment Series
1010- - Education
1111-excerpt: Pour continuer à améliorer notre cluster k3s et surtout le flux de
1212- travail CI/CD, nous allons maintenant nous pencher sur l'outil GitOps appelé
1313- <a class="gh-badge" href="https://github.com/argoproj"><img
1414- src="https://github.com/argoproj.png" alt="Argo CD" />Argo CD</a>, et comment
1515- nous pouvons l'intégrer à notre cluster. Notre pile technologique pour le
1616- déploiement utilise ces services: k3s, Helm, Cilium et après ce tutoriel,
1717- Argo CD également.
1818-authors:
1919- - trueberryless
2020-cover:
2121- alt: A beautiful cover image with the text "Argo CD"
2222- image: ../../../../../public/blog/setup-argocd-for-kubernetes.jpg
2323-giscus: true
2424-2525----
2626-2727-Après avoir lu l'article de Vegard S. Hagen “[Argo CD Kustomize with Helm](https://blog.stonegarden.dev/articles/2023/09/argocd-kustomize-with-helm/)” et décidé que leur solution n'était pas adaptée à notre cluster, nous sommes directement passés au guide “[Getting started](https://argo-cd.readthedocs.io/en/stable/getting_started/)” par défaut d'Argo CD. Et maintenant, nous allons vous faire traverser les étapes de configuration d'[Argo CD](https://github.com/argoproj) sur [k3s](https://github.com/k3s-io) et [Cilium](https://github.com/cilium), en poursuivant à partir du chapitre “[Setup Certificate Manager with Cloudflare](../../../../../blog/setup-kubernetes-with-cilium-and-cloudflare#setup-certificate-manager-with-cloudflare)” de notre article précédent “[Setting up Kubernetes with Cilium and Cloudflare](../../../../../blog/setup-kubernetes-with-cilium-and-cloudflare)”. Dans ce même article récent, nous avons également configuré [Keel](https://github.com/keel-hq) à la fin, mais cette étape sera désormais inutile car nous utiliserons Argo CD pour obtenir le code le plus récent et le plus avancé à partir de chaque dépôt [GitHub](https://github.com/github). Bonne lecture !
2828-2929-:::note
3030-Nous supposons que vous avez suivi [notre autre article de blog](../../../../../blog/setup-kubernetes-with-cilium-and-cloudflare).
3131-:::
3232-3333-## Pré-requis
3434-3535-Avant de commencer, nous devons nous assurer que nous avons installé `kubectl`, un fichier kubeconfig (k3s enregistre ce fichier ici :
3636-3737-```yaml
3838-#/etc/rancher/k3s/config.yaml
3939-flannel-backend: "none"
4040-disable-kube-proxy: true
4141-disable-network-policy: true
4242-cluster-init: true
4343-disable:
4444- - servicelb
4545- - traefik
4646-```
4747-4848-) et CoreDNS (vérifiez si vous avez CoreDNS en exécutant cette commande :
4949-5050-```bash
5151-kubectl get pods -n kube-system -l k8s-app=kube-dns
5252-```
5353-5454-commande).
5555-5656-## Installation
5757-5858-Tout d'abord, appliquons tous les services nécessaires, les déploiements et de nombreuses autres ressources Kubernetes différentes en exécutant :
5959-6060-```bash
6161-kubectl create namespace argocd
6262-kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
6363-```
6464-6565-## Certificat
6666-6767-De plus, nous aurons besoin d'un certificat :
6868-6969-```yaml
7070-apiVersion: cert-manager.io/v1
7171-kind: Certificate
7272-metadata:
7373- name: argocd
7474- namespace: argocd
7575-spec:
7676- secretName: argocd
7777- issuerRef:
7878- name: acme-issuer
7979- kind: ClusterIssuer
8080- dnsNames:
8181- - "argo-cd.trueberryless.org"
8282-```
8383-8484-Appliquez cette ressource en exécutant `kubectl apply -f certificate.yaml`.
8585-8686-## Contrôleur d'Ingress
8787-8888-Nous aurons également besoin d'un contrôleur d'Ingress géré par Cilium :
8989-9090-```yaml
9191-apiVersion: networking.k8s.io/v1
9292-kind: Ingress
9393-metadata:
9494- name: argocd-ingress
9595- namespace: argocd
9696-spec:
9797- rules:
9898- - host: argo-cd.trueberryless.org
9999- http:
100100- paths:
101101- - path: /
102102- pathType: Prefix
103103- backend:
104104- service:
105105- name: argocd-server
106106- port:
107107- number: 80
108108-109109- tls:
110110- - hosts:
111111- - argo-cd.trueberryless.org
112112- secretName: argocd
113113-```
114114-115115-Appliquez cette ressource en exécutant `kubectl apply -f argocd-ingress.yaml`.
116116-117117-## Désactiver TLS dans Argo CD
118118-119119-Avec le certificat, la connexion entre le client et le serveur est sécurisée. Cependant, il existe toujours un certificat auto-signé au sein des services [Argo CD](https://github.com/argoproj), dont nous n'avons pas strictement besoin. Nous pouvons donc désactiver la sécurité du serveur Argo CD en modifiant la propriété `server.insecure`.
120120-121121-Pour ce faire, exécutez d'abord cette commande :
122122-123123-```bash
124124-kubectl edit cm argocd-cmd-params-cm -n argocd
125125-```
126126-127127-ce qui ouvrira, espérons-le, un fichier dans vim ou neovim (sinon ce serait une honte si vous nous demandez, MDR). Le fichier devrait ressembler à ceci :
128128-129129-```yaml {21-22}
130130-# Please edit the object below. Lines beginning with a '#' will be ignored,
131131-# and an empty file will abort the edit. If an error occurs while saving this file will be
132132-# reopened with the relevant failures.
133133-#
134134-apiVersion: v1
135135-data:
136136- server.insecure: "true"
137137-kind: ConfigMap
138138-metadata:
139139- annotations:
140140- kubectl.kubernetes.io/last-applied-configuration: |
141141- {"apiVersion":"v1","kind":"ConfigMap","metadata":{"annotations":{},"labels":{"app.kubernetes.io/name":"argocd-cmd-params-cm","app.kubernetes.io/part-of":"argocd"},"name":"arg
142142- creationTimestamp: "2024-07-27T11:15:28Z"
143143- labels:
144144- app.kubernetes.io/name: argocd-cmd-params-cm
145145- app.kubernetes.io/part-of: argocd
146146- name: argocd-cmd-params-cm
147147- namespace: argocd
148148- resourceVersion: "239710156"
149149- uid: 5f53d26b-3adf-4ed9-9807-c3da847335a2
150150-data:
151151- server.insecure: "true"
152152-```
153153-154154-Les deux dernières lignes ne seront probablement pas là au départ, mais c'est exactement le paramètre que nous voulons atteindre. Allez-y et ajoutez ces deux lignes (marquées ci-dessus) et enregistrez le fichier (`Esc` → `:wq` si vous êtes cool).
155155-156156-Redémarrez le serveur Argo CD en exécutant cette commande et en attendant que le déploiement soit terminé :
157157-158158-```bash
159159-kubectl rollout restart deploy argocd-server -n argocd
160160-kubectl rollout status deploy argocd-server -n argocd
161161-```
162162-163163-Après toutes ces étapes, nous devrions maintenant voir l'interface utilisateur sur [`https://argo-cd.trueberryless.org`](https://argo-cd.trueberryless.org) (protégé par mot de passe).
164164-165165-
166166-167167-:::note
168168-Les identifiants de connexion à l'interface utilisateur d'Argo CD se composent d'un utilisateur et d'un mot de passe. L'utilisateur est toujours `admin` et vous pouvez obtenir votre mot de passe en exécutant :
169169-170170-```bash
171171-kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
172172-```
173173-:::
174174-175175-## Ajouter le manifest au dépôt
176176-177177-Pour créer une nouvelle application dans [Argo CD](https://github.com/argoproj) (via l'interface utilisateur ou l'interface CLI — nous utilisons l'interface utilisateur car nous n'avons pas configuré l'interface CLI), nous devons préparer le dépôt Git. Comme le dépôt est la seule source de vérité, c'est aussi l'endroit où nous définissons toutes les ressources Kubernetes qui devraient être créées par Argo CD.
178178-179179-Nous recommandons de créer un nouveau dossier dans le dépôt Git appelé quelque chose comme `manifest`. Dans ce dossier, nous allons créer quelques fichiers :
180180-181181-* `certificate.yaml` :
182182-183183- ```yaml
184184- apiVersion: cert-manager.io/v1
185185- kind: Certificate
186186- metadata:
187187- name: mutanuq
188188- namespace: mutanuq
189189- spec:
190190- secretName: mutanuq
191191- issuerRef:
192192- name: acme-issuer
193193- kind: ClusterIssuer
194194- dnsNames:
195195- - "mutanuq.trueberryless.org"
196196- ```
197197-198198-* `deployment.yaml` :
199199-200200- ```yaml
201201- apiVersion: apps/v1
202202- kind: Deployment
203203- metadata:
204204- name: mutanuq
205205- namespace: mutanuq
206206- labels:
207207- app: mutanuq
208208- spec:
209209- replicas: 3
210210- selector:
211211- matchLabels:
212212- app: mutanuq
213213- template:
214214- metadata:
215215- labels:
216216- app: mutanuq
217217- spec:
218218- containers:
219219- - name: mutanuq
220220- image: "trueberryless/mutanuq"
221221- imagePullPolicy: Always
222222- ```
223223-224224-* `service.yaml` :
225225-226226- ```yaml
227227- apiVersion: v1
228228- kind: Service
229229- metadata:
230230- name: mutanuq
231231- namespace: mutanuq
232232- annotations:
233233- cert-manager.io/issuer: acme-issuer
234234- spec:
235235- selector:
236236- app: mutanuq
237237- ports:
238238- - name: http
239239- port: 80
240240- ```
241241-242242-* `ingress.yaml` :
243243-244244- ```yaml
245245- apiVersion: networking.k8s.io/v1
246246- kind: Ingress
247247- metadata:
248248- name: mutanuq
249249- namespace: mutanuq
250250- spec:
251251- rules:
252252- - host: mutanuq.trueberryless.org
253253- http:
254254- paths:
255255- - path: /
256256- pathType: Prefix
257257- backend:
258258- service:
259259- name: mutanuq
260260- port:
261261- number: 80
262262-263263- tls:
264264- - hosts:
265265- - mutanuq.trueberryless.org
266266- secretName: mutanuq
267267- ```
268268-269269-Ces fichiers sont essentiellement les mêmes que ceux mentionnés dans [l'autre article](../../../../../blog/setup-kubernetes-with-cilium-and-cloudflare#example-app-mutanuq) mais séparés en quatre fichiers, car cela nous donne l'avantage de manipuler le manifest depuis [GitHub](https://github.com/github) Actions. Mais chaque chose en son temps, vous verrez comment configurer le manifest avec GitHub Actions dans le [prochain article](../../../../../blog/setup-continuous-integration-github-repository).
270270-271271-## Créer une nouvelle application dans l'interface utilisateur d'Argo CD
272272-273273-Vous verrez probablement le grand bouton `NEW APP` dans l'interface utilisateur d'[Argo CD](https://github.com/argoproj). Cliquez dessus et créez une nouvelle application avec les propriétés adaptées ci-dessous :
274274-275275-* Nom de l'application : `mutanuq`
276276-* Nom du projet : `défaut`
277277-* Politique de synchronisation : En savoir plus dans [cet article](../../../../../blog/setup-continuous-integration-github-repository) / laissez `Manuel` pour l'instant
278278-* URL du dépôt : `https://github.com/trueberryless-org/mutanuq`
279279-* Révision : `HEAD`
280280-* Chemin : `manifest`
281281-* URL du cluster : `https://kubernetes.default.svc`
282282-* Namespace : `mutanuq`
283283-284284-Optionnellement — si vous avez [le CLI installé](https://argo-cd.readthedocs.io/en/stable/cli_installation/) — vous pouvez exécuter cette commande pour obtenir le même résultat :
285285-286286-```bash
287287-argocd app create mutanuq \
288288- --project default \
289289- --repo https://github.com/trueberryless-org/mutanuq \
290290- --revision HEAD \
291291- --path manifest \
292292- --dest-server https://kubernetes.default.svc \
293293- --dest-namespace mutanuq
294294-```
295295-296296-Vous devriez maintenant voir votre site web en cours de déploiement dans l'interface utilisateur. Ce processus peut prendre un certain temps, car, par exemple, la demande de certificat doit être approuvée. Une application saine devrait ressembler à ceci :
297297-298298-
299299-300300-## Célébrez avec un café !
301301-302302-Félicitations, vous avez configuré avec succès [Argo CD](https://github.com/argoproj) sur un cluster [k3s](https://github.com/k3s-io) ! Vous méritez une pause café. Savourez une tasse bien méritée et, si vous souhaitez partager un café virtuel avec moi, n'hésitez pas à soutenir mon travail sur [Ko-fi](https://ko-fi.com/trueberryless). Merci !
303303-304304-## Continuation
305305-306306-La suite dans notre [prochain article de blog](../../../../../blog/setup-continuous-integration-github-repository), qui décrira comment configurer un dépôt [GitHub](https://github.com/github) pouvant ensuite être déployé via Argo CD.
···11----
22-title: Configurer le déploiement continu dans un dépôt GitHub
33-description: Aujourd'hui, nous allons voir comment configurer un dépôt GitHub
44- qui sera déployé sur un cluster k3s via Argo CD.
55-date: 2024-07-28
66-tags:
77- - Automation
88- - Deployment Series
99- - GitHub
1010- - Education
1111-excerpt: Aujourd'hui, nous allons voir comment configurer un <a class="gh-badge"
1212- href="https://github.com/github"><img src="https://github.com/github.png"
1313- alt="github" />GitHub</a> dépôt qui sera déployé sur un cluster k3s via Argo
1414- CD. En résumé, l'article inclura les fichiers Workflow, le Dockerfile, les
1515- manifestes (déploiement) et les dépôts <a class="gh-badge"
1616- href="https://github.com/docker"><img src="https://github.com/docker.png"
1717- alt="Docker Hub" />Docker Hub</a>. Veuillez consulter [notre blog Argo
1818- CD](./setup-argocd-for-kubernetes) car cet article sera une continuation d'un
1919- autre post.
2020-authors:
2121- - trueberryless
2222-cover:
2323- alt: A beautiful cover image with the text "Github CD"
2424- image: ../../../../../public/blog/setup-continuous-integration-github-repository.jpg
2525-giscus: true
2626-2727----
2828-2929-Dans le post d'aujourd'hui, nous allons examiner brièvement comment configurer un déploiement continu dans un dépôt [GitHub](https://github.com/github). Nous sommes assez sûrs que cette configuration fonctionne également pour d'autres registres Git, mais si vous en utilisez un autre, gardez à l'esprit que cet article est conçu uniquement pour GitHub.
3030-3131-Ce post suppose également que vous utilisez [GitHub](https://github.com/github) Actions combiné avec Argo CD pour déployer vos applications sur un cluster Kubernetes. Suivez nos autres [articles sur le déploiement](../../../../../blog/tags/deployment) pour des instructions supplémentaires sur la façon de configurer ces deux technologies sur votre serveur personnel.
3232-3333-## Préparatifs
3434-3535-Nous recommandons de créer un compte [Docker Hub](https://hub.docker.com/) ou de choisir un autre registre Docker si vous le souhaitez.
3636-3737-Votre dépôt GitHub doit remplir ces conditions :
3838-3939-* A un Dockerfile (idéalement dans le dossier racine)
4040-* A deux Secrets GitHub ([créer un Secret GitHub](https://docs.github.com/en/actions/security-guides/using-secrets-in-github-actions#creating-secrets-for-a-repository)) :
4141- * DOCKER\\\_USERNAME : Votre nom d'utilisateur Docker
4242- * DOCKER\_PASSWORD : Votre mot de passe Docker (ou [jeton d'accès](https://docs.docker.com/security/for-developers/access-tokens/))
4343-4444-## Créer un ou plusieurs fichiers de workflow
4545-4646-Les GitHub Actions sont des tâches spécifiques sur GitHub qui fonctionnent principalement sur des serveurs Linux et peuvent être contrôlées en créant des fichiers `yaml` dans le répertoire `.github/workflows`. Ces fichiers particuliers permettent de définir les événements déclencheurs des tâches et offrent beaucoup de flexibilité. En tant qu'utilisateur régulier des GitHub Actions, je peux vous dire qu'il faut souvent réécrire vos fichiers `yaml` car les petits détails sont facilement négligés. Mais sans plus attendre, passons directement à la création d'un fichier `deployment.yaml` adapté, qui effectuera les tâches suivantes pour nous :
4747-4848-* Pousser une nouvelle image Docker sur Docker Hub (avec la dernière version).
4949-* Mettre à jour le fichier `manifest/deployment.yaml` pour qu'Argo CD soit informé de la nouvelle image taguée.
5050-* (optionnel) Créer une nouvelle release sur GitHub, afin que les temps de publication soient documentés où ils doivent l'être.
5151-5252-```yaml {20}
5353-# deployment.yaml
5454-name: Deployment
5555-5656-on:
5757- push:
5858- branches: [main]
5959- merge_group:
6060- pull_request:
6161- branches: [main]
6262- # Allows you to run this workflow manually from the Actions tab
6363- workflow_dispatch:
6464-6565-# Automatically cancel in-progress actions on the same branch
6666-concurrency:
6767- group: ${{ github.workflow }}-${{ github.event_name == 'pull_request_target' && github.head_ref || github.ref }}
6868- cancel-in-progress: true
6969-7070-env:
7171- REGISTRY: docker.io
7272- IMAGE_NAME: trueberryless/blog
7373- NODE_VERSION: 20
7474-7575-jobs:
7676- deployment:
7777- if: contains(github.event.head_commit.message, 'deploy') || github.event_name == 'workflow_dispatch'
7878- runs-on: ubuntu-latest
7979- permissions:
8080- contents: write
8181- steps:
8282- - name: Check out the repo
8383- uses: actions/checkout@v4
8484- with:
8585- fetch-depth: 0
8686-8787- - name: Create tag
8888- run: echo "IMAGE_TAG=$(echo $GITHUB_REF_NAME-$GITHUB_SHA)" >> $GITHUB_ENV
8989-9090- - name: Set up Docker Buildx
9191- uses: docker/setup-buildx-action@v2
9292-9393- - name: Log in to Docker Hub
9494- uses: docker/login-action@v2
9595- with:
9696- username: ${{ secrets.DOCKER_USERNAME }}
9797- password: ${{ secrets.DOCKER_PASSWORD }}
9898-9999- - name: Extract metadata (tags, labels) for Docker
100100- id: meta
101101- uses: docker/metadata-action@v4
102102- with:
103103- images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
104104-105105- - name: Build and push Docker image
106106- uses: docker/build-push-action@v5
107107- with:
108108- context: .
109109- push: true
110110- tags: |
111111- ${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}
112112- ${{ env.IMAGE_NAME }}:latest
113113- labels: ${{ steps.meta.outputs.labels }}
114114-115115- - name: Update deployment.yaml file
116116- run: |
117117- yq eval '.spec.template.spec.containers[0].image = "${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}"' -i manifest/deployment.yaml
118118-119119- - uses: stefanzweifel/git-auto-commit-action@v4
120120- with:
121121- commit_message: update deployment.json container image (automated)
122122-123123- - uses: ncipollo/release-action@v1
124124- with:
125125- tag: ${{ env.IMAGE_TAG }}
126126- makeLatest: true
127127- body: "A docker image has been deployed to [Docker Hub](https://hub.docker.com/r/${{ env.IMAGE_NAME }}/tags)."
128128-```
129129-130130-Voici un fichier `docker-hub.yaml` obsolète que nous utilisions auparavant car il proposait de bonnes stratégies de versioning :
131131-132132-```yaml collapse={1-145}
133133-# docker-hub.yaml
134134-name: Docker Image Push
135135-136136-on:
137137- push:
138138- branches: [main]
139139- merge_group:
140140- pull_request:
141141- branches: [main]
142142- # Allows you to run this workflow manually from the Actions tab
143143- workflow_dispatch:
144144-145145-# Automatically cancel in-progress actions on the same branch
146146-concurrency:
147147- group: ${{ github.workflow }}-${{ github.event_name == 'pull_request_target' && github.head_ref || github.ref }}
148148- cancel-in-progress: true
149149-150150-env:
151151- REGISTRY: docker.io
152152- IMAGE_NAME: trueberryless/blog
153153- NODE_VERSION: 18
154154-155155-jobs:
156156- docker-push-image:
157157- if: contains(github.event.head_commit.message, 'version') || github.event_name == 'workflow_dispatch'
158158- runs-on: ubuntu-latest
159159- permissions:
160160- contents: write
161161- steps:
162162- - name: Check out the repo
163163- uses: actions/checkout@v4
164164- with:
165165- fetch-depth: 0
166166-167167- - name: Check if file exists
168168- run: |
169169- if [ -f .github/artifacts/version.json ]; then
170170- echo "File exists"
171171- echo "FILE_EXISTS=true" >> $GITHUB_ENV
172172- else
173173- echo "File does not exist"
174174- echo "FILE_EXISTS=false" >> $GITHUB_ENV
175175- fi
176176-177177- - name: read_json
178178- if: ${{ env.FILE_EXISTS == 'true' }}
179179- id: version
180180- uses: zoexx/github-action-json-file-properties@release
181181- with:
182182- file_path: ".github/artifacts/version.json"
183183-184184- - name: save environment variables
185185- if: ${{ env.FILE_EXISTS == 'true' }}
186186- run: |
187187- echo "MAJOR=${{steps.version.outputs.major}}" >> $GITHUB_ENV
188188- echo "MINOR=${{steps.version.outputs.minor}}" >> $GITHUB_ENV
189189- echo "PATCH=${{steps.version.outputs.patch}}" >> $GITHUB_ENV
190190-191191- - name: create environment variables
192192- if: ${{ env.FILE_EXISTS == 'false' }}
193193- run: |
194194- echo "MAJOR=0" >> $GITHUB_ENV
195195- echo "MINOR=0" >> $GITHUB_ENV
196196- echo "PATCH=0" >> $GITHUB_ENV
197197-198198- - name: echo environment variables
199199- run: |
200200- echo ${{ env.MINOR }}
201201- echo ${{ env.MINOR }}
202202- echo ${{ env.MINOR }}
203203-204204- - name: Major version
205205- if: contains(github.event.head_commit.message, 'major')
206206- run: |
207207- echo "New major version"
208208- echo "MAJOR=$((${{ env.MAJOR }}+1))" >> $GITHUB_ENV
209209- echo "MINOR=0" >> $GITHUB_ENV
210210- echo "PATCH=0" >> $GITHUB_ENV
211211-212212- - name: Minor version
213213- if: contains(github.event.head_commit.message, 'minor')
214214- run: |
215215- echo "New minor version"
216216- echo "MINOR=$((${{ env.MINOR }}+1))" >> $GITHUB_ENV
217217- echo "PATCH=0" >> $GITHUB_ENV
218218-219219- - name: Patch version
220220- if: contains(github.event.head_commit.message, 'patch') || github.event_name == 'workflow_dispatch'
221221- run: |
222222- echo "New patch version"
223223- echo "PATCH=$((${{ env.PATCH }}+1))" >> $GITHUB_ENV
224224-225225- - name: Set up Docker Buildx
226226- uses: docker/setup-buildx-action@v2
227227-228228- - name: Log in to Docker Hub
229229- uses: docker/login-action@v2
230230- with:
231231- username: ${{ secrets.DOCKER_USERNAME }}
232232- password: ${{ secrets.DOCKER_PASSWORD }}
233233-234234- - name: Extract metadata (tags, labels) for Docker
235235- id: meta
236236- uses: docker/metadata-action@v4
237237- with:
238238- images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
239239-240240- - name: Build and push Docker image
241241- uses: docker/build-push-action@v5
242242- with:
243243- context: .
244244- push: true
245245- tags: |
246246- ${{ env.IMAGE_NAME }}:${{ env.MAJOR }}.${{ env.MINOR }}.${{ env.PATCH }}
247247- ${{ env.IMAGE_NAME }}:latest
248248- labels: ${{ steps.meta.outputs.labels }}
249249-250250- - name: Check out the repo
251251- uses: actions/checkout@v4
252252- with:
253253- fetch-depth: 0
254254-255255- - name: Create folder if necessary
256256- if: ${{ env.FILE_EXISTS == 'false' }}
257257- run: mkdir -p .github/artifacts
258258-259259- - name: write_json
260260- id: create-json
261261- uses: jsdaniell/create-json@v1.2.2
262262- with:
263263- name: "version.json"
264264- json: '{ "major": ${{ env.MAJOR }}, "minor": ${{ env.MINOR }}, "patch": ${{ env.PATCH }} }'
265265- dir: ".github/artifacts/"
266266-267267- - uses: stefanzweifel/git-auto-commit-action@v4
268268- with:
269269- commit_message: update version.json (automated)
270270-271271- - name: Update deployment.yaml file
272272- run: |
273273- yq eval '.spec.template.spec.containers[0].image = "${{ env.IMAGE_NAME }}:${{ env.MAJOR }}.${{ env.MINOR }}.${{ env.PATCH }}"' -i manifest/deployment.yaml
274274-275275- - uses: stefanzweifel/git-auto-commit-action@v4
276276- with:
277277- commit_message: update deployment.json container image (automated)
278278-```
279279-280280-Après avoir copié le contenu de notre fichier `deployment.yaml` et créé le nouveau fichier dans le dossier `.github/workflows`, vous devez effectuer quelques adaptations très **importantes** :
281281-282282-* Modifiez le `IMAGE_NAME` pour qu'il corresponde à votre dépôt personnel sur Docker Hub. Le nom de l'image se compose de votre nom de compte et du nom du dépôt. Si vous n'êtes pas sûr de ce qu'est le nom de votre image, vous pouvez regarder l'URL du dépôt Docker Hub, il devrait y figurer quelque part.
283283-284284-Maintenant, vous êtes prêt à ajouter le mot-clé `deploy` dans n'importe quel message de commit sur la branche principale de votre dépôt, et cela devrait automatiquement pousser une image Docker sur Docker Hub et mettre à jour le manifeste pour Argo CD.
285285-286286-## Célébrez avec un café !
287287-288288-Félicitations, vous avez configuré Argo CD avec k3s et [Cilium](https://github.com/cilium) avec succès ! Vous méritez une pause café. Savourez une tasse bien méritée, et si vous souhaitez partager un café virtuel avec moi, n'hésitez pas à soutenir mon travail sur [Ko-fi](https://ko-fi.com/trueberryless). Merci !
···11----
22-title: Mise en place de Kubernetes avec Cilium et Cloudflare
33-description: Aujourd'hui, nous allons voir comment configurer un cluster
44- Kubernetes avec K3s et Cilium.
55-date: 2024-06-11
66-lastUpdated: 2024-10-01
77-tags:
88- - Deployment Series
99- - Education
1010-excerpt: Cet article de blog décrit le processus de configuration d'un cluster
1111- <a class="gh-badge" href="https://github.com/kubernetes"><img
1212- src="https://github.com/kubernetes.png" alt="Kubernetes" />Kubernetes</a> avec
1313- <a class="gh-badge" href="https://github.com/k3s-io"><img
1414- src="https://github.com/k3s-io.png" alt="k3s" />k3s</a> et <a class="gh-badge"
1515- href="https://github.com/cilium"><img src="https://github.com/cilium.png"
1616- alt="Cilium" />Cilium</a>. Nous utilisons <a class="gh-badge"
1717- href="https://github.com/helm"><img src="https://github.com/helm.png"
1818- alt="Helm" />Helm</a> comme gestionnaire de packages et <a class="gh-badge"
1919- href="https://github.com/cloudflare"><img
2020- src="https://github.com/cloudflare.png" alt="Cloudflare" />Cloudflare</a>
2121- comme émetteur de certificats. Nous avons utilisé les astuces et conseils de
2222- Vegard S. Hagen tirés de [son
2323- article](https://blog.stonegarden.dev/articles/2024/02/bootstrapping-k3s-with-cilium/).
2424- En gros, ce blog explique comment tous les sites trueberryless.org sont
2525- déployés (ce n'est plus le cas).
2626-authors:
2727- - trueberryless
2828- - clemens
2929-cover:
3030- alt: A beautiful cover image with the text "Kubernetes"
3131- image: ../../../../../public/blog/setup-kubernetes-with-cilium-and-cloudflare.jpg
3232-giscus: true
3333-metrics:
3434- readingTime: 360
3535- words: 1099
3636-3737----
3838-3939-Travailler avec les conteneurs [Docker](https://github.com/docker) peut être difficile. Cependant, il existe des outils qui facilitent la gestion des conteneurs, comme [Kubernetes](https://github.com/kubernetes). En fait, Kubernetes est le seul outil, à ma connaissance, qui agit comme un logiciel de gestion pour les conteneurs Docker. Kubernetes est bien intégré dans presque tous les fournisseurs de cloud, comme Google Cloud, Azure et AWS. Par conséquent, il utilise une syntaxe standardisée en `yaml`, ce qui est idéal pour les petits développeurs, car ils peuvent basculer entre « Les Trois Grands » avec peu d'effort.
4040-4141-## résumé
4242-4343-Installez tout, puis appliquez cert-manager. Facile.
4444-4545-```bash
4646-curl -sfL https://get.k3s.io | sh -s - \
4747- --flannel-backend=none \
4848- --disable-kube-proxy \
4949- --disable servicelb \
5050- --disable-network-policy \
5151- --disable traefik \
5252- --cluster-init
5353-5454-curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
5555-5656-helm repo add cilium https://helm.cilium.io/
5757-helm repo update
5858-helm install cilium cilium/cilium
5959-6060-CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
6161-CLI_ARCH=amd64
6262-curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz
6363-sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin
6464-rm cilium-linux-${CLI_ARCH}.tar.gz
6565-6666-cilium install \
6767- --set k8sServiceHost=${API_SERVER_IP} \
6868- --set k8sServicePort=6443 \
6969- --set kubeProxyReplacement=true
7070-7171-cilium status --wait
7272-7373-helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --set crds.enabled=true
7474-```
7575-7676-```yaml
7777-# cert-manager.yaml
7878-# secret-cloudflare.yaml
7979-apiVersion: v1
8080-kind: Secret
8181-metadata:
8282- name: cloudflare-api-key-secret
8383- namespace: cert-manager
8484-type: Opaque
8585-stringData:
8686- api-key: <Cloudflare API Token (not encrypted)>
8787----
8888-# cert-issuer.yaml
8989-apiVersion: cert-manager.io/v1
9090-kind: ClusterIssuer
9191-metadata:
9292- name: acme-issuer
9393- namespace: cert-manager
9494-spec:
9595- acme:
9696- email: <Email for updates>
9797- server: https://acme-v02.api.letsencrypt.org/directory
9898- privateKeySecretRef:
9999- name: acme-issuer
100100- solvers:
101101- - dns01:
102102- cloudflare:
103103- email: <Cloudflare account Email>
104104- apiTokenSecretRef:
105105- name: cloudflare-api-token-secret
106106- key: api-token
107107-```
108108-109109-## Installer k3s
110110-111111-Comme Hagen l'explique dans [son article](https://blog.stonegarden.dev/articles/2024/02/bootstrapping-k3s-with-cilium/), nous voulons installer `k3s` sans configurations et avec tout désactivé. Il décrit en détail quels composants ne sont pas installés.
112112-113113-```bash
114114-curl -sfL https://get.k3s.io | sh -s - \
115115- --flannel-backend=none \
116116- --disable-kube-proxy \
117117- --disable servicelb \
118118- --disable-network-policy \
119119- --disable traefik \
120120- --cluster-init
121121-```
122122-123123-Après l'installation, quelques pods devraient être en cours d'exécution (3). Ne soyez pas choqués si les pods sont dans l'état `ContainerCreating` ou `Pending`. Cela est dû au fait que les pods ne peuvent pas communiquer entre eux parce que nous avons désactivé le CNI (`--flannel-backend=none`). Nous installerons plus tard [Cilium](https://github.com/cilium), qui remplacera le CNI Flannel.
124124-125125-```bash
126126-kubectl get pods -A
127127-```
128128-129129-## Installer Helm
130130-131131-Helm est le gestionnaire de packages pour [Kubernetes](https://github.com/kubernetes), vous pouvez soit l'installer directement (suivez la [documentation Helm](https://helm.sh/docs/intro/install/)), soit utiliser les composants d'Helm inclus avec Cilium. Nous avons choisi d'installer Helm directement, ce qui est facilement faisable avec cette commande :
132132-133133-```bash
134134-curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
135135-```
136136-137137-## Installer Cilium
138138-139139-[Cilium](https://github.com/cilium) est un logiciel de mise en réseau et de sécurité pour Kubernetes. Cilium est très rapide, évolutif et sécurisé car il repose sur eBPF - une technologie révolutionnaire qui peut exécuter des programmes isolés dans le noyau Linux sans recompiler le noyau ou charger des modules noyau.
140140-141141-Nous pourrions installer Cilium avec Helm comme indiqué ici :
142142-143143-```bash
144144-helm repo add cilium https://helm.cilium.io/
145145-helm repo update
146146-helm install cilium cilium/cilium
147147-```
148148-149149-Cependant, nous avons voulu l'installer avec leur CLI, et voici comment vous pouvez le faire. Tout d'abord, installez la CLI de Cilium en exécutant ce script :
150150-151151-```bash
152152-CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
153153-CLI_ARCH=amd64
154154-curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz
155155-sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin
156156-rm cilium-linux-${CLI_ARCH}.tar.gz
157157-```
158158-159159-Ensuite, vous pouvez installer Cilium avec l'adresse IP de votre serveur :
160160-161161-```bash
162162-cilium install \
163163- --set k8sServiceHost=${API_SERVER_IP} \
164164- --set k8sServicePort=6443 \
165165- --set kubeProxyReplacement=true
166166-```
167167-168168-Nous attendons maintenant que Cilium indique que tout est `OK` ou `disabled` :
169169-170170-```bash
171171-cilium status --wait
172172-```
173173-174174-Au bout d'un moment, tous les pods devraient être en état `Running`.
175175-176176-```bash
177177-kubectl get pods -A
178178-```
179179-180180-Enfin, vous pouvez appliquer certaines ressources pour Cilium :
181181-182182-```yaml
183183-# announce.yaml
184184-apiVersion: cilium.io/v2alpha1
185185-kind: CiliumL2AnnouncementPolicy
186186-metadata:
187187- name: default-l2-announcement-policy
188188- namespace: kube-system
189189-spec:
190190- externalIPs: true
191191- loadBalancerIPs: true
192192-```
193193-194194-```yaml
195195-# ip-pool.yaml
196196-apiVersion: "cilium.io/v2alpha1"
197197-kind: CiliumLoadBalancerIPPool
198198-metadata:
199199- name: "first-pool"
200200-spec:
201201- blocks:
202202- - start: "192.168.0.240"
203203- stop: "192.168.0.249"
204204-```
205205-206206-De plus, vous devriez mettre à jour la configuration de Cilium. Pour cela, créez d'abord ce fichier dans le répertoire racine où vous souhaitez gérer le cluster k3s. Plus tard, vous pourrez également appliquer des propriétés liées à Hubble et Prometheus si vous souhaitez utiliser [Grafana](https://github.com/Grafana) ou un outil similaire (ouvrez les lignes repliées si vous souhaitez utiliser notre configuration également).
207207-208208-```yaml collapse={32-59}
209209-#cilium-config.yaml
210210-k8sServiceHost: 127.0.0.1
211211-k8sServicePort: 6443
212212-213213-kubeProxyReplacement: true
214214-l2announcements:
215215- enabled: true
216216-217217-externalIPs:
218218- enabled: true
219219-220220-k8sClientRateLimit:
221221- qps: 50
222222- burst: 200
223223-224224-operator:
225225- replicas: 1
226226- rollOutPods: true
227227- prometheus:
228228- enabled: true
229229-230230-rollOutCiliumPods: true
231231-232232-ingressController:
233233- enabled: true
234234- default: true
235235- loadbalancerMode: shared
236236- service:
237237- annotations:
238238- io.cilium/lb-ipam-ips: 192.168.0.240
239239-240240-hubble:
241241- relay:
242242- enabled: true
243243- ui:
244244- enabled: true
245245- metrics:
246246- serviceMonitor:
247247- enabled: true
248248- enableOpenMetrics: true
249249- enabled:
250250- - dns
251251- - drop
252252- - tcp
253253- - icmp
254254- - port-distribution
255255- - "flow:sourceContext=workload-name|reserved-identity;destinationContext=workload-name|reserved-identity"
256256- - "kafka:labelsContext=source_namespace,source_workload,destination_namespace,destination_workload,traffic_direction;sourceContext=workload-name|reserved-identity;destinationContext=workload-name|reserved-identity"
257257- - "httpV2:exemplars=true;labelsContext=source_ip,source_namespace,source_workload,destination_ip,destination_namespace,destination_workload,traffic_direction;sourceContext=workload-name|reserved-identity;destinationContext=workload-name|reserved-identity"
258258- dashboards:
259259- enabled: true
260260- namespace: monitoring
261261- annotations:
262262- grafana_folder: "Hubble"
263263-264264-prometheus:
265265- enabled: true
266266- serviceMonitor:
267267- enabled: true
268268-```
269269-270270-Exécutez cette commande pour mettre à jour :
271271-272272-```bash
273273-cilium upgrade -f cilium-config.yaml
274274-```
275275-276276-## Configurer le gestionnaire de certificats avec Cloudflare
277277-278278-Pour pouvoir créer des certificats pour chaque sous-domaine, il est important d'appliquer un émetteur de certificats qui gère les demandes de certificats et les résout auprès d'un fournisseur. Nous avons choisi [Cloudflare](https://github.com/cloudflare) comme notre émetteur, et voici la configuration que vous devez appliquer à votre cluster Kubernetes. Pour plus d'informations, vous pouvez consulter la [documentation de cert-manager](https://cert-manager.io/docs/configuration/acme/dns01/cloudflare/).
279279-280280-Mais d'abord, nous devons installer le cert-manager en exécutant la commande suivante :
281281-282282-```bash
283283-helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --set crds.enabled=true
284284-```
285285-286286-```yaml
287287-# cert-issuer.yaml
288288-apiVersion: cert-manager.io/v1
289289-kind: ClusterIssuer
290290-metadata:
291291- name: acme-issuer
292292- namespace: cert-manager
293293-spec:
294294- acme:
295295- email: <Email for updates>
296296- server: https://acme-v02.api.letsencrypt.org/directory
297297- privateKeySecretRef:
298298- name: acme-issuer
299299- solvers:
300300- - dns01:
301301- cloudflare:
302302- email: <Cloudflare account Email>
303303- apiTokenSecretRef:
304304- name: cloudflare-api-token-secret
305305- key: api-token
306306-```
307307-308308-Vous pouvez appliquer un fichier au cluster [Kubernetes](https://github.com/kubernetes) en exécutant cette commande k8s (également k3s) :
309309-310310-```bash
311311-kubectl apply -f cluster-issuer.yaml
312312-```
313313-314314-Si vous souhaitez supprimer la ressource dans le cluster Kubernetes, la commande est assez simple :
315315-316316-```bash
317317-kubectl delete -f cluster-issuer.yaml
318318-```
319319-320320-Comme vous l'avez peut-être remarqué ci-dessus, nous avons également besoin d'un secret pour le jeton API qui authentifie que ce générateur est autorisé à demander des certificats. Par conséquent, nous créons un secret avec un `API Token` non chiffré de Cloudflare.
321321-322322-De nos jours, nous créons un jeton en accédant à votre tableau de bord [Cloudflare](https://github.com/cloudflare), puis en cliquant sur votre profil et en sélectionnant l'onglet `API Tokens`. Ici, vous pouvez générer un jeton spécifique pour votre générateur ou utiliser la clé API globale (non recommandée). La solution recommandée est de créer un jeton API avec deux permissions (jeton personnalisé) :
323323-324324-* Zone - DNS - Modifier
325325-* Zone - Zone - Lecture
326326-327327-
328328-329329-Une description plus détaillée des jetons peut être trouvée dans les [docs Cloudflare](https://developers.cloudflare.com/fundamentals/api/get-started/create-token/).
330330-331331-Après avoir appliqué ce secret à Kubernetes, le générateur devrait être prêt à résoudre quelques vilains problèmes !
332332-333333-```yaml
334334-# secret-cloudflare.yaml
335335-apiVersion: v1
336336-kind: Secret
337337-metadata:
338338- name: cloudflare-api-key-secret
339339- namespace: cert-manager
340340-type: Opaque
341341-stringData:
342342- api-key: <Cloudflare API Token (not encrypted)>
343343-```
344344-345345-Vous pouvez maintenant utiliser ce générateur en appliquant ce fichier qui, espérons-le, créera un certificat :
346346-347347-```yaml
348348-# mutanuq-certificat.yaml
349349-apiVersion: cert-manager.io/v1
350350-kind: Certificate
351351-metadata:
352352- name: mutanuq
353353- namespace: mutanuq
354354-spec:
355355- secretName: mutanuq
356356- issuerRef:
357357- name: acme-issuer
358358- kind: ClusterIssuer
359359- dnsNames:
360360- - "mutanuq.trueberryless.org"
361361-```
362362-363363-Cela prend généralement environ 90 secondes pour authentifier la demande une fois appliquée. Vous pouvez vérifier l'état actuel de la demande en exécutant cette commande kubernetes. Si cela prend plus de 2 minutes, peut-être que quelques astuces dans [#Dépannage](#no-cloudflare-certificate-approval) peuvent vous aider.
364364-365365-```bash
366366-kubectl describe certificaterequests.cert-manager.io -n mutanuq
367367-```
368368-369369-:::tip
370370-L'option `-n` signifie namespace.
371371-:::
372372-373373-## Exemple d'application [`mutanuq`](https://mutanuq.trueberryless.org)
374374-375375-Ensuite, vous pouvez utiliser ce certificat dans votre contrôleur Ingress :
376376-377377-```yaml collapse={1-42} {61-64}
378378-# mutanuq.yaml
379379-apiVersion: apps/v1
380380-kind: Deployment
381381-metadata:
382382- name: mutanuq
383383- namespace: mutanuq
384384- labels:
385385- app: mutanuq
386386- annotations:
387387- keel.sh/policy: all
388388- keel.sh/trigger: poll
389389- keel.sh/pollSchedule: "@every 10s"
390390- keel.sh/releaseNotes: "https://github.com/trueberryless-org/mutanuq/releases"
391391-spec:
392392- replicas: 3
393393- selector:
394394- matchLabels:
395395- app: mutanuq
396396- template:
397397- metadata:
398398- labels:
399399- app: mutanuq
400400- spec:
401401- containers:
402402- - name: mutanuq
403403- image: trueberryless/mutanuq
404404- imagePullPolicy: Always
405405----
406406-apiVersion: v1
407407-kind: Service
408408-metadata:
409409- name: mutanuq
410410- namespace: mutanuq
411411- annotations:
412412- cert-manager.io/issuer: acme-issuer
413413-spec:
414414- selector:
415415- app: mutanuq
416416- ports:
417417- - name: http
418418- port: 80
419419----
420420-apiVersion: networking.k8s.io/v1
421421-kind: Ingress
422422-metadata:
423423- name: mutanuq
424424- namespace: mutanuq
425425-spec:
426426- rules:
427427- - host: mutanuq.trueberryless.org
428428- http:
429429- paths:
430430- - path: /
431431- pathType: Prefix
432432- backend:
433433- service:
434434- name: mutanuq
435435- port:
436436- number: 80
437437-438438- tls:
439439- - hosts:
440440- - mutanuq.trueberryless.org
441441- secretName: mutanuq
442442-```
443443-444444-## Configurer Keel
445445-446446-Nous avons toujours voulu une solution propre d'Intégration Continue (CI) et de Livraison Continue (CD) pour nos sites web. Cela signifie qu'un message de commit spécifique devrait déclencher un processus automatisé via [GitHub](https://github.com/github), Docker Hub et notre serveur, qui, à la fin, met à jour le site web correspondant en environ deux minutes.
447447-448448-Keel est un outil logiciel robuste qui permet cette fonctionnalité pour Kubernetes. Nous avons utilisé Keel pour tirer de nouvelles images Docker de Docker Hub en interrogeant toutes les quelques minutes. De plus, Keel fournit un magnifique tableau de bord où vous pouvez contrôler l'interrogation également.
449449-450450-Pour configurer Keel avec le tableau de bord d'administration, nous avons créé ces fichiers :
451451-452452-* `secret-dashboard.yaml` pour le nom d'utilisateur et le mot de passe administrateur (tout le monde ne devrait pas pouvoir accéder au tableau de bord)
453453-* `keel.yaml` pour les configurations réelles de k3s (copié et adapté de [KeelHQ](https://github.com/keel-hq/keel/blob/9f0a7160bbdc3a107ad148933a4269f30e4e479c/deployment/deployment-template.yaml))
454454-455455-```yaml
456456-# secret-dashboard.yaml
457457-apiVersion: v1
458458-kind: Secret
459459-metadata:
460460- name: keel-dashboard-secrets
461461- namespace: keel
462462-type: Opaque
463463-stringData:
464464- username: <username>
465465- password: <password>
466466-```
467467-468468-```yaml {157-160,162-165} collapse={1-155, 166-194}
469469-# keel.yaml
470470----
471471-apiVersion: v1
472472-kind: Namespace
473473-metadata:
474474- name: keel
475475-476476----
477477-apiVersion: v1
478478-kind: ServiceAccount
479479-metadata:
480480- name: keel
481481- namespace: keel
482482- labels:
483483- app: keel
484484-485485----
486486-apiVersion: rbac.authorization.k8s.io/v1
487487-kind: ClusterRole
488488-metadata:
489489- name: keel
490490-rules:
491491- - apiGroups:
492492- - ""
493493- resources:
494494- - namespaces
495495- verbs:
496496- - watch
497497- - list
498498- - apiGroups:
499499- - ""
500500- resources:
501501- - secrets
502502- verbs:
503503- - get
504504- - watch
505505- - list
506506- - apiGroups:
507507- - ""
508508- - extensions
509509- - apps
510510- - batch
511511- resources:
512512- - pods
513513- - replicasets
514514- - replicationcontrollers
515515- - statefulsets
516516- - deployments
517517- - daemonsets
518518- - jobs
519519- - cronjobs
520520- verbs:
521521- - get
522522- - delete # required to delete pods during force upgrade of the same tag
523523- - watch
524524- - list
525525- - update
526526- - apiGroups:
527527- - ""
528528- resources:
529529- - configmaps
530530- - pods/portforward
531531- verbs:
532532- - get
533533- - create
534534- - update
535535-536536----
537537-apiVersion: rbac.authorization.k8s.io/v1
538538-kind: ClusterRoleBinding
539539-metadata:
540540- name: keel
541541-roleRef:
542542- apiGroup: rbac.authorization.k8s.io
543543- kind: ClusterRole
544544- name: keel
545545-subjects:
546546- - kind: ServiceAccount
547547- name: keel
548548- namespace: keel
549549-550550----
551551-apiVersion: networking.k8s.io/v1
552552-kind: Ingress
553553-metadata:
554554- name: keel
555555- namespace: keel
556556-spec:
557557- rules:
558558- - host: keel.trueberryless.org
559559- http:
560560- paths:
561561- - path: /
562562- pathType: Prefix
563563- backend:
564564- service:
565565- name: keel
566566- port:
567567- number: 9300
568568-569569- tls:
570570- - hosts:
571571- - keel.trueberryless.org
572572- secretName: keel
573573-574574----
575575-apiVersion: v1
576576-kind: Service
577577-metadata:
578578- name: keel
579579- namespace: keel
580580- labels:
581581- app: keel
582582-spec:
583583- type: LoadBalancer
584584- ports:
585585- - port: 9300
586586- targetPort: 9300
587587- protocol: TCP
588588- name: keel
589589- selector:
590590- app: keel
591591- sessionAffinity: None
592592-593593----
594594-apiVersion: apps/v1
595595-kind: Deployment
596596-metadata:
597597- name: keel
598598- namespace: keel
599599- labels:
600600- app: keel
601601-spec:
602602- replicas: 1
603603- selector:
604604- matchLabels:
605605- app: keel
606606- template:
607607- metadata:
608608- labels:
609609- app: keel
610610- spec:
611611- serviceAccountName: keel
612612- containers:
613613- - name: keel
614614- # Note that we use appVersion to get images tag.
615615- image: "keelhq/keel:latest"
616616- imagePullPolicy: Always
617617- command: ["/bin/keel"]
618618- env:
619619- - name: NAMESPACE
620620- valueFrom:
621621- fieldRef:
622622- fieldPath: metadata.namespace
623623- # Basic auth (to enable UI/API)
624624- - name: BASIC_AUTH_USER
625625- valueFrom:
626626- secretKeyRef:
627627- name: keel-dashboard-secrets
628628- key: username
629629- - name: BASIC_AUTH_PASSWORD
630630- valueFrom:
631631- secretKeyRef:
632632- name: keel-dashboard-secrets
633633- key: password
634634- ports:
635635- - containerPort: 9300
636636- livenessProbe:
637637- httpGet:
638638- path: /healthz
639639- port: 9300
640640- initialDelaySeconds: 30
641641- timeoutSeconds: 10
642642- resources:
643643- limits:
644644- cpu: 100m
645645- memory: 128Mi
646646- requests:
647647- cpu: 50m
648648- memory: 64Mi
649649-650650----
651651-# Source: keel/templates/pod-disruption-budget.yaml
652652-653653-apiVersion: policy/v1
654654-kind: PodDisruptionBudget
655655-metadata:
656656- name: keel
657657- namespace: keel
658658-spec:
659659- maxUnavailable: 1
660660- selector:
661661- matchLabels:
662662- app: keel
663663-```
664664-665665-Après avoir appliqué les deux fichiers et géré le certificat supplémentaire pour `keel.trueberryless.org`, le tableau de bord Keel fonctionne parfaitement. De plus, chaque `Deployment` Kubernetes peut opter pour un sondage Docker Hub automatisé en ajoutant quelques annotations :
666666-667667-```yaml {8-12} collapse={15-63}
668668-apiVersion: apps/v1
669669-kind: Deployment
670670-metadata:
671671- name: mutanuq
672672- namespace: mutanuq
673673- labels:
674674- app: mutanuq
675675- annotations:
676676- keel.sh/policy: all
677677- keel.sh/trigger: poll
678678- keel.sh/pollSchedule: "@every 1m"
679679- keel.sh/releaseNotes: "https://github.com/trueberryless-org/mutanuq/releases"
680680-spec:
681681- replicas: 1
682682- selector:
683683- matchLabels:
684684- app: mutanuq
685685- template:
686686- metadata:
687687- labels:
688688- app: mutanuq
689689- spec:
690690- containers:
691691- - name: mutanuq
692692- image: trueberryless/mutanuq
693693- imagePullPolicy: Always
694694----
695695-apiVersion: v1
696696-kind: Service
697697-metadata:
698698- name: mutanuq
699699- namespace: mutanuq
700700- annotations:
701701- cert-manager.io/issuer: acme-issuer
702702-spec:
703703- selector:
704704- app: mutanuq
705705- ports:
706706- - name: http
707707- port: 80
708708----
709709-apiVersion: networking.k8s.io/v1
710710-kind: Ingress
711711-metadata:
712712- name: mutanuq
713713- namespace: mutanuq
714714-spec:
715715- rules:
716716- - host: mutanuq.trueberryless.org
717717- http:
718718- paths:
719719- - path: /
720720- pathType: Prefix
721721- backend:
722722- service:
723723- name: mutanuq
724724- port:
725725- number: 80
726726-727727- tls:
728728- - hosts:
729729- - mutanuq.trueberryless.org
730730- secretName: mutanuq
731731-```
732732-733733-## Célébrez avec un café !
734734-735735-Félicitations, vous avez réussi à configurer [Kubernetes](https://github.com/kubernetes) avec [Cilium](https://github.com/cilium) et [Cloudflare](https://github.com/cloudflare) ! Vous méritez une pause café. Profitez d'une tasse bien méritée, et si vous souhaitez partager un café virtuel avec moi, n'hésitez pas à soutenir mon travail sur [Ko-fi](https://ko-fi.com/trueberryless). Merci !
736736-737737-## Dépannage
738738-739739-### Cilium-ingress n'a pas d'External-IP
740740-741741-Assurez-vous que le `ip-pool` inclut l'adresse spécifiée par les annotations dans le fichier `config.yaml`.
742742-743743-```yaml
744744-# ip-pool.yaml
745745-apiVersion: "cilium.io/v2alpha1"
746746-kind: CiliumLoadBalancerIPPool
747747-metadata:
748748- name: "first-pool"
749749-spec:
750750- blocks:
751751- - start: "192.168.0.240" # 240 included for ingress
752752- stop: "192.168.0.249"
753753-```
754754-755755-```yaml
756756-#cilium-config.yaml
757757-ingressController:
758758- enabled: true
759759- default: true
760760- loadbalancerMode: shared
761761- service:
762762- annotations:
763763- io.cilium/lb-ipam-ips: 192.168.0.240 # this must be within range
764764-```
765765-766766-:::note
767767-Dans certains cas, d'autres contrôleurs d'entrée obtiennent l'adresse annotée avant que le contrôleur d'entrée de Cilium puisse y accéder, donc elle resterait en attente...
768768-:::
769769-770770-Si vous ne déployez pas localement mais sur l'une des `Big Three`, veuillez consulter d'autres documentations sur les raisons pour lesquelles l'IP externe reste en attente. Il est principalement de leur responsabilité de vous fournir une adresse.
771771-772772-### Pas d'approbation de certificat Cloudflare
773773-774774-Il peut y avoir un problème lorsque le certificat ne reçoit pas l'approbation de Cloudflare.
775775-776776-#### Jeton API incorrect
777777-778778-Tout d'abord, assurez-vous que le jeton API Cloudflare est correct. Pour être sûr à 100 %, créez-en un nouveau et insérez-le (non encodé en base64) dans ce fichier :
779779-780780-```yaml
781781-apiVersion: v1
782782-kind: Secret
783783-metadata:
784784- name: cloudflare-api-key-secret
785785- namespace: cert-manager
786786-type: Opaque
787787-stringData:
788788- api-key: <Cloudflare API Token (not encrypted)>
789789-```
790790-791791-#### Maximum d'échecs d'authentification atteint
792792-793793-Nous avons rencontré une fois l'erreur `Error: 9109: Max auth failures reached, please check your Authorization header.`. Il suffit d'attendre quelques heures, de supprimer la ressource et de l'appliquer à nouveau :
794794-795795-```bash
796796-kubectl delete -f certificate.yaml
797797-kubectl apply -f certificate.yaml
798798-```
799799-800800-Espérons que tout fonctionne maintenant !
···11----
22-title: Comment générer automatiquement des barres latérales Starlight sans
33- perdre le contrôle
44-description: Découvrez deux techniques de Starlight pour générer automatiquement
55- de grandes barres latérales tout en conservant des URL et des intitulés
66- propres.
77-date: 2025-08-17
88-tags:
99- - Education
1010- - Starlight
1111-authors:
1212- - trueberryless
1313-cover:
1414- alt: A beautiful cover image with the text "Auto Sidebar"
1515- image: ../../../../../public/blog/starlight-autogenerate-whole-sidebar.jpg
1616-1717----
1818-1919-import { FileTree } from '@astrojs/starlight/components';
2020-2121-Avez-vous déjà voulu simplifier la génération de barres latérales dans votre projet Starlight ? Avez-vous essayé de générer automatiquement l'intégralité de la barre latérale pour découvrir qu'elle ne vous permet pas de personnaliser la structure selon vos besoins ?
2222-2323-Cet article démontre deux fonctionnalités de Starlight qui rendent les barres latérales entièrement générées automatiquement flexibles et réduisent la maintenance.
2424-2525-{/* excerpt */}
2626-2727-## Cas d'utilisation
2828-2929-Dans des projets Starlight de taille moyenne à grande, la création et la maintenance manuelles de la [configuration de la barre latérale Starlight](https://starlight.astro.build/reference/configuration/#sidebar) deviennent une tâche fastidieuse et chronophage.
3030-3131-Par le passé, Starlight ne fournissait pas les primitives adéquates pour cela, et l'approche recommandée consistait à déplacer d'un niveau inférieur la génération automatique de la configuration de la barre latérale — afin que seuls les dossiers sans sous-dossiers imbriqués soient générés automatiquement. Cependant, avec l'introduction de [Route Data](https://starlight.astro.build/guides/route-data/) et du plus récent [`generateId()` hook de `docsLoader`](https://starlight.astro.build/reference/configuration/#generateid), ces scénarios peuvent désormais être résolus beaucoup plus facilement et efficacement.
3232-3333-## Résolution du problème d’ordre
3434-3535-Un problème fréquent était toujours : "Comment puis-je personnaliser l'ordre des dossiers de la barre latérale si je génère automatiquement la barre latérale ?" D'anciennes problématiques comme [#1223](https://github.com/withastro/starlight/issues/1223) suggèrent une solution inspirée de [Nuxt Content](https://content.nuxt.com) où chaque segment de l'intégralité du chemin peut être [préfixé avec des nombres et des points](https://v2.content.nuxt.com/usage/content-directory#ordering) pour déterminer un ordre numérique au niveau du fichier. Un exemple pour un tel projet pourrait ressembler à ceci :
3636-3737-<FileTree>
3838- * src/content/docs/dossier-imbriqué
3939- * 1.frameworks
4040- * 1.vue.md
4141- * 2.nuxt.md
4242- * 2.examples
4343- * 1.vercel.md
4444- * 2.netlify.md
4545-</FileTree>
4646-4747-Si vous souhaitez utiliser cette approche dans Starlight, cela ne fonctionne pas immédiatement, mais avec une configuration simple, vous pouvez y parvenir.
4848-4949-Starlight [0.35.0](https://github.com/withastro/starlight/releases/tag/%40astrojs%2Fstarlight%400.35.0) a introduit une fonction de rappel que vous pouvez passer à `docsLoader()` et qui peut manipuler l'identifiant (URL) de la page générée. En divisant l'entrée par `"/"` et en supprimant tout nombre + point au niveau des segments, vous disposez maintenant de la même fonctionnalité dans Starlight :
5050-5151-```ts {6-7,12-19}
5252-// src/content.config.ts
5353-import { defineCollection } from "astro:content";
5454-import { docsLoader } from "@astrojs/starlight/loaders";
5555-import { docsSchema } from "@astrojs/starlight/schema";
5656-5757-const leadingNumberAndDotRegEx = /^\d+\./;
5858-const fileExtensionRegEx = /\.(md|mdx)$/;
5959-6060-export const collections = {
6161- docs: defineCollection({
6262- loader: docsLoader({
6363- // Remove file extension and
6464- // leading numbers + dot from each segment
6565- generateId: ({ entry }) =>
6666- entry
6767- .replace(fileExtensionRegEx, "")
6868- .split("/")
6969- .map((segment) => segment.replace(leadingNumberAndDotRegEx, ""))
7070- .join("/"),
7171- }),
7272- schema: docsSchema(),
7373- }),
7474-};
7575-7676-```
7777-7878-L'URL pour accéder aux pages change maintenant par exemple, de `/nested-folder/1.frameworks/1.vue` à `/nested-folder/frameworks/vue`.
7979-8080-Cependant, les noms des dossiers dans la barre latérale incluent encore les préfixes `1.`. Alors, résolvons également la manipulation de la barre latérale :
8181-8282-## Résolution du problème de nommage des dossiers dans la barre latérale
8383-8484-Starlight [0.32.0](https://github.com/withastro/starlight/releases/tag/%40astrojs%2Fstarlight%400.32.0) a introduit [Route Data](https://starlight.astro.build/guides/route-data/), que nous pouvons maintenant utiliser pour manipuler les noms des dossiers dans la barre latérale afin de
8585-8686-1. supprimer tout numéro et point en début de nom de dossier, et
8787-2. appliquer la "Title Case" afin qu'ils ne soient pas entièrement en minuscules
8888-8989-```ts
9090-// src/routeData.ts
9191-import { defineRouteMiddleware } from "@astrojs/starlight/route-data";
9292-9393-const leadingNumberAndDotRegEx = /^\d+\./;
9494-const wordSplitterRegEx = /\w\S*/g;
9595-9696-function toTitleCase(str: string) {
9797- return str.replace(wordSplitterRegEx, (word) => {
9898- return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
9999- });
100100-}
101101-102102-function cleanGroupLabels(entries: any[]) {
103103- for (const entry of entries) {
104104- if (entry.type === "group") {
105105- // Remove leading number + dot
106106- let label = entry.label.replace(leadingNumberAndDotRegEx, "");
107107- // Convert to Title Case
108108- entry.label = toTitleCase(label);
109109- // Recurse into children
110110- cleanGroupLabels(entry.entries);
111111- }
112112- }
113113-}
114114-115115-export const onRequest = defineRouteMiddleware((context) => {
116116- const { sidebar } = context.locals.starlightRoute;
117117- cleanGroupLabels(sidebar);
118118-});
119119-```
120120-121121-:::note[Internationalisation (i18n)]
122122-Notez que [l'internationalisation (i18n) des noms de dossiers](https://starlight.astro.build/guides/sidebar/#internationalization) est une fonctionnalité manquante avec une telle configuration, car il n'y a actuellement aucun endroit pour définir des traductions de noms de dossiers ; ils sont simplement convertis en "Title Case". Implémenter une logique pour charger dynamiquement les traductions pourrait impliquer de lire le [champ `locale` à partir des données de route](https://starlight.astro.build/reference/route-data/#locale) et de définir les traductions dans des fichiers `json`. Sinon, [utilisez le plugin de HiDeoo](#using-hideoos-plugin), qui [prend en charge l'i18n](https://starlight-auto-sidebar.netlify.app/guides/i18n/).
123123-:::
124124-125125-N'oubliez pas d'ajouter le fichier `routeData.ts` à votre fichier `astro.config.mjs` :
126126-127127-```ts ins={11}
128128-// astro.config.mjs
129129- starlight({
130130- title: "Autogenerate whole sidebar",
131131- social: [{ icon: "github", label: "GitHub", href: "https://github.com/withastro/starlight" }],
132132- sidebar: [
133133- {
134134- label: "Root Folder",
135135- autogenerate: { directory: "nested-folder" },
136136- },
137137- ],
138138- routeMiddleware: "./src/routeData.ts",
139139- }),
140140-```
141141-142142-Bien sûr, vous pouvez ajuster le code à vos besoins (par exemple, supprimer la transformation "Title Case" si vos noms de fichiers sont déjà correctement écrits).
143143-144144-## Utilisation du plugin de HiDeoo
145145-146146-Si vous souhaitez générer automatiquement toute votre barre latérale et conserver la flexibilité nécessaire pour personnaliser tout ce que vous voulez, [HiDeoo](https://github.com/HiDeoo) a également créé un plugin dédié pour de tels cas d'utilisation : [Starlight Auto Sidebar](https://starlight-auto-sidebar.netlify.app).
147147-148148-En particulier, ces deux fonctionnalités ont été mentionnées dans cet article :
149149-150150-* Controllant [l'ordre](https://starlight-auto-sidebar.netlify.app/metadata/#order) des répertoires individuels
151151-* Adaptant [l'intitulé affiché](https://starlight-auto-sidebar.netlify.app/metadata/#label) des dossiers individuels
152152-153153-Cependant, si vous souhaitez automatiser entièrement la génération sans devoir spécifier manuellement les intitulés et l'ordre pour chaque répertoire, coder la solution vous-même (avec quelques lignes directrices de ce blog) est la solution préférée et recommandée.
154154-155155-Si vous souhaitez consulter le code présenté dans cet article, n'hésitez pas à visiter le [StackBlitz](https://stackblitz.com/github/trueberryless/starlight-autogenerate-whole-sidebar?file=src%2Fcontent.config.ts) ou le code source dans le [dépôt GitHub](https://github.com/trueberryless/starlight-autogenerate-whole-sidebar).
···11----
22-title: Une façon élégante de rendre hommage dans les projets Starlight
33-date: 2024-11-12
44-description: Inspiré par le crédit Starlight dans la documentation Astro, j'ai
55- créé un plugin personnalisable qui lie vers Starlight, Astro et le Starlight
66- Blog, avec un support multilingue.
77-excerpt: Starlight Cooler Credit est un plugin personnalisable qui offre des
88- liens de crédit élégants et multilingues vers Starlight, Astro et le Starlight
99- Blog—transformant une petite idée en une collaboration mondiale.
1010-tags:
1111- - Starlight
1212- - Plugins
1313-authors:
1414- - trueberryless
1515-cover:
1616- alt: A beautiful cover image with the text "Cooler Credit"
1717- image: ../../../../../public/blog/starlight-cooler-credit.jpg
1818-1919----
2020-2121-Tout a commencé lorsque j'ai remarqué le lien de crédit vers [Starlight](https://starlight.astro.build) dans la [documentation Astro](https://docs.astro.build). Positionné au bas de la table des matières, il était simple mais élégant, et j'aimais la manière subtile de reconnaître l'auteur du projet. Lorsque Starlight a introduit sa propre option de crédit, je l'ai activée dans tous mes projets. C'était discret, petit et placé au bas de chaque page—sympathique, mais facile à manquer.
2222-2323-C'est alors que je me suis dit, *Et si d'autres voulaient une option de crédit plus cool, comme celle de la documentation Astro ?* Alors, je me suis mis à créer un plugin. Au départ, c'était juste un projet amusant pour faire des liens vers Starlight et Astro d'une manière plus visible. J'ai commencé avec deux préréglages—un pour Starlight et un pour Astro—et j'ai partagé mon travail sur le Discord d'Astro.
2424-2525-C'est là que tout a changé. [Un mainteneur extraordinaire d'Astro](https://www.rainsberger.ca/) a suggéré, *"Pourquoi ne pas ajouter un lien vers le Starlight Blog également ?"* et j'ai pensé, *Quelle idée géniale !* J'ai ajouté le blog comme troisième préréglage, et soudainement, le plugin est devenu bien plus que ce que j'avais prévu.
2626-2727-Mais je n'avais pas encore fini. Ça m'agaçait que les crédits soient toujours en anglais, alors j'ai décidé de les faire traduire automatiquement en fonction des langues prises en charge par Starlight. C'est là que la vraie aventure a commencé. J'ai sollicité la communauté pour m'aider à traduire le plugin dans différentes langues. La réponse a été incroyable ! Des personnes du monde entier ont proposé leur aide, et ce qui avait commencé comme un projet solo s'est transformé en une collaboration mondiale. En chemin, j'ai fait de nouvelles rencontres et appris énormément grâce à tous ceux qui ont participé. Maintenant, le plugin prend en charge une dizaine de langues, et de nouvelles traductions continuent d'arriver.
2828-2929-Ce qui a commencé comme une idée simple est devenu quelque chose dont je suis vraiment fier : **Starlight Cooler Credit**. Ce n'est pas juste un plugin—c'est une façon de rendre hommage avec style, personnalisation et une touche de travail d'équipe mondial.
3030-3131-Si vous êtes curieux, vous pouvez le découvrir sur [starlight-cooler-credit.trueberryless.org](https://starlight-cooler-credit.trueberryless.org/). Essayez-le—je pense que vous l'aimerez autant que moi !
···11----
22-title: Dropdown et Liste des sujets Starlight ensemble
33-description: Découvrez comment combiner une liste de bureau et un menu déroulant
44- mobile pour les sujets de votre barre latérale Starlight.
55-date: 2025-05-13
66-tags:
77- - Starlight
88- - Plugins
99- - CSS
1010- - Education
1111-excerpt: Combinez deux plugins <a class="gh-badge"
1212- href="https://github.com/withastro/starlight"><img src="/starlight.png"
1313- alt="Starlight" />Starlight</a> Sidebar Topics pour afficher une liste de
1414- sujets sur le bureau et un menu déroulant dans la barre latérale mobile.
1515-authors:
1616- - hideoo
1717- - trueberryless
1818-cover:
1919- alt: A beautiful cover image with the text "Dropdown and List?"
2020- image: ../../../../../public/blog/starlight-dropdown-and-list-together.jpg
2121-2222----
2323-2424-import { Tabs, TabItem } from "@astrojs/starlight/components";
2525-2626-En utilisant le plugin [Starlight Sidebar Topics](https://github.com/hideoo/starlight-sidebar-topics) avec le composant [Starlight Sidebar Topics Dropdown](https://github.com/trueberryless-org/starlight-sidebar-topics-dropdown), vous pouvez créer un site web qui affiche une liste de sujets sur le bureau et un menu déroulant sur mobile.
2727-2828-## Prérequis
2929-3030-Vous devez disposer d’un site web Starlight existant.
3131-3232-## Installer les paquets
3333-3434-Tout d'abord, installez le plugin `starlight-sidebar-topics` ainsi que le composant `starlight-sidebar-topics-dropdown` :
3535-3636-<Tabs syncKey="pkg">
3737- <TabItem label="npm">
3838- ```bash
3939- npm install starlight-sidebar-topics starlight-sidebar-topics-dropdown
4040- ```
4141- </TabItem>
4242-4343- <TabItem label="pnpm">
4444- ```bash
4545- pnpm add starlight-sidebar-topics starlight-sidebar-topics-dropdown
4646- ```
4747- </TabItem>
4848-4949- <TabItem label="Yarn">
5050- ```bash
5151- yarn add starlight-sidebar-topics starlight-sidebar-topics-dropdown
5252- ```
5353- </TabItem>
5454-</Tabs>
5555-5656-Ensuite, suivez les guides d'installation de [Starlight Sidebar Topics](https://starlight-sidebar-topics.trueberryless.org/docs/getting-started/#installation) et de [Starlight Sidebar Topics Dropdown](https://starlight-sidebar-topics-dropdown.trueberryless.org/docs/getting-started/#installation).
5757-5858-## Modifier le composant de la barre latérale
5959-6060-Dans le guide d'installation du composant déroulant, vous avez créé un composant de barre latérale qui ne rend que le menu déroulant. Désormais, vous devez modifier ce composant pour qu'il rende également la barre latérale par défaut si l'utilisateur est sur un bureau.
6161-6262-```astro
6363----
6464-// src/components/Sidebar.astro
6565-import Default from '@astrojs/starlight/components/Sidebar.astro';
6666-import Topics from 'starlight-sidebar-topics/components/Sidebar.astro';
6767-import TopicsDropdown from 'starlight-sidebar-topics-dropdown/TopicsDropdown.astro';
6868----
6969-7070-<div class="topics">
7171- <Topics/>
7272-</div>
7373-<div class="topics-dropdown">
7474- <TopicsDropdown/>
7575-</div>
7676-<Default><slot /></Default>
7777-7878-<style>
7979- /* Hide topics by default and show them on medium screens and larger */
8080- .topics {
8181- display: none;
8282- }
8383-8484- @media (min-width: 800px) {
8585- .topics {
8686- display: block;
8787- }
8888- }
8989-9090- /* Show topics dropdown on small screens and hide it on medium screens and larger */
9191- .topics-dropdown {
9292- display: block;
9393- }
9494-9595- @media (min-width: 800px) {
9696- .topics-dropdown {
9797- display: none;
9898- }
9999- }
100100-</style>
101101-```
102102-103103-## Résultat
104104-105105-Si vous suivez ces étapes, votre barre latérale ressemblera à ceci :
106106-107107-
108108-109109-Vous pouvez trouver le code source complet de ce guide dans cet [exemple StackBlitz](https://stackblitz.com/edit/withastro-starlight-qgraahmp?file=astro.config.mjs).
110110-111111-## Possibilités infinies
112112-113113-Vous pourriez également faire l'inverse (liste sur mobile, menu déroulant sur le bureau) en intervertissant les propriétés `display: block` et `display: none` dans le CSS.
114114-115115-De plus, vous pourriez également créer votre propre composant d'affichage, qui utilise les données de route du plugin Starlight Sidebar Topics et rend les sujets de manière personnalisée. Cela est un peu plus avancé, mais vous pouvez trouver plus d'informations à ce sujet dans la documentation ["Custom Topics List"](https://starlight-sidebar-topics.trueberryless.org/docs/guides/custom-topic-list/).
···11----
22-title: Comment créer un indicateur de progression horizontal pour votre site Starlight
33-description: Apprenez à créer un indicateur de progression horizontal pour votre
44- site Starlight.
55-date: 2025-06-10
66-tags:
77- - Starlight
88- - CSS
99- - Education
1010-excerpt: Apprenez à créer un indicateur de progression horizontal pour votre <a
1111- class="gh-badge" href="https://github.com/withastro/starlight"><img
1212- src="/starlight.png" alt="Starlight" />Starlight</a> site.
1313-authors:
1414- - frostybee
1515- - trueberryless
1616-cover:
1717- alt: A beautiful cover image with the text "Progress Bar"
1818- image: ../../../../../public/blog/starlight-progress-indicator.jpg
1919-2020----
2121-2222-Dans cet article, nous aimerions vous montrer comment [FrostyBee](https://github.com/frostybee) a créé un indicateur de progression horizontal et épuré pour les sites Starlight.
2323-2424-## Prérequis
2525-2626-Vous devez disposer d’un site web Starlight existant.
2727-2828-## Créer le composant d'indicateur de progression
2929-3030-Créons un nouveau composant appelé `ProgressIndicator.astro` dans le répertoire `src/components/`. Ce composant sera chargé de rendre l'indicateur de progression.
3131-3232-Nous créons un conteneur qui s'étend sur toute la largeur avec la barre de progression `<div>` à l'intérieur. La largeur de l'élément `<div>` interne est mise à jour chaque fois que l'utilisateur fait défiler la page (et lors du chargement de celle-ci) pour refléter la position de défilement actuelle.
3333-3434-```astro title="src/components/ProgressIndicator.astro" collapse={27-43}
3535-<div class="progress-scroll-container" aria-hidden="true">
3636- <div id="progress-scroll"></div>
3737-</div>
3838-3939-<script>
4040- window.addEventListener("scroll", function () {
4141- updateProgressScroll();
4242- });
4343- window.addEventListener("load", function () {
4444- updateProgressScroll();
4545- });
4646-4747- function updateProgressScroll() {
4848- if (document) {
4949- const progressScroll = document.getElementById("progress-scroll");
5050- if (progressScroll) {
5151- var scrollTop = window.scrollY || document.documentElement.scrollTop;
5252- var scrollHeight =
5353- document.documentElement.scrollHeight - window.innerHeight;
5454- var progress = (scrollTop / scrollHeight) * 100;
5555- progressScroll.style.width = progress + "%";
5656- }
5757- }
5858- }
5959-</script>
6060-6161-<style>
6262- html:is(:not([data-has-hero]), [data-has-sidebar], [data-has-toc]) .progress-scroll-container {
6363- position: fixed;
6464- top: var(--sl-nav-height);
6565- left: 0;
6666- height: 0.25rem;
6767- width: 100%;
6868- background-color: transparent;
6969- z-index: 3;
7070- }
7171-7272- #progress-scroll {
7373- height: 100%;
7474- width: 0px;
7575- background-color: var(--sl-color-accent-high);
7676- }
7777-</style>
7878-7979-<style is:global>
8080- #starlight__on-this-page--mobile {
8181- margin-top: 0.25rem;
8282- }
8383-</style>
8484-```
8585-8686-Dans les lignes masquées se trouve le style qui s'assure que la barre de progression ressemble à une barre de progression typique. Elle est également adaptée à Starlight car la barre est automatiquement masquée lorsque le site n’a ni barre latérale ni table des matières, mais possède un élément « hero », comme la plupart des pages de destination.
8787-8888-Un point important à noter concernant le CSS global (ligne 45) : il déplace le menu déroulant de la table des matières mobile vers le bas pour créer plus d’espace blanc au niveau de la barre de progression. C'est une préférence personnelle et vous pouvez le supprimer si vous le souhaitez.
8989-9090-## Surcharge dans Starlight
9191-9292-Nous pouvons maintenant utiliser ce composant dans une [surcharge Starlight](https://starlight.astro.build/guides/overriding-components/). Dans ce cas, il est logique de surcharger le composant [`Header.astro`](https://starlight.astro.build/reference/overrides/#header-1) comme ceci :
9393-9494-```astro title="src/components/Header.astro"
9595----
9696-import Default from "@astrojs/starlight/components/Header.astro";
9797-import ScrollIndicator from "./ScrollIndicator.astro";
9898----
9999-100100-<Default><slot /></Default>
101101-<ScrollIndicator />
102102-```
103103-104104-N’oubliez pas d’ajouter cette surcharge de composant à votre fichier `astro.config.mjs` :
105105-106106-```diff lang="js" title="astro.config.mjs"
107107-import { defineConfig } from 'astro/config';
108108-import starlight from '@astrojs/starlight';
109109-110110-export default defineConfig({
111111- integrations: [
112112- starlight({
113113- title: 'My Docs with a Progress Indicator',
114114-+ components: {
115115-+ // Override the default `Header` component.
116116-+ Header: './src/components/Header.astro',
117117-+ },
118118- }),
119119- ],
120120-});
121121-```
122122-123123-## Code source
124124-125125-Vous pouvez trouver l'intégralité du code du projet sur [GitHub](https://github.com/trueberryless/starlight-progress-indicator) et dans cet [exemple sur Stackblitz](https://stackblitz.com/github/trueberryless/starlight-progress-indicator?file=src%2Fcomponents%2FProgressIndicator.astro).
126126-127127-## Conclusion
128128-129129-Avec cette configuration, l'indicateur de progression sera affiché sur chaque page (sauf les pages de destination) de votre site Starlight. 🥳
130130-131131-Vous pouvez également consulter le [plugin Starlight Scroll To Top de FrostyBee](https://github.com/frostybee/starlight-scroll-to-top), qui prend également en charge un [Progress Ring](https://frostybee.github.io/starlight-scroll-to-top/configuration/#showprogressring) intégré depuis la version `0.3.1`. 🙌
···11----
22-title: Comment rendre les éléments de la barre latérale Starlight plus attrayants
33-description: Dans cet article de blog, nous examinerons comment de petits
44- changements peuvent faire une grande différence en termes d'espaces blancs, de
55- tailles de police, de poids et de couleurs dans votre barre latérale
66- Starlight.
77-date: 2025-04-27
88-tags:
99- - Starlight
1010- - CSS
1111- - Education
1212-excerpt: Dans cet article de blog, nous examinerons comment de petits
1313- changements peuvent faire une grande différence en termes d'espaces blancs
1414- dans votre <a class="gh-badge"
1515- href="https://github.com/withastro/starlight"><img src="/starlight.png"
1616- alt="Starlight" />Starlight</a>.
1717-authors:
1818- - trueberryless
1919-cover:
2020- alt: A beautiful cover image with the text "Starlight CSS"
2121- image: ../../../../../public/blog/starlight-sidebar-whitespace.jpg
2222-2323----
2424-2525-Vous êtes-vous déjà demandé pourquoi votre barre latérale \[Starlight]\[starlight] n'est pas si attrayante ? Saviez-vous combien l'espace entre les éléments de votre barre latérale est inconsciemment important ? La taille de la police, le poids et les petites différences de couleur ? Dans ce guide, nous examinerons comment personnaliser l'apparence de votre barre latérale Starlight avec des étapes rapides et faciles.
2626-2727-## Prérequis
2828-2929-Tout d'abord, vous devez \[configurer votre site Starlight]\[starlight-getting-started]. Ensuite, Starlight offre un \[guide sur la personnalisation des styles appliqués à votre site Starlight]\[starlight-css], qui est la fonctionnalité que nous utiliserons dans cet article.
3030-3131-Comme décrit dans \[ce guide]\[starlight-css-custom], vous devez créer un fichier `.css` quelque part dans votre répertoire `src/`, où vous pouvez définir vos styles CSS. N'oubliez pas d'ajouter le chemin vers ce fichier `.css` dans le tableau `customCss` de Starlight dans le fichier `astro.config.mjs` :
3232-3333-```diff lang="js"
3434-// astro.config.mjs
3535-import { defineConfig } from 'astro/config';
3636-import starlight from '@astrojs/starlight';
3737-3838-export default defineConfig({
3939- integrations: [
4040- starlight({
4141- title: 'Docs With Custom CSS',
4242- customCss: [
4343-+ // Relative path to your custom CSS file
4444-+ './src/styles/custom.css',
4545- ],
4646- }),
4747- ],
4848-});
4949-```
5050-5151-Après avoir terminé ces étapes de préparation, vous êtes prêt à essayer quelques ajustements intéressants à la conception de la barre latérale de Starlight.
5252-5353-## Personnalisations
5454-5555-Il existe une infinité de possibilités différentes auxquelles vous pouvez jouer simplement avec votre CSS personnalisé. Je vais vous donner quelques idées que j'ai trouvées très utiles en expérimentant avec la conception de la barre latérale. Bien que certaines de ces idées puissent sembler absurdes, je vous promets que la combinaison de quelques-unes d'entre elles rendra votre barre latérale Starlight encore meilleure.
5656-5757-:::note
5858-Une chose à noter cependant, dans cet article, l'accent est mis sur l'ajustement du style des **éléments de niveau racine** (ceux qui n'ont pas d'enfants) dans la barre latérale.
5959-:::
6060-6161-Mais avant cela, je vais vous montrer à quoi ressemble actuellement le style par défaut de la barre latérale Starlight :
6262-6363-
6464-6565-### Manipuler les espaces blancs entre les éléments de la barre latérale
6666-6767-Au niveau racine de votre barre latérale Starlight, il existe deux types d'éléments différents : **pages** et **groupes**. Bien que le style par défaut soit assez correct, je trouve que les espaces blancs - c'est-à-dire la marge entre les éléments qui n'inclut aucun contenu - sont un peu trop grands, surtout entre les éléments de niveau racine. Avec cet exemple de CSS personnalisé ci-dessous, j'ai réduit la marge entre les éléments de niveau racine tout en conservant la marge entre les groupes. Les styles CSS importants sont surlignés dans le bloc de code.
6868-6969-```css {3} showLineNumbers=false
7070-// src/styles/custom.css
7171-sl-sidebar-state-persist ul.top-level > li:not(:has(details)) {
7272- margin-top: 0rem;
7373-}
7474-sl-sidebar-state-persist ul.top-level > li:has(details) {
7575- margin-block: 0.5rem; /* default value */
7676-}
7777-```
7878-7979-
8080-8181-Peut-être que cela ne sera pas aussi utile pour vous parce que vous n'utilisez pas de pages de niveau racine dans votre barre latérale, donc cet effet ne sera pas perceptible pour vous. Mais si c'est le cas, essayez-le.
8282-8383-### Ajuster le poids de la police des éléments de la barre latérale
8484-8585-\[À mon avis]\[imho], ce qui me dérange le plus avec les éléments de niveau racine de la barre latérale de Starlight, c'est leur caractère gras. C'est probablement une opinion très subjective, mais si vous me demandez, une seule page ne peut pas être aussi importante qu'un groupe entier de pages dans votre documentation. Par conséquent, j'ai rendu le poids de la police des éléments de niveau racine plus léger, comme vous pouvez le voir dans le bloc de code ci-dessous.
8686-8787-```css {6} showLineNumbers=false
8888-// src/styles/custom.css
8989-sl-sidebar-state-persist ul.top-level > li > a[aria-current="page"] {
9090- font-weight: 600; /* default value */
9191-}
9292-sl-sidebar-state-persist ul.top-level > li > a:not([aria-current="page"]) {
9393- font-weight: 400;
9494-}
9595-```
9696-9797-
9898-9999-### Ajuster la couleur des éléments de la barre latérale
100100-101101-Un petit changement mais subtil : j'ai rendu les éléments de niveau racine non sélectionnés plus ternes dans le bloc de code ci-dessous.
102102-103103-Si vous choisissez d'utiliser ce design également, je recommande de n'appliquer que la deuxième règle CSS puisque la première revient simplement à démontrer comment ajuster le style des éléments de niveau racine sélectionnés — cette règle s'applique également aux autres blocs de code dans ce blog s'ils sont marqués comme `valeur par défaut`.
104104-105105-```css {6} showLineNumbers=false
106106-// src/styles/custom.css
107107-sl-sidebar-state-persist ul.top-level > li > a[aria-current="page"] {
108108- color: var(--sl-color-text-invert); /* default value */
109109-}
110110-sl-sidebar-state-persist ul.top-level > li > a:not([aria-current="page"]) {
111111- color: var(--sl-color-gray-2);
112112-}
113113-```
114114-115115-
116116-117117-### Ajuster la taille de la police des éléments de la barre latérale
118118-119119-Bien que je ne le recommande pas, vous pouvez également ajuster la taille de la police des éléments de la barre latérale. Avec cet exemple de CSS personnalisé ci-dessous, j'ai réduit la taille de la police des éléments de niveau racine.
120120-121121-```css {3} showLineNumbers=false
122122-// src/styles/custom.css
123123-sl-sidebar-state-persist ul.top-level > li > a {
124124- font-size: var(--sl-text-sm);
125125-}
126126-```
127127-128128-
129129-130130-## Recommandations
131131-132132-Pour résumer, je recommande d'appliquer un mélange des options de personnalisation ci-dessus, que vous pouvez facilement vérifier dans un seul fichier `.css`.
133133-134134-Notez que j'utilise également les \[niveaux de cascade]\[starlight-css-cascade-layers], pris en charge depuis \[Starlight 0.34.0]\[starlight-0-34], et je recommande de les utiliser pour spécifier l'ordre dans lequel les styles CSS sont appliqués.
135135-136136-```css showLineNumbers=false
137137-// src/styles/custom.css
138138-@layer starlight, my-starlight-sidebar;
139139-140140-@layer my-starlight-sidebar {
141141- sl-sidebar-state-persist ul.top-level > li:not(:has(details)) {
142142- margin-block: 0rem;
143143- }
144144- sl-sidebar-state-persist ul.top-level > li > a:not([aria-current="page"]) {
145145- font-weight: 400;
146146- color: var(--sl-color-gray-2);
147147- }
148148-}
149149-```
150150-151151-[starlight]: https://starlight.astro.build
152152-153153-[starlight-getting-started]: https://starlight.astro.build/getting-started/
154154-155155-[starlight-css]: https://starlight.astro.build/guides/css-and-tailwind/
156156-157157-[starlight-css-custom]: https://starlight.astro.build/guides/css-and-tailwind/#custom-css-styles
158158-159159-[starlight-css-cascade-layers]: https://starlight.astro.build/guides/css-and-tailwind/#cascade-layers
160160-161161-[starlight-0-34]: https://github.com/withastro/starlight/releases/tag/%40astrojs%2Fstarlight%400.34.0
162162-163163-[imho]: https://en.wiktionary.org/wiki/IMHO
···11----
22-title: Une courte histoire des plugins Starlight Sidebar Topics
33-description: Dans cet article de blog, je vais vous montrer l'évolution des
44- plugins Starlight avec une étude de cas du plugin Starlight Sidebar Topics.
55-date: 2025-05-05
66-tags:
77- - Starlight
88- - Plugins
99-excerpt: Dans cet article, je vais vous montrer l'évolution des <a
1010- class="gh-badge" href="https://github.com/withastro/starlight"><img
1111- src="/starlight.png" alt="Starlight" /> Starlight</a> plugins avec une étude
1212- de cas du plugin [Starlight Sidebar
1313- Topics](https://github.com/hideoo/starlight-sidebar-topics). Préparez-vous à
1414- découvrir des faits impressionnants sur les personnes et le code autour de
1515- Starlight.
1616-authors:
1717- - trueberryless
1818- - ai
1919-cover:
2020- alt: A beautiful cover image with the text "History Time"
2121- image: ../../../../../public/blog/starlight-topics-history-story.jpg
2222-2323----
2424-2525-Peut-être avez-vous déjà entendu parler de ce framework de documentation génial. J'en parle assez souvent et je l'utilise régulièrement. Non seulement parce que je suis un contributeur actif, mais aussi parce que [Starlight](https://starlight.astro.build) m’est vraiment cher. Ses caractéristiques : simplicité et minimalisme, mais tout ce dont vous avez besoin. Sa performance : [plus rapide que 98 % des autres sites Web](https://www.websitecarbon.com/website/starlight-astro-build-getting-started/). Son accessibilité : même pas une question !
2626-2727-## La Création
2828-2929-Cependant, une chose qui manque objectivement à mon avis est une manière granulaire de séparer les sujets larges dans votre documentation. Et je ne suis pas seul avec cette opinion subjectivement acceptée de manière générale. [HiDeoo](https://github.com/HiDeoo) n'est pas seulement l'un des mainteneurs les plus actifs du projet, mais aussi l'auteur des plus nombreux, et selon moi, des meilleurs plugins que vous pouvez trouver pour Starlight. Et ils ont également remarqué cette fonctionnalité de niche manquante concernant les sujets. C’est pourquoi ils ont décidé de créer le plugin [Starlight Sidebar Topics](https://github.com/hideoo/starlight-sidebar-topics) dès le début, en octobre 2024, qui vous permet de créer une barre latérale avec des sujets. Lisez-en davantage sur les fonctionnalités du plugin dans [sa documentation](https://starlight-sidebar-topics.trueberryless.org/).
3030-3131-La chose qui me gênait personnellement dans les premiers jours du plugin était la manière dont les sujets étaient affichés dans la barre latérale. Parce qu'il n’utilise pas - comme je l’imaginais - un menu déroulant pour passer d'un sujet à l'autre, mais montre au contraire toujours tous les sujets. Ce choix de conception était, comme [HiDeoo le souligne clairement](https://github.com/HiDeoo/starlight-sidebar-topics/issues/2#issuecomment-2410196392), très intentionnel et non sans raisons : tous les sujets devraient être visibles en même temps. Prouvé par les documents [Astro](https://github.com/withastro) eux-mêmes ([Chris Swithinbank](https://github.com/delucis) a implémenté la ["barre latérale à onglets"](https://github.com/withastro/docs/pull/9890) pour la documentation Astro v5 plus tard dans le même mois), cette approche présente de nombreux avantages par rapport à un menu déroulant. Néanmoins, j'étais toujours insatisfait de ce design, alors j’ai créé ma propre version.
3232-3333-Copier et coller était ma force quand il s’agissait de créer un nouveau plugin Starlight pour la communauté. Et c’est ce que j’ai fait. J’ai pris le plugin Starlight Sidebar Topics comme point de départ et j’ai simplement adapté le composant `Topics.astro`, qui inclut le HTML pour afficher les sujets dans la barre latérale. Après avoir lutté un certain temps pour implémenter un menu déroulant qui soit satisfaisant et propre visuellement (désolé pour l'autosatisfaction, mais je suis fier de moi), j’ai finalement trouvé une solution dont je suis très satisfait et j’ai publié ce nouveau plugin sous le nom [Starlight Sidebar Topics Dropdown](https://github.com/trueberryless-org/starlight-sidebar-topics-dropdown) - quelle originalité.
3434-3535-## L'Adaptation
3636-3737-Vous pourriez penser que cette histoire est maintenant terminée, car tout le monde pourrait simplement utiliser la variante qu'il souhaite, et tout le monde est heureux. Mais Starlight a continué et continue de s'améliorer, et environ trois mois plus tard, le 15 février, presque comme un [cadeau d'anniversaire](../../../../../blog/20th-birthday/) pour moi, l'ajout tant attendu des données de route dans Starlight est arrivé avec la sortie de la version [v0.32](https://github.com/withastro/starlight/releases/tag/@astrojs/starlight@0.32.0). Cet ajout apparemment mineur a ouvert tant de possibilités, que je n'avais moi-même jamais envisagées. Une fois de plus, HiDeoo a été la principale source d'inspiration pour les auteurs de plugins et a poussé cette nouvelle fonctionnalité à ses limites. Il leur a fallu seulement deux jours pour [adapter plus de 11 plugins à la dernière version de Starlight à l'époque](https://bsky.app/profile/hideoo.dev/post/3liffpudc5c2b) et ils ont ensuite amélioré et refactorisé une grande partie du code pour tirer encore plus parti de cette puissante fonctionnalité.
3838-3939-Et ainsi vint le jour où HiDeoo me contacte pour me dire que le plugin Starlight Sidebar Topics utilise maintenant la nouvelle fonctionnalité de données de route de Starlight. Au début, je ne comprenais pas vraiment quels avantages ces changements d’implémentation auraient, mais HiDeoo a pris le temps de m’expliquer que je pouvais maintenant transformer le plugin Starlight Sidebar Topics Dropdown en un simple composant utilisant les données de route de son plugin. Intuitivement, j’étais opposé à cette idée intelligente car cela donnait l’impression que mon seul plugin ayant une certaine popularité devenait un composant inutile. Je ne pouvais pas être plus loin de la vérité.
4040-4141-## L'Union
4242-4343-Finalement, j’ai décidé de refondre mon plugin en un composant - cette refonte a éliminé exactement [1210 lignes de code et ajouté 68 lignes de changelog](https://github.com/trueberryless-org/starlight-sidebar-topics-dropdown/pull/40) - et j’ai remarqué à quel point il fallait maintenant peu de code pour transformer la liste `Topics.astro` en un menu déroulant du point de vue d’un utilisateur. J’étais convaincu que c’était vraiment la bonne direction pour le ~~plugin~~ composant. Et donc, j’ai mis à jour toute la documentation - plus exactement : supprimé plus de 200 lignes de texte (ça fait du bien) - et j’ai publié la nouvelle [version 0.5](https://github.com/trueberryless-org/starlight-sidebar-topics-dropdown/releases/tag/starlight-sidebar-topics-dropdown%400.5.0).
4444-4545-Vous vous demandez peut-être comment des plugins aussi matures pourraient encore s’améliorer avec le temps. Pour être honnête, moi-même j’ai été très surpris lorsque HiDeoo a lâché une idée brillante dans mes messages privés sur Discord. Son idée était et reste ingénieuse. Sinon, je n’y penserais même plus à ce *sujet*. Mais me voilà, en train d’écrire un texte de 800 mots juste pour vous préparer à ce qui va suivre. Roulement de tambour ! Attachez votre ceinture ! Cette déclaration de HiDeoo va vous épater :
4646-4747-> "On pourrait avoir quelque chose comme la liste intégrée par défaut sur une vue bureau, et utiliser votre composant pour la version mobile, ou quelque chose comme ça 🧠" — HiDeoo, 21/03/2025 09:54
4848-4949-Profond. Intemporel. En or.
5050-5151-Et cette seule et belle étincelle d’idée ? C’est précisément ce que je vais vous expliquer dans [l’article "Starlight Topics Dropdown and List together"](../../../../../blog/starlight-dropdown-and-list-together/).
···11----
22-title: Comment j'ai créé un README de profil GitHub qui ne devrait pas exister
33- (mais qui le fait)
44-description: Une plongée approfondie dans les défis techniques et les solutions
55- derrière mon README de profil GitHub, avec manipulation de SVG, automatisation
66- et une grille dynamique Bento.
77-date: 2025-02-05
88-tags:
99- - Automation
1010- - GitHub
1111-excerpt: Créer un README de profil <a class="gh-badge"
1212- href="https://github.com/github"><img src="https://github.com/github.png"
1313- alt="github" />GitHub</a> remarquable ne consiste pas seulement à ajouter
1414- quelques badges — il s'agit de repousser les limites techniques. Dans cette
1515- plongée approfondie, j'explore la manipulation de SVG au niveau bas, la
1616- conversion de HTML en SVG, les animations intégrées, et l'automatisation
1717- complète avec les GitHub Actions pour construire ce que je crois être l'un des
1818- README GitHub les plus techniquement avancés. D'une grille Bento dynamique qui
1919- se met à jour toutes les 5 minutes à l'intégration de SVG en direct sans
2020- requêtes externes, ce projet a transformé mon profil en une vitrine vivante et
2121- auto-mise à jour de mon travail. Vous voulez savoir comment j'ai fait ?
2222- Décortiquons cela. 🚀
2323-authors:
2424- - trueberryless
2525- - ai
2626-cover:
2727- alt: A beautiful cover image with the text "GitHub Profile"
2828- image: ../../../../../public/blog/technically-impressive-github-profile-readme.jpg
2929----
3030-3131-:::note
3232-Lisez l'histoire plus formelle [ici](../../../../../blog/github-profile-readme/)
3333-:::
3434-3535-## Le début : un README qui ressemblait à une page Wikipedia
3636-3737-Chaque grande histoire commence par un problème, et le mien était simple : le README de mon [profil GitHub](https://github.com/trueberryless) était un vrai bazar. Il était long. Il y avait trop de texte. Il débordait de badges — tellement que ça ressemblait à une collection de trophées internet. Hackathons, contributions GitHub, Astro, roadmap.sh — s’il existait un badge, je l’avais.
3838-3939-Au début, je pensais que c'était bien. Ça montrait tout sur moi, non ? Mais un jour, je l’ai regardé et j’ai réalisé :
4040-4141-> Ce n'est pas stylé. C'est un désastre encombré.
4242-4343-J'avais besoin de quelque chose de nouveau. De quelque chose de propre. De quelque chose de visuellement frappant. Je voulais une **grille Bento** qui inciterait les gens à s'arrêter et à l'admirer, plutôt que de défiler dans la confusion. Un design si bien exécuté que toute personne qui le verrait voudrait instantanément le sien.
4444-4545-C'était le rêve. Maintenant, je devais juste le réaliser.
4646-4747-## Phase 1 : Le rêve HTML (et le cauchemar Markdown)
4848-4949-La première étape était simple : modéliser mon profil parfait en HTML et CSS. Et laissez-moi vous dire, c’était incroyable. Il avait une mise en page parfaite, des animations fluides et juste le bon équilibre entre contenu et espace. Puis la réalité m’a rattrapé. Il fallait que cela fonctionne dans le *Markdown au format GitHub*. Pas de problème, non ? Markdown prend en charge le HTML ! Alors j'ai copié mon magnifique HTML dans mon README et j'ai enregistré.
5050-5151-> [GitHub](https://github.com/github) : *Absolument pas.*
5252-5353-Le Markdown de GitHub [supprime un certain nombre d'étiquettes HTML, mais des étiquettes importantes](https://github.github.com/gfm/#disallowed-raw-html-extension). Des raisons de sécurité, bien sûr (et je respecte totalement cela, GitHub, vraiment ❤️), mais cela signifiait que mon design parfait était complètement **inutilisable**.
5454-5555-J'ai essayé de l'ajuster. De remplacer les étiquettes non prises en charge par celles qui fonctionnaient. Peut-être que je pouvais en sauver une partie ? *Non*. Les limitations du Markdown signifiaient que ma mise en page idéale était impossible.
5656-5757-## Phase 2 : "Juste utiliser un script Python" (comment survivre)
5858-5959-En cas de doute, automatisez. Si je ne pouvais pas insérer directement mon HTML, peut-être que je pouvais générer quelque chose de dynamique avec un script ? Alors j'ai bricolé un script Python pour récupérer mon dernier dépôt GitHub et l'insérer dans mon README. Je laisse juste ces octets aléatoires que certains appelleraient du code Python ici :
6060-6161-```python collapse={1-22} showLineNumbers=false
6262-import requests
6363-6464-github_username = "yourusername"
6565-repos_url = f"https://api.github.com/users/{github_username}/repos?sort=pushed"
6666-6767-response = requests.get(repos_url)
6868-repos = response.json()
6969-7070-latest_repo = repos[0]["name"] if repos else "No repositories found."
7171-7272-with open("README.md", "r") as file:
7373- readme_content = file.readlines()
7474-7575-new_content = []
7676-for line in readme_content:
7777- if "<!--LATEST_REPO-->" in line:
7878- new_content.append(f"- Latest Repo: [{latest_repo}](https://github.com/{github_username}/{latest_repo})\n")
7979- else:
8080- new_content.append(line)
8181-8282-with open("README.md", "w") as file:
8383- file.writelines(new_content)
8484-```
8585-8686-Cela semblait être un pas dans la bonne direction. C'était automatisé. C'était fonctionnel. Mais cela ne résolvait pas mon problème principal. 😢
8787-8888-Il ne s'agissait pas de contenu dynamique — il s'agissait de *design*. Et aucun script Python ne rendrait le Markdown beau.
8989-9090-## Phase 3 : "Bon, je vais juste utiliser une capture d'écran" (fond du gouffre)
9191-9292-À ce stade, j'étais désespéré. J'ai envisagé l'impensable : *il suffit de prendre une capture d'écran du HTML et de la mettre dans mon README en tant qu'image.* C'était une approche brutale. C'était paresseux. C'était... efficace ?
9393-9494-Pendant un instant, j'ai vraiment pensé à le faire. Mais je savais au fond de moi que je ne me pardonnerais jamais si je laissais cela être ma solution finale.
9595-9696-À titre de référence, j'aurais utilisé [Puppeteer](https://www.npmjs.com/package/puppeteer) et [FFmpeg](https://www.ffmpeg.org/) — je n'ai aucune idée de ce que sont ces outils.
9797-9898-## Phase 4 : Passons aux SVG (la lumière au bout du tunnel)
9999-100100-J'ai abandonné le plan maudit de la capture d'écran et cherché quelque chose de plus flexible.
101101-102102-Les SVG.
103103-104104-Les SVG sont évolutifs, prennent en charge à la fois le texte et les images, et — plus important encore — ils peuvent **intégrer** du HTML à l'intérieur.
105105-106106-Alors j'ai essayé quelque chose comme ceci :
107107-108108-```xml showLineNumbers=false
109109-<svg width="800" height="400" xmlns="http://www.w3.org/2000/svg">
110110- <foreignObject width="100%" height="100%">
111111- <body xmlns="http://www.w3.org/1999/xhtml">
112112- <h1>Hello from HTML inside SVG!</h1>
113113- </body>
114114- </foreignObject>
115115-</svg>
116116-```
117117-118118-Prometteur ! Cela pourrait vraiment fonctionner !
119119-120120-Puis j'ai été occupé par d'autres choses, j'ai oublié de le déboguer, et je n'y suis jamais retourné.
121121-122122-
123123-124124-## Phase 5 : Des SVG imbriqués dans des SVG eux-mêmes imbriqués (niveau Inception 100)
125125-126126-Quand je suis revenu sur le projet, j'étais **déterminé** à le faire fonctionner.
127127-128128-Je me suis rendu compte que si je ne pouvais pas intégrer directement du HTML dans le Markdown, je pouvais feindre en utilisant des SVG imbriqués. (au fait, ceci est massivement simplifié ; le processus réel a pris des jours qui semblaient être des semaines, voire des mois, mais je sais que vous ne liriez tout de même rien de tout cela alors peu importe.)
129129-130130-Et puis, après des heures de recherche, je suis tombé sur une réponse révolutionnaire sur Stack Overflow :
131131-132132-[https://stackoverflow.com/a/65049620/22573601](https://stackoverflow.com/a/65049620/22573601)
133133-134134-Cela m'a conduit à la solution actuelle :
135135-136136-1. Convertir ma mise en page HTML en SVG.
137137-2. Encoder toutes les images en **Base64** (parce que le Markdown de GitHub ne chargera pas les images externes à l'intérieur d'un SVG contenant du HTML).
138138-3. Inclure des SVG dynamiques (comme mes statistiques GitHub, mon statut Spotify, etc.).
139139-4. Tout automatiser avec **GitHub Actions**.
140140-141141-## Le Grand Final : Le README de profil GitHub ultime
142142-143143-* Une mise en page en grille Bento élégante, parfaitement structurée en SVG.
144144-* Un statut Spotify mis à jour en temps réel, inclus en SVG.
145145-* Des statistiques GitHub, insérées dynamiquement via l'automatisation.
146146-* Entièrement responsive, entièrement évolutif et absolument fou à construire.
147147-148148-Il se met à jour toutes les 5 minutes, fonctionne entièrement avec GitHub Actions, et ne dépend d'aucun service externe. C'est magnifique. C'est efficace. Et surtout, c'est techniquement absurde dans le meilleur des cas.
149149-150150-Jetez un œil à un exemple concret du résultat final à un certain point dans le temps.
151151-152152-import { Image } from 'astro:assets'
153153-154154-<Image src={"https://raw.githubusercontent.com/trueberryless/trueberryless/7519c6f50094bdfd6fb47f610e6638ac8efdd6ad/html-wrapper.svg"} width={980} height={913} alt="Final result" data-zoom-off />
155155-156156-Ce n'est pas si mal comparé à l'[ancien README.md](https://github.com/trueberryless/trueberryless/blob/5dce4ad0033b00829f8ec3756827057017447a65/README.md). Et ne commentez pas pourquoi j'écoute de la K-pop ! C'est mieux que vous ne le pensez, faites-moi confiance.
157157-158158-Consultez la version en direct sur mon GitHub [trueberryless](https://github.com/trueberryless) — si j'ai décidé de la garder... — et laissez un follow si vous y êtes déjà et avez apprécié cette lecture ! ❤️
159159-160160-***
161161-162162-## Pensées finales : Est-ce que ça valait le coup ?
163163-164164-Absolument.
165165-166166-Ce parcours fut frustrant, chronophage, et rempli de plus d'obstacles que je ne l'aurais jamais imaginé. Mais j'ai appris tellement de choses sur les SVG, les limitations du Markdown, GitHub Actions et l'automatisation en cours de route.
167167-168168-Est-ce que je le referais ? Définitivement.
169169-170170-Est-ce que je le recommanderais ? Seulement si vous avez une patience infinie. 😅
171171-172172-Mais au final, j'ai créé un README de profil [GitHub](https://github.com/github) qui *ne devrait pas exister* — mais il existe. Et je l'adore.
···11----
22-title: Vibe-coding une extension VS Code pour des projets Terraform
33-description: Comment j'ai créé une extension pour Visual Studio Code qui ajoute
44- des résolutions en ligne aux variables dans les projets Terraform.
55-date: 2025-08-01
66-tags:
77- - Automation
88- - Plugins
99- - Tool
1010-authors:
1111- - trueberryless
1212-cover:
1313- alt: A beautiful cover image with the text "VSCE Terraform"
1414- image: ../../../../../public/blog/terraform-variables-resolution.jpg
1515-1616----
1717-1818-import { FileTree, LinkButton } from "@astrojs/starlight/components"
1919-2020-Aujourd'hui, je veux parler d'une petite extension VS Code que j'ai codée intuitivement en une seule journée pour rendre le travail avec Terraform plus facile. Je vais d'abord expliquer ce qu'est Terraform, puis plonger directement dans les fonctionnalités et les raisons derrière cette extension. N'hésitez pas à passer à la section suivante si vous êtes déjà familier avec Terraform.
2121-2222-{/* excerpt */}
2323-2424-## Qu'est-ce que Terraform ?
2525-2626-Terraform est un outil d'infrastructure en tant que code (IaC) qui vous permet de définir l'intégralité de votre infrastructure cloud ou sur site sous forme de code. Son langage de configuration, inventé par [HashiCorp](https://github.com/hashicorp), s'appelle HCL (HashiCorp Configuration Language) et présente une syntaxe intuitive et lisible par les humains. La *syntaxe native* a l'avantage de présenter une courbe d'apprentissage faible, d'être cohérente pour tous les fournisseurs, et agréable à lire et écrire pour les humains, tandis que la variante basée sur JSON est plus facile à générer et à analyser pour les machines.
2727-2828-Ce qui rend Terraform très puissant, ce sont deux fonctionnalités de base : **les variables** et **les modules**. Les variables vous permettent de créer des ressources dont les valeurs réelles peuvent être insérées depuis un autre endroit, et les modules regroupent un certain nombre de ressources, ce qui offre l’avantage de la réutilisabilité et de l’imbrication. Bien que ces deux fonctionnalités paraissent très basiques, leur combinaison en fait une équipe de rêve. Cela parce que l'ouverture de Terraform vous permet de définir des variables d'entrée pour chaque module et également d'exporter des variables via des sorties.
2929-3030-Un module simple est structuré comme ceci :
3131-3232-<FileTree>
3333- * groupe-de-ressources-azure/
3434- * principal.tf
3535- * variables.tf
3636- * sorties.tf
3737- * README.md
3838-</FileTree>
3939-4040-Tous les fichiers sauf `principal.tf` sont optionnels (le `README.md` n’est pas spécifique à Terraform), mais je préfère suivre les bonnes pratiques, donc l’exemple les inclut.
4141-4242-Examinons un exemple simple. Imaginez que nous voulons gérer un groupe de ressources dans Azure avec Terraform. Dans le fichier `variables.tf`, nous définissons quelles entrées nous attendons dans le module. Chacun des deux blocs représente la variable et les propriétés de la variable, comme la `description` ou le `type` :
4343-4444-```hcl
4545-// variables.tf
4646-variable "name" {
4747- description = "Name of the resource group"
4848- type = string
4949-}
5050-5151-variable "location" {
5252- description = "Azure region"
5353- type = string
5454- default = "westeurope"
5555-}
5656-```
5757-5858-Vous avez peut-être remarqué que la variable `location` a également une propriété `default`, ce qui rend la variable optionnelle et fournit une valeur de secours si aucune n'est spécifiée. Ces variables peuvent ensuite être utilisées dans le fichier `principal.tf`, où nous définissons les ressources réelles que nous voulons générer :
5959-6060-```hcl
6161-// main.tf
6262-provider "azurerm" {
6363- features {}
6464-}
6565-6666-resource "azurerm_resource_group" "this" {
6767- name = var.name
6868- location = var.location
6969-}
7070-```
7171-7272-Dans ce cas, nous définissons simplement notre groupe de ressources, que vous pouvez imaginer comme un dossier dans Azure - explication très simpliste. Maintenant, la dernière partie que nous pouvons implémenter est le fichier `sorties.tf` :
7373-7474-```hcl
7575-// outputs.tf
7676-output "resource_group_id" {
7777- description = "The ID of the resource group"
7878- value = azurerm_resource_group.this.id
7979-}
8080-```
8181-8282-Cela est très utile si nous voulons utiliser des informations comme l'ID du groupe de ressources plus tard dans d'autres parties de notre projet Terraform.
8383-8484-Comme je l'ai déjà mentionné, le `README.md` ne fait pas vraiment partie des définitions Terraform, mais aide à comprendre l'objectif du module :
8585-8686-````md
8787-# Azure Resource Group Module
8888-8989-A minimal Terraform module that creates an Azure Resource Group.
9090-9191-## Usage
9292-9393-```hcl
9494-module "rg" {
9595- source = "./azure-resource-group"
9696- name = "my-resource-group"
9797-}
9898-```
9999-````
100100-101101-Comme le `README.md` le suggère déjà, nous pouvons maintenant utiliser ce module pour créer un groupe de ressources Azure n'importe où dans notre projet. Nous devons juste nous assurer que le chemin vers le dossier du module est correct et que Terraform sait comment interpréter les fichiers `main.tf`, `variables.tf` et `outputs.tf`. Dans ce cas, étant donné que nous ne spécifions pas la variable `location`, elle sera définie sur `"westeurope"`.
102102-103103-```hcl
104104-module "rg" {
105105- source = "./azure-resource-group"
106106- name = "my-resource-group"
107107-}
108108-```
109109-110110-J'espère que cette section vous a donné une meilleure compréhension de base de ce qu'est Terraform et de ce que vous pouvez faire avec.
111111-112112-## La tâche fastidieuse de Terraform
113113-114114-Vous avez peut-être remarqué que le champ `source` d’un module crée une flexibilité incroyable pour l’ensemble du projet puisque vous pouvez définir des modules n’importe où et les utiliser n’importe où dans le projet.
115115-116116-Cependant, cette fonctionnalité a aussi un énorme inconvénient en termes de maintenabilité : résoudre les valeurs réelles derrière les variables peut être très fastidieux. Bien que dans cet exemple simple, cela puisse sembler facile à gérer, plus le projet grandit, plus il devient imbriqué, et plus il est difficile et chronophage de comprendre et d'adapter le code Terraform. C'est pourquoi j'ai créé une extension.
117117-118118-**Que doit faire l'extension ?** Le principal objectif de l’extension est de fournir les valeurs réelles des variables partout où elles sont utilisées. Si un module est appelé à partir de plusieurs endroits ou simplement plusieurs fois, les informations doivent indiquer quel cas d’utilisation définit la variable avec quelle valeur. Si les modules sont profondément imbriqués, les valeurs doivent être résolues jusqu'à ce que nous atteignions les fichiers `.tfvars`. Ce sont les fichiers où vous pouvez définir des valeurs codées en dur pour les variables.
119119-120120-## Comment démarrer une extension VS Code
121121-122122-Créer le projet modèle de base pour une extension VS Code est aussi simple que d'exécuter cette commande lorsque vous avez [Node](https://github.com/nodejs) installé :
123123-124124-```bash
125125-npx --package yo --package generator-code -- yo code
126126-```
127127-128128-Cette commande installe temporairement Yeoman (un logiciel générateur), et entre dans un mode interactif où certaines questions doivent être répondues, comme le nom du projet, le type et la description. Dans le bloc suivant, vous pouvez voir toutes les questions et les réponses par défaut :
129129-130130-```bash
131131-# ? What type of extension do you want to create? New Extension (TypeScript)
132132-# ? What's the name of your extension? HelloWorld
133133-### Press <Enter> to choose default for all options below ###
134134-135135-# ? What's the identifier of your extension? helloworld
136136-# ? What's the description of your extension? LEAVE BLANK
137137-# ? Initialize a git repository? Y
138138-# ? Which bundler to use? unbundled
139139-# ? Which package manager to use? npm
140140-141141-# ? Do you want to open the new folder with Visual Studio Code? Open with `code`
142142-```
143143-144144-Pour plus d'informations sur les extensions VS Code, je tiens à renvoyer à [la documentation officielle](https://code.visualstudio.com/api/get-started/your-first-extension), car elle est toujours à jour contrairement à mes explications ici.
145145-146146-## 3… 2… 1… Vibe-Coding !
147147-148148-J'aime commencer de nouveaux projets en posant des questions techniques générales à [ChatGPT](https://github.com/openai) comme :
149149-150150-* Comment suggéreriez-vous de réaliser un tel projet ?
151151-* Combien de temps estimez-vous que cela me prendra ?
152152-* À quel point cela sera-t-il difficile ?
153153-154154-Brainstormer avec des bots d'IA semble être un moyen très sensé d'avoir une meilleure vue d'ensemble des nouveaux projets, surtout lorsqu'on s'aventure dans des terrains complètement inconnus.
155155-Créer une extension VS Code était exactement un tel cas d'utilisation, car je n'avais jamais créé quelque chose pour VS Code ou tout autre IDE auparavant.
156156-Après cette phase initiale de brainstorming, je préfère utiliser [Claude](https://github.com/anthropics) pour programmer tous les fichiers nécessaires à une telle extension, car, selon mon expérience, ce bot IA a vraiment la capacité de produire des codes impeccables. J’ai rarement rencontré des bugs ou problèmes d’exécution avec le code de Claude, alors je l’utilise exactement pour ces cas d’utilisation - les premiers pas. L’inconvénient de Claude est sa version d’essai gratuite très limitée, ce qui fait que je suis toujours prudent dans le choix de mes mots et que j’essaie de prévoir autant d'erreurs potentielles que l'IA pourrait faire.
157157-C’est ainsi que tout a commencé : j’ai pris le temps de formuler mon scénario et mon souhait exact dans les fenêtres de contexte limitées d’une machine à mots aléatoires appelée Claude et j’ai immédiatement reçu une implémentation massive du fichier `extension.ts`. Bien sûr, il y avait des différences évidentes entre ma vision et la communication avec ce LLM, alors j’ai dû lui dire une autre fois quelles sont les considérations importantes, et pour pouvoir recevoir davantage de code, j’ai également utilisé mon astuce magique : "Si cela est trop grand pour un fichier, donne-moi simplement l’ensemble de `extension.ts` en plusieurs fichiers, ce qui devrait bien sûr fonctionner."
158158-159159-Claude s'est alors lancé dans un long périple.
160160-161161-Après quelques difficultés à le maintenir opérationnel, tous mes jetons étaient utilisés et j'ai dû terminer le reste du code moi-même. Néanmoins, j'ai réussi à obtenir une version fonctionnelle, car il ne manquait pas grand-chose, et j'ai immédiatement identifié quelques améliorations qui étaient passées inaperçues jusqu'à maintenant. Étant donné que je devais attendre le rechargement de mes jetons, c'est exactement ce que j'ai fait.
162162-163163-Le lendemain matin, la session d'amélioration a commencé, et après deux longues conversations, la fenêtre de contexte était complètement remplie et je ne pouvais même plus envoyer de messages dans le même chat, bien que mes jetons ne soient pas encore expirés. Cependant, tout ce que je voulais accomplir et obtenir de Claude était désormais disponible et je pouvais effectuer des tests dans l'un de mes projets plus importants. Après avoir confirmé et ajusté manuellement quelques morceaux de code, j'étais satisfait pour le moment et j'ai décidé que la première version publique était prête.
164164-165165-Après quelques essais et erreurs avec [GitHub Actions](https://github.com/github), j'ai réussi à [configurer le publisher](https://code.visualstudio.com/api/working-with-extensions/publishing-extension#create-a-publisher) pour une extension VS Code. Et après deux versions correctives, j'étais assez satisfait des résultats.
166166-167167-## Le Résultat Final
168168-169169-Essayez l'extension vous-même en cliquant sur le bouton ci-dessous. Il reste encore de nombreuses améliorations à apporter, donc si vous êtes intéressé pour aider, n'hésitez pas à contribuer sur [GitHub](https://github.com/trueberryless/terraform-variables-resolution).
170170-171171-<LinkButton href="vscode:extension/trueberryless.terraform-variables-resolution">Installer Terraform Variables Resolution</LinkButton>
172172-173173-Voici un exemple tiré de [l'explication de Terraform](#what-is-terraform), montrant comment cette extension ajoute visuellement les valeurs des variables dans VS Code :
174174-175175-
-36
src/content/docs/fr/blog/true-tracker.mdx
···11----
22-title: Concevoir une approche de suivi du temps sans compte et sans base de données
33-date: 2024-07-06
44-description: Une application de suivi du temps privée stockant toutes les
55- données dans votre navigateur — pas de comptes, pas de base de données, juste
66- un suivi simple.
77-excerpt: True Tracker est une application minimaliste de suivi du temps
88- construite avec Next.js qui garde toutes les données dans votre navigateur —
99- pas de comptes, pas de base de données, juste une confidentialité et une
1010- simplicité totales.
1111-tags:
1212- - Tool
1313-authors:
1414- - trueberryless
1515-cover:
1616- alt: A beautiful cover image with the text "True Tracker"
1717- image: ../../../../../public/blog/true-tracker.jpg
1818-featured: true
1919-2020----
2121-2222-L'été 2024 a marqué le début d'un nouveau chapitre passionnant pour moi en tant que développeur. Jusqu'à ce moment-là, j'avais principalement travaillé avec Angular, un framework que j'appréciais pour son approche structurée et opinée. Mais j'ai toujours été curieux de découvrir React : cela semblait plus léger, plus flexible, et juste… différent. Lorsque je suis tombé sur Next.js, un framework de [Vercel](https://github.com/vercel) basé sur React qui offrait des fonctionnalités comme le rendu côté serveur et un accent mis sur les performances, j'ai su qu'il était temps d'explorer quelque chose de nouveau.
2323-2424-En même temps, j'étais frustré depuis des années par les outils de suivi de sessions comme Toggl. Bien qu'ils soient théoriquement excellents, leurs meilleures fonctionnalités semblaient toujours enfermées derrière des paywalls premium. Comme tout développeur à un moment donné, je me suis dit, *« Pourquoi ne pas simplement créer le mien ? »* C'est pratiquement un rite de passage — chaque programmeur doit au moins une fois dans sa carrière créer une application de tâches ou un tracker. Et ainsi, True Tracker est né.
2525-2626-True Tracker n'était pas un tracker comme les autres, cependant. Je voulais faire quelque chose de différent. Pour commencer, je voulais le garder simple : les utilisateurs pouvaient ajouter des projets, les diviser en tâches, et suivre leur temps en sessions. Aucun surplus, aucune fonctionnalité inutile. Mais voici la particularité — True Tracker enregistrerait tout dans le stockage local. Pas de comptes, pas de synchronisation avec le cloud, et surtout, personne (même pas moi) n'aurait accès à vos données. C'est votre tracker, et vos données restent les vôtres.
2727-2828-Bien sûr, passer d'Angular à Next.js n'a pas été sans défis. Si je devais donner un seul conseil à quiconque apprend un nouveau framework, ce serait celui-ci : *Lisez la documentation.* Sérieusement, ne la sautez pas. Je ne l'ai pas fait, et cela a conduit au chaos. Next.js était récemment passé au routeur d'application, mais je m'étais obstinément lancé dans la construction avec le routeur de pages. Il s'avère que cela a causé une montagne de problèmes lorsque l'application ne voulait pas se construire correctement parce qu'il n'y avait pas de répertoire `app`. J'ai dû garder un fichier `.gitkeep` vide dans le dossier pour que Git ne le supprime pas et ne casse rien à nouveau. Pas mon moment de gloire.
2929-3030-Après deux semaines de codage intensif, de débogage, et d'affrontement avec ce qui semblait être toutes les erreurs imaginables, True Tracker a enfin fonctionné. Je me souviens de cette première exécution réussie — j'avais l'impression de crier *« C'est vivant ! »* dans ma tête.
3131-3232-Le projet n'était pas non plus sans ses blagues. Un ami, après avoir vu le branding de l'application, a plaisanté : « Donc... le "true" dans True Tracker ? C'est un peu exagéré, même pour l'image. C'est *trop de vérité !* » Ils n'avaient pas tort, mais je l'ai assumé. Après tout, si vous allez marquer quelque chose, autant y aller à fond.
3333-3434-True Tracker est devenu mon tout premier projet Next.js — une application simple mais unique pour suivre le temps sans aucune contrainte. Elle est maintenant en ligne à l'adresse [https://true-tracker.trueberryless.org](https://true-tracker.trueberryless.org/).
3535-3636-Le voyage m'a appris plus que simplement comment utiliser Next.js. Il m'a appris à surmonter les défis, à passer d'un framework à un autre, et à embrasser les particularités qui rendent chaque projet unique. True Tracker n'est pas juste une application ; c'est une étape importante — une petite preuve que même les petites idées peuvent avoir un grand impact.
···11----
22-title: Certains aspects de la création d'un blog sont vraiment faciles, et
33- d'autres extrêmement difficiles !
44-description: Une introduction conviviale pour les débutants avec quelques jurons
55- sur la manière de commencer à écrire votre propre article de blog.
66-date: 2025-07-08
77-tags:
88- - Mindspace
99- - Education
1010-authors:
1111- - trueberryless
1212-excerpt: <p>Parlons un peu de comment on peut s'améliorer (sans pour autant
1313- devenir un maître, personne n'est parfait) dans l'écriture d'un article de
1414- blog. Ce ne sont que mes réflexions après que deux gars géniaux de la <a
1515- href="https://astro.build/chat">Communauté Astro</a> (<a class="gh-badge"
1616- href="https://github.com/jdtjenkins"><img
1717- src="https://github.com/jdtjenkins.png" alt="jdtjenkins" />Jacob</a> et <a
1818- class="gh-badge" href="https://github.com/louisescher"><img
1919- src="https://github.com/louisescher.png" alt="louisescher" />Lou</a>) aient
2020- décidé d'écrire des blogs sur la difficulté ou la facilité d'écrire des
2121- articles de blog.</p><p>Veuillez lire leurs articles en premier, car celui-ci
2222- est une suite aux deux autres :</p><ol><li><a
2323- href="https://jacobjenkins.codes/posts/why-is-writing-blogs-so-hard/">"Pourquoi
2424- est-il si difficile d'écrire des articles de blog ?" - Jacob
2525- Jenkins</a></li><li><a
2626- href="https://lou.gg/blog/why-writing-blogs-isnt-hard">"Pourquoi écrire des
2727- blogs n'est pas difficile" - Louis Escher</a></li><li><a
2828- href="/blog/writing-blogs-is-hard-and-easy/">"Certains aspects de la création
2929- d'un blog sont vraiment faciles, et d'autres extrêmement difficiles !" - Felix
3030- Schneider</a></li></ol><p>Après cela, vous aurez complété avec succès cette
3131- trilogie géniale sur les articles de blog.</p>
3232-cover:
3333- alt: A beautiful cover image with the text "Writing Skill"
3434- image: ../../../../../public/blog/writing-blogs-is-hard-and-easy.jpg
3535-tableOfContents: false
3636-3737----
3838-3939-Après une discussion très intéressante dans le [Discord](https://astro.build/chat) d'[Astro](https://github.com/withastro) - initiée par nul autre que le mainteneur principal [Alex](https://github.com/alexanderniebuhr) lui-même (au fait félicitations pour cette récente réussite 🎉) -, j'ai plaisanté en disant que quelqu'un pourrait écrire un blog sur les raisons pour lesquelles il est si difficile pour beaucoup de gens non seulement d'écrire, mais aussi de gérer un blog dans son ensemble.
4040-4141-L'homme qui m'a nommé dans l'équipe de support Astro - [Jacob](https://github.com/jdtjenkins) (au fait, merci beaucoup de m'avoir remarqué dans cette communauté incroyable 😍) - a pris cela au pied de la lettre et a écrit un blog à ce sujet. Pas de blague. Allez voir : [https://jacobjenkins.codes/posts/why-is-writing-blogs-so-hard/](https://jacobjenkins.codes/posts/why-is-writing-blogs-so-hard/) D'ailleurs, c'est son tout premier blog (et j'espère que ce ne sera pas le dernier, car j'ai vraiment apprécié son style d'écriture).
4242-4343-Notre aide multitâche bien-aimée, blogueur, designer et StudioCMSer - [Lou](https://github.com/louisescher/) (merci d'avance pour tes conseils d'écriture de blog qui m'ont permis d'écrire ceci avec plus de confiance 🤩) - a sauté immédiatement sur cette vague d'enthousiasme (comme les utilisateurs de Twitch pourraient l'appeler) et a publié [sa réponse](https://lou.gg/blog/why-writing-blogs-isnt-hard) en seulement 12 heures !!! Croyez-moi, j'ai vérifié les commits, Lou a littéralement publié 4 minutes avant la fin des 12 heures.
4444-4545-Comme je ferai de nombreuses références à leurs blogs, il vaut mieux que vous lisiez les leurs en premier. Puis le mien. Ou peut-être vaut-il mieux lire seulement les leurs, je ne suis pas encore sûr de la tournure que prendra le mien.
4646-4747-Mais ce que je peux ~~dire~~ écrire, c'est que le mien se concentrera entièrement sur les compétences en écriture.
4848-4949-## Comment configurer un blog (défis techniques)
5050-5151-Bien que ce blog ne traite pas de la façon de créer un blog, le déployer et gérer tout cet aspect technique, je tiens à mentionner que tout le monde peut y arriver. Comme Lou l'a mentionné, en tant que personne non technique, vous pouvez toujours simplement créer un compte sur [Medium](https://medium.com/) ou des alternatives similaires. Si vous avez quelques notions de programmation, vous pouvez laisser un peu plus de place à votre créativité et, grâce au projet génial [Starlight Blog](https://starlight-blog-docs.vercel.app/) de [HiDeoo](https://github.com/HiDeoo), il ne vous faut pas beaucoup de connaissances pour déployer votre propre site Web. De nos jours, avec l'existence de fournisseurs PaaS (Platform as a Service) comme [Netlify](https://www.netlify.com/), qui transforment le déploiement en une aventure "Click-Ops", il n'y a plus aucune excuse pour ne pas publier votre blog à cause de difficultés techniques.
5252-5353-## D'accord, fin des blagues, passons maintenant aux compétences en écriture
5454-5555-Mais ce blog devrait se concentrer principalement sur la "compétence d'écriture", comme je l'ai dit, alors continuons sur ce sujet. Ayant moi-même eu des difficultés initiales à écrire des blogs, je peux totalement confirmer ce que Jacob dit : commencer est difficile. Ce n'est pas comme lire le [Guide de démarrage d'Astro](https://docs.astro.build/en/install-and-setup/) où il suffit de suivre les instructions et ensuite demander sur Discord ce que signifie une erreur `InvalidContentEntryDataError` <sub>veuillez utiliser le fil `#support` si vous le faites 🫶</sub> ([Si vous vous demandez encore](https://docs.astro.build/en/reference/errors/invalid-content-entry-data-error/)).
5656-5757-D'un autre côté, l'objectif semble si proche et réalisable. Il suffit d'écrire quelques mots. Qu'est-ce qui est si difficile à écrire ces foutus mots ? En réalité, je ne sais pas moi-même. Pourquoi me le demandez-vous ? La seule chose qui m'a aidé à sortir de la spirale de "Tu-Veux-Écrire-Mais-Chaque-Fois-Tu-Regards-Le-Curseur-Clignotant-Ton-Cerveau-Devient-Vide" (faisons-en le hashtag de la semaine) était le conseil de Lou : ne pas en exiger trop de vous-même dans votre premier blog. Pourquoi voulez-vous un blog parfait pour débuter ? À cause de votre réputation ? Pour que les gens ne pensent pas mal de vous ? Ressentent de la déception ? Honnêtement : c'est des conneries ! Pas seulement parce que votre premier blog ne sera probablement lu par personne (à l'exception remarquée de l'exceptionnel blog de Jacob), mais aussi parce que vous ne faites que vous compliquer la tâche. Mon plafond mental personnel était que je pensais devoir écrire au moins 500 mots pour commencer. Mais qui dit cela ? Honnêtement, si je regarde en arrière maintenant, je pense parfois : "Mince, ça aurait été tellement unique et cool si mon tout premier blog avait été comme un simple tweet", ou encore plus extrême : Un. Mot. Personne ne vous empêchera de publier ce blog :
5858-5959-> Bonjour 👋
6060-6161-(Désolé si j'ai maintenant pris votre idée géniale,\
6262-et inclus votre article complet ici\
6363-\- wow cool, ça rime)
6464-6565-Vous voyez ? Je peux faire ce que je veux, même être un foutu poète (comportement typiquement allemand), et personne ne me jugera. D'accord, peut-être que quelqu'un critiquera ce blog en disant que c'est "une perte de temps, sans signification dans tout ce contenu inutile", mais qui ***s'en soucie*** ? C'est *votre* blog, <span id="comment-reference" class="fragment-highlight">personne ne demande leur avis (à moins que vous ayez une section de commentaires sous votre blog 🙄 *tousse* [Lou](https://lou.gg/blog/why-writing-blogs-isnt-hard#chapter-five-its-the-8th-of-july)</span>). Alors, ne pensez pas à ce que les autres pourraient penser de votre style d'écriture, de votre contenu, de votre usage de la langue ou même si vous faites des fautes de grammaire. Tout cela vous rend humain et chercher à tout rendre parfait est non seulement complètement inutile, mais aussi [difficil](https://jacobjenkins.codes/posts/why-is-writing-blogs-so-hard/#chapter-1---i-want-it-now).
6666-6767-Un autre aspect de l'écriture de blogs n'est pas seulement de commencer, mais aussi de maintenir un flux cohérent, une idée directrice si vous voulez. En tant qu'audience de discours bien écrits, vous remarquez inconsciemment qu'ils étaient bons, satisfaisants, sublimes. Et c'est ce que j'adore dans de tels blogs ou discours. Ils semblent juste parfaits d'une manière ou d'une autre. Mais j'ai moi-même accepté que je ne puisse pas accomplir de telles performances dans mes propres créations. Et je m'en porte beaucoup mieux avec cette acceptation. Parce que le bénéfice d'accepter l'imperfection est d'accomplir les choses. Pas juste à 50 %, pas juste à 90 %. Aller jusqu'au bout. Terminer, à 100 %. Et c'est quelque chose avec lequel beaucoup de gens ont du mal, y compris mon ancien moi - en fait uniquement moi.
6868-6969-Mais comme le mentionne Lou, il existe d'autres méthodes simples pour garder un fil conducteur dans tout le post, rester fidèle à l'histoire alors que vos pensées peuvent vagabonder dans votre propre esprit. Mettre toutes ces idées sur papier, ou dans ce cas sur le clavier, peut être un défi, surtout lorsque vous commencez à écrire. Mais il y a une raison pour laquelle nous apprenons de telles compétences à l'école, elles améliorent notre santé cognitive et nos capacités de développement de façon immense. C'est aussi pourquoi je suis tout à fait d'accord avec Lou quand il dit que l'intelligence artificielle ne devrait jamais être utilisée dans le processus d'écriture. Cela n'a tout simplement aucun avantage, ni pour le lecteur, encore moins pour vous.
7070-7171-Donc, je ne veux pas répéter ce que dit Lou, mais les points-bullets m'ont beaucoup aidé dans le passé. Ils me donnent simplement un sentiment de structure constante, tandis que mon esprit peut jouer avec diverses idées et théories. Cela garantit que vous revenez toujours à ce que vous vouliez inclure initialement dans votre post. "Et si vous ne pouvez pas trouver de points-bullets ?", pourriez-vous demander. Eh bien, vous pourriez avoir besoin de plus de séances de brainstorming ou tout simplement de prendre des douches.
7272-7373-À la fin, voici quelques conseils que je peux vous donner en route :
7474-7575-* Développez votre propre style d'écriture, non pas en vous entraînant, mais simplement en écrivant. Tôt ou tard, vous remarquerez les types qui pourraient vous plaire, certaines choses que vous voulez adopter d'autres blogueurs, mais summa summarum ce que vous écrivez sera toujours à vous. Vous le partagez simplement avec le monde. C'est à vous de décider si vous souhaitez utiliser un deux-points ou un tiret ici ou là, mettre plus de points, utiliser le passé, l'impératif, des jurons ou un style plus formel. Toutes ces choses viendront automatiquement ensemble et vous définiront comme un blogueur unique. Et vos lecteurs apprécieront cette individualité plus que vous ne le pensez.
7676-7777-* Ne prenez pas trop sur vous. Cela peut sembler facile, mais tout le monde tombe régulièrement dans ce piège. Ou peut-être seulement des gens comme moi, ayant un mélange d'autisme et de perfectionnisme - je ne sais pas.
7878-7979-* Bien que cela sonne toujours stupide : Commencez à écrire. Et si cela ne fonctionne pas, commencez à écrire la partie centrale. Parce que je sais que commencer et finir sont toujours difficiles, mais imo la partie centrale coule comme du beurre.
8080-8181-* Les blogs ont des côtés faciles et difficiles : C'est ce que dit le titre, mais sachez qu'après avoir écrit tout ça, je me suis rendu compte que je n'ai pas répondu à cette question du tout... Dieu merci, Jacob n'a pas mis un point d'interrogation à la fin de cette suggestion. 🙏
8282-8383-Oui, je suppose que c'est tout. Si vous voulez partager vos pensées, laissez-les dans [les commentaires de Lou](https://lou.gg/blog/why-writing-blogs-isnt-hard) car je n'en ai pas.
-17
src/content/docs/fr/index.mdx
···11----
22-title: Pensées Profondes - Aperçu
33-description: Bienvenue sur mon blog. Découvrez cet aperçu minimaliste de tous
44- mes articles de blog.
55-template: splash
66-lastUpdated: false
77-editUrl: false
88-pagefind: false
99-next:
1010- label: Detailed view
1111- link: /blog
1212-1313----
1414-1515-import IndexPostList from "../../../components/IndexPostList.astro";
1616-1717-<IndexPostList />
-609
translations/de.json
···11-{
22- "Deep Thoughts - Overview": "Tiefgründige Gedanken - Überblick",
33- "Welcome to my blog. Take a look at this minimalistic overview of all my blog pos.5A38D8470D9F24600ED2": "Willkommen in meinem Blog. Werfen Sie einen Blick auf diesen minimalistisch gestalteten Überblick über alle meine Blogbeiträge.",
44- "Some aspects of creating a blog are really easy, and some are extremely difficul.997EB56977F5D63B1118": "Einige Aspekte der Erstellung eines Blogs sind wirklich einfach, und einige sind extrem schwierig!",
55- "A beginner friendly introduction with some swear words on how to start writing y.BE312646252BC9A86726": "Eine einsteigerfreundliche Einführung mit einigen Schimpfwörtern darüber, wie man anfängt, seinen eigenen Blogbeitrag zu schreiben.",
66- "<p>Talk a little bit about how one can become better (not master by any means, n.8C69E4E4A592E67958BE": "<p>Ein wenig darüber sprechen, wie man besser (bei weitem kein Meister, niemand ist perfekt) im Schreiben von Blogposts sein kann. Dies sind nur meine Gedanken, nachdem zwei großartige Leute aus der <a href=\"https://astro.build/chat\">Astro Community</a> (<a class=\"gh-badge\" href=\"https://github.com/jdtjenkins\"><img src=\"https://github.com/jdtjenkins.png\" alt=\"jdtjenkins\" />Jacob</a> und <a class=\"gh-badge\" href=\"https://github.com/louisescher\"><img src=\"https://github.com/louisescher.png\" alt=\"louisescher\" />Lou</a>) beschlossen haben, Blogs darüber zu schreiben, wie schwer und einfach es ist, Blogposts zu schreiben.</p><p>Bitte lesen Sie zuerst ihre Beiträge, da dies die Folge von beiden ist:</p><ol><li><a href=\"https://jacobjenkins.codes/posts/why-is-writing-blogs-so-hard/\">\"Warum ist Blogschreiben so schwer?\" - Jacob Jenkins</a></li><li><a href=\"https://lou.gg/blog/why-writing-blogs-isnt-hard\">\"Warum Blogschreiben nicht schwer ist\" - Louis Escher</a></li><li><a href=\"/blog/writing-blogs-is-hard-and-easy/\">\"Einige Aspekte der Erstellung eines Blogs sind wirklich einfach, und einige sind extrem schwierig!\" - Felix Schneider</a></li></ol><p>Nachdem Sie das gelesen haben, haben Sie erfolgreich diese großartige Trilogie von Blogposts über Blogposts abgeschlossen.</p>",
77- "After a very interesting discussion in the [Astro](https://github.com/withastro).48AFE0BF2E41079C33DD": "Nach einer sehr interessanten Diskussion im [Astro](https://github.com/withastro) [Discord](https://astro.build/chat) - gestartet von niemand geringerem als Kernentwickler [Alex](https://github.com/alexanderniebuhr) selbst (übrigens Glückwunsch zu diesem kürzlichen Erfolg 🎉) -, habe ich scherzhaft gesagt, dass jemand einen Blog darüber schreiben könnte, warum es für viele Menschen so schwierig ist, nicht nur zu schreiben, sondern auch einen Blog insgesamt zu pflegen.",
88- "The man who nominated me as an Astro Support Squad - [Jacob](https://github.com/.47D0DB043E57D3E7660B": "Der Mann, der mich als Mitglied des Astro Support Teams vorgeschlagen hat - [Jacob](https://github.com/jdtjenkins) (übrigens vielen Dank, dass du mich in dieser großartigen Community bemerkt hast 😍) - nahm das ziemlich wörtlich und schrieb einen Blog darüber. Kein Scherz. Sehen Sie selbst: [https://jacobjenkins.codes/posts/why-is-writing-blogs-so-hard/](https://jacobjenkins.codes/posts/why-is-writing-blogs-so-hard/) Dies ist übrigens sein allererster Blog (und hoffentlich nicht sein letzter, da ich seinen Stil wirklich genossen habe).",
99- "Our beloved everywhere-helper, Blogger, Designer and StudioCMSer - [Lou](https:/.00B9B777867DC593B708": "Unser geliebter Allround-Helfer, Blogger, Designer und StudioCMS-Experte - [Lou](https://github.com/louisescher/) (übrigens danke, dass du mir im Voraus ein paar Tipps zum Blogschreiben gegeben hast, damit ich das hier selbstbewusster schreiben konnte 🤩) - sprang sofort auf diesen großartigen Hype-Zug (wie Twitch-Nutzer es nennen könnten) und veröffentlichte [seinen Anschlussartikel](https://lou.gg/blog/why-writing-blogs-isnt-hard) innerhalb von verdammten 12 Stunden!!! Glauben Sie mir, ich habe die Commits überprüft, Lou hat buchstäblich innerhalb von 4 Minuten nach Ablauf der 12 Stunden-Marke veröffentlicht.",
1010- "As I will include many references to both of their blogs, it's best if you read .2E1FCF6AB78B43DC2069": "Da ich viele Verweise auf beide ihrer Blogs einfügen werde, ist es am besten, wenn Sie zuerst ihre lesen. Und dann meinen. Oder vielleicht ist es besser, wenn Sie nur ihre lesen, ich bin mir noch nicht sicher, wie sich meiner entwickeln wird.",
1111- "But what I can ~~say~~ write, is that mine will fully focus on just the writing .FC4D0CF3F6082890E1EC": "Aber was ich sagen ~~kann~~ schreiben kann, ist, dass meiner sich vollständig auf die Schreibfähigkeiten konzentrieren wird.",
1212- "How to setup a blog (technical challenges)": "Wie man einen Blog einrichtet (technische Herausforderungen)",
1313- "Whilst this blog doesn't focus on how to build a blog, deploy it and all this te.460F9C9970BD9D6ED53F": "Auch wenn dieser Blog sich nicht darauf konzentriert, wie man einen Blog erstellt, bereitstellt und all diesen technischen Kram macht, möchte ich erwähnen, dass es jeder schaffen kann. Wie Lou erwähnte, können Sie als Nicht-Techniker immer einfach ein Konto auf [Medium](https://medium.com/) oder ähnlichen Alternativen erstellen. Wenn Sie sich ein wenig mit Programmierung auskennen, können Sie Ihrer Kreativität ein wenig mehr Raum geben. Dank des großartigen [Starlight Blog](https://starlight-blog-docs.vercel.app/) Projekts von [HiDeoo](https://github.com/HiDeoo) benötigen Sie nicht viel Wissen, um Ihre eigene Website bereitzustellen. Heutzutage, wo es auch PaaS (Platform as a Service)-Anbieter wie [Netlify](https://www.netlify.com/) gibt, die den Umgang zu einer Click-Ops Erfahrung machen, gibt es keine Ausrede mehr, warum technische Schwierigkeiten Sie daran hindern sollten, Ihren Blog zu veröffentlichen.",
1414- "Okay, jokes aside, now: Writing skills": "Okay, Spaß beiseite, jetzt: Schreibfähigkeiten",
1515- "But this blog should focus on mainly on the \"Writing Skill\" as I said, so let's .809BFECD79628A7D6401": "Aber dieser Blog sollte sich hauptsächlich auf die \"Schreibfähigkeiten\" konzentrieren, wie ich sagte, also machen wir dort weiter. Da ich selbst anfangs Schwierigkeiten hatte, Blogs zu schreiben, kann ich Jacob absolut zustimmen, dass der Einstieg schwierig ist. Es ist nicht wie das Durchlesen des [Astro \"Getting started\" Leitfadens](https://docs.astro.build/en/install-and-setup/), bei dem Sie nur den Anweisungen folgen müssen und dann auf Discord fragen, was ein `InvalidContentEntryDataError` bedeutet <sub>bitte verwenden Sie den `#support`-Thread, wenn Sie das tun 🫶</sub> ([Falls Sie sich immer noch wundern](https://docs.astro.build/en/reference/errors/invalid-content-entry-data-error/)).",
1616- "On the other hand, the goal seems so close and doable. Just write some words. Wh.D4B7EBAB98F3D78C25CA": "Auf der anderen Seite erscheint das Ziel so nah und machbar. Schreiben Sie einfach ein paar Worte. Was ist so schwer daran, diese verdammten Worte zu schreiben? Ehrlich gesagt weiß ich es selbst nicht. Warum fragen Sie mich? Das Einzige, was mir geholfen hat, aus der Spirale „Du-willst-schreiben-aber-jedes-Mal-wenn-du-den-blinkenden-Cursor-ansiehst-wird-dein-Hirn-leer“ (machen wir das zum Hashtag der Woche) herauszukommen, war Lous Tipp, am Anfang nicht so viel von sich selbst zu verlangen. Warum möchten Sie mit einem perfekten Blog beginnen? Nur wegen Ihres Rufs? Damit die Leute nichts Falsches von Ihnen denken? Enttäuscht sind? Ehrlich gesagt: Das ist Schwachsinn! Nicht nur, weil Ihr erster Blog sehr wahrscheinlich von niemandem gelesen wird (mit Ausnahme von Jacobs außergewöhnlichem Blog), sondern auch, weil Sie es sich nur schwerer machen. Meine persönliche mentale Grenze war, dass ich dachte, ich müsse mindestens 500 Wörter schreiben, um anzufangen. Aber wer sagt das? Um ehrlich zu sein, wenn ich jetzt zurückblicke, denke ich manchmal: „Mensch, es wäre so einzigartig und cool gewesen, wenn mein erster Blog wie ein normaler Tweet gewesen wäre“, oder noch extremer: Ein. Wort. Niemand wird Sie davon abhalten, diesen Blog zu veröffentlichen:",
1717- "Hello 👋": "Hallo 👋",
1818- "(Sorry if I now took your awesome idea,\\\nand included your whole blog post in he.2C4E38E676160D62D299": "(Entschuldigung, falls ich jetzt Ihre großartige Idee genommen habe,\\\nund Ihren gesamten Blogbeitrag hier eingefügt habe\\\n\\- wow cool, das reimt sich.)",
1919- "See? I can do whatever I want, even being a fricking poet (typical German behavi.CA4561FAF77C16255B02": "Sehen Sie? Ich kann tun, was ich will, sogar ein verdammter Poet sein (typisches deutsches Verhalten), und niemand wird mich verurteilen. Okay, vielleicht wird jemand diesen Blog hassen, weil er „Zeitverschwendung sei, kein Sinn in all diesen nutzlosen Inhalten“, aber wen interessiert’s, ***w e n***? Es ist *Ihr* Blog, <span id=\"comment-reference\" class=\"fragment-highlight\">niemand fragt nach deren Meinungen (es sei denn, Sie haben einen Kommentarbereich unter Ihrem Blog 🙄 *hust* [Lou](https://lou.gg/blog/why-writing-blogs-isnt-hard#chapter-five-its-the-8th-of-july)</span>). Also denken Sie nicht darüber nach, was andere über Ihren Schreibstil, Inhalt, Sprachgebrauch oder sogar Ihre Grammatikfehler denken könnten. All dies macht Sie menschlich, und alles perfekt hinzubekommen, ist nicht nur völlig unnötig, sondern auch [hrad](https://jacobjenkins.codes/posts/why-is-writing-blogs-so-hard/#chapter-1---i-want-it-now).",
2020- "Another part of writing blogs is not just getting started, but the difficulty of.784B95527E097077F971": "Ein weiterer Bestandteil des Blogschreibens ist nicht nur der Einstieg, sondern auch die Schwierigkeit, einen Fluss, einen Gedanken, wenn Sie so wollen, aufrechtzuerhalten. Als Zuhörer gut geschriebener Reden bemerken Sie unterbewusst, dass sie gut waren, erfüllend, erhaben. Und das liebe ich an solchen Blogs oder Reden. Sie fühlen sich einfach irgendwie richtig an. Aber ich selbst habe akzeptiert, dass ich solche Errungenschaften in meiner eigenen kreativen Arbeit nicht erreichen kann. Und mit dieser Akzeptanz komme ich viel besser zurecht. Denn der Vorteil, Unvollkommenheit zu akzeptieren, besteht darin, Dinge fertig zu bekommen. Nicht nur zu 50 %, nicht nur zu 90 %. Fertig. Abgeschlossen, 100 %. Und das ist etwas, womit viele Menschen kämpfen, mich eingeschlossen - tatsächlich nur mich.",
2121- "But as Lou mentions, there are other easy methods to keep a common thread in the.18BEED3C4E5876FC95F2": "Aber wie Lou erwähnt, gibt es andere einfache Methoden, um einen roten Faden im gesamten Beitrag beizubehalten, der Geschichte treu zu bleiben, während Gedanken in Ihrem eigenen Kopf herumschweifen könnten. All diese Gedanken zu Papier zu bringen oder in diesem Fall auf die Tastatur, kann eine Herausforderung sein, besonders wenn Sie gerade erst mit dem Schreiben anfangen. Aber es gibt einen Grund, warum wir solche Fähigkeiten in der Schule lernen. Sie verbessern unsere kognitive Gesundheit und Entwicklung erheblich. Deshalb stimme ich Lou auch zu, wenn er sagt, dass KI im Schreibprozess niemals verwendet werden sollte. Es bringt weder für den Leser noch für Sie selbst irgendwelche Vorteile mit sich.",
2222- "So I don't want to repeat what Lou says, but bullet points have helped me out a .964F132C02AED6CE1634": "Ich möchte nicht wiederholen, was Lou sagt, aber Aufzählungspunkte haben mir in der Vergangenheit sehr geholfen. Sie geben mir das Gefühl von konstanter Struktur, während mein Geist mit verschiedenen Gedanken und Theorien spielen kann. So stelle ich sicher, dass ich immer wieder zu dem zurückkomme, was ich ursprünglich in meinen Beitrag aufnehmen wollte. „Und wenn Ihnen keine Aufzählungspunkte einfallen?“, könnten Sie fragen. Dann brauchen Sie möglicherweise noch mehr Brainstormings oder einfach Duschen.",
2323- "In the end, these are some tips I can give you along the way:": "Am Ende sind hier einige Tipps, die ich Ihnen mit auf den Weg geben kann:",
2424- "Develop your own writing style, not by training, but just writing. Sooner or lat.F84CA1A98AD5E28A3F69": "Entwickle deinen eigenen Schreibstil, nicht durch Training, sondern durch Schreiben. Früher oder später wirst du bemerken, welche Arten dir gefallen könnten, einige Dinge, die du von anderen Bloggern übernehmen möchtest, aber summa summarum wird das, was du schreibst, immer deins sein. Du teilst es einfach mit der Welt. Es liegt an dir, ob du hier und da einen Doppelpunkt oder Bindestrich verwenden möchtest, mehr Punkte, die Vergangenheitsform, den Imperativ, Schimpfwörter oder den formelleren Stil. All diese Dinge fügen sich automatisch zusammen und definieren dich als einzigartigen Blogger. Und deine Leser werden diese Individualität mehr schätzen, als du denkst.",
2525- "Don't take on too much. Might sound easy, but everyone falls regularly into this.F956D1FB960DB4CD026C": "Nimm dir nicht zu viel vor. Das klingt vielleicht einfach, aber jeder tappt regelmäßig in diese Falle. Oder vielleicht nur Leute wie ich, die eine Mischung aus Autismus und Perfektionismus haben – keine Ahnung.",
2626- "Although it always sounds stupid: Start writing. And if it doesn't work, start w.0018355B94E38C7B923C": "Auch wenn es immer dumm klingt: Fang an zu schreiben. Und wenn es nicht funktioniert, fang mit dem Mittelteil an. Denn ich weiß, Anfang und Ende sind immer schwierig, aber meiner Meinung nach flutscht der Mittelteil wie Butter.",
2727- "Blogs have easy and hard sides: This is what the title says, but know that I wro.72A914EB55320A9E44E4": "Blogs haben einfache und schwierige Seiten: Das ist, was der Titel sagt, aber wusstest du, dass ich beim Schreiben all dessen gemerkt habe, dass ich diese Frage überhaupt nicht beantwortet habe... Gott sei Dank hat Jacob am Ende dieses Vorschlags kein Fragezeichen gesetzt. 🙏",
2828- "Yeah, I guess that's it. If you want to share you thoughts, leave them in [Lou's.D2EA8444C7BDC5361790": "Ja, ich denke, das war's. Wenn du deine Gedanken teilen möchtest, hinterlasse sie in [Lous Kommentaren](https://lou.gg/blog/why-writing-blogs-isnt-hard), weil ich keine habe.",
2929- "Vibe-coding a VS Code Extension for Terraform projects": "Vibe-Coding einer VS Code-Erweiterung für Terraform-Projekte",
3030- "How I created an extension for Visual Studio Code which adds inline resolutions .94295B1957CBEE7AD731": "Wie ich eine Erweiterung für Visual Studio Code erstellt habe, die Inline-Resolutionen für Variablen in Terraform-Projekten hinzufügt.",
3131- "Today, I want to talk about a small VS Code extension that I vibe-coded in a sin.6C43E09851571E31F19E": "Heute möchte ich über eine kleine VS Code-Erweiterung sprechen, die ich an einem einzigen Tag vibe-codiert habe, um die Arbeit mit Terraform zu erleichtern. Zunächst erkläre ich, was Terraform ist, und gehe dann direkt auf die Funktionalität und die Gründe für diese Erweiterung ein. Fühlen Sie sich frei, den ersten Abschnitt zu überspringen, wenn Sie bereits mit Terraform vertraut sind.",
3232- "What is Terraform?": "Was ist Terraform?",
3333- "Terraform is an infrastructure-as-code (IaC) tool that lets you define your enti.C1E19D8A95C63B18257A": "Terraform ist ein Infrastructure-as-Code (IaC)-Tool, mit dem Sie Ihre gesamte Cloud- oder On-Premises-Infrastruktur als Code definieren können. Die von [HashiCorp](https://github.com/hashicorp) entwickelte Konfigurationssprache wird als HCL (HashiCorp Configuration Language) bezeichnet und bietet eine intuitive, menschenlesbare Syntax. Die *native Syntax* hat den Vorteil, dass die Lernkurve niedrig ist, sie für alle Anbieter konsistent ist und angenehm für Menschen zu lesen und zu schreiben ist, während die JSON-basierte Variante für Maschinen einfacher zu generieren und zu parsen ist.",
3434- "What makes Terraform very powerful are two basic features: **variables** and **m.F29F6CFC8D18A39724FE": "Was Terraform sehr leistungsfähig macht, sind zwei grundlegende Funktionen: **Variablen** und **Module**. Variablen ermöglichen es, Ressourcen zu erstellen, bei denen die tatsächlichen Werte von anderswoher eingefügt werden können, und Module gruppieren eine beliebige Anzahl von Ressourcen, was den Vorteil der Wiederverwendbarkeit und Verschachtelung hat. Während beide Funktionen sehr grundlegend erscheinen, bilden sie in Kombination ein Traumteam. Denn die Offenheit von Terraform ermöglicht es, Eingabevariablen für jedes Modul zu definieren und Variablen auch über Ausgaben zu exportieren.",
3535- "A simple module is therefore structured like this:": "Ein einfaches Modul ist daher wie folgt aufgebaut:",
3636- "azure-resource-group/": "azure-resource-group/",
3737- "main.tf": "main.tf",
3838- "variables.tf": "variables.tf",
3939- "outputs.tf": "outputs.tf",
4040- "README.md": "README.md",
4141- "All files except `main.tf` are optional (the `README.md` isn’t Terraform-specifi.C0AA6A4205B65B850BDC": "Alle Dateien außer `main.tf` sind optional (die `README.md` ist nicht spezifisch für Terraform), aber ich bevorzuge es, Best Practices zu folgen, daher beinhaltet das Beispiel diese Dateien.",
4242- "Let's look at a simple example. Imagine we want to manage a resource group in Az.C7130E93293C5F3835FA": "Schauen wir uns ein einfaches Beispiel an. Nehmen wir an, wir möchten eine Ressourcengruppe in Azure mit Terraform verwalten. In der Datei `variables.tf` definieren wir, welche Eingaben wir innerhalb des Moduls erwarten. Jeder der beiden Blöcke repräsentiert die Variable und die Eigenschaften der Variablen, wie die `description` oder den `type`:",
4343- "You might have noticed that the `location` variable also has a `default` propert.98D282B5427579CFCDE8": "Sie haben vielleicht bemerkt, dass die Variable `location` auch eine `default`-Eigenschaft hat, die die Variable optional macht und einen Fallback-Wert bietet, falls keiner angegeben wird. Diese Variablen können dann innerhalb der Datei `main.tf` verwendet werden. Hier definieren wir die tatsächlichen Ressourcen, die wir generieren möchten:",
4444- "In this case, we just define our simple resource group, which you can think of a.549C08D1FEC998D18486": "In diesem Fall definieren wir einfach unsere Ressourcengruppe, die Sie sich wie einen Ordner in Azure vorstellen können – eine sehr laienhafte Erklärung. Der letzte Teil, den wir umsetzen können, ist die Datei `outputs.tf`:",
4545- "This is very useful if we want to use information like the ID of the resource gr.EB0A3E52AB5C3982D204": "Dies ist sehr nützlich, wenn wir Informationen wie die ID der Ressourcengruppe später in anderen Teilen unseres Terraform-Projekts verwenden möchten.",
4646- "As I already wrote, the `README.md` is not actually part of the Terraform defini.E6BDEA6D28A17F85099B": "Wie ich bereits geschrieben habe, ist die `README.md` tatsächlich kein Teil der Terraform-Definitionen, hilft uns jedoch, den Zweck des Moduls zu verstehen:",
4747- "As the `README.md` already suggests, we can now use this module to create an Azu.A94748FE0C01D4120745": "Wie die `README.md` bereits andeutet, können wir dieses Modul jetzt verwenden, um eine Azure-Ressourcengruppe überall innerhalb unseres Projekts zu erstellen. Wir müssen nur sicherstellen, dass der Pfad zum Modul-Ordner korrekt ist und Terraform die Dateien `main.tf`, `variables.tf` und `outputs.tf` interpretieren kann. In diesem Fall, da wir die Variable `location` nicht angeben, wird sie auf `\"westeurope\"` gesetzt.",
4848- "I hope this section gave you a better basic understanding of what Terraform is a.8558BAB715B916ACA2AE": "Ich hoffe, dieser Abschnitt hat Ihnen ein besseres grundlegendes Verständnis dafür gegeben, was Terraform ist und was Sie damit tun können.",
4949- "The tedious task of Terraform": "Die mühsame Aufgabe mit Terraform",
5050- "You might have noticed that the `source` field of a module creates an awesome fl.8E968461FC7650C53259": "Sie haben vielleicht bemerkt, dass das Feld `source` eines Moduls eine erstaunliche Flexibilität für das gesamte Projekt schafft, da Sie Module überall definieren und überall im Projekt verwenden können.",
5151- "However, this feature also has a huge drawback when it comes to maintainability:.648C608F44A24AAF64E1": "Dieses Feature hat jedoch einen großen Nachteil in Bezug auf die Wartbarkeit: Das Auflösen der tatsächlichen Werte hinter Variablen kann sehr mühsam sein. Während es in diesem einfachen Beispiel leicht zu verwalten scheint, desto größer das Projekt wird und je verschachtelter es ist, desto schwieriger und zeitaufwändiger wird das Verstehen und Anpassen von Terraform-Code. Deshalb habe ich eine Erweiterung erstellt.",
5252- "**What should the extension do?** The main goal of the extension is to provide t.8B7ACE467BC6CBF2D8B5": "**Was sollte die Erweiterung tun?** Das Hauptziel der Erweiterung ist es, die tatsächlichen Werte der Variablen überall dort bereitzustellen, wo sie verwendet werden. Wenn ein Modul von mehreren Stellen oder einfach mehreren Malen aufgerufen wird, sollten die Informationen bereitstellen, welcher Anwendungsfall die Variable auf welchen Wert setzt. Wenn Module tief verschachtelt sind, sollten die Werte aufgelöst werden, bis wir die `.tfvars`-Dateien erreichen. Dies sind die Dateien, in denen Sie die fest kodierten Werte für Variablen definieren können.",
5353- "How to start a VS Code extension": "So starten Sie eine VS Code-Erweiterung",
5454- "Creating the basic template project for a VS Code extension is as easy as runnin.6F4EB3BBD45F5DF0A520": "Das Erstellen des grundlegenden Template-Projekts für eine VS Code-Erweiterung ist so einfach wie das Ausführen dieses Befehls, wenn Sie [Node](https://github.com/nodejs) installiert haben:",
5555- "This command temporarily installs the Yeoman (a generator software), and enters .5FDA5DDC43BF09081006": "Dieser Befehl installiert temporär Yeoman (eine Generator-Software) und öffnet einen interaktiven Modus, in dem einige Fragen beantwortet werden müssen, wie der Projektname, der Typ und die Beschreibung. Im folgenden Block sehen Sie alle Fragen und Standardantworten:",
5656- "For further information regarding VS Code extensions I want to link to [the offi.B0448C131D881366A635": "Weitere Informationen zu VS Code-Erweiterungen möchte ich im [offiziellen Dokumentation](https://code.visualstudio.com/api/get-started/your-first-extension) verlinken, da sie immer aktueller im Gegensatz zu meinen Erklärungen hier ist.",
5757- "3… 2… 1… Vibe-Coding!": "3… 2… 1… Vibe-Coding!",
5858- "I like to start new projects by asking [ChatGPT](https://github.com/openai) for .FD250EAE4277C6E99E2B": "Ich beginne gerne neue Projekte, indem ich [ChatGPT](https://github.com/openai) nach allgemeinen technischen Fragen frage wie:",
5959- "How would you suggest achieving such a project?": "Wie würden Sie vorschlagen, ein solches Projekt umzusetzen?",
6060- "How long do you estimate it will take me?": "Wie lange schätzen Sie, dass es dauern wird?",
6161- "How difficult will it be?": "Wie schwierig wird es sein?",
6262- "Brainstorming with AI bots seems like a very sensible way to get a better overvi.59F0199CCC0E7F65A0D7": "Das Brainstorming mit KI-Bots scheint ein sehr sinnvoller Weg zu sein, um sich einen besseren Überblick über neue Projekte zu verschaffen, insbesondere wenn man in völlig neue Gewässer eintaucht. Eine VS Code-Erweiterung zu erstellen, war genau ein solcher Anwendungsfall, da ich noch nie zuvor etwas für VS Code oder eine andere IDE erstellt hatte. Nach dieser anfänglichen Brainstorming-Phase bevorzuge ich [Claude](https://github.com/anthropics), um alle notwendigen Dateien für eine solche Erweiterung zu programmieren, da dieser KI-Bot meiner Erfahrung nach in der Lage ist, Code wirklich präzise umzusetzen. Ich habe kaum Fehler oder Laufzeitprobleme mit Claude-Code erlebt, sodass ich ihn genau für solche Anwendungsfälle nutze – Initialstarter. Der Nachteil von Claude ist sein sehr begrenztes kostenloses Testangebot, weshalb ich beim Formulieren meiner Worte immer vorsichtig bin und versuche, im Voraus an so viele mögliche Fehler der KI zu denken wie möglich. So begann es also: Ich nahm mir etwas Zeit, um mein genaues Szenario und meinen Wunsch in die begrenzten Kontextfenster einer zufälligen Wortmaschine namens Claude zu formulieren und erhielt sofort eine riesige `extension.ts`-Implementierung. Natürlich gab es offensichtliche Unterschiede zwischen meiner Vision und der Kommunikation mit diesem LLM, weshalb ich ihm ein weiteres Mal erklären musste, was die wichtigen Überlegungen sind, und um weiteren Code zu erhalten, nutzte ich auch meinen magischen Trick: \"Wenn das zu groß für eine Datei ist, geben Sie mir einfach die gesamte `extension.ts` in mehreren Dateien, die natürlich funktionieren sollte.\"",
6363- "Claude then went on a long journey.": "Claude begab sich dann auf eine lange Reise.",
6464- "After some struggling to keep it going my tokens were all used and I had to figu.2D452B77249C8430A480": "Nach einigen Kämpfen, es weiter am Laufen zu halten, waren meine Tokens aufgebraucht und ich musste den verbleibenden Code selbst herausfinden. Dennoch gelang es mir, eine laufende Version zu erstellen, da nicht viel fehlte, und bemerkte sofort einige Verbesserungen, die bislang unbemerkt geblieben waren. Da ich auf die Wiederauffüllung meiner Tokens warten musste, tat ich genau das.",
6565- "The next morning the improvement session began, and after two long conversations.D0F806E5F02FCADFF975": "Am nächsten Morgen begann die Verbesserungssitzung, und nach zwei langen Gesprächen war das Kontextfenster komplett gefüllt, und ich konnte keine Nachrichten mehr im selben Chat senden, obwohl meine Tokens noch nicht abgelaufen waren. Doch alles, was ich von Claude erreichen und erhalten wollte, war nun verfügbar, und ich konnte einige Tests in einem meiner größeren Projekte durchführen. Nachdem ich den Code manuell bestätigt und angepasst hatte, war ich zunächst zufrieden und entschied, dass die erste öffentliche Version fertig war.",
6666- "Some trial and error with [GitHub Actions](https://github.com/github) later, I m.B1A6CFA9C8791F3B0E65": "Nach einigem Ausprobieren mit [GitHub Actions](https://github.com/github) gelang es mir, den [Publisher für eine VS Code-Erweiterung einzurichten](https://code.visualstudio.com/api/working-with-extensions/publishing-extension#create-a-publisher). Und zwei Patch-Versionen später war ich ziemlich zufrieden mit den Ergebnissen.",
6767- "The Final Result": "Das Endergebnis",
6868- "Try out the extension yourself by clicking on the button below. There are still .53D329C6D712DEFF0967": "Probieren Sie die Erweiterung selbst aus, indem Sie auf den unten stehenden Button klicken. Es gibt noch viele Verbesserungsmöglichkeiten, also zögern Sie nicht, mitzuhelfen, wenn Sie interessiert sind. Sie können dies gerne auf [GitHub](https://github.com/trueberryless/terraform-variables-resolution) tun.",
6969- "Install Terraform Variables Resolution": "Terraform Variables Resolution installieren",
7070- "Here you can see the example from [the Terraform explanation](#what-is-terraform.772358BC6F4987371F60": "Hier sehen Sie das Beispiel aus [der Terraform-Erklärung](#what-is-terraform), das zeigt, wie diese Erweiterung die Werte der Variablen visuell in VS Code hinzufügt:",
7171- "": "Wie ich ein GitHub-Profil-README gebaut habe, das nicht existieren sollte (aber es tut)",
7373- "A deep dive into the technical challenges and solutions behind my GitHub profile.8493E1B06B7E9BE16E95": "Ein tiefgehender Einblick in die technischen Herausforderungen und Lösungen hinter meinem GitHub-Profil-README, mit Schwerpunkt auf SVG-Manipulation, Automatisierung und einem dynamischen Bento-Grid.",
7474- "Creating a standout <a class=\"gh-badge\" href=\"https://github.com/github\"><img sr.EC7EC3169C3D5076914B": "Ein herausragendes <a class=\"gh-badge\" href=\"https://github.com/github\"><img src=\"https://github.com/github.png\" alt=\"github\" />GitHub</a>-Profil-README zu erstellen, bedeutet nicht nur, ein paar Abzeichen hinzuzufügen — es geht darum, technische Grenzen zu überwinden. In diesem tiefgehenden Artikel erkunde ich grundlegende SVG-Manipulation, HTML-zu-SVG-Konvertierung, Inline-Animationen und vollständige Automatisierung mit GitHub Actions, um eines der technisch fortschrittlichsten GitHub-READMEs zu bauen. Von einem dynamischen Bento-Grid, das sich alle 5 Minuten aktualisiert, bis hin zur Einbettung von Live-SVGs ohne externe Anfragen – dieses Projekt hat mein Profil in eine lebendige, sich selbst aktualisierende Präsentation meiner Arbeit verwandelt. Möchtest du wissen, wie ich das gemacht habe? Lass es uns aufschlüsseln. 🚀",
7575- "Read the more formal story [here](https://trueberryless.org/work/github-profile-.5BCD9DBA0F2103014075": "Lies die formellere Geschichte [hier](https://trueberryless.org/work/github-profile-readme/)",
7676- "The Beginning: A README That Looked Like a Wikipedia Dump": "Der Anfang: Ein README, das wie ein Wikipedia-Dump aussah",
7777- "Every great story starts with a problem, and mine was simple: my [GitHub profile.3713BD43F2A1A91BFB7E": "Jede großartige Geschichte beginnt mit einem Problem, und meines war einfach: Mein [GitHub-Profil](https://github.com/trueberryless) README war ein komplettes Chaos. Es war lang. Es hatte zu viel Text. Es war überfüllt mit Abzeichen — so viele, dass es aussah, als würde ich jede mögliche Internet-Trophäe horten. Hackathons, GitHub-Beiträge, Astro, roadmap.sh — wenn es ein Abzeichen gab, hatte ich es.",
7878- "At first, I thought this was fine. It showed everything about me, right? But one.773B7C308644FEDA7081": "Am Anfang dachte ich, das wäre in Ordnung. Es zeigte schließlich alles über mich, oder? Aber eines Tages sah ich es an und stellte fest:",
7979- "This is not stylish. This is a cluttered disaster.": "Das ist nicht stilvoll. Das ist ein überladenes Desaster.",
8080- "I needed something new. Something clean. Something visually striking. I wanted a.C82835C3D13A6981B63B": "Ich brauchte etwas Neues. Etwas Sauberes. Etwas Visuell Beeindruckendes. Ich wollte ein **Bento-Grid**, das die Leute dazu bringt, stehen zu bleiben und es zu bewundern, anstatt verwirrt daran vorbeizuscrollen. Ein Design, das so gut ausgeführt ist, dass jeder, der es sieht, sofort eines für sich haben wollte.",
8181- "That was the dream. Now I just had to make it real.": "Das war der Traum. Jetzt musste ich ihn nur noch realisieren.",
8282- "Phase 1: The HTML Dream (and Markdown Nightmare)": "Phase 1: Der HTML-Traum (und Markdown-Albtraum)",
8383- "The first step was simple: mock up my perfect profile in HTML and CSS. And let m.EEFE6C2742301B518D46": "Der erste Schritt war einfach: Entwerfen meines perfekten Profils in HTML und CSS. Und ich kann dir sagen, es sah unglaublich aus. Es hatte das perfekte Layout, sanfte Animationen und genau das richtige Gleichgewicht zwischen Inhalt und Raum. Dann kam die Realität. Dies musste innerhalb von *GitHub-Flavored Markdown* funktionieren. Kein Problem, oder? Markdown unterstützt HTML! Also kopierte ich mein wunderschönes HTML in mein README und drückte Speichern.",
8484- "[GitHub](https://github.com/github): *Absolutely not.*": "[GitHub](https://github.com/github): *Absolut nicht.*",
8585- "GitHub’s Markdown [strips out a not a huge number of HTML tags, but important on.8ADCE02DB7CC7739FAD2": "GitHubs Markdown [entfernt zwar keine große Anzahl von HTML-Tags, aber wichtige](https://github.github.com/gfm/#disallowed-raw-html-extension). Aus Sicherheitsgründen natürlich (und ich respektiere das vollkommen, GitHub, wirklich ❤️), aber das bedeutete, dass mein perfektes Design komplett **unbrauchbar** war.",
8686- "I tried tweaking it. Replacing unsupported tags with ones that worked. Maybe I c.14452FE82B6AC0DB8958": "Ich versuchte, es anzupassen. Ungestützte Tags durch solche zu ersetzen, die funktionierten. Vielleicht könnte ich etwas davon retten? *Nein*. Die Einschränkungen von Markdown bedeuteten, dass mein Traum-Layout unmöglich war.",
8787- "Phase 2: The \"Just Use a Python Script\" Cope": "Phase 2: Der \"Einfach Ein Python-Skript Benutzen\"-Kompromiss",
8888- "When in doubt, automate. If I couldn’t get my HTML in directly, maybe I could ge.FD6C9ADF71816E0E5B49": "Wenn man unsicher ist, automatisieren. Wenn ich mein HTML nicht direkt einfügen konnte, konnte ich vielleicht etwas Dynamisches mit einem Skript erstellen? Also bastelte ich ein Python-Skript, das mein neuestes GitHub-Repository abruft und in mein README einfügt. Hier einfach ein paar zufällige Bytes, die manche als Python-Code bezeichnen:",
8989- "This seemed like a step in the right direction. It was automated. It was functio.D20A833F97288BD3E73B": "Das schien ein Schritt in die richtige Richtung zu sein. Es war automatisiert. Es funktionierte. Aber es löste mein eigentliches Problem nicht. 😢",
9090- "This wasn’t about dynamic content — it was about *design*. And no amount of Pyth.8C914CE49CA59FC373EC": "Es ging nicht um dynamischen Inhalt — es ging um *Design*. Und kein Skript der Welt konnte Markdown schön machen.",
9191- "Phase 3: \"Fine, I'll Just Use a Screenshot\" (Rock Bottom)": "Phase 3: \"Na Gut, Ich Nehme Einfach Einen Screenshot\" (Tiefpunkt)",
9292- "At this point, I was desperate. I considered the unthinkable: *just take a scree.A573BC6FDCB7D404B86F": "Zu diesem Zeitpunkt war ich verzweifelt. Ich dachte an das Undenkbare: *Einfach einen Screenshot vom HTML machen und ihn als Bild in mein README einfügen.* Es war ein brutaler Ansatz. Es war faul. Es war... effektiv?",
9393- "For a moment, I actually thought about doing it. But I knew deep down that I wou.F11BA1015DB80A5D8D2D": "Einen Moment lang dachte ich tatsächlich darüber nach, es zu tun. Aber tief im Inneren wusste ich, dass ich mir nie verzeihen würde, wenn ich das als endgültige Lösung akzeptieren würde.",
9494- "Just for the reference, I would have used [Puppeteer](https://www.npmjs.com/pack.7C033B35BC935C314B6E": "Zur Referenz hätte ich [Puppeteer](https://www.npmjs.com/package/puppeteer) und [FFmpeg](https://www.ffmpeg.org/) verwendet — keine Ahnung, was diese Tools sind.",
9595- "Phase 4: Enter SVG (The Light at the End of the Tunnel)": "Phase 4: SVGs treten auf den Plan (Das Licht am Ende des Tunnels)",
9696- "I abandoned the cursed screenshot plan and looked for something more flexible.": "Ich ließ den verfluchten Screenshot-Plan fallen und suchte nach etwas Flexiblerem.",
9797- "SVGs.": "SVGs.",
9898- "SVGs could scale, they supported both text and images, and — most importantly — .F259141963EA4A11F694": "SVGs konnten skalieren, sie unterstützten sowohl Text als auch Bilder, und — was am wichtigsten war — sie konnten **HTML innerhalb von ihnen einbetten**.",
9999- "So I tried something like this:": "Also versuchte ich etwas wie das:",
100100- "Promising! This could actually work!": "Vielversprechend! Das könnte tatsächlich funktionieren!",
101101- "Then I got busy with other things, forgot to debug it, and never returned to thi.9BEE5D08ED4C8C9B33DD": "Dann wurde ich mit anderen Dingen beschäftigt, vergaß, es zu debuggen, und kehrte nie zu dieser Idee zurück.",
102102- "": "Eine gute Idee verwerfen",
103103- "Phase 5: SVGs Within SVGs Within SVGs (Inception Level 100)": "Phase 5: SVGs in SVGs in SVGs (Inception-Stufe 100)",
104104- "When I came back to the project, I was **determined** to make it work.": "Als ich zum Projekt zurückkehrte, war ich **entschlossen**, es zum Laufen zu bringen.",
105105- "I realised that if I couldn’t directly embed HTML into Markdown, I could fake it.8993D07A86C6FB209386": "Ich stellte fest, dass ich, wenn ich HTML nicht direkt in Markdown einbetten konnte, es durch verschachtelte SVGs vortäuschen konnte. (Übrigens ist das massiv vereinfacht; der eigentliche Prozess dauerte Tage, die sich wie Wochen anfühlten, wenn nicht Monate, aber ich weiß, dass du sowieso nichts davon lesen würdest, also wen interessiert's?)",
106106- "And then, after hours of research, I stumbled across a life-changing Stack Overf.B19E66FB6CDC38EB7F45": "Und dann, nach Stunden der Recherche, stieß ich auf eine lebensverändernde Stack Overflow-Antwort:",
107107- "This lead me to the current solution:": "Das führte mich zur aktuellen Lösung:",
108108- "Convert my HTML layout to SVG.": "Mein HTML-Layout nach SVG konvertieren.",
109109- "Encode all images in **Base64** (because GitHub Markdown won’t load external ima.6BA37AFF26936D15AD36": "Alle Bilder in **Base64** codieren (da GitHub-Markdown keine externen Bilder in einem SVG mit HTML lädt).",
110110- "Inline dynamic SVGs (like my GitHub stats, Spotify status, etc.).": "Dynamische SVGs einbetten (wie meine GitHub-Statistiken, Spotify-Status usw.).",
111111- "Automate everything with **GitHub Actions**.": "Alles mit **GitHub Actions** automatisieren.",
112112- "The Grand Finale: The Ultimate GitHub Profile README": "Das große Finale: Das ultimative GitHub-Profil-README",
113113- "A sleek Bento Grid layout, perfectly structured in SVG.": "Ein schlankes Bento-Grid-Layout, perfekt in SVG strukturiert.",
114114- "A live-updating Spotify status, inlined as an SVG.": "Ein live-aktualisierender Spotify-Status, in SVG eingebettet.",
115115- "GitHub stats, dynamically inserted via automation.": "GitHub-Statistiken, dynamisch über Automatisierung eingefügt.",
116116- "Fully responsive, fully scalable, and fully insane to build.": "Vollständig responsiv, vollständig skalierbar und vollkommen verrückt zu erstellen.",
117117- "It updates itself every 5 minutes, runs completely on GitHub Actions, and doesn’.D6DD34ED3B85DAE2F120": "Es aktualisiert sich alle 5 Minuten selbst, läuft vollständig über GitHub Actions und ist unabhängig von externen Diensten. Es ist wunderschön. Es ist effizient. Und am wichtigsten, es ist technisch absurd auf die beste Art und Weise.",
118118- "Take a look at a specific example of the final results at some point back in tim.096EC0AF4A7E3D30CE29": "Schauen Sie sich ein konkretes Beispiel der Endergebnisse irgendwann in der Vergangenheit an.",
119119- "Isn't that bad compared to the [old README.md](https://github.com/trueberryless/.E3E5E0072DF705843179": "Das ist nicht schlecht im Vergleich zum [alten README.md](https://github.com/trueberryless/trueberryless/blob/5dce4ad0033b00829f8ec3756827057017447a65/README.md). Und kommentiere nicht, warum ich K-Pop höre! Es ist besser, als du denkst, glaub mir.",
120120- "Check out the live version on my GitHub [trueberryless](https://github.com/trueb.4FFADA956CF12B9EFE9F": "Sieh dir die Live-Version auf meinem GitHub [trueberryless](https://github.com/trueberryless) an — falls ich beschlossen habe, sie zu behalten... — und folge mir, wenn du schon da bist, falls dir das Lesen gefallen hat! ❤️",
121121- "Final Thoughts: Was It Worth It?": "Abschließende Gedanken: War es das wert?",
122122- "Absolutely.": "Absolut.",
123123- "This journey was frustrating, time-consuming, and filled with more roadblocks th.9E6BE12D4EDD580594EA": "Diese Reise war frustrierend, zeitaufwendig und voller Hindernisse, mit denen ich nie gerechnet hätte. Aber ich habe so viel über SVGs, die Einschränkungen von Markdown, GitHub Actions und Automatisierung gelernt.",
124124- "Would I do it again? Definitely.": "Würde ich es wieder tun? Definitiv.",
125125- "Would I recommend it? Only if you have way too much patience. 😅": "Würde ich es empfehlen? Nur, wenn du eine Menge Geduld hast. 😅",
126126- "But in the end, I created a [GitHub](https://github.com/github) profile README t.2B7EC6933681A24E2F33": "Aber am Ende habe ich ein [GitHub](https://github.com/github)-Profil-README erstellt, das *nicht existieren sollte* — aber es existiert. Und ich liebe es.",
127127- "A short history of Starlight Sidebar Topics plugins": "Eine kurze Geschichte der Starlight Sidebar Topics Plugins",
128128- "In this blog post, I'll show you the evolution of Starlight plugins with a case .4AA6D9FADD1A6BE13985": "In diesem Blogbeitrag zeige ich Ihnen die Entwicklung der Starlight-Plugins anhand einer Fallstudie zum Starlight Sidebar Topics Plugin.",
129129- "In this post, I'll show you the evolution of <a class=\"gh-badge\" href=\"https://g.995EB19ECCFE1867C83C": "In diesem Beitrag zeige ich Ihnen die Entwicklung der <a class=\"gh-badge\" href=\"https://github.com/withastro/starlight\"><img src=\"/starlight.png\" alt=\"Starlight\" />Starlight</a>-Plugins anhand einer Fallstudie des [Starlight Sidebar Topics](https://github.com/hideoo/starlight-sidebar-topics) Plugins. Seien Sie darauf gefasst, beeindruckende Fakten über Menschen und Code rund um Starlight zu entdecken.",
130130- "Maybe you have heard about this cool documentation framework before. I talk abou.5A104B8E7F80C4B25128": "Vielleicht haben Sie schon einmal von diesem coolen Dokumentationsframework gehört. Ich spreche oft darüber und benutze es regelmäßig. Nicht nur, weil ich ein aktiver Mitwirkender bin, sondern auch, weil [Starlight](https://starlight.astro.build) mir einfach ans Herz gewachsen ist. Seine Funktionen: Einfachheit und Minimalismus, aber alles, was man braucht. Seine Leistung: [Schneller als 98 % der anderen Websites](https://www.websitecarbon.com/website/starlight-astro-build-getting-started/). Seine Barrierefreiheit: Keine Frage!",
131131- "The Creation": "Die Entstehung",
132132- "However, one thing that's objectively missing in my opinion is a granular way of.DBB9BD2B7C991AECF1AF": "Eine Sache, die aus meiner Sicht objektiv fehlt, ist eine granulare Möglichkeit, breite Themen in Ihrer Dokumentation zu trennen. Und ich bin nicht allein mit dieser subjektiv allgemein akzeptierten Meinung. [HiDeoo](https://github.com/HiDeoo) ist nicht nur einer der aktivsten Maintainer des Projekts, sondern auch der Autor der meisten und meiner Meinung nach besten Plugins, die man für Starlight finden kann. Und auch ihnen fiel diese fehlende Nischenfunktionalität bei Themen auf. Deshalb haben sie im Oktober 2024, also relativ früh, das [Starlight Sidebar Topics](https://github.com/hideoo/starlight-sidebar-topics) Plugin erstellt, mit dem man eine Seitenleiste mit Themen erstellen kann. Lesen Sie mehr über die Funktionen des Plugins in [der Dokumentation](https://starlight-sidebar-topics.trueberryless.org/).",
133133- "The one thing that bothered me personally in the early days of the plugin was th.6F5F49BB9B5B06675F60": "Das Einzige, was mich in den frühen Tagen des Plugins persönlich gestört hat, war die Art und Weise, wie die Themen in der Seitenleiste angezeigt wurden. Es verwendet - im Gegensatz zu der von mir vorgestellten Lösung - keine Art Dropdown-Menü zum Wechseln zwischen Themen, sondern zeigt stattdessen immer alle Themen an. Diese Designentscheidung war, wie [HiDeoo klar hervorhebt](https://github.com/HiDeoo/starlight-sidebar-topics/issues/2#issuecomment-2410196392), sehr bewusst und nicht ohne Grund: Alle Themen sollen auf einmal sichtbar sein. Bewiesen durch die [Astro](https://github.com/withastro) Dokumentation selbst ([Chris Swithinbank](https://github.com/delucis) implementierte die [\"Tab-Leiste\"](https://github.com/withastro/docs/pull/9890) für die Astro v5 Dokumentation später im selben Monat), hat dieser Ansatz definitiv viele Vorteile gegenüber einem Dropdown-Menü. Dennoch war ich weiterhin mit diesem Design unzufrieden, und so habe ich meine eigene Version erstellt.",
134134- "Copying and pasting was my strength when it came to building a new Starlight plu.860638CCB2BA61F003E9": "Kopieren und Einfügen war meine Stärke, wenn es darum ging, ein neues Starlight-Plugin für die Community zu erstellen. Und so habe ich es einfach getan. Ich nahm das Starlight Sidebar Topics Plugin als Ausgangspunkt und musste nur das `Topics.astro`-Komponente anpassen, das das HTML für die Darstellung der Themen in der Seitenleiste enthält. Nachdem ich einige Zeit damit gekämpft hatte, ein zufriedenstellendes Dropdown-Menü zu implementieren, das nur aus HTML und CSS bestand, aber auch optisch ansprechend war (Entschuldigung für das Eigenlob, ich bin einfach stolz auf mich), habe ich endlich eine Lösung gefunden, mit der ich sehr zufrieden bin, und habe dieses neue Plugin unter dem Namen [Starlight Sidebar Topics Dropdown](https://github.com/trueberryless-org/starlight-sidebar-topics-dropdown) veröffentlicht - wie originell.",
135135- "The Adaptation": "Die Anpassung",
136136- "You might think that this story is now over because everyone could just use the .B22BDA5C191E4AEC54CE": "Man könnte denken, dass diese Geschichte jetzt zu Ende ist, weil jeder einfach die Variante verwenden könnte, die er möchte, und jeder glücklich ist. Aber Starlight hat sich kontinuierlich verbessert, und etwa drei Monate später, am 15. Februar, wie ein [Geburtstagsgeschenk](https://trueberryless.org/work/20th-birthday/) für mich, kam die langersehnte Hinzufügung von Routen-Daten in Starlight mit der Veröffentlichung von [v0.32](https://github.com/withastro/starlight/releases/tag/@astrojs/starlight@0.32.0). Diese scheinbar kleine Ergänzung eröffnete so viele Möglichkeiten, die ich selbst nie vorausgesehen habe. HiDeoo war erneut die treibende Inspirationsquelle für Plugin-Autoren und nutzte diese neue Funktionalität voll aus. Es dauerte nur zwei Tage, um [über 11 Plugins an die neueste Starlight-Version anzupassen](https://bsky.app/profile/hideoo.dev/post/3liffpudc5c2b), und später verbesserten und überarbeiteten sie viel vom Code, um diese leistungsstarke Funktion noch besser zu nutzen.",
137137- "And so comes the day when HiDeoo contacts me to tell me that the Starlight Sideb.CB4E9F542FB4DC96204E": "Und so kam der Tag, an dem HiDeoo mich kontaktierte, um mir mitzuteilen, dass das Starlight Sidebar Topics Plugin nun die neue Routen-Daten-Funktion von Starlight nutzt. Zuerst verstand ich nicht ganz, welchen Nutzen diese Implementierungsänderungen haben würden, aber dann nahm sich HiDeoo die Zeit, mir zu erklären, dass ich das Starlight Sidebar Topics Dropdown Plugin jetzt in eine einfache Komponente umwandeln könnte, die die Routen-Daten aus seinem Plugin verwendet. Intuitiv war ich gegen diese clevere Idee, weil es sich anfühlte, als würde mein einziges Plugin, das etwas Popularität erlangt hatte, in eine nutzlose Komponente verwandelt. Ich hätte nicht weiter von der Wahrheit entfernt sein können.",
138138- "The Union": "Die Vereinigung",
139139- "Eventually, I decided to refactor my plugin into a component - this refactoring .4324540ABE36305F27C5": "Schließlich beschloss ich, mein Plugin in eine Komponente umzuwandeln - diese Umstrukturierung eliminierte beiläufig genau [1210 Zeilen Code und fügte 68 Änderungsprotokollzeilen hinzu](https://github.com/trueberryless-org/starlight-sidebar-topics-dropdown/pull/40) - und ich bemerkte, wie wenig Code es jetzt erforderte, um die `Topics.astro` Liste aus der Perspektive eines Nutzers in ein Dropdown zu verwandeln. Ich war zuversichtlich, dass dies wirklich die richtige Richtung für die ~~Plugin~~ Komponente war. Also aktualisierte ich die gesamte Dokumentation - eher: löschte über 200 Zeilen Text (fühlt sich gut an) - und veröffentlichte die neue [Version 0.5](https://github.com/trueberryless-org/starlight-sidebar-topics-dropdown/releases/tag/starlight-sidebar-topics-dropdown%400.5.0).",
140140- "Now you might wonder how such mature plugins could still improve over time. To b.8F9AABD213A178EFB11C": "Jetzt fragen Sie sich vielleicht, wie solch ausgereifte Plugins sich noch weiter verbessern können. Um ehrlich zu sein, ich selbst war sehr überrascht, als HiDeoo mir beiläufig eine Bombe in meine Discord-DMs fallen ließ. Seine Idee war und ist immer noch genial. Andernfalls würde ich nicht einmal mehr an dieses *Thema* denken. Aber hier bin ich und schreibe satte 800 Worte, nur um Sie auf das kommende vorzubereiten. Trommelwirbel bitte! Anschnallen! Diese Aussage von HiDeoo wird Sie umhauen:",
141141- "\"One could have something like the default built-in list on a desktop view, and .D9D8BC0B8C5FADE63015": "„Man könnte auf einer Desktop-Ansicht etwas wie die standardmäßig eingebaute Liste und auf mobilen Geräten Ihre Komponente oder so etwas verwenden 🧠“ — HiDeoo, 21/03/2025 09:54",
142142- "Profound. Timeless. Golden.": "Tiefgründig. Zeitlos. Golden.",
143143- "And that single, beautiful spark of an idea? It’s precisely what I’ll guide you .D5B772B8E2ED479D7F54": "Und diese einzige, wunderschöne Idee? Genau darüber werde ich Ihnen im Beitrag [„Starlight Topics Dropdown und List zusammen“](/blog/starlight-dropdown-and-list-together/) berichten.",
144144- "How to make your Starlight sidebar items look better": "Wie Sie die Elemente Ihrer Starlight-Seitenleiste verbessern können",
145145- "In this blog post, we'll take a look at how small changes can make a big differe.710EB546A7825319B5BD": "In diesem Blogbeitrag werfen wir einen Blick darauf, wie kleine Änderungen bei Leerzeichen, Schriftgrößen, -gewichten und -farben in Ihrer Starlight-Seitenleiste einen großen Unterschied machen können.",
146146- "In this blog post, we'll take a look at how small changes can make a big differe.91CB4D1869F959776162": "In diesem Blogbeitrag werfen wir einen Blick darauf, wie kleine Änderungen bei Leerzeichen in Ihrer <a class=\"gh-badge\" href=\"https://github.com/withastro/starlight\"><img src=\"/starlight.png\" alt=\"Starlight\" />Starlight</a>-Seitenleiste einen großen Unterschied machen können.",
147147- "Have you ever wondered why your [Starlight][starlight] sidebar doesn't look that.1641BC1FAEE439920C90": "Haben Sie sich jemals gefragt, warum Ihre [Starlight][starlight]-Seitenleiste nicht so ansprechend aussieht? Wussten Sie, wie wichtig der Platz zwischen den Elementen in Ihrer Seitenleiste unbewusst ist? Die Schriftgröße, das Gewicht und kleine Farbabstufungen? In diesem Leitfaden werfen wir einen Blick darauf, wie Sie das Erscheinungsbild Ihrer Starlight-Seitenleiste mit ein paar schnellen und einfachen Schritten anpassen können.",
148148- "Prerequisites": "Voraussetzungen",
149149- "First, you need to [set up your Starlight site][starlight-getting-started]. Afte.DF558576AB082588D034": "Zuerst müssen Sie Ihre [Starlight-Seite einrichten][starlight-getting-started]. Anschließend bietet Starlight einen [Leitfaden zur Anpassung von Stilen, die auf Ihre Starlight-Seite angewendet werden][starlight-css], und genau dieses Feature werden wir heute verwenden.",
150150- "As described in [this guide][starlight-css-custom], you need to create a `.css` .0CD83940C89F2D1185A1": "Wie in [diesem Leitfaden][starlight-css-custom] beschrieben, müssen Sie eine `.css`-Datei irgendwo in Ihrem `src/`-Verzeichnis erstellen, in der Sie Ihre CSS-Stile definieren können. Vergessen Sie nicht, den Pfad zu dieser `.css`-Datei in Starlight's `customCss`-Array in `astro.config.mjs` hinzuzufügen:",
151151- "After completing these preparation steps, you are ready to try out some nice adj.DE7E5B1DE51E76B69982": "Nach Abschluss dieser Vorbereitungsschritte sind Sie bereit, einige schöne Anpassungen am Design der Starlight-Seitenleiste auszuprobieren.",
152152- "Customizations": "Anpassungen",
153153- "There are endless different possibilities that you can play around with just wit.315492DDFA6948DAD882": "Es gibt unendlich viele Möglichkeiten, mit Ihrem benutzerdefinierten CSS zu experimentieren. Ich werde Ihnen einige Ideen geben, die ich selbst beim Spielen mit dem Design der Seitenleiste sehr hilfreich fand. Auch wenn einige dieser Ideen für Sie albern erscheinen mögen, verspreche ich, dass die Kombination einiger davon Ihre Starlight-Seitenleiste noch besser aussehen lassen wird.",
154154- "One thing to note though is that in this blog post the focus lies on adjusting t.157A7D5F675513D49CA2": "Eine Sache, die zu beachten ist: In diesem Blogbeitrag liegt der Fokus auf der Anpassung des Stils von **Elementen auf Root-Ebene** (diejenigen ohne Unterelemente) in der Seitenleiste.",
155155- "But before I do that, I'll show you how the default styling of the Starlight sid.935D4EBD7A75949003B6": "Aber bevor ich das tue, zeige ich Ihnen, wie das Standarddesign der Starlight-Seitenleiste derzeit aussieht:",
156156- "": "Starlight-Seitenleiste mit abgeschwächten Farben",
168168- "Adjust the font size of sidebar items": "Anpassen der Schriftgröße der Seitenleisten-Elemente",
169169- "Although I don't recommend it, you can also adjust the font size of sidebar item.5B666452173153740723": "Obwohl ich es nicht empfehle, können Sie auch die Schriftgröße der Seitenleisten-Elemente anpassen. Mit diesem Beispiel benutzerdefinierten CSS unten habe ich die Schriftgröße der Elemente auf Root-Ebene verkleinert.",
170170- " einen sauberen horizontalen Fortschrittsanzeiger für Starlight-Websites erstellt hat.",
178178- "You will need to have an existing Starlight website.": "Sie benötigen eine bestehende Starlight-Website.",
179179- "Create the progress indicator component": "Erstellen Sie die Fortschrittsanzeiger-Komponente",
180180- "Let's create a new component called `ProgressIndicator.astro` in the `src/compon.3AF2A56DBB850F8660D1": "Lassen Sie uns eine neue Komponente namens `ProgressIndicator.astro` im Verzeichnis `src/components/` erstellen. Diese Komponente ist für die Darstellung des Fortschrittsanzeigers zuständig.",
181181- "We create a container which spans across the whole width with the progress bar `.BF53914FAF1D12F4D39C": "Wir erstellen einen Container, der sich über die gesamte Breite erstreckt, mit der Fortschrittsleiste `<div>` darin. Die Breite des inneren `<div>` wird aktualisiert, wann immer der Benutzer scrollt (und beim Laden der Seite), um die aktuelle Scrollposition widerzuspiegeln.",
182182- "In the hidden lines is the styling which makes sure that the progress bar looks .D3205B85D528FA0A2D8A": "In den ausgeblendeten Zeilen befindet sich das Styling, das sicherstellt, dass die Fortschrittsleiste wie eine typische Fortschrittsleiste aussieht. Sie ist auch an Starlight angepasst, da die Leiste automatisch ausgeblendet wird, wenn die Website keine Seitenleiste und Inhaltsverzeichnis, aber ein Hero-Element hat, wie es die meisten Landing Pages tun.",
183183- "One thing to point out is what the global CSS (line 45) does: It pushes the mobi.9D93B4CCEB69834E52E2": "Eine Sache, die hervorzuheben ist, ist, was das globale CSS (Zeile 45) bewirkt: Es schiebt das Dropdown-Menü des mobilen Inhaltsverzeichnisses nach unten, um mehr Abstand zur Fortschrittsleiste zu schaffen. Dies ist eine persönliche Präferenz, die Sie entfernen können, wenn Sie möchten.",
184184- "Starlight Override": "Starlight-Override",
185185- "Now we can use this component in a [Starlight override](https://starlight.astro..BD7A14DF6609C76376D6": "Nun können wir diese Komponente in einem [Starlight-Override](https://starlight.astro.build/guides/overriding-components/) verwenden. In diesem Fall macht es Sinn, die [`Header.astro`-Komponente](https://starlight.astro.build/reference/overrides/#header-1) wie folgt zu überschreiben:",
186186- "Do not forget to add this component override to your `astro.config.mjs` file:": "Vergessen Sie nicht, dieses Komponenten-Override in Ihre `astro.config.mjs`-Datei aufzunehmen:",
187187- "Source Code": "Quellcode",
188188- "You can find the whole project code on [GitHub](https://github.com/trueberryless.F650372F9DC07B1F43E8": "Sie können den gesamten Projektcode auf [GitHub](https://github.com/trueberryless/starlight-progress-indicator) und in diesem [Stackblitz-Beispiel](https://stackblitz.com/github/trueberryless/starlight-progress-indicator?file=src%2Fcomponents%2FProgressIndicator.astro) finden.",
189189- "Conclusion": "Fazit",
190190- "With this setup, the progress indicator will be displayed on every page (except .14DF840C82B37252652E": "Mit dieser Konfiguration wird der Fortschrittsanzeiger auf jeder Seite (außer Landing Pages) Ihrer Starlight-Website angezeigt. 🥳",
191191- "You can also check out [FrostyBee's](https://github.com/frostybee) [Starlight Sc.2885FB180F098A43BD51": "Sie können auch das [Starlight Scroll To Top Plugin](https://github.com/frostybee/starlight-scroll-to-top) von [FrostyBee](https://github.com/frostybee) ausprobieren, das seit Version `0.3.1` auch einen integrierten [Fortschrittsring](https://frostybee.github.io/starlight-scroll-to-top/configuration/#showprogressring) unterstützt. 🙌",
192192- "Starlight Topics Dropdown and List together": "Starlight Themen-Dropdown und Liste zusammen",
193193- "Learn how to combine a desktop list and mobile dropdown for your Starlight sideb.E44A5587DB1652DE8801": "Erfahren Sie, wie Sie eine Desktop-Liste und ein mobiles Dropdown-Menü für die Starlight-Sidebar-Themen kombinieren.",
194194- "Combine two <a class=\"gh-badge\" href=\"https://github.com/withastro/starlight\"><i.F2B401A419A027863D20": "Kombinieren Sie zwei <a class=\"gh-badge\" href=\"https://github.com/withastro/starlight\"><img src=\"/starlight.png\" alt=\"Starlight\" />Starlight</a> Sidebar Topics Plugins, um eine Themenliste auf dem Desktop und ein Dropdown-Menü in der mobilen Sidebar anzuzeigen.",
195195- "Using the [Starlight Sidebar Topics](https://github.com/hideoo/starlight-sidebar.7183C62B96DBF9A43128": "Mit dem [Starlight Sidebar Topics](https://github.com/hideoo/starlight-sidebar-topics) Plugin zusammen mit der [Starlight Sidebar Topics Dropdown](https://github.com/trueberryless-org/starlight-sidebar-topics-dropdown) Komponente können Sie eine Website erstellen, die eine Themenliste auf dem Desktop und ein Dropdown-Menü auf mobilen Geräten bietet.",
196196- "Install the packages": "Pakete installieren",
197197- "First, install the `starlight-sidebar-topics` plugin and also the `starlight-sid.6A32241A1C081FF4DD1C": "Zuerst installieren Sie das `starlight-sidebar-topics` Plugin sowie die `starlight-sidebar-topics-dropdown` Komponente:",
198198- "Afterwards, follow the setup guides from [Starlight Sidebar Topics](https://star.D6EC61B940DA777E2BEB": "Anschließend folgen Sie den Einrichtungsanleitungen von [Starlight Sidebar Topics](https://starlight-sidebar-topics.trueberryless.org/docs/getting-started/#installation) und [Starlight Sidebar Topics Dropdown](https://starlight-sidebar-topics-dropdown.trueberryless.org/docs/getting-started/#installation).",
199199- "Modify the Sidebar component": "Die Sidebar-Komponente anpassen",
200200- "In the setup guide from the dropdown component, you have created a sidebar compo.BD6B58F9BEEFEE582749": "In der Einrichtungsanleitung der Dropdown-Komponente haben Sie eine Sidebar-Komponente erstellt, die nur das Dropdown-Menü rendert. Nun müssen Sie diese Komponente anpassen, sodass sie auch die Standard-Sidebar rendert, wenn der Benutzer am Desktop ist.",
201201- "Result": "Ergebnis",
202202- "If you follow these steps, your sidebar will look like this:": "Wenn Sie diese Schritte befolgen, sieht Ihre Sidebar folgendermaßen aus:",
203203- ".",
205205- "Endless possibilities": "Unbegrenzte Möglichkeiten",
206206- "You could also do it the other way around (list on mobile, dropdown on desktop) .6BA6A2F32E24F0FB3A00": "Sie könnten es auch umgekehrt machen (Liste auf mobilen Geräten, Dropdown auf dem Desktop), indem Sie die CSS-Eigenschaften `display: block` und `display: none` tauschen.",
207207- "Moreover, you could also create your own display component, which uses the route.7237A9BCDFBA80A2B459": "Darüber hinaus könnten Sie auch eine eigene Anzeige-Komponente erstellen, die die Routendaten aus dem Starlight Sidebar Topics Plugin verwendet und die Themen auf eine benutzerdefinierte Weise rendert. Das ist etwas anspruchsvoller, aber Sie finden weitere Informationen dazu in der [\"Custom Topics List\"-Dokumentation](https://starlight-sidebar-topics.trueberryless.org/docs/guides/custom-topic-list/).",
208208- "Setting up Kubernetes with Cilium and Cloudflare": "Einrichten von Kubernetes mit Cilium und Cloudflare",
209209- "Today we'll take a look at how to set up a Kubernetes cluster with K3s and Ciliu.651207C3314901C11632": "Heute schauen wir uns an, wie man ein Kubernetes-Cluster mit K3s und Cilium einrichtet.",
210210- "This blog posts describes the process of setting up a <a class=\"gh-badge\" href=\".E82478488BD3E7D9E2C2": "Dieser Blogpost beschreibt den Prozess der Einrichtung eines <a class=\"gh-badge\" href=\"https://github.com/kubernetes\"><img src=\"https://github.com/kubernetes.png\" alt=\"Kubernetes\" />Kubernetes</a>-Clusters mit <a class=\"gh-badge\" href=\"https://github.com/k3s-io\"><img src=\"https://github.com/k3s-io.png\" alt=\"k3s\" />k3s</a> und <a class=\"gh-badge\" href=\"https://github.com/cilium\"><img src=\"https://github.com/cilium.png\" alt=\"Cilium\" />Cilium</a>. Wir verwenden <a class=\"gh-badge\" href=\"https://github.com/helm\"><img src=\"https://github.com/helm.png\" alt=\"Helm\" />Helm</a> als Paketmanager und <a class=\"gh-badge\" href=\"https://github.com/cloudflare\"><img src=\"https://github.com/cloudflare.png\" alt=\"Cloudflare\" />Cloudflare</a> als Zertifikataussteller. Wir haben die Tipps und Tricks von Vegard S. Hagen aus [seinem Artikel](https://blog.stonegarden.dev/articles/2024/02/bootstrapping-k3s-with-cilium/) genutzt. Im Wesentlichen erklärt dieser Blog, wie alle trueberryless.org-Webseiten bereitgestellt wurden (nicht mehr).",
211211- "Working with [Docker](https://github.com/docker) Containers can be hard. However.1CC6942704DAE062A463": "Die Arbeit mit [Docker](https://github.com/docker)-Containern kann schwierig sein. Es gibt jedoch Tools, die das Management von Containern verbessern, wie [Kubernetes](https://github.com/kubernetes). Tatsächlich ist Kubernetes meines Wissens das einzige Tool, das als Management-Software für Docker-Container fungiert. Kubernetes ist in fast allen Cloud-Anbietern wie Google Cloud, Azure und AWS gut integriert. Dadurch hat es eine standardisierte `yaml`-Syntax, was für kleine Entwickler großartig ist, da sie mit geringem Aufwand zwischen `The Big Three` wechseln können.",
212212- "tl;dr": "tl;dr",
213213- "Install everything and then apply cert-manager. ez": "Alles installieren und dann cert-manager anwenden. Ganz einfach.",
214214- "Install k3s": "k3s installieren",
215215- "As Hagen explains in [his article](https://blog.stonegarden.dev/articles/2024/02.D5EDD5BC9C49780444EF": "Wie Hagen in [seinem Artikel](https://blog.stonegarden.dev/articles/2024/02/bootstrapping-k3s-with-cilium/) erklärt, möchten wir `k3s` ohne Konfigurationen und mit deaktivierten Komponenten installieren. Er beschreibt im Detail, welche Komponenten nicht installiert werden.",
216216- "After the installation, there should be some pods running (3). Don't be shocked .56BB9C3C1CCEDAFADEDB": "Nach der Installation sollten einige Pods laufen (3). Nicht schockiert sein, wenn die Pods im Status `ContainerCreating` oder `Pending` sind. Das liegt daran, dass die Pods nicht miteinander kommunizieren können, da wir das CNI deaktiviert haben (`--flannel-backend=none`). Später werden wir [Cilium](https://github.com/cilium) installieren, welches das Flannel-CNI ersetzen wird.",
217217- "Install Helm": "Helm installieren",
218218- "Helm is the package manager for [Kubernetes](https://github.com/kubernetes), so .B3313537E64D4FFE6667": "Helm ist der Paketmanager für [Kubernetes](https://github.com/kubernetes). Sie können es entweder direkt installieren (siehe die [Helm-Dokumentation](https://helm.sh/docs/intro/install/)) oder Teile von Helm verwenden, die mit Cilium ausgeliefert werden. Wir haben uns entschieden, Helm direkt zu installieren, was mit folgendem Befehl problemlos möglich ist:",
219219- "Install Cilium": "Cilium installieren",
220220- "[Cilium](https://github.com/cilium) is a networking and security software for Ku.F7DC9A96105A082EC9DB": "[Cilium](https://github.com/cilium) ist eine Netzwerk- und Sicherheitssoftware für Kubernetes. Cilium ist sehr schnell, skalierbar und sicher, da es auf eBPF basiert -- einer revolutionären Technologie, die sandboxed Programme im Linux-Kernel ausführen kann, ohne den Kernel neu zu kompilieren oder Kernelmodule zu laden.",
221221- "We could install Cilium with Helm like shown here:": "Wir könnten Cilium mit Helm wie hier gezeigt installieren:",
222222- "However, we wanted to install with their CLI and this is how you can do it. Firs.551EA48947BA4759E483": "Wir wollten es jedoch mit deren CLI installieren, und so funktioniert das. Zuerst installieren Sie die Cilium-CLI, indem Sie diesen Code-Schnipsel ausführen:",
223223- "Then you can install Cilium with your Server IP-Address:": "Anschließend können Sie Cilium mit Ihrer Server-IP-Adresse installieren:",
224224- "Now we wait until Cilium says, everything is `OK` or `disabled`:": "Jetzt warten wir, bis Cilium meldet, dass alles `OK` oder `disabled` ist:",
225225- "After a while, all pods should be `Running`.": "Nach einer Weile sollten alle Pods im Status `Running` sein.",
226226- "Last but not least, you can apply some resources for Cilium:": "Zu guter Letzt können Sie einige Ressourcen für Cilium anwenden:",
227227- "Additionally you should upgrade the cilium config. In order to do that with the .B2C737654644F532072A": "Außerdem sollten Sie die Cilium-Konfiguration aktualisieren. Um dies mit den richtigen Werten zu tun, erstellen Sie zunächst diese Datei im Root-Verzeichnis, in dem Sie das k3s-Cluster verwalten möchten. Später können Sie auch einige hubble- und prometheus-bezogene Eigenschaften hinzufügen, wenn Sie [Grafana](https://github.com/Grafana) oder Ähnliches verwenden möchten (öffnen Sie die ausgeblendeten Zeilen, wenn Sie unsere Konfiguration ebenfalls verwenden möchten).",
228228- "Run this command to upgrade:": "Führen Sie diesen Befehl aus, um ein Upgrade durchzuführen:",
229229- "Setup Certificate Manager with Cloudflare": "Zertifikatsmanager mit Cloudflare einrichten",
230230- "In order to be able to create certificates for each subdomain, it is important t.412EB3BCACB9EA434592": "Um in der Lage zu sein, Zertifikate für jede Subdomain zu erstellen, ist es wichtig, einen Zertifikatsaussteller anzuwenden, der Zertifikatsanfragen bearbeitet und sie bei einem Anbieter einlöst. Wir haben [Cloudflare](https://github.com/cloudflare) als unseren Aussteller gewählt, und hier ist die Konfiguration, die Sie auf Ihr Kubernetes-Cluster anwenden müssen. Weitere Informationen finden Sie in der [cert-manager-Dokumentation](https://cert-manager.io/docs/configuration/acme/dns01/cloudflare/).",
231231- "But first, we need to install the cert-manager by running the following command:.2C3AE967A1D1E33B0CFD": "Zuerst müssen wir den cert-manager installieren, indem wir den folgenden Befehl ausführen:",
232232- "You can apply a file to the [Kubernetes](https://github.com/kubernetes) cluster,.7C198D3247CB04A61DD9": "Sie können eine Datei auf den [Kubernetes](https://github.com/kubernetes)-Cluster anwenden, indem Sie diesen k8s- (oder k3s-) Befehl ausführen:",
233233- "If you want to delete the resource in the Kubernetes cluster, the command is pre.13785BDE8535FD743BB9": "Wenn Sie die Ressource im Kubernetes-Cluster löschen möchten, ist der Befehl ziemlich einfach:",
234234- "As you may have spotted above, we also need a secret for the API token which aut.EED50E553247233483D4": "Wie Sie oben vielleicht bemerkt haben, benötigen wir auch ein Geheimnis für das API-Token, das die Authentifizierung durchführt, dass dieser Issuer berechtigt ist, Zertifikate anzufordern. Daher erstellen wir ein Geheimnis mit einem unverschlüsselten `API Token` von Cloudflare.",
235235- "Nowadays we create a token by going to your [Cloudflare](https://github.com/clou.29311654A42391586C43": "Heutzutage erstellen wir ein Token, indem wir zu Ihrem [Cloudflare](https://github.com/cloudflare)-Dashboard gehen, dann auf Ihr Profil klicken und die Registerkarte `API Tokens` auswählen. Hier können Sie ein spezifisches Token für Ihren Issuer generieren oder den globalen API-Schlüssel (nicht mehr empfohlen) verwenden. Die empfohlene Lösung ist, ein API-Token mit zwei Berechtigungen (benutzerdefiniertes Token) zu erstellen:",
236236- "Zone - DNS - Edit": "Zone - DNS - Bearbeiten",
237237- "Zone - Zone - Read": "Zone - Zone - Lesen",
238238- "": "Cloudflare-API-Token",
239239- "A more detailed description about the tokens, can be found in the [Cloudflare do.1F2C806B3988F77EF2CC": "Eine detailliertere Beschreibung der Tokens finden Sie in den [Cloudflare-Dokumenten](https://developers.cloudflare.com/fundamentals/api/get-started/create-token/).",
240240- "After applying this secret to Kubernetes, the issuer should be ready to resolve .6908E4EC999AC0DCA147": "Nachdem Sie dieses Geheimnis auf Kubernetes angewendet haben, sollte der Issuer bereit sein, unangenehme Fälle zu lösen!",
241241- "You can now use this issuer by applying this file which will hopefully create a .7987E8195B3DBB4AB6A9": "Sie können diesen Issuer jetzt verwenden, indem Sie diese Datei anwenden, die hoffentlich ein Zertifikat erstellt:",
242242- "It usually takes around 90 seconds to authenticate the request once applied. You.523D684039CD86DF5B8E": "Normalerweise dauert es etwa 90 Sekunden, um die Anfrage nach dem Anwenden zu authentifizieren. Sie können den aktuellen Status der Anfrage überprüfen, indem Sie diesen Kubernetes-Befehl ausführen.\nWenn es länger als 2 Minuten dauert, können möglicherweise einige Tipps unter [#Fehlerbehebung](#no-cloudflare-certificate-approval) hilfreich sein.",
243243- "The `-n` option stands for namespace.": "Die Option `-n` steht für Namespace.",
244244- "## Example app [`mutanuq`](https://mutanuq.trueberryless.org)": "Beispielanwendung [`mutanuq`](https://mutanuq.trueberryless.org)",
245245- "Then you can use this certificate in your Ingress controller:": "Dann können Sie dieses Zertifikat in Ihrem Ingress-Controller verwenden:",
246246- "Setup Keel": "Einrichtung von Keel",
247247- "We always wanted a clean Continuous Integration (CI) and Continuous Delivery (CD.5A7C877EE9C3CC7E2E7A": "Wir wollten schon immer eine saubere Continuous Integration (CI) und Continuous Delivery (CD) Lösung für unsere Websites. Das bedeutet, dass eine spezifische Commit-Nachricht einen automatisierten Prozess über [GitHub](https://github.com/github), Docker Hub und unseren Server auslösen sollte, der am Ende die entsprechende Website nach etwa zwei Minuten aktualisiert.",
248248- "Keel is a robust software tool which enables this feature for Kubernetes. We use.782AFBD621B2DB555C2D": "Keel ist ein robustes Software-Tool, das diese Funktion für Kubernetes ermöglicht. Wir haben Keel verwendet, um neue Docker-Images von Docker Hub durch regelmäßige Abfragen zu holen. Außerdem bietet Keel ein schönes Dashboard, auf dem Sie die Abfragen steuern können.",
249249- "In order to set up Keel with the admin dashboard, we created those files:": "Um Keel mit dem Administrations-Dashboard einzurichten, haben wir folgende Dateien erstellt:",
250250- "`secret-dashboard.yaml` for the Admin Username and Password (not everyone should.BC266314D27DCB36F4CB": "`secret-dashboard.yaml` für den Admin-Benutzernamen und das Passwort (nicht jeder sollte auf das Dashboard zugreifen können)",
251251- "`keel.yaml` for the actual k3s configs (copied and adapted from [KeelHQ](https:/.F8A38C5FC9A4505AF62C": "`keel.yaml` für die eigentlichen k3s-Konfigurationen (kopiert und angepasst von [KeelHQ](https://github.com/keel-hq/keel/blob/9f0a7160bbdc3a107ad148933a4269f30e4e479c/deployment/deployment-template.yaml))",
252252- "After applying both files and managing the additional certificate for `keel.true.30388E288EFFF1AD00F9": "Nachdem beide Dateien angewendet und das zusätzliche Zertifikat für `keel.trueberryless.org` verwaltet wurden, funktioniert das Keel-Dashboard perfekt. Darüber hinaus kann jedes Kubernetes-`Deployment` für automatisiertes Docker-Hub-Polling durch Setzen einiger Annotationen aktiviert werden:",
253253- "Celebrate with a Coffee!": "Feiern Sie mit einem Kaffee!",
254254- "Congratulations, you've successfully set up [Kubernetes](https://github.com/kube.C26D3423275F0054D782": "Herzlichen Glückwunsch, Sie haben erfolgreich [Kubernetes](https://github.com/kubernetes) mit [Cilium](https://github.com/cilium) und [Cloudflare](https://github.com/cloudflare) eingerichtet! Sie haben sich eine Kaffeepause verdient. Genießen Sie eine wohlverdiente Tasse, und wenn Sie mit mir virtuell einen Kaffee teilen möchten, können Sie meine Arbeit gerne auf [Ko-fi](https://ko-fi.com/trueberryless) unterstützen. Vielen Dank!",
255255- "Troubleshooting": "Fehlerbehebung",
256256- "Cilium-ingress has no External-IP": "Cilium-Ingress hat keine External-IP",
257257- "Make sure that the `ip-pool` includes the address specified by the annotations i.4E44377E5C9AC3845ED3": "Stellen Sie sicher, dass der `ip-pool` die in der Datei `config.yaml` angegebenen Adressen enthält.",
258258- "Also in some cases, other ingress controllers get the annotated address before t.16FB14B27C64B47E0869": "In einigen Fällen nehmen andere Ingress-Controller die annotierte Adresse, bevor der Cilium IC darauf zugreifen kann, sodass sie weiterhin ausstehend ist...",
259259- "If you don't deploy locally but on one of `The Big Three`, please check out some.4CF2A8E1AE1127E8E9D5": "Wenn Sie nicht lokal, sondern auf einer der `Big Three` bereitstellen, schauen Sie bitte in andere Dokumentationen nach, warum die External IP weiterhin ausstehend ist. Es liegt meistens in deren Verantwortung, Ihnen eine Adresse bereitzustellen.",
260260- "No Cloudflare Certificate Approval": "Keine Cloudflare-Zertifikatsgenehmigung",
261261- "There can be some problem when the certificate won't get approved by Cloudflare..21242D4E500A87FE26A2": "Es kann Probleme geben, wenn das Zertifikat von Cloudflare nicht genehmigt wird.",
262262- "Wrong API token": "Falsches API-Token",
263263- "First make sure that the Cloudflare API token is correct. To make 100 percent su.BE3E293E05F70A765669": "Stellen Sie zunächst sicher, dass das Cloudflare API-Token korrekt ist. Erstellen Sie zur hundertprozentigen Sicherheit ein neues und fügen Sie es (nicht Base64-codiert) in diese Datei ein:",
264264- "Max auth failures reached": "Maximale Authentifizierungsfehler erreicht",
265265- "We once ran into the error `Error: 9109: Max auth failures reached, please check.661EAA2B42757CBB4C1D": "Wir sind einmal auf den Fehler `Error: 9109: Max auth failures reached, please check your Authorization header.` gestoßen. Warten Sie einfach ein paar Stunden, löschen Sie die Ressource und wenden Sie sie erneut an:",
266266- "Hopefully, you're now good to go!": "Hoffentlich können Sie jetzt loslegen!",
267267- "Setting up Continuous deployment in a GitHub repository": "Einrichten der kontinuierlichen Bereitstellung in einem GitHub-Repository",
268268- "Today we'll take a look at how to set up a GitHub repository which will be deplo.210AF277FD26683FD09E": "Heute schauen wir uns an, wie man ein GitHub-Repository einrichtet, das über Argo CD auf einem k3s-Cluster bereitgestellt wird.",
269269- "Today we'll take a look at how to set up a <a class=\"gh-badge\" href=\"https://git.A040D5A396CEA3FE8E47": "Heute schauen wir uns an, wie man ein <a class=\"gh-badge\" href=\"https://github.com/github\"><img src=\"https://github.com/github.png\" alt=\"github\" />GitHub</a>-Repository einrichtet, das über Argo CD auf einem k3s-Cluster bereitgestellt wird. Zusammenfassend wird der Artikel Workflow-Dateien, eine Dockerfile, Manifeste (Deployment) und <a class=\"gh-badge\" href=\"https://github.com/docker\"><img src=\"https://github.com/docker.png\" alt=\"Docker Hub\" />Docker Hub</a>-Repositories umfassen. Bitte werfen Sie einen Blick auf [unseren Argo CD Blog](./setup-argocd-for-kubernetes), da dies eine Fortsetzung des anderen Beitrags ist.",
270270- "In today's post, we'll take a quick look at how to set up continuous deployment .837E00D0E73247CB97BC": "Im heutigen Beitrag werfen wir einen kurzen Blick darauf, wie man eine kontinuierliche Bereitstellung in einem [GitHub](https://github.com/github)-Repository einrichtet. Wir sind uns ziemlich sicher, dass dieses Setup auch mit anderen Git-Registrys funktioniert. Beachten Sie jedoch, dass sich dieser Beitrag ausschließlich auf GitHub konzentriert.",
271271- "This post also assumes that you use [GitHub](https://github.com/github) Actions .5387D30E9AFCFCF33E71": "Dieser Beitrag setzt voraus, dass Sie [GitHub](https://github.com/github)-Actions in Kombination mit Argo CD verwenden, um Ihre Anwendungen auf einem Kubernetes-Cluster bereitzustellen. Folgen Sie unseren anderen [Bereitstellungsbeiträgen](/blog/tags/deployment), um weitere Anleitungen zur Einrichtung beider Technologien auf Ihrem persönlichen Server zu erhalten.",
272272- "Preparations": "Vorbereitungen",
273273- "We recommend creating a [Docker Hub](https://hub.docker.com/) account or choose .D653C06B296243188634": "Wir empfehlen, ein [Docker Hub](https://hub.docker.com/)-Konto zu erstellen oder ein anderes Docker-Registry Ihrer Wahl zu nutzen.",
274274- "Your GitHub repository must fulfil these conditions:": "Ihr GitHub-Repository muss die folgenden Bedingungen erfüllen:",
275275- "Has a Dockerfile (ideally in the root folder)": "Hat eine Dockerfile (idealerweise im Stammordner)",
276276- "Has two GitHub Secrets ([create GitHub Secret](https://docs.github.com/en/action.5E18F567EA5B8452C4B3": "Hat zwei GitHub-Secrets ([GitHub-Secret erstellen](https://docs.github.com/en/actions/security-guides/using-secrets-in-github-actions#creating-secrets-for-a-repository)):",
277277- "DOCKER_USERNAME: Your docker username": "DOCKER\\_USERNAME: Ihr Docker-Benutzername",
278278- "DOCKER\\_PASSWORD: Your docker password (or [access token](https://docs.docker.co.09AD66E199369AC9AC74": "DOCKER\\_PASSWORD: Ihr Docker-Passwort (oder [Access Token](https://docs.docker.com/security/for-developers/access-tokens/))",
279279- "Create workflow file(s)": "Erstellen einer Workflow-Datei (oder mehrerer)",
280280- "GitHub Actions are special jobs in GitHub which mostly run on Linux servers and .E52CA8DEA2F2414C53E4": "GitHub Actions sind spezielle Jobs in GitHub, die meist auf Linux-Servern ausgeführt werden und über das Erstellen von `yaml`-Dateien im Verzeichnis `.github/workflows` gesteuert werden können. Diese speziellen Dateien können festlegen, nach welchen Ereignissen diese Jobs ausgeführt werden sollen, und bieten Ihnen viel Freiheit. Als regelmäßiger GitHub-Actions-Nutzer kann ich Ihnen sagen, dass Sie sich daran gewöhnen sollten, Ihre `yaml`-Dateien ziemlich oft umzuschreiben, da Sie häufig kleine Details übersehen. Aber ohne weitere Umschweife, lassen Sie uns direkt in die Erstellung einer passenden `deployment.yaml`-Datei einsteigen, die einige Aufgaben für uns erledigt:",
281281- "Push a new docker image to Docker Hub (with the newest version).": "Eine neue Docker-Image-Version in Docker Hub hochladen (mit der neuesten Version).",
282282- "Update the `manifest/deployment.yaml` file, so Argo CD gets notified about the n.745ACECEA48EBB0BD214": "Die `manifest/deployment.yaml`-Datei aktualisieren, damit Argo CD über das neue getaggte Image informiert wird.",
283283- "(optional) Create a new release on GitHub, so the times of releases are document.5A45740CFC388A713228": "(optional) Ein neues Release auf GitHub erstellen, damit die Zeitpunkte der Releases dokumentiert sind, wo sie sein sollten.",
284284- "Here you have an obsolete `docker-hub.yaml` which we used to use because it has .ACD068BBAB645A580B40": "Hier finden Sie eine veraltete `docker-hub.yaml`, die wir früher verwendet haben, da sie gute Versionierungsstrategien bietet:",
285285- "After copying the contents of our `deployment.yaml` file and creating the new fi.BA0B84DE711F10368BA7": "Nachdem Sie den Inhalt unserer `deployment.yaml`-Datei kopiert und die neue Datei im `.github/workflows`-Ordner erstellt haben, müssen Sie einige sehr **wichtige Anpassungen** vornehmen:",
286286- "Change the `IMAGE_NAME` to your personal Docker Hub repository. The image name c.70E854B465ED70C76952": "Ändern Sie den `IMAGE_NAME` in Ihr persönliches Docker Hub-Repository. Der Bildname besteht aus Ihrem Kontonamen und dem Repositoriesnamen. Wenn Sie sich nicht sicher sind, wie Ihr Bildname lautet, können Sie die URL des Docker Hub-Repositories ansehen, dort sollte er irgendwo zu finden sein.",
287287- "Now you should be good to go to add the keyword `deploy` into any commit message.BBFBDF3655BEA5A69ED1": "Jetzt sollten Sie bereit sein, das Schlüsselwort `deploy` in jede Commit-Nachricht für den Hauptzweig Ihres Repositories einzufügen, und es sollte automatisch ein Docker-Image an Docker Hub senden und das Manifest für Argo CD aktualisieren.",
288288- "Congratulations, you've successfully set up Argo CD with k3s and [Cilium](https:.F5382A81A78FA5565691": "Herzlichen Glückwunsch, Sie haben Argo CD erfolgreich mit k3s und [Cilium](https://github.com/cilium) eingerichtet! Sie haben eine Kaffeepause verdient. Genießen Sie eine wohlverdiente Tasse, und wenn Sie mit mir einen virtuellen Kaffee teilen möchten, können Sie gerne meine Arbeit auf [Ko-fi](https://ko-fi.com/trueberryless) unterstützen. Vielen Dank!",
289289- "Setting up Argo CD in a k3s cluster": "Einrichten von Argo CD in einem k3s-Cluster",
290290- "Today we'll take a look at how to set up Argo CD in a k3s cluster.": "Heute sehen wir uns an, wie man Argo CD in einem k3s-Cluster einrichtet.",
291291- "Continuing to improve our k3s cluster and especially the CI/CD workflow, we now .A2E0EE988FAFFFAD6A42": "Um unseren k3s-Cluster und insbesondere den CI/CD-Workflow weiter zu verbessern, werfen wir einen Blick auf das GitOps-Tool <a class=\"gh-badge\" href=\"https://github.com/argoproj\"><img src=\"https://github.com/argoproj.png\" alt=\"Argo CD\" />Argo CD</a>. Hier zeigen wir, wie wir es in unseren Cluster integrieren können. Unsere Tech-Stack für den Deployment-Prozess umfasst k3s, Helm, Cilium und nach diesem Tutorial auch Argo CD.",
292292- "Having read Vegard S. Hagen's article “[Argo CD Kustomize with Helm](https://blo.A0B58D0615DC386245A0": "Nachdem wir Vegard S. Hagens Artikel “[Argo CD Kustomize with Helm](https://blog.stonegarden.dev/articles/2023/09/argocd-kustomize-with-helm/)” gelesen und beschlossen haben, dass seine Lösung nicht passend für unseren Cluster ist, haben wir uns direkt in die Standard-Argo-CD-„[Getting started](https://argo-cd.readthedocs.io/en/stable/getting_started/)“-Anleitung vertieft. Nun führen wir Sie durch die Herausforderungen bei der Einrichtung von [Argo CD](https://github.com/argoproj) auf [k3s](https://github.com/k3s-io) und [Cilium](https://github.com/cilium). Dies knüpft an das Kapitel „[Setup Certificate Manager with Cloudflare](/blog/setup-kubernetes-with-cilium-and-cloudflare#setup-certificate-manager-with-cloudflare)“ aus unserem letzten Beitrag „[Setting up Kubernetes with Cilium and Cloudflare](/blog/setup-kubernetes-with-cilium-and-cloudflare)“ an. In genau diesem Beitrag haben wir am Ende auch [Keel](https://github.com/keel-hq) eingerichtet, aber dieser Schritt ist jetzt überflüssig, da wir Argo CD nutzen, um den neuesten Stand der Technik-Code aus jeder [GitHub](https://github.com/github)-Repo zu holen. Viel Spaß beim Lesen!",
293293- "We assume that you followed [our other blog post](/blog/setup-kubernetes-with-ci.35443F83A3EBC402F568": "Wir gehen davon aus, dass Sie [unseren anderen Blogbeitrag](/blog/setup-kubernetes-with-cilium-and-cloudflare) gelesen haben.",
294294- "Requirements": "Voraussetzungen",
295295- "Before we can start, we need to make sure we have `kubectl` installed, a kubecon.AF18D970264C891E62E6": "Bevor wir starten, müssen wir sicherstellen, dass `kubectl` installiert ist, eine kubeconfig-Datei vorhanden ist (k3s speichert diese Datei hier:",
296296- ") and CoreDNS (check if you have CoreDNS by running this": ") und CoreDNS (prüfen Sie, ob Sie CoreDNS haben, indem Sie diesen",
297297- "command).": "Befehl ausführen).",
298298- "Installation": "Installation",
299299- "First, let's apply all the necessary services, deployments and many other differ.3968A495D46DF328E51D": "Zunächst wenden wir alle notwendigen Services, Deployments und viele andere Kubernetes-Ressourcen an, indem wir folgendes ausführen:",
300300- "Certificate": "Zertifikat",
301301- "Additionally, we'll need a certificate:": "Zusätzlich benötigen wir ein Zertifikat:",
302302- "Apply this resource by running `kubectl apply -f certificate.yaml`.": "Wenden Sie diese Ressource an, indem Sie `kubectl apply -f certificate.yaml` ausführen.",
303303- "Ingress Controller": "Ingress-Controller",
304304- "And we'll need a ingress controller which is managed by Cilium:": "Außerdem benötigen wir einen Ingress-Controller, der von Cilium verwaltet wird:",
305305- "Apply this resource by running `kubectl apply -f argocd-ingress.yaml`.": "Wenden Sie diese Ressource an, indem Sie `kubectl apply -f argocd-ingress.yaml` ausführen.",
306306- "Deactivate TSL within Argo CD": "Deaktivieren des TLS in Argo CD",
307307- "With the certificate the connection between the client and server is secured. Ho.198C7766F41D2E4927DA": "Mit dem Zertifikat ist die Verbindung zwischen Client und Server gesichert. Es gibt jedoch immer noch ein selbstsigniertes Zertifikat innerhalb der [Argo CD](https://github.com/argoproj)-Services, das wir nicht unbedingt benötigen. Daher können wir die Sicherheit des Argo-CD-Servers deaktivieren, indem wir die Eigenschaft `server.insecure` bearbeiten.",
308308- "In order to do that, we first run this command:": "Um das zu tun, führen wir zunächst diesen Befehl aus:",
309309- "which will hopefully open a file in vim or neovim (otherwise would be cringe if .8B321BBC80D980EFA538": "was hoffentlich eine Datei in vim oder neovim öffnet (ansonsten wäre es ziemlich unangenehm, wenn Sie uns fragen, LMAO). Die Datei sollte in etwa so aussehen:",
310310- "The last two lines will probably be not there at first, but this is exactly the .00E15DF17F5D9A9B4B22": "Die letzten beiden Zeilen werden wahrscheinlich zuerst nicht vorhanden sein, aber genau diese Einstellung wollen wir erreichen. Fügen Sie diese beiden Zeilen (oben markiert) hinzu und speichern Sie die Datei (`Esc` → `:wq`, wenn Sie cool sind).",
311311- "Restart the Argo CD Server by running and waiting till the rollout is completed:.CDC77B3806BBA44885A8": "Starten Sie den Argo-CD-Server neu, indem Sie warten, bis das Rollout abgeschlossen ist:",
312312- "After all those steps, we should now see the UI under [`https://argo-cd.trueberr.89BC34AD1ECDBC06B87E": "Nach all diesen Schritten sollten wir nun die Benutzeroberfläche unter [`https://argo-cd.trueberryless.org`](https://argo-cd.trueberryless.org) (passwortgeschützt) sehen.",
313313- "": "Argo CD UI-Dashboard",
314314- "The credentials of Argo CD UI consist of a user and a password. The user is alwa.BE74F043F4C1B4E5AB9E": "Die Anmeldedaten der Argo-CD-Benutzeroberfläche bestehen aus einem Benutzer und einem Passwort. Der Benutzer ist immer `admin` und Sie können Ihr Passwort herausfinden, indem Sie diesen Befehl ausführen:",
315315- "Add manifest to repository": "Manifest im Repository hinzufügen",
316316- "Now in order to create a new application in [Argo CD](https://github.com/argopro.B153A0B7CA8710DB4FF2": "Um nun eine neue Anwendung in [Argo CD](https://github.com/argoproj) zu erstellen (entweder über die Benutzeroberfläche oder CLI – wir nutzen die Benutzeroberfläche, da wir die CLI nicht eingerichtet haben), müssen wir das Git-Repository vorbereiten. Da das Repository die einzige Quelle der Wahrheit ist, definieren wir dort auch alle Kubernetes-Ressourcen, die von Argo CD erstellt werden sollen.",
317317- "We recommend creating a new folder in the git repository called something like `.505C369206406EFB86A4": "Wir empfehlen, im Git-Repository einen neuen Ordner mit dem Namen `manifest` zu erstellen. In diesem Ordner erstellen wir einige Dateien:",
318318- "`certificate.yaml`:": "`certificate.yaml`:",
319319- "`deployment.yaml`:": "`deployment.yaml`:",
320320- "`service.yaml`:": "`service.yaml`:",
321321- "`ingress.yaml`:": "`ingress.yaml`:",
322322- "These files are basically the exact same files mentioned in the [other post](/bl.A6639A930D5E316FA4EB": "Diese Dateien sind im Grunde dieselben wie in dem [anderen Beitrag](/blog/setup-kubernetes-with-cilium-and-cloudflare#example-app-mutanuq), jedoch in vier Dateien aufgeteilt, da uns dies den Vorteil bietet, das Manifest aus [GitHub](https://github.com/github)-Aktionen heraus zu manipulieren. Aber der Reihe nach: Im [nächsten Beitrag](/blog/setup-continuous-integration-github-repository) sehen Sie, wie das Manifest mit GitHub-Aktionen eingerichtet wird.",
323323- "Create new application in Argo CD UI": "Neue Anwendung in der Argo-CD-Benutzeroberfläche erstellen",
324324- "You'll probably see the big `NEW APP` button in the UI of [Argo CD](https://gith.8C955D38A27D41B77691": "Sie werden wahrscheinlich den großen Button `NEW APP` in der Benutzeroberfläche von [Argo CD](https://github.com/argoproj) sehen. Klicken Sie darauf und erstellen Sie eine neue Anwendung mit den unten angepassten Eigenschaften:",
325325- "Application Name: `mutanuq`": "Anwendungsname: `mutanuq`",
326326- "Project Name: `default`": "Projektname: `default`",
327327- "Sync Policy: Find out more in [this post](/blog/setup-continuous-integration-git.049A9447DEA81CE1B5DD": "Sync Policy: Erfahren Sie mehr in [diesem Beitrag](/blog/setup-continuous-integration-github-repository) / vorerst auf `Manual` lassen",
328328- "Repository URL: `https://github.com/trueberryless-org/mutanuq`": "Repository-URL: `https://github.com/trueberryless-org/mutanuq`",
329329- "Revision: `HEAD`": "Revision: `HEAD`",
330330- "Path: `manifest`": "Pfad: `manifest`",
331331- "Cluster URL: `https://kubernetes.default.svc`": "Cluster-URL: `https://kubernetes.default.svc`",
332332- "Namespace: `mutanuq`": "Namespace: `mutanuq`",
333333- "Optionally — if you have [the CLI installed](https://argo-cd.readthedocs.io/en/s.4F9EF0A15884AE51DE02": "Optional – wenn Sie [die CLI installiert haben](https://argo-cd.readthedocs.io/en/stable/cli_installation/) – können Sie diesen Befehl für dasselbe Ergebnis ausführen:",
334334- "Now you can hopefully see your website being deployed in the UI. This process ca.9A72C473303559E3BDC1": "Nun sollten Sie hoffentlich sehen, wie Ihre Website in der Benutzeroberfläche bereitgestellt wird. Dieser Prozess kann einige Zeit in Anspruch nehmen, da beispielsweise der Zertifikatsantrag genehmigt werden muss. Eine gesunde Anwendung sollte in etwa so aussehen:",
335335- " auf einem [k3s](https://github.com/k3s-io) Cluster eingerichtet! Sie haben sich eine Kaffeepause verdient. Genießen Sie eine wohlverdiente Tasse, und wenn Sie mit mir virtuell einen Kaffee teilen möchten, können Sie gerne meine Arbeit auf [Ko-fi](https://ko-fi.com/trueberryless) unterstützen. Vielen Dank!",
337337- "Continuation": "Fortsetzung",
338338- "Be continued for our [next blog](/blog/setup-continuous-integration-github-repos.C6E6C542B1FAA026061D": "Fortsetzung in unserem [nächsten Blog](/blog/setup-continuous-integration-github-repository), der beschreibt, wie ein [GitHub](https://github.com/github)-Repository eingerichtet wird, das dann über Argo CD bereitgestellt werden kann.",
339339- "How to create a Rehype plugin that turns GitHub links into beautiful badges": "Wie man ein Rehype-Plugin erstellt, das GitHub-Links in schöne Badges verwandelt",
340340- "Learn how to build a simple yet delightful Rehype plugin that automatically tran.1DBFD32D56C53FC8C2C2": "Lernen Sie, wie Sie ein einfaches und zugleich ansprechendes Rehype-Plugin erstellen, das GitHub-Profillinks automatisch in stilvolle, Abzeichen-ähnliche Links mit Profilbildern umwandelt – perfekt, um Ihrem Blog oder Ihren Dokumentationen Persönlichkeit zu verleihen.",
341341- "Discover how a tiny Rehype plugin can give your GitHub links a big visual upgrad.95CD8D7DFB0C962AE484": "Entdecken Sie, wie ein kleines Rehype-Plugin Ihren GitHub-Links einen großen visuellen Schub verleiht. Mit nur wenigen Zeilen Code verwandeln wir normale Profillinks in elegante Abzeichen mit Avataren, inspiriert von Antfus Website und unterstützt durch Astro + Starlight.",
342342- "Recently, I added a very little neat feature to this blog, which you might have .31ECBA06CD87D5CFEC39": "Kürzlich habe ich diesem Blog eine ganz kleine, aber feine Funktion hinzugefügt, die Ihnen als regelmäßiger Leser vielleicht aufgefallen ist. Es ist nichts riesiges, aber es verleiht jedem Blog diesen kleinen, charmanten Touch, nach dem ich mich schon lange gesehnt habe. Ich spreche ~~schreibe~~ von diesen grünen Abzeichen mit Profilbildern, die Sie auch in diesem Blog sehen können.",
343343- "The inspiration to create them was taken from none other than [Antfu](https://gi.F44018DA56F114106E55": "Die Inspiration, sie zu erstellen, stammt von niemand anderem als [Antfu](https://github.com/antfu) selbst, der solche Abzeichen überall auf seiner Website hat (zum Zeitpunkt des Schreibens).",
344344- "Initially I thought they would require some long and tedious programming session.255FD9F39C231A32E556": "Anfangs dachte ich, dafür wäre eine lange und mühsame Programmiersitzung nötig, um dieselbe visuelle Schönheit zu erreichen. Doch nach einigem \"Vibe Coding\" – wie [Andrej Karpathy den Begriff prägte](https://x.com/karpathy/status/1886192184808149383) – wurde mir schnell klar, dass diese Abzeichen nur ein kleines [rehype](https://github.com/rehypejs)-Plugin von ihrer Existenz entfernt waren.",
345345- "This is the whole code behind the rehype plugin:": "Dies ist der gesamte Code hinter dem Rehype-Plugin:",
346346- "Basically all this plugin does, is walking through the HTML, looking for links w.713A33AB7C816E7ADAF6": "Im Wesentlichen durchsucht dieses Plugin das HTML nach Links, die auf ein GitHub-Profil verweisen. Wenn es einen solchen Link findet, fügt es vor dem Textinhalt ein `<img>`-Tag mit dem Profilbild des GitHub-Benutzers oder der Organisation ein. Dies ist dank GitHubs Funktion, das Bild als Ressource hinter dem Profillink mit der Endung `.png` zur Verfügung zu stellen, sehr konsistent möglich. Lesen Sie mehr über diese Funktion in [diesem großartigen Artikel auf `dev.to`](https://dev.to/10xlearner/how-to-get-the-profile-picture-of-a-github-account-1d82).",
347347- "With a little bit of additional styling it looks really cute in my opinion. Plea.3CF02F394DFC8ECF3E94": "Mit ein wenig zusätzlichem Styling sieht es meiner Meinung nach wirklich niedlich aus. Bitte beachten Sie, dass dies eine [Starlight](https://starlight.astro.build)-Seite ist und ich verfügbare CSS-Variablen verwende, wie in Zeile vier:",
348348- "Now to put everything together, let's say for example in an Astro site, you just.9BE9659FCADE76D6467F": "Um nun alles zusammenzufügen, müssen Sie beispielsweise in einer Astro-Site lediglich das Rehype-Plugin wie folgt zur Konfiguration hinzufügen:",
349349- "Read more about the injection of rehype plugins in Astro in [their configuration.D3124728AFCD14A1CEE8": "Lesen Sie mehr über die Einbindung von Rehype-Plugins in Astro in [deren Konfigurationsreferenz](https://docs.astro.build/en/reference/configuration-reference/#markdownrehypeplugins).",
350350- "Do not forget to add the CSS in a similar way depending on your framework - in S.8376354E6C8822949CB6": "Vergessen Sie nicht, das CSS auf ähnliche Weise je nach Framework hinzuzufügen – in Starlight können Sie individuelle globale CSS-Stile konfigurieren, indem Sie [diese Anweisungen](https://docs.astro.build/en/guides/styling/#scoped-styles) befolgen – und schon können Sie Ihre eigenen Abzeichen-Links bewundern. Teilen Sie diesen Beitrag gerne mit jedem, den Sie dazu überzeugen möchten, diese Funktionen ebenfalls zu nutzen.",
351351- "✨ Bones point": "✨ Bonus-Punkt",
352352- "If you want to use such a badge for other links too, I recommend that you craft .E4245F963D0ACC5A33AD": "Wenn Sie ein solches Abzeichen auch für andere Links verwenden möchten, empfehle ich Ihnen, sich selbst eine kleine Astro-Komponente wie diese zu basteln:",
353353- "Just make sure that the CSS is globally (or [scope](https://docs.astro.build/en/.4FF4BAAF51A54FE15B11": "Stellen Sie einfach sicher, dass das CSS global ist (oder [scopen](https://docs.astro.build/en/guides/styling/#scoped-styles) Sie es in der obigen Komponente) und es ist einsatzbereit:",
354354- "Earworms and the message hidden within the pattern": "Ohrwürmer und die Botschaft, die im Muster verborgen liegt",
355355- "Some random thoughts about earworms and their message hidden within the pattern..9902F83DCFE33FCF2F42": "Einige zufällige Gedanken über Ohrwürmer und ihre Botschaft, die im Muster verborgen liegt.",
356356- "Yes, this title is a small nod to the excellent Netflix series \"Arcane\", but tha.13B50605E73E31D148F1": "Ja, dieser Titel ist eine kleine Hommage an die ausgezeichnete Netflix-Serie \"Arcane\", aber darum geht es in diesem Beitrag nicht.",
357357- "Today, I want to share some thoughts about earworms, a term that originated in G.6A8601A7B3560A913F2E": "Heute möchte ich einige Gedanken über Ohrwürmer teilen, ein Begriff, der ursprünglich aus dem Deutschen („Ohrwurm“) stammt und später als wörtliche Übersetzung ins Englische übernommen wurde. Die Bedeutung hinter diesem eher abstrakten Begriff sind eingängige Melodien—*sticky music*, wie es auf Wikipedia heißt. Dieses Phänomen tritt oft unvorhersehbar auf, besonders wenn unsere Gedanken von der Gegenwart abschweifen.",
358358- "While many of my blog-post ideas strike on train rides, while lying in bed, or w.25AB9868BD26D2664DE1": "Während viele meiner Blog-Ideen während Zugfahrten, im Bett liegend oder einfach beim Nachdenken über das Leben auftauchen, entstand die Inspiration für diesen Beitrag buchstäblich unter der Dusche — wie es bei den guten alten *Duschen-Gedanken* sein sollte. Der Grund – wie Sie vielleicht beim Lesen des Themas bereits erahnen können – war ein Ohrwurm von einer Melodie, bei der ich schwören könnte, dass ich sie lange nicht gehört hatte, vielleicht 4–5 Wochen.",
359359- "And this always seems to be the confusing parts about earworms: Nobody really kn.02E8F977B7963E92DD1D": "Und dies scheint immer der verwirrende Teil an Ohrwürmern zu sein: Niemand weiß wirklich, wer entscheidet, wann sie „abgespielt“ werden. Ist es das Gehirn, das auf „Play“ drückt, wenn es ein wenig taub ist? Sie wissen, was ich meine, diese Momente, in denen Sie nicht wirklich wissen, woran Sie aktuell denken, und auch nicht darüber nachdenken müssen, worüber Sie nachdenken sollten, sondern einfach den Moment genießen. Es gibt ein weiteres österreichisches Sprichwort für genau dieses Szenario: „ins Narrenkastl schauen“, was so viel bedeutet wie *in die Leere starren*. Und ich denke, genau diese geistesabwesenden Momente sind der Ursprung und Grund, warum Ohrwürmer entstehen.",
360360- "But this still leaves the question: Who decides what to play in someone's head w.869DDF0A56F11A495705": "Aber diese Frage bleibt dennoch: Wer entscheidet, was in jemandes Kopf abgespielt wird, wenn es passiert? Wer ist der DJ? Aus meiner eigenen Erfahrung habe ich ein wiederkehrendes Muster bemerkt, besonders wenn man in der letzten halben Stunde gerade Musik gehört hat. Mein Gehirn zumindest neigt dazu, Teile des **vorletzten Songs** zu wiederholen, also des Songs, der vor dem letzten Lied gespielt wurde. Diese Theorie funktioniert noch besser, wenn das letzte Lied in der Mitte pausiert oder einfach nicht perfekt zu Ende abgespielt wurde.",
361361- "The exact reason for that is completely unknown to me, but if I had to guess, I .A798D76B65D60FBFC400": "Der genaue Grund dafür ist mir völlig unbekannt, aber wenn ich raten müsste, würde ich sagen, dass die Rhythmen des beendeten Songs (des vorletzten) irgendwo in deinem Kopf nachhallen, da das Lied selbst vielleicht eines dieser „Ich-verstumme-langsam-zum-Ende“-Songs war, was nicht meine liebste Art ist, Musik zu beenden, aber es regt das Gehirn dazu an, weiterzumachen.",
362362- "At least that's what I think. I would be very interested if you have experienced.2A5110405B0386450071": "Zumindest ist das meine Vermutung. Ich wäre sehr daran interessiert, ob Sie ähnliche Muster erlebt haben, also schreiben Sie gerne Ihren eigenen Blog-Beitrag darüber oder teilen Sie diesen mit Freunden, um ihn gemeinsam zu diskutieren!",
363363- "Stop Outsourcing Your Soul to AI": "Stoppe das Auslagern deiner Seele an KI",
364364- "Reflections on AI overuse, its cognitive and social downsides, and a proposed mo.A89AED1EE3DE3D0BCC9B": "Reflexionen über den übermäßigen Einsatz von KI, deren kognitive und soziale Nachteile sowie ein vorgeschlagenes Modell zur Nutzung der KI ohne Beeinträchtigung menschlicher Kreativität und Kommunikation.",
365365- "It has been more than two and a half years since the release of ChatGPT. The 30<.25CE9B6E0E88F7C05662": "Es sind mehr als zweieinhalb Jahre vergangen seit der Veröffentlichung von ChatGPT. Der 30<sup>. November</sup> 2022 markierte den Beginn einer neuen Ära: den Anfang der KI. Heute nutzen viele Berufe und Privatpersonen, insbesondere im IT-Sektor, sie täglich. Und wir wissen nicht einmal, wo wir uns im Gartner-Hype-Zyklus befinden oder ob sich KI gemäß Kurzweils \"Gesetz der beschleunigten Rückkehr\" verbessern wird.",
366366- "The trend is still rising, but at the same time I have noticed a slight but stea.4471FBD85DD8F244947F": "Der Trend ist weiterhin steigend, aber gleichzeitig habe ich eine leichte, jedoch stetige Verschlechterung von Wissen auf menschlicher Basis bemerkt, da immer mehr kreative Arbeit an KI delegiert wird. Daher habe ich mich entschlossen, einen kleinen Blogbeitrag zu schreiben, in dem ich meine Gedanken teile, um von einem übermäßigen Einsatz Künstlicher Intelligenz abzuraten, da dieser unsere kognitiven Fähigkeiten zerstören könnte. Und obwohl ich weiß, dass nur sehr wenige Menschen dies lesen werden, hält mich das nicht davon ab, es zu versuchen. Andernfalls könnte ich meine Chance verpassen, der Zukunft der Menschheit zu helfen.",
367367- "**Disclaimer**: This whole blog post is created from my observations of developm.6E39A6FC36B46BF133B0": "**Hinweis**: Dieser gesamte Blogpost basiert auf meinen Beobachtungen hinsichtlich gesellschaftlicher Entwicklungen mit einem besonderen Fokus auf den Einsatz von Künstlicher Intelligenz und meiner Interpretation davon und ist daher sehr subjektiv. Ich habe keine Studien angesehen, die meine Meinung unterstützen oder ihr widersprechen.",
368368- "How people tend to use AI": "Wie Menschen dazu neigen, KI zu nutzen",
369369- "AI is awesome. I do not want to question this statement. It helped and still hel.1B73784A0B66F1C26560": "KI ist großartig. Ich möchte diese Aussage nicht in Frage stellen. Sie hat mir geholfen und hilft mir immer noch, meinen Arbeitsablauf zu verbessern, neues Wissen zu sammeln, in neue Gewässer einzutauchen und neue Technologien zu erkunden. Für Menschen, die sich nicht dafür interessieren, wie KI funktioniert, erscheinen solche intelligenten Werkzeuge wie Magie. Deshalb sehe ich gerne, wie ihre Augen funkeln und ihre Münder offen bleiben, wenn ich ihnen erkläre, dass KI lediglich auf Wahrscheinlichkeiten basiert - welches Wort am wahrscheinlichsten das nächste ist, basierend auf Eigenschaften und Emotionen in einem hochdimensionalen virtuellen Raum. [Aber das ist ein anderes Thema.](https://www.youtube.com/watch?v=LPZh9BOjkQs)",
370370- "What I would like to focus on is how people have come to use AI, especially over.0645ED8C57D4B143BECD": "Worauf ich mich konzentrieren möchte, ist, wie Menschen angefangen haben, KI zu nutzen, besonders in den letzten Monaten - wenn nicht Jahren. Da unser Gehirn von Natur aus faul ist, neigen wir dazu, mehr Arbeit an KI auszulagern, je weniger fokussiert wir auf eine spezifische Aufgabe sind. Mit anderen Worten: Wenn du nicht den Großteil deines Engagements in dein aktuelles Projekt steckst, bist du wahrscheinlich kurz davor, es einfach einer KI zu übertragen. Ein weiterer möglicher Grund für das Offshoring von Arbeit an die KI-Welt ist Unwissenheit über die zugrunde liegenden Technologien, was es dir erschwert, eigene Lösungen zu entwickeln.",
371371- "I am by no means a scientist, but I think that watching AI doing your work - bec.9C73DF2EC8CE97A8882E": "Ich bin keineswegs ein Wissenschaftler, aber ich glaube, dass das Zusehen, wie KI deine Arbeit erledigt - weil das Ergebnis, das du produzierst, aufgrund deiner Inkompetenz nicht mit deiner Vision übereinstimmt -, dir so viel Dopamin gibt, dass dein Gehirn es immer öfter tun möchte. Darüber hinaus strebt der Mensch als soziales Wesen immer danach, mit jemandem verbunden zu sein, und die Interaktion mit KI erfüllt dieses Bedürfnis. Dieses Verhalten ist typisch für unsere Gehirne und tritt auch beim Konsum von sozialen Medien oder explizitem Inhalt auf. Es ist tief in unserem Kortex verankert, und die gesamte Gaming- und Unterhaltungsbranche nutzt dies rücksichtslos, um Geld zu optimieren.",
372372- "Negative side effects": "Negative Nebenwirkungen",
373373- "I pointed out the main drawbacks of using AI too extensively that I observed. I .5A4212FD0B6A0413D8EA": "Ich habe die Hauptnachteile der extensiven Nutzung von KI, die ich beobachtet habe, beschrieben. Nun werde ich zwei kleinere Gründe nennen, die ich bei mir selbst feststellte, warum du KI nicht für expressive Arbeiten nutzen solltest.",
374374- "Communication decline": "Rückgang der Kommunikation",
375375- "While watching a promotion video from \"The Browser Company™\" (see the last link .72C7B7D43BFCB10D0126": "Während ich mir ein Werbevideo von \"The Browser Company™\" angesehen habe (siehe den letzten Link im [Ressourcenabschnitt unten](#resources-with-better-evidence)), fiel mir auf, wie weit auseinander liegend Visionen heutzutage sein können. Ich sehe diesen Trend nicht nur beim Dia-Browser, sondern in vielen verschiedenen Aspekten der Technologie und in vielen Teilen unseres Lebens. Eine Seite des Trends möchte KI überall integrieren, wo es möglich ist, und so unsere Abhängigkeit von ihr vergrößern. Ein Beispiel ist die Nutzung von KI, um Nachrichten an unsere engsten Freunde und Kollegen zu verfassen, weil es uns effizienter macht. Ich glaube, dass es uns langfristig einfach nur dumm macht.",
376376- "If people do not train their brains for coming up with words for communication, .0E50F4E2AEC63CCFA8CD": "Wenn Menschen ihre Gehirne nicht trainieren, um Wörter für die Kommunikation zu finden, nützliche Sätze zu bilden und Bedeutungen zu schaffen, die von anderen Menschen verstanden werden können, ist unser Fundament des Miteinander-Interagierens gebrochen, und wir wären wieder auf dem Niveau von *Homo habilis* - der letzten Spezies, die vermutlich keine vollständig entwickelte Sprache verwendete. Siehst du, ich habe KI verwendet, um genau diesen Punkt zu recherchieren, aber ich habe meine Worte bewusst gewählt, um mich auszudrücken. Auf diese Weise habe ich nicht nur etwas Neues gelernt, sondern kann es jetzt auch erinnern. Eine Fähigkeit, die du niemals haben wirst, wenn du das Schreiben an eine KI auslagerst.",
377377- "Loneliness": "Einsamkeit",
378378- "Being alone on a mental level is in my opinion one of the most underrated modern.DF4685B2DE4270080DF1": "Auf einer mentalen Ebene allein zu sein, ist meiner Meinung nach eine der am meisten unterschätzten modernen Gefahren in der Gesellschaft. Das Ironische daran ist, dass, wenn jeder allein ist, wir es alle gemeinsam haben und somit nicht mehr allein mit unserer Einsamkeit sind. Aber meine Gedanken driften wieder in andere Gewässer ab.",
379379- "AI strongly encourages us to be alone. It ~~acts~~ was intentionally trained to .CBE7FABA8A468DBE0C14": "KI ermutigt uns stark dazu, allein zu sein. Sie ~~agiert~~ wurde absichtlich so trainiert, als sei sie ein perfekter Freund, Kollege oder wie auch immer du es nennen möchtest. Kürzlich habe ich bemerkt, dass ChatGPTs Antworten explizit meinen Namen beinhalten, was sich für mich auf mehreren Ebenen sehr seltsam anfühlt. Man könnte argumentieren, dass dies eine private künstliche Form von Doxxing ist, was natürlich ein Oxymoron an sich ist, da Doxxing per Definition öffentlich ist. Nichtsdestotrotz: Je öfter du KI nutzt, desto *öfter* willst du KI nutzen. Besonders nach der Einführung von KI-Sprachmodi stieg dieser Trend weiter an, als gäbe es kein Morgen. Glückwunsch, ClosedAI, ihr habt die Sucht neu erfunden.",
380380- "In worst case scenarios, this can leads people to fear talking with other people.DE0F55D85004B91A5977": "Im schlimmsten Fall kann dies dazu führen, dass Menschen Angst haben, mit anderen zu sprechen. Freundschaften verlassen. Sich aus der Gesellschaft zurückziehen. Solche Gewohnheiten sind ernste Probleme und sollten am besten von einem Arzt oder Psychologen untersucht werden.",
381381- "Proposal of AI usage layer model": "Vorschlag eines Modells für den Umgang mit KI",
382382- "Proposing a global solution for all people of such a problem is impossible. Sinc.10DA331D742128D1E376": "Einen globalen Lösungsansatz für alle Menschen für ein solches Problem vorzuschlagen, ist unmöglich. Da jede Person ihre eigenen Erfahrungen mit KI hat, ihre eigenen Gedanken und Gefühle, Optimisten oder Pessimisten, kann ich nicht für alle sprechen. Tatsächlich denke ich, dass ich nur für mich selbst sprechen, lernen und meine eigenen Wege des Umgangs und der Einschränkung meiner KI-Nutzung teilen kann und hoffe, dass diese Erfahrungen auch dir helfen können.",
383383- "My ideal experiences with AI - the optimal golden way between the overuse of AI .7279A13F58BE82D3A45D": "Meine idealen Erfahrungen mit KI - der optimale goldene Weg zwischen dem übermäßigen Gebrauch von KI, der kognitiven Erosion nach sich zieht, und der Möglichkeit, den Hype zu ignorieren, ohne Vorteile zu nutzen - besteht darin, KI [genau dann](https://en.wikipedia.org/wiki/If_and_only_if) zu nutzen, wenn und nur wenn du davon profitierst. Mit anderen Worten: Kontrolliere deine Nutzung und beschränke sie auf ein Extrem, bei dem nur du selbst jemals mit den Inhalten in Kontakt kommst, die die KI produziert. Eine solche Einschränkung hat viele Konsequenzen; hier sind einige Beispiele, um besser zu verdeutlichen und zu betonen, was ich meine:",
384384- "Use AI for personal learning sessions: If you initially want to dive into a new,.DE3EFB49A432DEF98DFD": "Nutze KI für persönliche Lernsitzungen: Wenn du dich zunächst mit einem neuen, völlig unbekannten Thema beschäftigen möchtest, kann dir KI allgemeine Übersichten geben und Zusammenhänge zu anderen Wissensbereichen und realen Anwendungen aufzeigen. Obwohl dies nicht unbedingt bedeutet, dass du wirklich schneller oder effizienter lernst, hilft es, den ersten Schritt zu machen und den Ball ins Rollen zu bringen.",
385385- "Use AI for stupid and repetitive workloads and ask for help if you are certain t.ABC71EA43B6FE421530F": "Nutze KI für stupide und repetitive Aufgaben und frage nach Hilfe, wenn du sicher bist, dass das Problem oder die Aufgabe bereits von anderen tausendfach gelöst wurde. Aktuelle LLMs sind auf Basis bestehender Daten trainiert, weshalb sie gut darin sein sollten, bereits gelöste Probleme zu lösen, aber nicht das Rad neu zu erfinden, sondern die Nutzung des bestehenden runden Instruments vorzuschlagen.",
386386- "Do not use AI to express yourself to other people. Think about what meaning you .68CA5EC714F05E5EC131": "Verwende KI nicht, um dich anderen Menschen gegenüber auszudrücken. Denke darüber nach, welche Bedeutung du vermitteln möchtest, welches Wissen du teilen willst, und packe deine Gedanken in deine eigenen Worte. Das hilft dir enorm, deine eigenen Gedanken zu festigen, dich an das Gelernte zu erinnern und dich viel besser zu fühlen.",
387387- "Do not use AI to generate complex and creative work. Nowadays, there are hundred.572F9E5BBC126B708CF7": "Nutze KI nicht, um komplexe und kreative Arbeiten zu erstellen. Heutzutage gibt es Hunderte - wahrscheinlich Tausende - von Tools, die dir dabei helfen, Kunst, Musik, Code, Designs, Pläne usw. mit Hilfe von oder komplett durch KI zu erstellen. Obwohl dies den Anschein erweckt, dass du produktiver sein kannst, macht es dich in Wirklichkeit umso unwissender, je öfter du auf diese Methoden zurückgreifst, anstatt das zu tun, was du selbst gerne machst. Es ist völlig in Ordnung, kleine Teile der Arbeit an KI auszulagern, vor allem repetitive Aufgaben, die manuell einfach mehr Zeit in Anspruch nehmen würden. Kreative und originelle Arbeit hingegen sollte menschlich bleiben und mit Liebe hergestellt werden. Wenn dir das, was du tust, überhaupt nicht gefällt, ist dies ein Signal, dass du wahrscheinlich komplett damit aufhören solltest.",
388388- "Do not fall for all the shiny AI stuff out there. Tools like [Lovable](https://l.730DE3F722D5456EC235": "Lass dich nicht von all dem glänzenden KI-Zeug dort draußen verführen. Tools wie [Lovable](https://lovable.dev), [GitHub Copilot](https://github.com/features/copilot), [Cursor](https://cursor.com/en), [ChatGPT Voice](https://openai.com/index/chatgpt-can-now-see-hear-and-speak/) und neu auf dem Markt: [GPT-5](https://academy.openai.com/public/resources/intro-gpt-5), um nur einige zu nennen, wollen dir eigentlich nicht helfen. Sie wollen entweder direkt deine Daten oder deinen Arbeitsablauf besitzen, so dass du nicht mehr daraus entkommen kannst, sobald du dich daran gewöhnt hast. Leider gewöhnen sich Menschen faszinierend schnell an KI.",
389389- "In short, what I mean is that AI should be used for brainstorming and helping ea.7E4914372E95A248FB12": "Kurz gesagt, ich meine, dass KI zum Brainstorming und zur Unterstützung jedes Einzelnen bei der Erstellung eines Endprodukts verwendet werden sollte - nicht zu verwechseln mit einer durch KI erstellten Endlösung -, aber nicht für die Kommunikation mit anderen Menschen oder die Endergebnisse selbst (z. B. Bildbearbeitung, Blogartikel schreiben, Beiträge in sozialen Medien, Chatkommunikation, Motivationsreden, Essays usw.). Meiner Meinung nach kann das menschliche Gehirn nur durch eigene Fehler und Erfahrungen wachsen und lernen. Und du kannst nie aus deinen Fehlern lernen, wenn diese eigentlich von der KI generiert wurden.",
390390- "AI has a place in ideation, but expressive work should remain human.": "KI hat ihren Platz beim Ideensammeln, aber ausdrucksstarke Arbeit sollte menschlich bleiben.",
391391- "The Paradigm": "Das Paradigma",
392392- "I recently discovered a software design pattern called the \"Onion Architecture\"..1A7DACE78A504AB231FA": "Ich habe kürzlich ein Software-Design-Muster namens \"Onion Architecture\" entdeckt. Um die Erklärung kurz zu halten: Das Hauptprinzip dieser Architektur ist ihre Aufteilung in Schichten, wobei jede Schicht nur mit ihren beiden Nachbarn verbunden ist (Geschwister ausgeschlossen), also der inneren und der äußeren Schicht.",
393393- "To transfer this paradigm into the current context, you can imagine the AI as a .5C827B59D0E80CEDD730": "Um dieses Paradigma auf den aktuellen Kontext zu übertragen, kannst du dir die KI als ein Werkzeug vorstellen, das dir zur Verfügung steht, das jedoch von allen anderen Teilen unabhängig ist, da es nur von deinem Gehirn umgeben wird, und nur dein Gehirn kann auf die äußeren Schichten zugreifen, sie manipulieren, erstellen und modifizieren - in diesem Beispiel das Schreiben von Blogs, das Erstellen von Inhalten, die Kommunikation mit Menschen über Chats oder Reden oder das Ausdrücken mit Kunst oder Design.",
394394- "Here you can see an image that represents my idea of a limited, but ideal usage .FC6C0DF5BEEB877D3C9A": "Hier siehst du ein Bild, das meine Vorstellung von einer begrenzten, aber idealen Nutzung von KI darstellt:",
395395- "-Community ist diejenige, in der ich mich am wohlsten fühle, da sie gleichzeitig am lohnendsten und freundlichsten ist. Nicht alle Communitys können einen so großartigen Status unter OSS erreichen.",
418418- "Recently, I discovered another evolving project founded by [pelikhan](https://gi.90E9DCA5FB8FA470B7FE": "Kürzlich entdeckte ich ein weiteres wachsendes Projekt, das von [pelikhan](https://github.com/pelikhan) gegründet wurde und das darauf abzielt, alle deine Dokumentationen, Blogs oder Shop-Seiten automatisch mit Hilfe von KI zu übersetzen, sobald sich etwas ändert. Obwohl ich anfangs skeptisch war, hat mich das Lesen der README.md des Projekts fasziniert.",
419419- "The approach of strictly guiding AI into only translating little chunks - mostly.EFA08DBC1CAAB5CE6D3C": "Der Ansatz, die KI strikt dazu anzuleiten, nur kleine Abschnitte – hauptsächlich Sätze oder Absätze – mit perfektionistischen Anweisungen zu übersetzen, ließ mich denken, dass dies wirklich funktionieren könnte. Also probierte ich es in meinem eigenen Projekt aus, meinem Blog. Und zu meiner Überraschung waren diese Übersetzungen viel besser als erwartet. Natürlich merkt man, dass es von einer KI übersetzt wurde – handgefertigte Arbeit wird hoffentlich nie vollständig ersetzt – aber wenn man fair erwähnt, dass man eine KI verwendet, ist dies für Menschen viel zugänglicher als nichts.",
420420- "So I took a closer look at the actual code of the project. After noticing some l.04C2097BA41406300A39": "Also warf ich einen genaueren Blick auf den eigentlichen Code des Projekts. Nachdem ich einige kleine Unstimmigkeiten, Verbesserungspotenziale und fehlende, aber sehr coole Funktionen hier und da bemerkte, begann ich ebenfalls, dort beizutragen. Ich meine, nach einem Jahr Beiträge zu größeren Projekten waren Pull Requests für mich nichts Neues.",
421421- "You have to know that this was a Friday evening - almost night in my timezone - .F07D43687D090B7997ED": "Man muss wissen, dass dies ein Freitagabend war – fast Nacht in meiner Zeitzone – und [Peli](https://github.com/pelikhan) war gerade online und führte Commit um Commit für das Projekt durch. Ich bemerkte schnell, dass Peli im Gegensatz zu den anderen Projekten, in denen ich mitwirke, keine Zeit mit dem Mergen von Pull Requests verschwendete. Es fühlte sich diese Nacht sehr lohnend an, da ich einfach bis 1 Uhr morgens weitermachte, Peli schneller merge als ich Features, Dokumentationen und Fixes verbessern konnte. Ein weiterer Aspekt, der großartig war, war, dass Peli, da dies ein junges Projekt war, nicht zögerte, einfach zu mergen, es lokal auszuprobieren und dann kleine Fixes zu pushen, die ich übersehen hatte.",
422422- "Fast-forward three days and I am now an official contributor to the project, mak.3479DA18B6C4E8D9A8EE": "Drei Tage später bin ich nun ein offizieller Contributor des Projekts und trage fast täglich dazu bei, es immer weiter zu verbessern, wobei mein Hauptfokus auf der Dokumentation und der Unterstützung für mein Herzensprojekt liegt: Starlight – wie ihr vielleicht schon aus [meinen Blogs](/blog/tags/starlight/) erraten habt.",
423423- "Peli and I have our virtual productivity sessions between 4pm and 8pm UTC, exten.51E309B378285EAEEA84": "Peli und ich haben unsere virtuellen Produktivitätssitzungen zwischen 16:00 und 20:00 UTC, die an Wochenenden auch länger dauern. Wenn du als Frühaufsteher des Projekts mitmachen oder Interesse daran hast, es zu nutzen, schau es dir gerne auf [GitHub](https://github.com/github) an: [https://github.com/pelikhan/action-continuous-translation](https://github.com/pelikhan/action-continuous-translation)",
424424- "Designing a No-Account, No-Database Approach to Time Tracking": "Entwerfen eines Ansatzes für Zeiterfassung ohne Konto und ohne Datenbank",
425425- "A private time-tracking app storing all data in your browser — no accounts, no d.F138A1009E69F5985E79": "Eine private Zeiterfassungs-App, die alle Daten in deinem Browser speichert — keine Konten, keine Datenbank, nur einfache Erfassung.",
426426- "True Tracker is a minimalist time-tracking app built with Next.js that keeps all.83D3C3B8B44C4975D8DD": "True Tracker ist eine minimalistische Zeiterfassungs-App, die mit Next.js entwickelt wurde und alle Daten in deinem Browser speichert — keine Konten, keine Datenbank, einfach nur vollständige Privatsphäre und Einfachheit.",
427427- "The summer of 2024 marked the start of an exciting new chapter for me as a devel.4693500D69418D01C04B": "Der Sommer 2024 markierte den Beginn eines aufregenden neuen Kapitels für mich als Entwickler. Bis zu diesem Zeitpunkt hatte ich hauptsächlich mit Angular gearbeitet, einem Framework, das ich für seinen strukturierten und meinungsstarken Ansatz schätzte. Aber ich war immer neugierig auf React gewesen – es fühlte sich leichter, flexibler und einfach… anders an. Als ich auf Next.js stieß, ein Framework von [Vercel](https://github.com/vercel), das auf React aufbaut und Funktionen wie serverseitiges Rendering und einen Fokus auf Performance bietet, wusste ich, dass es an der Zeit war, etwas Neues auszuprobieren.",
428428- "At the same time, I'd been frustrated for ages with session tracking tools like .03C6C9A3C18CFB3FDCD1": "Zur gleichen Zeit war ich seit Langem über Tools zur Sitzungsverfolgung wie Toggl frustriert. Theoretisch sind sie großartig, aber ihre besten Funktionen schienen immer hinter teuren Bezahlwänden versteckt zu sein. Wie jeder Entwickler irgendwann dachte ich: *„Warum baue ich mir nicht einfach mein eigenes?“* Es ist praktisch ein Übergangsritus – jeder Programmierer muss mindestens einmal eine To-Do-App oder einen Tracker in seiner Karriere erstellen. Und so wurde True Tracker geboren.",
429429- "True Tracker wouldn't just be any tracker, though. I wanted to do something diff.A78A97DDBF776E5A3623": "True Tracker sollte jedoch kein gewöhnlicher Tracker sein. Ich wollte etwas anderes machen. Zunächst wollte ich es einfach halten: Benutzer konnten Projekte hinzufügen, sie in Aufgaben unterteilen und ihre Zeit in Sitzungen erfassen. Kein Schnickschnack, keine unnötigen Funktionen. Doch hier kommt der Clou — True Tracker würde alles im lokalen Speicher speichern. Keine Konten, keine Cloud-Synchronisierung, und vor allem, niemand (nicht einmal ich) hätte Zugriff auf deine Daten. Es ist dein Tracker, und deine Daten bleiben deine.",
430430- "Of course, transitioning from Angular to Next.js wasn't without its challenges. .42B63477ABA3012B4AFB": "Natürlich war der Übergang von Angular zu Next.js nicht ohne Herausforderungen. Wenn ich jemandem, der ein neues Framework lernt, einen Rat geben könnte, dann wäre es dieser: *Lies die Dokumentation.* Ernsthaft, überspring sie nicht. Ich tat es nicht, und das führte zu Chaos. Next.js war kürzlich auf den App-Router umgestiegen, aber ich begann stur, mit dem Page-Router zu bauen. Das führte zu einem Berg von Problemen, als die App nicht richtig gebaut werden konnte, weil kein `app`-Verzeichnis vorhanden war. Ich musste eine leere `.gitkeep`-Datei im Ordner belassen, nur damit Git sie nicht löscht und alles erneut kaputt macht. Nicht mein stolzester Moment.",
431431- "After two weeks of nonstop coding, debugging, and running into what felt like ev.6C07E411C9E65C40E90F": "Nach zwei Wochen ununterbrochenem Codieren, Debuggen und dem Gefühl, auf jeden erdenklichen Fehler zu stoßen, funktionierte True Tracker endlich. Ich erinnere mich an diesen ersten erfolgreichen Lauf – es fühlte sich an wie ein innerlicher Schrei *„Es lebt!“*.",
432432- "The project also wasn't without its jokes. A friend, after seeing the app's bran.4E6FB3382F951646087C": "Das Projekt war auch nicht ohne seine Witze. Ein Freund meinte nach einem Blick auf das Branding der App: „Also … das ‚true‘ in True Tracker? Das ist ein bisschen zu viel, selbst für das Bild. Es ist *zu viel Wahrheit!*“ Sie hatten nicht unrecht, aber ich nahm es an. Schließlich, wenn man etwas brandet, sollte man es auch durchziehen.",
433433- "True Tracker became my first-ever Next.js project—a simple but unique app for tr.252C96FD81AA9227820E": "True Tracker wurde mein allererstes Next.js-Projekt – eine einfache, aber einzigartige App zur Zeiterfassung ohne Bedingungen. Sie ist jetzt live unter [https://true-tracker.trueberryless.org](https://true-tracker.trueberryless.org/).",
434434- "The journey taught me more than just how to use Next.js. It taught me about push.4577627813AA93D48F0F": "Die Reise lehrte mich mehr, als nur wie man Next.js verwendet. Sie lehrte mich, Herausforderungen zu überwinden, zwischen Frameworks zu wechseln und die Eigenheiten zu schätzen, die jedes Projekt einzigartig machen. True Tracker ist nicht nur eine App; es ist ein Meilenstein – ein kleiner Beweis dafür, dass auch kleine Ideen eine große Wirkung haben können.",
435435- "Designing a Kafka-Based Pipeline and Interactive Graph for Energy Anomaly Detect.6E40C602D9518B54F990": "Entwicklung einer Kafka-basierten Pipeline und eines interaktiven Graphen zur Erkennung von Energieanomalien",
436436- "A SOA solution with Siemens AG to analyze power grid anomalies, featuring a Kafk.7FC6E382F6C39EFB4296": "Eine SOA-Lösung mit Siemens AG zur Analyse von Netzwerkanomalien im Stromnetz, mit einer Kafka-Pipeline, PostgreSQL, GraphQL-API und einem Angular-Dashboard zur Visualisierung.",
437437- "For our diploma thesis with Siemens AG, we built a service-oriented solution to .E03A3AD551F1B141D274": "Für unsere Diplomarbeit mit Siemens AG haben wir eine dienstorientierte Lösung entwickelt, um Netzwerkanomalien im Stromnetz zu erkennen — mit einer Kafka-Pipeline, PostgreSQL, GraphQL-API sowie einem Angular-Dashboard mit Tabellen und einem interaktiven Graphen zur Echtzeitvisualisierung.",
438438- "During my fifth year at HTL Krems (2023/24), every student was required to compl.33C68E23474119532BF0": "Während meines fünften Jahres an der HTL Krems (2023/24) musste jeder Schüler eine Diplomarbeit absolvieren – ein umfangreiches Projekt, das in zwei Hauptteile unterteilt war: theoretisch und praktisch. In Zweierteams verfassten wir eine theoretische Arbeit von etwa 100 Seiten, in der wir unser gewähltes Thema vorstellten, analysierten und erklärten.",
439439- "The theoretical part was organized into three sections. The first involved gathe.383BAC1FDBC3A2145A6D": "Der theoretische Teil war in drei Abschnitte gegliedert. Der erste bestand darin, vorhandenes Wissen aus glaubwürdigen Quellen wie Büchern und früheren Arbeiten zu sammeln und zusammenzufassen. Der zweite konzentrierte sich auf die Erkenntnisse und Ergebnisse, die wir aus unserem Prototyp – einer Softwarelösung, die wir für den praktischen Teil entwickelten – gewonnen hatten. Schließlich kombinierte der dritte Abschnitt diese beiden Ansätze und bot einen kritischen Vergleich und eine Reflexion darüber, was wir durch das Projekt insgesamt gelernt hatten.",
440440- "The practical aspect required us to design and implement a solution, either soft.9F57571ADA22C3F461BC": "Der praktische Teil verlangte von uns, eine Lösung zu entwerfen und umzusetzen, die entweder software- oder hardwarebasiert war, um ein realweltliches Problem zu lösen. Mein Teamkollege Clemens Schlipfinger und ich entschieden uns ausschließlich auf Software zu konzentrieren, um die Zuverlässigkeit zu gewährleisten. Hardware kann unvorhersehbare Probleme verursachen, aber Software – insbesondere, wenn sie in robusten Docker-Containern bereitgestellt wird – bietet eine konsistente Umgebung, die überall nahtlos funktioniert.",
441441- "What made our project particularly exciting was our partnership with Siemens AG,.E3DFFF62A58AA54FFAF4": "Was unser Projekt besonders spannend machte, war unsere Partnerschaft mit Siemens AG, einem renommierten multinationalen Unternehmen, das auf Energie-, Automatisierungs- und Digitalisierungslösungen spezialisiert ist. Diese Zusammenarbeit war unter unseren Mitschülern selten und verlieh unserem Projekt eine professionelle Dimension. Siemens beauftragte uns, eine dienstorientierte Softwarelösung zur Analyse von Anomalien im europäischen Stromnetz zu entwickeln.",
442442- "The system we built comprised several components, each designed to handle a spec.66064ADCDD1375BE0F9A": "Das von uns entwickelte System bestand aus mehreren Komponenten, die jeweils für eine spezifische Funktion konzipiert waren. Im Kern befand sich eine Kafka-Anwendung, die für die Erfassung von Daten verantwortlich war – Berichte über Netzwerkanomalien, die wir als „Findings“ bezeichneten. Diese Berichte dokumentierten Ausfälle und Unregelmäßigkeiten im komplexen europäischen Stromnetz, das aus Millionen von verbundenen Komponenten wie Transistoren, Schaltern und Generatoren besteht. Kafka übermittelte die neuesten Anomalien an eine PostgreSQL-Datenbank, die dann über eine GraphQL-API zugänglich gemacht wurde. Diese API bot umfassende Funktionen wie Paginierung, Filterung und Abfragen, um eine nahtlose Integration mit unserem Angular-basierten Frontend zu gewährleisten.",
443443- "The frontend was designed as a user-friendly dashboard with three key sections:": "Das Frontend wurde als benutzerfreundliches Dashboard mit drei Hauptbereichen gestaltet:",
444444- "Anomalies Table – A searchable, paginated, and filterable table for quick naviga.530B334CB3F183450BCF": "Anomalien-Tabelle – Eine durchsuchbare, paginierte und filterbare Tabelle für die schnelle Navigation durch Anomalien.",
445445- "Graph View – A dynamic visualisation of anomaly data, making it easier to pinpoi.FA55A622C6F84DDFA484": "Graph-Ansicht – Eine dynamische Visualisierung der Anomaliedaten, um die Quelle eines Problems im weitläufigen, komplexen Netz leichter zu lokalisieren.",
446446- "Overall Dashboard – Key metrics and insights for quick, actionable overviews.": "Gesamtdashboard – Wichtige Kennzahlen und Einblicke für schnelle, umsetzbare Übersichten.",
447447- "Clemens and I divided our responsibilities evenly. Clemens handled the backend s.57A227B299EB92B6AC25": "Clemens und ich teilten unsere Verantwortlichkeiten gleichmäßig auf. Clemens übernahm die Backend-Systeme, einschließlich Kafka, PostgreSQL und der GraphQL-API, und sorgte für eine zuverlässige und effiziente Daten-Pipeline. Ich übernahm die Rolle des Projektleiters, koordinierte die Kommunikation mit Siemens und entwickelte das Frontend, um die nahtlose Integration der verschiedenen Komponenten sicherzustellen. Diese Zusammenarbeit ermöglichte es uns, unsere Stärken einzusetzen und eine ausgewogene Arbeitsverteilung aufrechtzuerhalten.",
448448- "Our final product not only met Siemens' requirements but also demonstrated the p.3DFD3D918F5BEBCA8D06": "Unser Endprodukt erfüllte nicht nur die Anforderungen von Siemens, sondern demonstrierte auch die Stärke einer gut gestalteten dienstorientierten Architektur (SOA) zur Lösung komplexer, realweltlicher Probleme. Es war äußerst befriedigend, unsere Software zuverlässig arbeiten zu sehen und verwertbare Einblicke zur Bewältigung von Stromnetzanomalien zu liefern.",
449449- "For more details about our work, feel free to explore our thesis [here](https://.404251D1094C50B2114B": "Für weitere Details zu unserer Arbeit können Sie unsere Thesis [hier](https://trueberryless.org/thesis.pdf) 📜 einsehen oder unseren Videokurs [hier](https://videos.trueberryless.org/videos/thesis/) 🎥 anschauen (beides nur auf Deutsch verfügbar).",
450450- "": "Wie ich ein GitHub-Profil-README erstellt habe, das es eigentlich nicht geben sollte (aber es gibt es)",
452452- "Creating a standout <a class=\"gh-badge\" href=\"https://github.com/github\"><img sr.2311B04CBE33507503C4": "Ein herausragendes <a class=\"gh-badge\" href=\"https://github.com/github\"><img src=\"https://github.com/github.png\" alt=\"github\" />GitHub</a>-Profil-README zu erstellen, bedeutet nicht nur, ein paar Abzeichen hinzuzufügen — es geht darum, technische Grenzen zu überschreiten. In diesem tiefgehenden Einblick erkunde ich Low-Level-SVG-Manipulation, HTML-zu-SVG-Konvertierung, Inline-Animationen und vollständige Automatisierung mit GitHub Actions, um das vielleicht technisch fortschrittlichste GitHub-README zu erstellen. Von einem dynamischen Bento-Grid, das alle 5 Minuten aktualisiert wird, bis hin zum Einbetten von Live-SVGs ohne externe Anfragen hat dieses Projekt mein Profil in eine lebendige, sich selbst aktualisierende Präsentation meiner Arbeit verwandelt. Neugierig, wie ich das gemacht habe? Lass uns loslegen. 🚀",
453453- "Read the more formal story [here](/blog/github-profile-readme/)": "Lies die formellere Geschichte [hier](/blog/github-profile-readme/)",
454454- "GitHub's Markdown [strips out a not a huge number of HTML tags, but important on.205FA73346A246681FB2": "Die GitHub-Markdown [entfernt nicht eine riesige Anzahl von HTML-Tags, aber wichtige](https://github.github.com/gfm/#disallowed-raw-html-extension). Aus Sicherheitsgründen natürlich (und das respektiere ich vollkommen, GitHub, wirklich ❤️), aber das bedeutete, dass mein perfektes Design komplett **unbrauchbar** war.",
455455- "I tried tweaking it. Replacing unsupported tags with ones that worked. Maybe I c.9C1A1617434D20136447": "Ich habe versucht, es anzupassen. Nicht unterstützte Tags durch funktionierende zu ersetzen. Vielleicht konnte ich etwas retten? *Nein*. Die Einschränkungen von Markdown machten mein Traum-Layout unmöglich.",
456456- "When in doubt, automate. If I couldn't get my HTML in directly, maybe I could ge.1858A8B032C310D0855B": "Wenn du dir unsicher bist, automatisiere es. Wenn ich mein HTML nicht direkt einfügen konnte, vielleicht konnte ich etwas Dynamisches mit einem Skript generieren? Also habe ich ein Python-Skript zusammengestellt, um mein neuestes GitHub-Repository abzurufen und in mein README einzufügen. Ich lasse hier einfach ein paar zufällige Bytes, die einige als Python-Code bezeichnen könnten:",
457457- "This seemed like a step in the right direction. It was automated. It was functio.C4E6DC32E9331691DF3A": "Das schien ein Schritt in die richtige Richtung zu sein. Es war automatisiert. Es funktionierte. Aber es löste nicht mein eigentliches Problem. 😢",
458458- "This wasn't about dynamic content — it was about *design*. And no amount of Pyth.DA93C57EF8343BE1D312": "Es ging nicht um dynamischen Inhalt — es ging um *Design*. Und keine Menge Python-Scripting würde Markdown schön aussehen lassen.",
459459- "",
461461- "Encode all images in **Base64** (because GitHub Markdown won't load external ima.E9111278458075460675": "Alle Bilder in **Base64** kodieren (da GitHub Markdown keine externen Bilder innerhalb eines SVG mit HTML lädt).",
462462- "It updates itself every 5 minutes, runs completely on GitHub Actions, and doesn'.83A1BE6CD135F68513B3": "Es aktualisiert sich alle 5 Minuten, läuft vollständig auf GitHub Actions und ist nicht auf externe Dienste angewiesen. Es ist wunderschön. Es ist effizient. Und vor allem ist es technisch absurd im besten Sinne.",
463463- "Isn't that bad compared to the [old README.md](https://github.com/trueberryless/.6E17F52CECF11CDBE670": "Ist das nicht schlecht im Vergleich zum [alten README.md](https://github.com/trueberryless/trueberryless/blob/5dce4ad0033b00829f8ec3756827057017447a65/README.md). Und kommentier bitte nicht, warum ich K-Pop höre! Es ist besser, als du denkst, glaub mir.",
464464- "But in the end, I created a [GitHub](https://github.com/github) profile README t.B8AC0FFCEFB516E68262": "Aber am Ende habe ich ein [GitHub](https://github.com/github)-Profil-README erstellt, das *eigentlich nicht existieren sollte* — aber es existiert. Und ich liebe es.",
465465- " in den [Astro-Dokumentationen](https://docs.astro.build) auffiel. Am unteren Ende des Inhaltsverzeichnisses positioniert, war er einfach, aber stilvoll, und ich liebte, wie subtil er Anerkennung gab. Als Starlight seine eigene Anerkennungsoption einführte, aktivierte ich sie in all meinen Projekten. Sie war klein, unaufdringlich und am unteren Ende jeder Seite platziert – nett, aber leicht zu übersehen.",
475475- "That’s when I thought, *What if others want a cooler credit option, like the one.A4A2F8A54AB64409161B": "Da dachte ich, *Was ist, wenn andere eine coolere Anerkennungsoption möchten, wie die aus den Astro-Dokumentationen?* Also machte ich mich daran, ein Plugin zu erstellen. Anfangs war es nur ein spaßiges Projekt, um auf auffälligere Weise Links zu Starlight und Astro bereitzustellen. Ich begann mit zwei Voreinstellungen – eine für Starlight und eine für Astro – und teilte meine Arbeit auf dem Astro-Discord.",
476476- "That’s where things took off. [One awesome Astro maintainer](https://www.rainsbe.B87402A9E163AA44FD52": "Und dort nahm alles Fahrt auf. [Ein großartiger Astro-Maintainer](https://www.rainsberger.ca/) schlug vor, *\"Warum nicht auch den Starlight-Blog verlinken?\"* und ich dachte, *Was für eine brillante Idee!* Ich fügte den Blog als dritte Voreinstellung hinzu, und plötzlich war das Plugin mehr, als ich je geplant hatte.",
477477- "But I wasn’t done yet. It bugged me that the credits were always in English, so .2030C81E5E275567F632": "Aber ich war noch nicht fertig. Es störte mich, dass die Anerkennung immer auf Englisch war, also beschloss ich, sie automatisch anhand der von Starlight unterstützten Sprachen übersetzen zu lassen. Da begann das eigentliche Abenteuer. Ich wandte mich an die Community, um Hilfe bei der Übersetzung des Plugins in verschiedene Sprachen zu erhalten. Die Resonanz war unglaublich! Menschen aus der ganzen Welt boten ihre Unterstützung an, und was als Solo-Projekt begann, wurde zu einer globalen Zusammenarbeit. Unterwegs fand ich neue Freunde und lernte so viel von allen Beteiligten. Jetzt unterstützt das Plugin etwa zehn Sprachen, und es kommen immer mehr Übersetzungen hinzu.",
478478- "What started as a simple idea turned into something I’m really proud of: **Starl.95365D5202F9DED635D6": "Was als einfache Idee begann, wurde zu etwas, auf das ich wirklich stolz bin: **Starlight Cooler Credit**. Es ist mehr als nur ein Plugin – es ist eine Möglichkeit, Anerkennung mit Stil, Anpassungsfähigkeit und einem Hauch von globaler Teamarbeit zu geben.",
479479- "If you’re curious, you can check it out at [starlight-cooler-credit.trueberryles.6ABA7C0A45AE4104F8C3": "Wenn du neugierig bist, kannst du es dir unter [starlight-cooler-credit.trueberryless.org](https://starlight-cooler-credit.trueberryless.org/) ansehen. Probier es aus – ich denke, du wirst es genauso lieben wie ich!",
480480- " verstreut. Das Chaos war überwältigend und machte es schwer, sich effektiv auf das Lernen zu konzentrieren.",
485485- "Driven by the vision of streamlining this process—not just for me, but also for .767678E51699FE7BA56A": "Getrieben von der Vision, diesen Prozess zu vereinfachen – nicht nur für mich, sondern auch für meine Mitschüler – entschied ich mich, eine zentrale Plattform zu schaffen, um Schulinhalte zusammenzufassen. Mein Ziel war zweigeteilt: Das Lernen zu vereinfachen und meine Mitschüler zu motivieren.",
486486- "At that time, I wasn’t aware of frameworks that could make building documentatio.46FC3F67CBB578E4C0C2": "Zu jener Zeit kannte ich keine Frameworks, die es einfacher gemacht hätten, dokumentationsartige Websites zu erstellen. Stattdessen nutzte ich reines HTML, CSS und JavaScript, um die ersten Versionen dessen zu entwickeln, was ich *Schneider IT* nannte. Obwohl ich es liebte, daran zu arbeiten, waren meine ersten Versuche umständlich – die dynamische Generierung des Inhaltsverzeichnisses und der Seitenleiste mit eigenem JavaScript-Code führte zu quälend langsamen Ladezeiten. Es dauerte über 10 Sekunden, bis alles angezeigt wurde!",
487487- "Despite the setbacks, I kept iterating. By 2023, I had created and discarded abo.4C51D8C17C02D0DB4703": "Trotz der Rückschläge arbeitete ich weiter daran. Bis 2023 hatte ich rund 10 Versionen der Website erstellt und verworfen, immer auf der Suche nach einem klareren Design und einem effizienteren Verwaltungssystem. Das Potenzial der Website war mir klar, doch an der Benutzerfreundlichkeit fehlte es noch.",
488488- "That’s when I stumbled upon [Starlight](https://starlight.astro.build/), a power.2C6631782B77735B3205": "Dann entdeckte ich [Starlight](https://starlight.astro.build/), ein leistungsstarkes und beeindruckendes Framework, erstellt von [Chris Swithinbank (@delucis)](https://github.com/delucis), um schnelle, Markdown-basierte Websites zu entwickeln. Diese Entdeckung war ein Wendepunkt – sie erlaubte mir, zwei meiner Leidenschaften zu verbinden: Websites zu erstellen und Markdown für seine Einfachheit und Eleganz zu nutzen.",
489489- "With the transition to Starlight, Schneider IT evolved into *Mutanuq*. The new n.99A51B0573CAAE76AA7D": "Mit dem Wechsel zu Starlight entwickelte sich *Schneider IT* zu *Mutanuq*. Der neue Name markierte einen Neuanfang und spiegelte die optimierte, modernisierte Website wider, die sie inzwischen geworden war. Ich schrieb alles neu, optimierte die Leistung der Website und konzentrierte mich darauf, Inhalte zu erstellen, die speziell auf die Bedürfnisse meiner Mitschüler zugeschnitten waren, insbesondere für bevorstehende Prüfungen.",
490490- "The transformation paid off. Friends began using the website regularly and gave .0C49D62224878320182A": "Die Transformation machte sich bezahlt. Freunde begannen, die Website regelmäßig zu nutzen und gaben begeistertes Feedback, wie *„Bro, diese Website sieht fantastisch aus!“* Mutanuq war nicht nur ein Werkzeug für Prüfungen – es wurde zu einer vertrauenswürdigen Ressource für meine Mitschüler und einem persönlichen Archiv für all das Wissen, das ich über die Schule hinaus bewahren wollte.",
491491- "Thanks to Starlight, managing and expanding Mutanuq became effortless, and the p.DA9EDB995FD28655BD1F": "Dank Starlight wurde das Verwalten und Erweitern von Mutanuq mühelos, und das Projekt entwickelte sich zu etwas, das ich bis heute gerne weiterführe. Was als *Schneider IT* begann – eine kleine Idee, meine Notizen zu organisieren – erblühte zu *Mutanuq*, einer Plattform, die das Lernen für andere vereinfacht und wertvolles Wissen für mein zukünftiges Ich bewahrt.",
492492- "Designing a Profile That Works Within GitHub's Rules": "Entwerfen eines Profils, das innerhalb der GitHub-Regeln funktioniert",
493493- "How I Built a GitHub Profile README That Shouldn't Exist But It Does": "Wie ich ein GitHub-Profile-README erstellt habe, das es eigentlich nicht geben sollte, aber es existiert",
494494- "Every great project starts with a realization of a problem. My GitHub profile RE.481577399AECDF28BE26": "Jedes großartige Projekt beginnt mit der Erkenntnis eines Problems. Mein GitHub-Profile-README war überladen, voll mit zu vielen Informationen, zu vielen Abzeichen und einer überwältigenden Menge an Inhalten, die Stil und Struktur fehlten. Es gab Erfolge von Hackathons, GitHub-Beitragsgrafiken, verschiedene technische Abzeichen und vieles mehr, was es visuell unansprechend und schwer navigierbar machte. Anfangs dachte ich, dies sei eine effektive Art, mich zu präsentieren, aber mit der Zeit wurde klar, dass die Informationen eher überwältigend als informativ waren. Ich wollte etwas Neues, einen raffinierteren und visuell ansprechenderen Ansatz, um mein Profil zu präsentieren, und die Idee, ein Bento-Raster zu implementieren, kam mir in den Sinn. Das Ziel war es, ein Layout zu schaffen, das nicht nur funktional, sondern auch ästhetisch beeindruckend und strukturiert ist.",
495495- "The first step was designing an ideal layout using HTML and CSS. The result was .6D5E560BE64C73324B74": "Der erste Schritt bestand darin, ein ideales Layout unter Verwendung von HTML und CSS zu entwerfen. Das Ergebnis war vielversprechend, ein strukturiertes und optisch ansprechendes Design, das die beabsichtigten Informationen effektiv vermittelte. Doch die direkte Umsetzung in meinem GitHub-Profile-README war nicht unkompliziert. GitHub-Flavored Markdown unterliegt strengen Einschränkungen hinsichtlich der unterstützten HTML-Elemente aufgrund von Sicherheitsvorgaben. Viele essenzielle HTML-Tags waren eingeschränkt, was es unmöglich machte, das Design wie vorgesehen einzubetten. Das Verständnis dieser Einschränkungen bedeutete, dass der gesamte Ansatz neu durchdacht werden musste.",
496496- "Faced with these restrictions, I considered alternative ways to dynamically gene.2567BD537B285ECB001A": "Angesichts dieser Einschränkungen überlegte ich, alternative Wege zu finden, um die Inhalte dynamisch zu generieren und zu präsentieren. Ein Ansatz bestand darin, die Inhaltsaktualisierungen mit einem Python-Skript zu automatisieren, um mein neuestes GitHub-Repository abzurufen und es dynamisch in das README einzufügen. Das Skript griff auf die GitHub-API zu, rief das zuletzt aktualisierte Repository ab und änderte entsprechend das README. Obwohl dies ein interessantes Experiment in Automatisierung war, löste es nicht das Kernproblem, nämlich die Notwendigkeit eines strukturierten und visuell ansprechenden Designs.",
497497- "Considering alternative approaches, I briefly entertained the idea of taking a s.780BAADFF3D433749DDA": "Unter Berücksichtigung alternativer Ansätze dachte ich kurzzeitig daran, einen Screenshot des entworfenen HTML-Layouts zu machen und ihn als statisches Bild im README einzubetten. Obwohl dies das Problem visuell gelöst hätte, fühlte es sich wie eine unelegante Lösung an, die mangelnde Flexibilität und Reaktionsfähigkeit aufwies. Weitergehend suchte ich nach einer Methode, die sowohl Struktur als auch Anpassungsfähigkeit ermöglichte und dennoch dynamische Inhaltsaktualisierungen beibehielt.",
498498- "SVGs emerged as a potential solution. They support scalability, maintain visual .0193206311AC8FC941A3": "SVGs traten als eine potenzielle Lösung in Erscheinung. Sie unterstützen Skalierbarkeit, bewahren die visuelle Klarheit über verschiedene Auflösungen hinweg und ermöglichen das Einbetten von Texten und anderen Elementen. Ein frühes Experiment beinhaltete das Einbetten von HTML in ein SVG unter Verwendung des `foreignObject`-Tags. Obwohl dies konzeptionell vielversprechend war, erwies sich die Umsetzung als komplex und wurde vorübergehend beiseite gelegt. Beim späteren Zurückkehren zum Problem war ein strukturierterer Ansatz erforderlich.",
499499- "The final approach involved using a composite SVG structure. The solution consis.F542E5E0B858565590BE": "Der endgültige Ansatz beinhaltete die Verwendung einer zusammengesetzten SVG-Struktur. Die Lösung bestand aus mehreren Schlüsselkomponenten: Konvertierung des ursprünglichen HTML-Layouts in eine SVG-Darstellung, Kodierung von Bildern mit Base64, um sicherzustellen, dass sie korrekt geladen wurden, Integration dynamischer Elemente wie GitHub-Statistiken und Spotify-Status-Updates als Inline-SVGs sowie Automatisierung der Updates über GitHub Actions. Durch den Einsatz dieser Techniken wurde das Bento-Rasterlayout voll funktionsfähig, konnte sich selbst aktualisieren und behielt dabei ein sauberes, strukturiertes Erscheinungsbild innerhalb der Einschränkungen von GitHub-Flavored Markdown bei.",
500500- "A critical turning point was the discovery of a Stack Overflow post detailing a .BFAFB816D1969BB990B1": "Ein entscheidender Wendepunkt war die Entdeckung eines Stack Overflow-Beitrags, der eine Methode zur effizienten und effektiven Konvertierung von HTML in SVG beschrieb. Diese Methode bot eine strukturierte Möglichkeit, die erforderlichen SVG-Elemente zu generieren, während das beabsichtigte Design beibehalten wurde. Durch die Kombination dieser Methode mit Base64-Kodierung für Bilder und GitHub Actions zur Automatisierung entstand eine vollständig realisierte Lösung, die alle ursprünglichen Anforderungen erfüllte.",
501501- "The final implementation consists of a refined and visually striking GitHub prof.C95E5BCA4CC5C610AAF2": "Die endgültige Implementierung besteht aus einem verfeinerten und visuell eindrucksvollen GitHub-Profile-README, das dynamische Inhaltsaktualisierungen integriert und dabei eine elegante Struktur beibehält. Sie präsentiert Informationen klar, ohne unnötige Überladung, und ist vollständig automatisiert, aktualisiert sich alle fünf Minuten ohne manuelles Eingreifen. Das Projekt erforderte umfangreiche Recherche und Experimente mit SVGs, GitHub Actions und Markdown-Einschränkungen. Der Prozess verlangte Ausdauer und Problemlösungsfähigkeiten, um innerhalb der Plattformbeschränkungen ein technisch beeindruckendes Ergebnis zu erzielen. Das Resultat ist ein GitHub-Profile-README, das Design, Automatisierung und Funktionalität innerhalb der Beschränkungen der Plattform effektiv ausbalanciert.",
502502- "If you're now inspired to create a stunning GitHub profile README yourself, read.BC2C5ED3BDEE87A869B8": "Wenn du nun inspiriert bist, selbst ein beeindruckendes GitHub-Profile-README zu erstellen, lies meinen [technischeren und humorvollen Blog-Beitrag](/blog/technically-impressive-github-profile-readme/) oder schau direkt in mein Repository [github.com/trueberryless/trueberryless](https://github.com/trueberryless/trueberryless/tree/7519c6f50094bdfd6fb47f610e6638ac8efdd6ad). Und falls dir meine Arbeit hilft, gib ihr gern einen ⭐ und folge mir auf GitHub unter [trueberryless](https://github.com/trueberryless)! 🚀",
503503- "I noticed this trend myself, as you can clearly see from [some of my posts where.6F67065684689D74728B": "Diesen Trend habe ich selbst bemerkt, wie man deutlich sehen kann aus [einigen meiner Beiträge, bei denen ich zugab, KI verwendet zu haben](/blog/authors/artificial-intelligence/), um mir beim Schreiben zu helfen. Aber ich denke, das ist keine Schande. Jeder Content-Ersteller, der KI einsetzt, sollte aus erster Hand die Fallstricke erleben, die entstehen, wenn Inhalte direkt für den Betrachter oder Leser erstellt werden, um zu erkennen, wie wenig sie letztlich über das Thema wissen. Dies ermöglicht es ihnen, aus ihrem Fehler zu lernen und sich bewusst zu sein, wie leicht Faulheit zu einem solch verachteten Weg führen kann. Nur die Exzellenten unter uns strebten von Anfang an nach handgefertigten Inhalten.",
504504- "![Cognitive Erosion Paradigm: Layered, green circles with \"AI\" in the centre, su.38D1FAC9088D0BD4738E": "Kognitionserosionsparadigma: Geschichtete, grüne Kreise mit \"KI\" in der Mitte, umgeben vom \"Gehirn\", das von mehreren kreisförmigen Segmenten umgeben ist, welche im Uhrzeigersinn mit \"Design\", \"Blog\", \"Chats\", \"Kunst\", \"Inhalt\" und \"Rede\" beschriftet sind.",
505505- "From Balloons to Binary: A 20th Birthday Packed with Clues": "Von Luftballons zu Binärcode: Ein 20. Geburtstag voller Rätsel",
506506- "This is the story of creating a true art masterpiece.": "Dies ist die Geschichte der Schaffung eines wahren Kunstmeisterwerks.",
507507- "This year, I turned 20 - and instead of simply lighting candles and inflating ba.CEC0F0AD03DAEF815274": "Dieses Jahr wurde ich 20 – und anstatt einfach Kerzen anzuzünden und Luftballons aufzublasen, wollte ich auf kreativere und persönlichere Weise feiern. Die Idee? Die Zahl 20 in so vielen überraschenden, cleveren und versteckten Formen wie möglich in einem dekorierten Wohnzimmer zu verstecken – und dann alles in einem einzigen Foto festzuhalten. Ob durch mathematische Rätsel oder visuelle Ostereier, der Raum verwandelte sich in ein fröhliches Rätsel voller spielerischer Details.",
508508- "I Turned 20 - And Turned It Into a Puzzle": "Ich wurde 20 – und verwandelte es in ein Puzzle",
509509- "The final result wasn't just a festive setting, but a carefully designed puzzle .B767471D3FEF6C98BD69": "Das Endergebnis war nicht nur eine festliche Umgebung, sondern ein sorgfältig gestaltetes Puzzle voller Bedeutung, Humor und subtiler Anspielungen auf Dinge, die ich liebe. Einige Hinweise sind leicht zu erkennen, andere sind tief versteckt oder erfordern kreative Interpretation – aber jetzt, da die Herausforderung öffentlich ist, ist es Zeit für die offizielle Auflösung.",
510510- "Altogether, the number 20 (or variations of it) appears **73 times** throughout .913452A34E0ADB471EF0": "Insgesamt erscheint die Zahl 20 (oder Variationen davon) **73 Mal** auf dem Bild. Dazu gehören 14 Fälle der wörtlichen Zahl „20“, die in cleveren Formen wie Barcodes, QR-Codes und Hexadezimalwerten versteckt sind, sowie sechs Fälle, in denen Objekte genau in zwanziger Mengen auftreten. Außerdem sind 32 „20“-Darstellungen auf Geburtstagsballons im Raum verteilt – obwohl etwa die Hälfte davon nicht aus der Perspektive der Kamera sichtbar ist – und fünf weitere Verweise, die auf kreative Weise meinen Geburtstag über Zahlen wie 2025 oder 2005 reflektieren.",
511511- "Roughly 40 of these clues are clearly visible and solvable from the photo alone..900B0E49D675342ADE28": "Etwa 40 dieser Hinweise sind direkt auf dem Foto sichtbar und lösbar. Der Rest erfordert etwas Querdenken oder Vorstellungskraft, um entdeckt zu werden – vor allem diejenigen, die sich knapp außerhalb des zweidimensionalen Rahmens des Bildes verstecken.",
512512- "How the “20” Was Hidden": "Wie die „20“ versteckt wurde",
513513- "Many of the 20s are woven directly into the decor. There's a bright 20 km/h road.DF20030D8A7B9E4CCCF0": "Viele der Zwanziger sind direkt in die Dekoration integriert. Es gibt ein helles 20-km/h-Verkehrsschild, riesige Regenbogen-Folienballons in den Ziffern 2 und 0 und ein großes „Happy 20th Birthday“-Banner, das über das Fenster gespannt ist. Ein Geburtstags-„Kuchen“ aus 20 Rollen Toilettenpapier steht prominent in der Mitte, umgeben von dekorativen Gegenständen wie Uhren, Obst, Ferrero Rocher Pralinen, Partylampen und Spielsteinen – alle absichtlich in Mengen von 20 gruppiert.",
514514- "Then come the mathematical twists: two QR codes subtly lead to the number 20. Th.631C4BD85BA49B72C4E1": "Dann kommen die mathematischen Wendungen: Zwei QR-Codes führen subtil zur Zahl 20. Es gibt einen Morsecode-Streifen, einen Binärcode (10100) und eine in Hexadezimal dargestellte Farbe, die in Basis<sub>10</sub> zu 20 konvertiert wird. Ein Barcode verbirgt die Zahl visuell, während ein Blatt Spielkarten (Ass, Bube, Dame, König) clever auf 20 summiert. Ein Domino-Paar ergibt ebenfalls die magische Zahl. Sogar ein Stück Kuchen auf der Couch – genau 20 % des Ganzen – setzt das Thema fort.",
515515- "Some of the trickiest clues are tucked into logic puzzles. For example, the appl.3E1D246EA1E47E0643AB": "Einige der kniffligsten Hinweise sind in Logikrätseln versteckt. Zum Beispiel ähneln die Äpfel und Birnen im Holzregal 1en und 0en, und wenn man sie richtig entschlüsselt, ergeben sie „Fe“ – eine subtile Anspielung auf meinen Namen, Felix. Würfel auf dem Tisch sind so gedreht, dass man die versteckten Oberseiten ableiten kann. Deren Summe ergibt 20.[^1] Und die größte Herausforderung: ein Bündel Mikado-Stäbchen, deren gesamte sichtbare Punktzahl 110 beträgt – was, wenn in Basis<sub>4</sub> interpretiert, genau 20 im Dezimalsystem entspricht. Ein echtes Rätsel im Rätsel!",
516516- "Fun fact: The tops of the dice should add up to 20, but in the final picture, th.1AD6690ECD087653EA2B": "Fun Fact: Die oberen Seiten der Würfel sollten 20 ergeben, aber im finalen Bild summieren sich diese nur auf 12. Das liegt daran, dass die fünf Würfel nicht mit dem gleichen Konstruktionsschema hergestellt wurden – zwei folgen einer Uhrzeigerrichtung, drei einer gegenläufigen, wie [hier auf Wikipedia](https://en.wikipedia.org/wiki/Dice#Arrangement) erklärt. 😂",
517517- "A few clues also fall under the “pop culture knowledge” category. There's a ment.AB39B4A99B41F7978013": "Einige Hinweise fallen auch in die Kategorie „Popkulturwissen“. Es gibt eine Erwähnung von Rihanna, die wie ich am 20. Februar geboren wurde. Eine kleine Hommage an Hans Zimmer und Christopher Nolan verweist auf ihre Zusammenarbeit im Jahr 2005 in Batman Begins – dem Jahr, in dem ich geboren wurde.",
518518- "A Snapshot of My Musical Taste": "Ein Einblick in meinen Musikgeschmack",
519519- "While not directly part of the 20-themed puzzle, there's a musical layer hidden .E75B2EA910ADE079A758": "Auch wenn es nicht direkt Teil des 20-Themen-Puzzles ist, gibt es eine musikalische Ebene im Bild, die etwas Tiefpersönliches widerspiegelt: meine Liebe zur Musik. In der oberen linken Ecke sind acht quadratische Albumcover ordentlich angeordnet, und jedes enthält einen Spotify-Code, der zu einem meiner absoluten Lieblingsstücke führt. Etwas weiter rechts stellt das neunte Cover eine Playlist dar, die all diese Songs zusammenbringt – ein kleiner kuratierter Soundtrack meiner Welt.",
520520- "Each song on that list has earned its place not just for how it sounds, but for .64FF10782E65A696CFEC": "Jeder Song auf dieser Liste hat sich seinen Platz nicht nur durch seinen Klang verdient, sondern auch durch die Geschichten, Erinnerungen und Emotionen, die er transportiert. Und am wichtigsten: durch die großartigen Künstler, die ihn geschaffen haben.",
521521- "It starts with *Molossus* from Batman Begins, a powerful, rising track that intr.0B2CCAEA825C10332861": "Es beginnt mit *Molossus* aus Batman Begins, einem kraftvollen, aufbauenden Track, der mich in die epische Verschmelzung von Film und Musik durch die Arbeit von Hans Zimmer und Christopher Nolan – einem meiner Lieblingsduos aus Regisseur und Komponist – eingeführt hat. Der Film wurde 2005 veröffentlicht, im Jahr meiner Geburt, und obwohl The Dark Knight mein persönlicher Favorit ist, wird sich Molossus immer ikonisch anfühlen.",
522522- "Next is *9-bit Expedition* from the Fastfall soundtrack, composed by Lifeformed..60068D27CC86091CE517": "Als nächstes kommt *9-bit Expedition* aus dem Fastfall-Soundtrack, komponiert von Lifeformed. Ihr ruhiger, von Chiptune inspirierter Stil trifft genau den richtigen Ton, zu dem ich immer wieder zurückkehre. Ich bewundere ihre Arbeit so sehr, dass ich ihre Tracks in selbstgebauten Celeste-Leveln verwendet habe – nicht nur, weil sie passen, sondern weil ihre Musik mir etwas bedeutet.",
523523- "And then there's *Resurrections* from Celeste - a game I've easily spent 200-300.94D4BAA5C193535ECDD8": "Und dann ist da noch *Resurrections* aus Celeste – ein Spiel, das ich problemlos 200–300 Stunden gespielt habe. Die wahre Magie der Atmosphäre liegt bei Lena Raine, deren Musik eine Art hat, in deine Emotionen einzutauchen und etwas Rohes und Schönes hervorzuziehen. Ihre Kompositionen sind mehr als nur Hintergrundmusik – sie sind das Erlebnis. Ich betrachte sie ehrlich gesagt als eine der inspirierendsten Komponistinnen, die ich je gehört habe, und ihre Arbeit an Celeste ist ein Meisterwerk, das ich nie aufhören werde zu bewundern.",
524524- "Also in the mix is *22:12 - Until the End of Time* by Danger, from the Haven sou.72EAD217688685BCB963": "Auch dabei ist *22:12 - Until the End of Time* von Danger, aus dem Haven-Soundtrack. Ich habe das Spiel nicht einmal gespielt – die Musik allein hat mich in ihren Bann gezogen. Sie ist filmisch, emotional und komplett immersive. Danger hat es absolut geschafft, durch Sound eine Welt zu erschaffen, in der ich mich stundenlang verlieren könnte.",
525525- "*Annihilate* from Across the Spider-Verse is another standout. I love both movie.9437FFA646F4451D9745": "*Annihilate* aus Across the Spider-Verse ist ein weiterer Höhepunkt. Ich liebe beide Filme aus der Serie, und dieser Track fängt perfekt die Energie, den Stil und die Emotion von Miles' Geschichte ein. Ein klanglicher Ausbruch, der nie alt wird.",
526526- "From a totally different genre comes *ROTTWEiLER* by TJ\\_beastboy, a German rapp.B95612C092ABF85A718D": "Aus einem ganz anderen Genre kommt *ROTTWEiLER* von TJ\\_beastboy, einem deutschen Rapper, der meiner Meinung nach auf einem völlig anderen Level ist. Er kombiniert entspannte Vibes und mitreißende Intensität auf eine Weise, die frisch und echt wirkt. Seine Musik hat immer etwas Einzigartiges zu sagen, und ich finde ehrlich, dass er einer der besten Künstler zurzeit ist.",
527527- "Another track I couldn't leave out is *747* from Tenet - another mind-bending No.89615FC31E49EF7EA4BB": "Ein weiterer Track, den ich nicht weglassen konnte, ist *747* aus Tenet – einem weiteren mind-bending Nolan-Film, vertont von Ludwig Göransson. Die Energie, das Tempo und der Aufbau dieses Stücks treffen einfach ins Schwarze. Es ist leicht einer meiner Lieblingsfilmsoundtracks aller Zeiten, und Göransson zeigt weiterhin, dass er ein Genie der Filmmusik ist.",
528528- "Last but far from least: *MORE* by K/DA - my most-played song ever. It's high-en.12164785491B9D2DAF37": "Zu guter Letzt: *MORE* von K/DA – mein meistgespielter Song überhaupt. Er ist energiegeladen, poliert, selbstbewusst und einfach rundum spaßig. K-Pop ist allgemein viel zu unterschätzt, und dieser Track ist der Beweis, dass Genregrenzen keine Rolle spielen, wenn ein Song auf jeder Ebene funktioniert.",
529529- "These songs - and the brilliant minds behind them - aren't just background music.E5DA08D529E76E42DBB3": "Diese Songs – und die brillanten Köpfe dahinter – sind nicht bloß Hintergrundmusik. Sie sind Teil meiner kreativen Welt, meiner emotionalen Landschaft und der Soundtrack zu allem, was ich liebe.",
530530- "Stats for Nerds": "Statistiken für Nerds",
531531- "For those who enjoy data and structure, here's a little summary of all 20s in th.B3CE0613F24C05B8FFE5": "Für diejenigen, die Daten und Struktur lieben, hier ist eine kleine Zusammenfassung aller \"20\" im Bild:",
532532- "Category": "Kategorie",
533533- "Count": "Anzahl",
534534- "Total hidden instances": "Gesamte versteckte Instanzen",
535535- "73x": "73x",
536536- "Clearly visible and solvable": "Klar sichtbar und lösbar",
537537- "\\~40x": "\\~40x",
538538- "Written \"20\"": "Geschriebene \"20\"",
539539- "14x": "14x",
540540- "Groups of 20 identical items": "Gruppen von 20 identischen Gegenständen",
541541- "6x": "6x",
542542- "Birthday balloons printed with \"20\"": "Geburtstagsballons mit \"20\" bedruckt",
543543- "32x": "32x",
544544- "Creative variations (e.g., 2025, 2005)": "Kreative Variationen (z. B. 2025, 2005)",
545545- "5x": "5x",
546546- "Puzzle Solutions": "Rätsel-Lösungen",
547547- "Code Type": "Code-Typ",
548548- "Representation": "Darstellung",
549549- "QR Codes": "QR-Codes",
550550- "Bar Code": "Barcode",
551551- "20\\. February": "20. Februar",
552552- "Binary Code": "Binärcode",
553553- "Today is February 20th, 2025": "Heute ist der 20. Februar 2025",
554554- "Base": "Base",
555555- "Code": "64",
556556- "My birthday is February 20th, 2005": "Mein Geburtstag ist der 20. Februar 2005",
557557- "Hex Code (Color Codes)": "Hex-Code (Farbcodes)",
558558- "twenty": "zwanzig",
559559- "Morse Code": "Morse-Code",
560560- "20\\. FEBRUARY 2005": "20. FEBRUAR 2005",
561561- "Playing Cards": "Spielkarten",
562562- "King (4) + Queen (3) + Jack (2) + Ace (11) = 20": "König (4) + Dame (3) + Bube (2) + Ass (11) = 20",
563563- "Domino": "Domino",
564564- "(0|2) + (3|3) + (4|0) + (2|1) + (1|0) + (2|2) = 20": "(0|2) + (3|3) + (4|0) + (2|1) + (1|0) + (2|2) = 20",
565565- "Apples (0) and Pears (1)": "Äpfel (0) und Birnen (1)",
566566- "Binary Code: Fe": "Binärcode: Fe",
567567- "Mikado Sticks Value": "Wert der Mikadostäbchen",
568568- "110 (base": "110 (Basis",
569569- ") = 20 (base": "4) = 20 (Basis",
570570- "Dice top sides": "10)",
571571- "It was a joy to turn this celebration into a personal challenge and to see frien.C633AD0611AAAC49C2DA": "Oben liegende Würfelseiten",
572572- "How to fully autogenerate Starlight sidebars (without losing control)": "Wie man Starlight-Sidebars vollständig automatisch erstellt (ohne die Kontrolle zu verlieren)",
573573- "Learn two Starlight techniques to autogenerate large sidebars while keeping clea.20BC1955A37AA7859B18": "Erfahren Sie zwei Starlight-Techniken, um große Sidebars automatisch zu erstellen und dabei saubere URLs und Beschriftungen beizubehalten.",
574574- "Have you ever wanted to simplify sidebar generation in your Starlight project? H.2D5E37D5439F17736C27": "Haben Sie jemals versucht, die Generierung von Sidebars in Ihrem Starlight-Projekt zu vereinfachen? Haben Sie versucht, die gesamte Sidebar automatisch zu erstellen, nur um festzustellen, dass Sie die Struktur nicht nach Ihren Wünschen anpassen können?",
575575- "This post demonstrates two Starlight features that make fully autogenerated side.BDF2E65CF1AF47E9F83B": "Dieser Beitrag zeigt zwei Starlight-Funktionen, die es ermöglichen, vollständig automatisch generierte Sidebars flexibel zu gestalten und den Wartungsaufwand zu reduzieren.",
576576- "Use case": "Anwendungsfall",
577577- "In medium to large Starlight projects, the problem arises that the manual creati.11763E0A14C36D449179": "In mittelgroßen bis großen Starlight-Projekten stellt sich das Problem, dass die manuelle Erstellung und Pflege der [Starlight-Sidebar-Konfiguration](https://starlight.astro.build/reference/configuration/#sidebar) eine mühsame und zeitaufwändige Aufgabe ist.",
578578- "In the past, Starlight didn't provide the right primitives for this, and the rec.48BF051900AF52DB446D": "In der Vergangenheit bot Starlight nicht die richtigen Grundfunktionen dafür, und der empfohlene Ansatz bestand darin, die automatische Erstellung der Sidebar-Konfiguration um eine Ebene tiefer zu verschieben - sodass nur Ordner ohne verschachtelte Unterordner automatisch generiert wurden. Mit der Einführung von [Route Data](https://starlight.astro.build/guides/route-data/) und dem jüngeren [`generateId()`-Hook im `docsLoader`](https://starlight.astro.build/reference/configuration/#generateid) können diese Szenarien nun jedoch viel einfacher und effizienter gelöst werden.",
579579- "Solving the ordering issue": "Das Sortierungsproblem lösen",
580580- "A common problem always was: \"How can I customise the order of sidebar folders i.AE2CA0CC5AC2560DCF3C": "Ein häufiges Problem war immer: „Wie kann ich die Reihenfolge der Sidebar-Ordner anpassen, wenn ich die Sidebar automatisch generiere?“ Alte Probleme wie [#1223](https://github.com/withastro/starlight/issues/1223) schlagen eine Lösung vor, die von [Nuxt Content](https://content.nuxt.com) inspiriert ist, bei der jeder Abschnitt des gesamten Pfads [mit Zahlen + Punkten vorangestellt](https://v2.content.nuxt.com/usage/content-directory#ordering) werden kann, um eine nummerische Sortierung auf Dateibasis festzulegen. Ein Beispiel für ein solches Projekt könnte so aussehen:",
581581- "src/content/docs/nested-folder": "src/content/docs/nested-folder",
582582- "1.frameworks": "1.frameworks",
583583- "1.vue.md": "1.vue.md",
584584- "2.nuxt.md": "2.nuxt.md",
585585- "2.examples": "2.examples",
586586- "1.vercel.md": "1.vercel.md",
587587- "2.netlify.md": "2.netlify.md",
588588- "If you want to use this approach in Starlight, it doesn't work out-of-the-box, b.1799E45D5D83874DE15D": "Wenn Sie diesen Ansatz in Starlight verwenden möchten, funktioniert er nicht sofort, aber mit einer einfachen Einrichtung können Sie ihn umsetzen.",
589589- "Starlight [0.35.0](https://github.com/withastro/starlight/releases/tag/%40astroj.5B25A8356D4B9CE00F94": "Starlight [0.35.0](https://github.com/withastro/starlight/releases/tag/%40astrojs%2Fstarlight%400.35.0) führte eine Callback-Funktion ein, die Sie an `docsLoader()` übergeben können, um die ID (URL) der generierten Seite zu manipulieren. Indem Sie den Eintrag durch `\"/\"` aufteilen und jede Zahl + Punkt auf Segmentebene entfernen, haben Sie nun die gleiche Funktionalität in Starlight:",
590590- "The URL to access the pages now changes e.g., from `/nested-folder/1.frameworks/.6941CF02484C8DCB2B28": "Die URL zum Zugriff auf die Seiten ändert sich nun z. B. von `/nested-folder/1.frameworks/1.vue` zu `/nested-folder/frameworks/vue`.",
591591- "However, the folder names in the sidebar still include the `1.` prefixes. So let.0CAEBB02FF8EEAA7C1F1": "Allerdings enthalten die Ordnernamen in der Sidebar immer noch die `1.`-Präfixe. Lassen Sie uns also auch die Manipulation der Sidebar lösen:",
592592- "Solving the sidebar folder naming issue": "Das Problem der Ordnerbenennung in der Sidebar lösen",
593593- "Starlight [0.32.0](https://github.com/withastro/starlight/releases/tag/%40astroj.7F6BC940CC96F2ABA63D": "Starlight [0.32.0](https://github.com/withastro/starlight/releases/tag/%40astrojs%2Fstarlight%400.32.0) führte [Route Data](https://starlight.astro.build/guides/route-data/) ein, das wir jetzt nutzen können, um die Ordnernamen in der Sidebar zu manipulieren:",
594594- "remove any leading number + dot from the folder name and": "das Entfernen jeder führenden Zahl + Punkt aus dem Ordnernamen und",
595595- "apply \"Title Case\" so they don't look completely lowercase": "die Anwendung von \"Title Case\", damit sie nicht vollständig kleingeschrieben erscheinen",
596596- "Internationalisation (i18n)": "Internationalisierung (i18n)",
597597- "Note that [internationalisation (i18n) of folder names](https://starlight.astro..78D4931CBD055B889B4B": "Beachten Sie, dass die [Internationalisierung (i18n) von Ordnernamen](https://starlight.astro.build/guides/sidebar/#internationalization) bei einem solchen Setup eine fehlende Funktionalität ist, da es derzeit keinen Ort gibt, an dem Übersetzungen von Ordnernamen definiert werden können. Sie werden einfach in Title Case umgewandelt. Die Implementierung einer Logik zum dynamischen Laden von Übersetzungen könnte darin bestehen, das [`locale`-Feld aus den Routeninformationen](https://starlight.astro.build/reference/route-data/#locale) zu lesen und Übersetzungen in `json`-Dateien zu definieren. Andernfalls können Sie [HiDeoos Plugin verwenden](#using-hideoos-plugin), das [i18n unterstützt](https://starlight-auto-sidebar.netlify.app/guides/i18n/).",
598598- "Don't forget to add the `routeData.ts` file to your `astro.config.mjs`:": "Vergessen Sie nicht, die Datei `routeData.ts` zu Ihrer `astro.config.mjs` hinzuzufügen:",
599599- "Of course you can adjust the code to your needs (e.g., remove the \"Title Case\" t.8EE143244F5E89BEFCE4": "Natürlich können Sie den Code an Ihre Bedürfnisse anpassen (z. B. die \"Title Case\"-Transformation entfernen, da Ihre Dateinamen bereits korrekt geschrieben sind).",
600600- "Using HiDeoo's plugin": "Das Plugin von HiDeoo verwenden",
601601- "If you want to autogenerate your whole sidebar and still have the flexibility to.AB216A94695F22CEA149": "Wenn Sie Ihre gesamte Sidebar automatisch generieren und dennoch die Flexibilität haben möchten, alles nach Ihren Wünschen anzupassen, hat [HiDeoo](https://github.com/HiDeoo) auch ein dediziertes Plugin für solche Anwendungsfälle erstellt: [Starlight Auto Sidebar](https://starlight-auto-sidebar.netlify.app).",
602602- "Especially those two features got mentioned in this article:": "Insbesondere wurden diese zwei Funktionen in diesem Artikel erwähnt:",
603603- "Controlling the [order](https://starlight-auto-sidebar.netlify.app/metadata/#ord.08329D63645DA7FDB0F2": "Die Steuerung der [Reihenfolge](https://starlight-auto-sidebar.netlify.app/metadata/#order) einzelner Verzeichnisse",
604604- "Adapting the [displayed label](https://starlight-auto-sidebar.netlify.app/metada.41A180D1D992072397D3": "Die Anpassung der [angezeigten Beschriftung](https://starlight-auto-sidebar.netlify.app/metadata/#label) einzelner Ordner",
605605- "However, if you want to automate the whole generation without having to specify .AA2463868A43906766FA": "Wenn Sie jedoch die gesamte automatische Generierung durchführen möchten, ohne für jedes Verzeichnis manuell Beschriftungen und Reihenfolgen festlegen zu müssen, ist es bevorzugt und empfohlen, die Lösung selbst zu programmieren (mit einigen Richtlinien in diesem Blog).",
606606- "If you want to check out the code presented in this blog, feel free to visit the.9F7F074B6E1A29450183": "Wenn Sie den in diesem Blog vorgestellten Code ausprobieren möchten, besuchen Sie gerne die [StackBlitz](https://stackblitz.com/github/trueberryless/starlight-autogenerate-whole-sidebar?file=src%2Fcontent.config.ts) oder den Quellcode im [GitHub-Repo](https://github.com/trueberryless/starlight-autogenerate-whole-sidebar).",
607607- "You might think that this story is now over because everyone could just use the .C9618FDEC9BA9ED17D35": "Sie könnten denken, dass diese Geschichte nun vorbei ist, da jeder einfach die Variante nutzen könnte, die er bevorzugt, und alle wären glücklich. Aber Starlight entwickelte sich weiter und verbessert sich ständig. Etwa drei Monate später, am 15. Februar, fast wie ein [Geburtstagsgeschenk](/blog/20th-birthday/) für mich, kam die lang erwartete Ergänzung von Routendaten in Starlight mit der Veröffentlichung von [v0.32](https://github.com/withastro/starlight/releases/tag/@astrojs/starlight@0.32.0). Diese scheinbar kleine Ergänzung eröffnete so viele Möglichkeiten, die ich selbst nie erwartet hätte. HiDeoo war einmal mehr die führende Inspiration für Plugin-Autoren und trieb diese neue Funktionalität bis an ihre Grenzen. Es dauerte nur zwei Tage, um [mehr als 11 Plugins an die neueste Starlight-Version von damals anzupassen](https://bsky.app/profile/hideoo.dev/post/3liffpudc5c2b), und später wurden viele dieser Codeabschnitte verbessert und refaktoriert, um diese mächtige Funktion noch weiter zu nutzen.",
608608- "Deactivate TLS within Argo CD": "TLS in Argo CD deaktivieren"
609609-}
-612
translations/fr.json
···11-{
22- "Deep Thoughts - Overview": "Pensées Profondes - Aperçu",
33- "Welcome to my blog. Take a look at this minimalistic overview of all my blog pos.5A38D8470D9F24600ED2": "Bienvenue sur mon blog. Découvrez cet aperçu minimaliste de tous mes articles de blog.",
44- "Some aspects of creating a blog are really easy, and some are extremely difficul.997EB56977F5D63B1118": "Certains aspects de la création d'un blog sont vraiment faciles, et d'autres extrêmement difficiles !",
55- "A beginner friendly introduction with some swear words on how to start writing y.BE312646252BC9A86726": "Une introduction conviviale pour les débutants avec quelques jurons sur la manière de commencer à écrire votre propre article de blog.",
66- "<p>Talk a little bit about how one can become better (not master by any means, n.8C69E4E4A592E67958BE": "<p>Parlons un peu de comment on peut s'améliorer (sans pour autant devenir un maître, personne n'est parfait) dans l'écriture d'un article de blog. Ce ne sont que mes réflexions après que deux gars géniaux de la <a href=\"https://astro.build/chat\">Communauté Astro</a> (<a class=\"gh-badge\" href=\"https://github.com/jdtjenkins\"><img src=\"https://github.com/jdtjenkins.png\" alt=\"jdtjenkins\" />Jacob</a> et <a class=\"gh-badge\" href=\"https://github.com/louisescher\"><img src=\"https://github.com/louisescher.png\" alt=\"louisescher\" />Lou</a>) aient décidé d'écrire des blogs sur la difficulté ou la facilité d'écrire des articles de blog.</p><p>Veuillez lire leurs articles en premier, car celui-ci est une suite aux deux autres :</p><ol><li><a href=\"https://jacobjenkins.codes/posts/why-is-writing-blogs-so-hard/\">\"Pourquoi est-il si difficile d'écrire des articles de blog ?\" - Jacob Jenkins</a></li><li><a href=\"https://lou.gg/blog/why-writing-blogs-isnt-hard\">\"Pourquoi écrire des blogs n'est pas difficile\" - Louis Escher</a></li><li><a href=\"/blog/writing-blogs-is-hard-and-easy/\">\"Certains aspects de la création d'un blog sont vraiment faciles, et d'autres extrêmement difficiles !\" - Felix Schneider</a></li></ol><p>Après cela, vous aurez complété avec succès cette trilogie géniale sur les articles de blog.</p>",
77- "After a very interesting discussion in the [Astro](https://github.com/withastro).48AFE0BF2E41079C33DD": "Après une discussion très intéressante dans le [Discord](https://astro.build/chat) d'[Astro](https://github.com/withastro) - initiée par nul autre que le mainteneur principal [Alex](https://github.com/alexanderniebuhr) lui-même (au fait félicitations pour cette récente réussite 🎉) -, j'ai plaisanté en disant que quelqu'un pourrait écrire un blog sur les raisons pour lesquelles il est si difficile pour beaucoup de gens non seulement d'écrire, mais aussi de gérer un blog dans son ensemble.",
88- "The man who nominated me as an Astro Support Squad - [Jacob](https://github.com/.47D0DB043E57D3E7660B": "L'homme qui m'a nommé dans l'équipe de support Astro - [Jacob](https://github.com/jdtjenkins) (au fait, merci beaucoup de m'avoir remarqué dans cette communauté incroyable 😍) - a pris cela au pied de la lettre et a écrit un blog à ce sujet. Pas de blague. Allez voir : [https://jacobjenkins.codes/posts/why-is-writing-blogs-so-hard/](https://jacobjenkins.codes/posts/why-is-writing-blogs-so-hard/) D'ailleurs, c'est son tout premier blog (et j'espère que ce ne sera pas le dernier, car j'ai vraiment apprécié son style d'écriture).",
99- "Our beloved everywhere-helper, Blogger, Designer and StudioCMSer - [Lou](https:/.00B9B777867DC593B708": "Notre aide multitâche bien-aimée, blogueur, designer et StudioCMSer - [Lou](https://github.com/louisescher/) (merci d'avance pour tes conseils d'écriture de blog qui m'ont permis d'écrire ceci avec plus de confiance 🤩) - a sauté immédiatement sur cette vague d'enthousiasme (comme les utilisateurs de Twitch pourraient l'appeler) et a publié [sa réponse](https://lou.gg/blog/why-writing-blogs-isnt-hard) en seulement 12 heures !!! Croyez-moi, j'ai vérifié les commits, Lou a littéralement publié 4 minutes avant la fin des 12 heures.",
1010- "As I will include many references to both of their blogs, it's best if you read .2E1FCF6AB78B43DC2069": "Comme je ferai de nombreuses références à leurs blogs, il vaut mieux que vous lisiez les leurs en premier. Puis le mien. Ou peut-être vaut-il mieux lire seulement les leurs, je ne suis pas encore sûr de la tournure que prendra le mien.",
1111- "But what I can ~~say~~ write, is that mine will fully focus on just the writing .FC4D0CF3F6082890E1EC": "Mais ce que je peux ~~dire~~ écrire, c'est que le mien se concentrera entièrement sur les compétences en écriture.",
1212- "How to setup a blog (technical challenges)": "Comment configurer un blog (défis techniques)",
1313- "Whilst this blog doesn't focus on how to build a blog, deploy it and all this te.460F9C9970BD9D6ED53F": "Bien que ce blog ne traite pas de la façon de créer un blog, le déployer et gérer tout cet aspect technique, je tiens à mentionner que tout le monde peut y arriver. Comme Lou l'a mentionné, en tant que personne non technique, vous pouvez toujours simplement créer un compte sur [Medium](https://medium.com/) ou des alternatives similaires. Si vous avez quelques notions de programmation, vous pouvez laisser un peu plus de place à votre créativité et, grâce au projet génial [Starlight Blog](https://starlight-blog-docs.vercel.app/) de [HiDeoo](https://github.com/HiDeoo), il ne vous faut pas beaucoup de connaissances pour déployer votre propre site Web. De nos jours, avec l'existence de fournisseurs PaaS (Platform as a Service) comme [Netlify](https://www.netlify.com/), qui transforment le déploiement en une aventure \"Click-Ops\", il n'y a plus aucune excuse pour ne pas publier votre blog à cause de difficultés techniques.",
1414- "Okay, jokes aside, now: Writing skills": "D'accord, fin des blagues, passons maintenant aux compétences en écriture",
1515- "But this blog should focus on mainly on the \"Writing Skill\" as I said, so let's .809BFECD79628A7D6401": "Mais ce blog devrait se concentrer principalement sur la \"compétence d'écriture\", comme je l'ai dit, alors continuons sur ce sujet. Ayant moi-même eu des difficultés initiales à écrire des blogs, je peux totalement confirmer ce que Jacob dit : commencer est difficile. Ce n'est pas comme lire le [Guide de démarrage d'Astro](https://docs.astro.build/en/install-and-setup/) où il suffit de suivre les instructions et ensuite demander sur Discord ce que signifie une erreur `InvalidContentEntryDataError` <sub>veuillez utiliser le fil `#support` si vous le faites 🫶</sub> ([Si vous vous demandez encore](https://docs.astro.build/en/reference/errors/invalid-content-entry-data-error/)).",
1616- "On the other hand, the goal seems so close and doable. Just write some words. Wh.D4B7EBAB98F3D78C25CA": "D'un autre côté, l'objectif semble si proche et réalisable. Il suffit d'écrire quelques mots. Qu'est-ce qui est si difficile à écrire ces foutus mots ? En réalité, je ne sais pas moi-même. Pourquoi me le demandez-vous ? La seule chose qui m'a aidé à sortir de la spirale de \"Tu-Veux-Écrire-Mais-Chaque-Fois-Tu-Regards-Le-Curseur-Clignotant-Ton-Cerveau-Devient-Vide\" (faisons-en le hashtag de la semaine) était le conseil de Lou : ne pas en exiger trop de vous-même dans votre premier blog. Pourquoi voulez-vous un blog parfait pour débuter ? À cause de votre réputation ? Pour que les gens ne pensent pas mal de vous ? Ressentent de la déception ? Honnêtement : c'est des conneries ! Pas seulement parce que votre premier blog ne sera probablement lu par personne (à l'exception remarquée de l'exceptionnel blog de Jacob), mais aussi parce que vous ne faites que vous compliquer la tâche. Mon plafond mental personnel était que je pensais devoir écrire au moins 500 mots pour commencer. Mais qui dit cela ? Honnêtement, si je regarde en arrière maintenant, je pense parfois : \"Mince, ça aurait été tellement unique et cool si mon tout premier blog avait été comme un simple tweet\", ou encore plus extrême : Un. Mot. Personne ne vous empêchera de publier ce blog :",
1717- "Hello 👋": "Bonjour 👋",
1818- "(Sorry if I now took your awesome idea,\\\nand included your whole blog post in he.2C4E38E676160D62D299": "(Désolé si j'ai maintenant pris votre idée géniale,\\\net inclus votre article complet ici\\\n\\- wow cool, ça rime)",
1919- "See? I can do whatever I want, even being a fricking poet (typical German behavi.CA4561FAF77C16255B02": "Vous voyez ? Je peux faire ce que je veux, même être un foutu poète (comportement typiquement allemand), et personne ne me jugera. D'accord, peut-être que quelqu'un critiquera ce blog en disant que c'est \"une perte de temps, sans signification dans tout ce contenu inutile\", mais qui ***s'en soucie*** ? C'est *votre* blog, <span id=\"comment-reference\" class=\"fragment-highlight\">personne ne demande leur avis (à moins que vous ayez une section de commentaires sous votre blog 🙄 *tousse* [Lou](https://lou.gg/blog/why-writing-blogs-isnt-hard#chapter-five-its-the-8th-of-july)</span>). Alors, ne pensez pas à ce que les autres pourraient penser de votre style d'écriture, de votre contenu, de votre usage de la langue ou même si vous faites des fautes de grammaire. Tout cela vous rend humain et chercher à tout rendre parfait est non seulement complètement inutile, mais aussi [difficil](https://jacobjenkins.codes/posts/why-is-writing-blogs-so-hard/#chapter-1---i-want-it-now).",
2020- "Another part of writing blogs is not just getting started, but the difficulty of.784B95527E097077F971": "Un autre aspect de l'écriture de blogs n'est pas seulement de commencer, mais aussi de maintenir un flux cohérent, une idée directrice si vous voulez. En tant qu'audience de discours bien écrits, vous remarquez inconsciemment qu'ils étaient bons, satisfaisants, sublimes. Et c'est ce que j'adore dans de tels blogs ou discours. Ils semblent juste parfaits d'une manière ou d'une autre. Mais j'ai moi-même accepté que je ne puisse pas accomplir de telles performances dans mes propres créations. Et je m'en porte beaucoup mieux avec cette acceptation. Parce que le bénéfice d'accepter l'imperfection est d'accomplir les choses. Pas juste à 50 %, pas juste à 90 %. Aller jusqu'au bout. Terminer, à 100 %. Et c'est quelque chose avec lequel beaucoup de gens ont du mal, y compris mon ancien moi - en fait uniquement moi.",
2121- "But as Lou mentions, there are other easy methods to keep a common thread in the.18BEED3C4E5876FC95F2": "Mais comme le mentionne Lou, il existe d'autres méthodes simples pour garder un fil conducteur dans tout le post, rester fidèle à l'histoire alors que vos pensées peuvent vagabonder dans votre propre esprit. Mettre toutes ces idées sur papier, ou dans ce cas sur le clavier, peut être un défi, surtout lorsque vous commencez à écrire. Mais il y a une raison pour laquelle nous apprenons de telles compétences à l'école, elles améliorent notre santé cognitive et nos capacités de développement de façon immense. C'est aussi pourquoi je suis tout à fait d'accord avec Lou quand il dit que l'intelligence artificielle ne devrait jamais être utilisée dans le processus d'écriture. Cela n'a tout simplement aucun avantage, ni pour le lecteur, encore moins pour vous.",
2222- "So I don't want to repeat what Lou says, but bullet points have helped me out a .964F132C02AED6CE1634": "Donc, je ne veux pas répéter ce que dit Lou, mais les points-bullets m'ont beaucoup aidé dans le passé. Ils me donnent simplement un sentiment de structure constante, tandis que mon esprit peut jouer avec diverses idées et théories. Cela garantit que vous revenez toujours à ce que vous vouliez inclure initialement dans votre post. \"Et si vous ne pouvez pas trouver de points-bullets ?\", pourriez-vous demander. Eh bien, vous pourriez avoir besoin de plus de séances de brainstorming ou tout simplement de prendre des douches.",
2323- "In the end, these are some tips I can give you along the way:": "À la fin, voici quelques conseils que je peux vous donner en route :",
2424- "Develop your own writing style, not by training, but just writing. Sooner or lat.F84CA1A98AD5E28A3F69": "Développez votre propre style d'écriture, non pas en vous entraînant, mais simplement en écrivant. Tôt ou tard, vous remarquerez les types qui pourraient vous plaire, certaines choses que vous voulez adopter d'autres blogueurs, mais summa summarum ce que vous écrivez sera toujours à vous. Vous le partagez simplement avec le monde. C'est à vous de décider si vous souhaitez utiliser un deux-points ou un tiret ici ou là, mettre plus de points, utiliser le passé, l'impératif, des jurons ou un style plus formel. Toutes ces choses viendront automatiquement ensemble et vous définiront comme un blogueur unique. Et vos lecteurs apprécieront cette individualité plus que vous ne le pensez.",
2525- "Don't take on too much. Might sound easy, but everyone falls regularly into this.F956D1FB960DB4CD026C": "Ne prenez pas trop sur vous. Cela peut sembler facile, mais tout le monde tombe régulièrement dans ce piège. Ou peut-être seulement des gens comme moi, ayant un mélange d'autisme et de perfectionnisme - je ne sais pas.",
2626- "Although it always sounds stupid: Start writing. And if it doesn't work, start w.0018355B94E38C7B923C": "Bien que cela sonne toujours stupide : Commencez à écrire. Et si cela ne fonctionne pas, commencez à écrire la partie centrale. Parce que je sais que commencer et finir sont toujours difficiles, mais imo la partie centrale coule comme du beurre.",
2727- "Blogs have easy and hard sides: This is what the title says, but know that I wro.72A914EB55320A9E44E4": "Les blogs ont des côtés faciles et difficiles : C'est ce que dit le titre, mais sachez qu'après avoir écrit tout ça, je me suis rendu compte que je n'ai pas répondu à cette question du tout... Dieu merci, Jacob n'a pas mis un point d'interrogation à la fin de cette suggestion. 🙏",
2828- "Yeah, I guess that's it. If you want to share you thoughts, leave them in [Lou's.D2EA8444C7BDC5361790": "Oui, je suppose que c'est tout. Si vous voulez partager vos pensées, laissez-les dans [les commentaires de Lou](https://lou.gg/blog/why-writing-blogs-isnt-hard) car je n'en ai pas.",
2929- "Vibe-coding a VS Code Extension for Terraform projects": "Vibe-coding une extension VS Code pour des projets Terraform",
3030- "How I created an extension for Visual Studio Code which adds inline resolutions .94295B1957CBEE7AD731": "Comment j'ai créé une extension pour Visual Studio Code qui ajoute des résolutions en ligne aux variables dans les projets Terraform.",
3131- "Today, I want to talk about a small VS Code extension that I vibe-coded in a sin.6C43E09851571E31F19E": "Aujourd'hui, je veux parler d'une petite extension VS Code que j'ai codée intuitivement en une seule journée pour rendre le travail avec Terraform plus facile. Je vais d'abord expliquer ce qu'est Terraform, puis plonger directement dans les fonctionnalités et les raisons derrière cette extension. N'hésitez pas à passer à la section suivante si vous êtes déjà familier avec Terraform.",
3232- "What is Terraform?": "Qu'est-ce que Terraform ?",
3333- "Terraform is an infrastructure-as-code (IaC) tool that lets you define your enti.C1E19D8A95C63B18257A": "Terraform est un outil d'infrastructure en tant que code (IaC) qui vous permet de définir l'intégralité de votre infrastructure cloud ou sur site sous forme de code. Son langage de configuration, inventé par [HashiCorp](https://github.com/hashicorp), s'appelle HCL (HashiCorp Configuration Language) et présente une syntaxe intuitive et lisible par les humains. La *syntaxe native* a l'avantage de présenter une courbe d'apprentissage faible, d'être cohérente pour tous les fournisseurs, et agréable à lire et écrire pour les humains, tandis que la variante basée sur JSON est plus facile à générer et à analyser pour les machines.",
3434- "What makes Terraform very powerful are two basic features: **variables** and **m.F29F6CFC8D18A39724FE": "Ce qui rend Terraform très puissant, ce sont deux fonctionnalités de base : **les variables** et **les modules**. Les variables vous permettent de créer des ressources dont les valeurs réelles peuvent être insérées depuis un autre endroit, et les modules regroupent un certain nombre de ressources, ce qui offre l’avantage de la réutilisabilité et de l’imbrication. Bien que ces deux fonctionnalités paraissent très basiques, leur combinaison en fait une équipe de rêve. Cela parce que l'ouverture de Terraform vous permet de définir des variables d'entrée pour chaque module et également d'exporter des variables via des sorties.",
3535- "A simple module is therefore structured like this:": "Un module simple est structuré comme ceci :",
3636- "azure-resource-group/": "groupe-de-ressources-azure/",
3737- "main.tf": "principal.tf",
3838- "variables.tf": "variables.tf",
3939- "outputs.tf": "sorties.tf",
4040- "README.md": "README.md",
4141- "All files except `main.tf` are optional (the `README.md` isn’t Terraform-specifi.C0AA6A4205B65B850BDC": "Tous les fichiers sauf `principal.tf` sont optionnels (le `README.md` n’est pas spécifique à Terraform), mais je préfère suivre les bonnes pratiques, donc l’exemple les inclut.",
4242- "Let's look at a simple example. Imagine we want to manage a resource group in Az.C7130E93293C5F3835FA": "Examinons un exemple simple. Imaginez que nous voulons gérer un groupe de ressources dans Azure avec Terraform. Dans le fichier `variables.tf`, nous définissons quelles entrées nous attendons dans le module. Chacun des deux blocs représente la variable et les propriétés de la variable, comme la `description` ou le `type` :",
4343- "You might have noticed that the `location` variable also has a `default` propert.98D282B5427579CFCDE8": "Vous avez peut-être remarqué que la variable `location` a également une propriété `default`, ce qui rend la variable optionnelle et fournit une valeur de secours si aucune n'est spécifiée. Ces variables peuvent ensuite être utilisées dans le fichier `principal.tf`, où nous définissons les ressources réelles que nous voulons générer :",
4444- "In this case, we just define our simple resource group, which you can think of a.549C08D1FEC998D18486": "Dans ce cas, nous définissons simplement notre groupe de ressources, que vous pouvez imaginer comme un dossier dans Azure - explication très simpliste. Maintenant, la dernière partie que nous pouvons implémenter est le fichier `sorties.tf` :",
4545- "This is very useful if we want to use information like the ID of the resource gr.EB0A3E52AB5C3982D204": "Cela est très utile si nous voulons utiliser des informations comme l'ID du groupe de ressources plus tard dans d'autres parties de notre projet Terraform.",
4646- "As I already wrote, the `README.md` is not actually part of the Terraform defini.E6BDEA6D28A17F85099B": "Comme je l'ai déjà mentionné, le `README.md` ne fait pas vraiment partie des définitions Terraform, mais aide à comprendre l'objectif du module :",
4747- "As the `README.md` already suggests, we can now use this module to create an Azu.A94748FE0C01D4120745": "Comme le `README.md` le suggère déjà, nous pouvons maintenant utiliser ce module pour créer un groupe de ressources Azure n'importe où dans notre projet. Nous devons juste nous assurer que le chemin vers le dossier du module est correct et que Terraform sait comment interpréter les fichiers `main.tf`, `variables.tf` et `outputs.tf`. Dans ce cas, étant donné que nous ne spécifions pas la variable `location`, elle sera définie sur `\"westeurope\"`.",
4848- "I hope this section gave you a better basic understanding of what Terraform is a.8558BAB715B916ACA2AE": "J'espère que cette section vous a donné une meilleure compréhension de base de ce qu'est Terraform et de ce que vous pouvez faire avec.",
4949- "The tedious task of Terraform": "La tâche fastidieuse de Terraform",
5050- "You might have noticed that the `source` field of a module creates an awesome fl.8E968461FC7650C53259": "Vous avez peut-être remarqué que le champ `source` d’un module crée une flexibilité incroyable pour l’ensemble du projet puisque vous pouvez définir des modules n’importe où et les utiliser n’importe où dans le projet.",
5151- "However, this feature also has a huge drawback when it comes to maintainability:.648C608F44A24AAF64E1": "Cependant, cette fonctionnalité a aussi un énorme inconvénient en termes de maintenabilité : résoudre les valeurs réelles derrière les variables peut être très fastidieux. Bien que dans cet exemple simple, cela puisse sembler facile à gérer, plus le projet grandit, plus il devient imbriqué, et plus il est difficile et chronophage de comprendre et d'adapter le code Terraform. C'est pourquoi j'ai créé une extension.",
5252- "**What should the extension do?** The main goal of the extension is to provide t.8B7ACE467BC6CBF2D8B5": "**Que doit faire l'extension ?** Le principal objectif de l’extension est de fournir les valeurs réelles des variables partout où elles sont utilisées. Si un module est appelé à partir de plusieurs endroits ou simplement plusieurs fois, les informations doivent indiquer quel cas d’utilisation définit la variable avec quelle valeur. Si les modules sont profondément imbriqués, les valeurs doivent être résolues jusqu'à ce que nous atteignions les fichiers `.tfvars`. Ce sont les fichiers où vous pouvez définir des valeurs codées en dur pour les variables.",
5353- "How to start a VS Code extension": "Comment démarrer une extension VS Code",
5454- "Creating the basic template project for a VS Code extension is as easy as runnin.6F4EB3BBD45F5DF0A520": "Créer le projet modèle de base pour une extension VS Code est aussi simple que d'exécuter cette commande lorsque vous avez [Node](https://github.com/nodejs) installé :",
5555- "This command temporarily installs the Yeoman (a generator software), and enters .5FDA5DDC43BF09081006": "Cette commande installe temporairement Yeoman (un logiciel générateur), et entre dans un mode interactif où certaines questions doivent être répondues, comme le nom du projet, le type et la description. Dans le bloc suivant, vous pouvez voir toutes les questions et les réponses par défaut :",
5656- "For further information regarding VS Code extensions I want to link to [the offi.B0448C131D881366A635": "Pour plus d'informations sur les extensions VS Code, je tiens à renvoyer à [la documentation officielle](https://code.visualstudio.com/api/get-started/your-first-extension), car elle est toujours à jour contrairement à mes explications ici.",
5757- "3… 2… 1… Vibe-Coding!": "3… 2… 1… Vibe-Coding !",
5858- "I like to start new projects by asking [ChatGPT](https://github.com/openai) for .FD250EAE4277C6E99E2B": "J'aime commencer de nouveaux projets en posant des questions techniques générales à [ChatGPT](https://github.com/openai) comme :",
5959- "How would you suggest achieving such a project?": "Comment suggéreriez-vous de réaliser un tel projet ?",
6060- "How long do you estimate it will take me?": "Combien de temps estimez-vous que cela me prendra ?",
6161- "How difficult will it be?": "À quel point cela sera-t-il difficile ?",
6262- "Brainstorming with AI bots seems like a very sensible way to get a better overvi.59F0199CCC0E7F65A0D7": "Brainstormer avec des bots d'IA semble être un moyen très sensé d'avoir une meilleure vue d'ensemble des nouveaux projets, surtout lorsqu'on s'aventure dans des terrains complètement inconnus.\nCréer une extension VS Code était exactement un tel cas d'utilisation, car je n'avais jamais créé quelque chose pour VS Code ou tout autre IDE auparavant.\nAprès cette phase initiale de brainstorming, je préfère utiliser [Claude](https://github.com/anthropics) pour programmer tous les fichiers nécessaires à une telle extension, car, selon mon expérience, ce bot IA a vraiment la capacité de produire des codes impeccables. J’ai rarement rencontré des bugs ou problèmes d’exécution avec le code de Claude, alors je l’utilise exactement pour ces cas d’utilisation - les premiers pas. L’inconvénient de Claude est sa version d’essai gratuite très limitée, ce qui fait que je suis toujours prudent dans le choix de mes mots et que j’essaie de prévoir autant d'erreurs potentielles que l'IA pourrait faire.\nC’est ainsi que tout a commencé : j’ai pris le temps de formuler mon scénario et mon souhait exact dans les fenêtres de contexte limitées d’une machine à mots aléatoires appelée Claude et j’ai immédiatement reçu une implémentation massive du fichier `extension.ts`. Bien sûr, il y avait des différences évidentes entre ma vision et la communication avec ce LLM, alors j’ai dû lui dire une autre fois quelles sont les considérations importantes, et pour pouvoir recevoir davantage de code, j’ai également utilisé mon astuce magique : \"Si cela est trop grand pour un fichier, donne-moi simplement l’ensemble de `extension.ts` en plusieurs fichiers, ce qui devrait bien sûr fonctionner.\"",
6363- "Claude then went on a long journey.": "Claude s'est alors lancé dans un long périple.",
6464- "After some struggling to keep it going my tokens were all used and I had to figu.2D452B77249C8430A480": "Après quelques difficultés à le maintenir opérationnel, tous mes jetons étaient utilisés et j'ai dû terminer le reste du code moi-même. Néanmoins, j'ai réussi à obtenir une version fonctionnelle, car il ne manquait pas grand-chose, et j'ai immédiatement identifié quelques améliorations qui étaient passées inaperçues jusqu'à maintenant. Étant donné que je devais attendre le rechargement de mes jetons, c'est exactement ce que j'ai fait.",
6565- "The next morning the improvement session began, and after two long conversations.D0F806E5F02FCADFF975": "Le lendemain matin, la session d'amélioration a commencé, et après deux longues conversations, la fenêtre de contexte était complètement remplie et je ne pouvais même plus envoyer de messages dans le même chat, bien que mes jetons ne soient pas encore expirés. Cependant, tout ce que je voulais accomplir et obtenir de Claude était désormais disponible et je pouvais effectuer des tests dans l'un de mes projets plus importants. Après avoir confirmé et ajusté manuellement quelques morceaux de code, j'étais satisfait pour le moment et j'ai décidé que la première version publique était prête.",
6666- "Some trial and error with [GitHub Actions](https://github.com/github) later, I m.B1A6CFA9C8791F3B0E65": "Après quelques essais et erreurs avec [GitHub Actions](https://github.com/github), j'ai réussi à [configurer le publisher](https://code.visualstudio.com/api/working-with-extensions/publishing-extension#create-a-publisher) pour une extension VS Code. Et après deux versions correctives, j'étais assez satisfait des résultats.",
6767- "The Final Result": "Le Résultat Final",
6868- "Try out the extension yourself by clicking on the button below. There are still .53D329C6D712DEFF0967": "Essayez l'extension vous-même en cliquant sur le bouton ci-dessous. Il reste encore de nombreuses améliorations à apporter, donc si vous êtes intéressé pour aider, n'hésitez pas à contribuer sur [GitHub](https://github.com/trueberryless/terraform-variables-resolution).",
6969- "Install Terraform Variables Resolution": "Installer Terraform Variables Resolution",
7070- "Here you can see the example from [the Terraform explanation](#what-is-terraform.772358BC6F4987371F60": "Voici un exemple tiré de [l'explication de Terraform](#what-is-terraform), montrant comment cette extension ajoute visuellement les valeurs des variables dans VS Code :",
7171- "": "Comment j'ai créé un README de profil GitHub qui ne devrait pas exister (mais il existe)",
7373- "A deep dive into the technical challenges and solutions behind my GitHub profile.8493E1B06B7E9BE16E95": "Une plongée approfondie dans les défis techniques et les solutions derrière mon README de profil GitHub, avec manipulation de SVG, automatisation et une grille dynamique Bento.",
7474- "Creating a standout <a class=\"gh-badge\" href=\"https://github.com/github\"><img sr.EC7EC3169C3D5076914B": "Créer un README de profil <a class=\"gh-badge\" href=\"https://github.com/github\"><img src=\"https://github.com/github.png\" alt=\"github\" />GitHub</a> remarquable ne se limite pas à ajouter quelques badges — il s'agit de repousser les limites techniques. Dans cette exploration approfondie, j'examine la manipulation de SVG au niveau inférieur, la conversion HTML en SVG, les animations intégrées et l'automatisation complète avec GitHub Actions pour créer ce que je crois être l'un des READMEs GitHub les plus avancés techniquement. D'une grille Bento dynamique qui se met à jour toutes les 5 minutes à des SVG intégrés en direct sans requêtes externes, ce projet a transformé mon profil en une vitrine vivante et auto-mise à jour de mon travail. Vous voulez savoir comment je l'ai fait ? Détaillons ensemble. 🚀",
7575- "Read the more formal story [here](https://trueberryless.org/work/github-profile-.5BCD9DBA0F2103014075": "Lisez l'histoire plus formelle [ici](https://trueberryless.org/work/github-profile-readme/)",
7676- "The Beginning: A README That Looked Like a Wikipedia Dump": "Le début : un README qui ressemblait à une page Wikipedia",
7777- "Every great story starts with a problem, and mine was simple: my [GitHub profile.3713BD43F2A1A91BFB7E": "Chaque grande histoire commence par un problème, et le mien était simple : le README de mon [profil GitHub](https://github.com/trueberryless) était un vrai bazar. Il était long. Il y avait trop de texte. Il débordait de badges — tellement que ça ressemblait à une collection de trophées internet. Hackathons, contributions GitHub, Astro, roadmap.sh — s’il existait un badge, je l’avais.",
7878- "At first, I thought this was fine. It showed everything about me, right? But one.773B7C308644FEDA7081": "Au début, je pensais que c'était bien. Ça montrait tout sur moi, non ? Mais un jour, je l’ai regardé et j’ai réalisé :",
7979- "This is not stylish. This is a cluttered disaster.": "Ce n'est pas stylé. C'est un désastre encombré.",
8080- "I needed something new. Something clean. Something visually striking. I wanted a.C82835C3D13A6981B63B": "J'avais besoin de quelque chose de nouveau. De quelque chose de propre. De quelque chose de visuellement frappant. Je voulais une **grille Bento** qui inciterait les gens à s'arrêter et à l'admirer, plutôt que de défiler dans la confusion. Un design si bien exécuté que toute personne qui le verrait voudrait instantanément le sien.",
8181- "That was the dream. Now I just had to make it real.": "C'était le rêve. Maintenant, je devais juste le réaliser.",
8282- "Phase 1: The HTML Dream (and Markdown Nightmare)": "Phase 1 : Le rêve HTML (et le cauchemar Markdown)",
8383- "The first step was simple: mock up my perfect profile in HTML and CSS. And let m.EEFE6C2742301B518D46": "La première étape était simple : modéliser mon profil parfait en HTML et CSS. Et laissez-moi vous dire, c’était incroyable. Il avait une mise en page parfaite, des animations fluides et juste le bon équilibre entre contenu et espace. Puis la réalité m’a rattrapé. Il fallait que cela fonctionne dans le *Markdown au format GitHub*. Pas de problème, non ? Markdown prend en charge le HTML ! Alors j'ai copié mon magnifique HTML dans mon README et j'ai enregistré.",
8484- "[GitHub](https://github.com/github): *Absolutely not.*": "[GitHub](https://github.com/github) : *Absolument pas.*",
8585- "GitHub’s Markdown [strips out a not a huge number of HTML tags, but important on.8ADCE02DB7CC7739FAD2": "Le Markdown de GitHub [supprime un certain nombre de balises HTML, mais des balises importantes](https://github.github.com/gfm/#disallowed-raw-html-extension). Pour des raisons de sécurité, bien sûr (et je respecte totalement cela, GitHub, vraiment ❤️), mais cela signifiait que mon design parfait était complètement **inutilisable**.",
8686- "I tried tweaking it. Replacing unsupported tags with ones that worked. Maybe I c.14452FE82B6AC0DB8958": "J'ai essayé de le modifier. De remplacer des balises non prises en charge par d'autres qui fonctionnaient. Peut-être que je pouvais en sauver une partie ? *Non*. Les limitations du Markdown rendaient ma mise en page de rêve impossible.",
8787- "Phase 2: The \"Just Use a Python Script\" Cope": "Phase 2 : \"Juste utiliser un script Python\" (comment survivre)",
8888- "When in doubt, automate. If I couldn’t get my HTML in directly, maybe I could ge.FD6C9ADF71816E0E5B49": "En cas de doute, automatisez. Si je ne pouvais pas intégrer directement mon HTML, peut-être pourrais-je générer quelque chose de dynamique avec un script ? J'ai donc monté un script Python pour récupérer mon dernier dépôt GitHub et l’insérer dans mon README. Voici ces quelques octets de code Python au hasard :",
8989- "This seemed like a step in the right direction. It was automated. It was functio.D20A833F97288BD3E73B": "Ça semblait être une bonne direction. C'était automatisé. C'était fonctionnel. Mais cela ne résolvait pas mon véritable problème. 😢",
9090- "This wasn’t about dynamic content — it was about *design*. And no amount of Pyth.8C914CE49CA59FC373EC": "Ce n'était pas une question de contenu dynamique — c'était une question de *design*. Et aucun script Python ne rendrait Markdown beau.",
9191- "Phase 3: \"Fine, I'll Just Use a Screenshot\" (Rock Bottom)": "Phase 3 : \"Bon, je vais juste utiliser une capture d'écran\" (fond du gouffre)",
9292- "At this point, I was desperate. I considered the unthinkable: *just take a scree.A573BC6FDCB7D404B86F": "À ce stade, j'étais désespéré. J'ai envisagé l'impensable : *il suffit de prendre une capture d'écran du HTML et de la mettre dans mon README en tant qu'image.* C'était une approche brutale. C'était paresseux. C'était... efficace ?",
9393- "For a moment, I actually thought about doing it. But I knew deep down that I wou.F11BA1015DB80A5D8D2D": "Pendant un instant, j'ai vraiment pensé à le faire. Mais je savais au fond de moi que je ne me pardonnerais jamais si je laissais cela être ma solution finale.",
9494- "Just for the reference, I would have used [Puppeteer](https://www.npmjs.com/pack.7C033B35BC935C314B6E": "À titre de référence, j'aurais utilisé [Puppeteer](https://www.npmjs.com/package/puppeteer) et [FFmpeg](https://www.ffmpeg.org/) — je n'ai aucune idée de ce que sont ces outils.",
9595- "Phase 4: Enter SVG (The Light at the End of the Tunnel)": "Phase 4 : Passons aux SVG (la lumière au bout du tunnel)",
9696- "I abandoned the cursed screenshot plan and looked for something more flexible.": "J'ai abandonné le plan maudit de la capture d'écran et cherché quelque chose de plus flexible.",
9797- "SVGs.": "Les SVG.",
9898- "SVGs could scale, they supported both text and images, and — most importantly — .F259141963EA4A11F694": "Les SVG sont évolutifs, prennent en charge à la fois le texte et les images, et — plus important encore — ils peuvent **intégrer** du HTML à l'intérieur.",
9999- "So I tried something like this:": "Alors j'ai essayé quelque chose comme ceci :",
100100- "Promising! This could actually work!": "Prometteur ! Cela pourrait vraiment fonctionner !",
101101- "Then I got busy with other things, forgot to debug it, and never returned to thi.9BEE5D08ED4C8C9B33DD": "Puis j'ai été occupé par d'autres choses, j'ai oublié de le déboguer, et je n'y suis jamais retourné.",
102102- "": "Jeter une bonne idée",
103103- "Phase 5: SVGs Within SVGs Within SVGs (Inception Level 100)": "Phase 5 : Des SVG imbriqués dans des SVG eux-mêmes imbriqués (niveau Inception 100)",
104104- "When I came back to the project, I was **determined** to make it work.": "Quand je suis revenu sur le projet, j'étais **déterminé** à le faire fonctionner.",
105105- "I realised that if I couldn’t directly embed HTML into Markdown, I could fake it.8993D07A86C6FB209386": "J’ai réalisé que si je ne pouvais pas intégrer directement du HTML dans le Markdown, je pouvais le simuler en utilisant des SVG imbriqués. (Ceci est massivement simplifié ; le processus réel a pris des jours, qui ressemblaient à des semaines sinon des mois, mais je sais que vous ne lirez pas tout cela de toute façon, alors peu importe.)",
106106- "And then, after hours of research, I stumbled across a life-changing Stack Overf.B19E66FB6CDC38EB7F45": "Et puis, après des heures de recherche, je suis tombé sur une réponse révolutionnaire sur Stack Overflow :",
107107- "This lead me to the current solution:": "Cela m'a conduit à la solution actuelle :",
108108- "Convert my HTML layout to SVG.": "Convertir ma mise en page HTML en SVG.",
109109- "Encode all images in **Base64** (because GitHub Markdown won’t load external ima.6BA37AFF26936D15AD36": "Encoder toutes les images en **Base64** (car le Markdown de GitHub ne charge pas les images externes à l'intérieur d'un SVG avec du HTML).",
110110- "Inline dynamic SVGs (like my GitHub stats, Spotify status, etc.).": "Inclure des SVG dynamiques (comme mes statistiques GitHub, mon statut Spotify, etc.).",
111111- "Automate everything with **GitHub Actions**.": "Tout automatiser avec **GitHub Actions**.",
112112- "The Grand Finale: The Ultimate GitHub Profile README": "Le Grand Final : Le README de profil GitHub ultime",
113113- "A sleek Bento Grid layout, perfectly structured in SVG.": "Une mise en page en grille Bento élégante, parfaitement structurée en SVG.",
114114- "A live-updating Spotify status, inlined as an SVG.": "Un statut Spotify mis à jour en temps réel, inclus en SVG.",
115115- "GitHub stats, dynamically inserted via automation.": "Des statistiques GitHub, insérées dynamiquement via l'automatisation.",
116116- "Fully responsive, fully scalable, and fully insane to build.": "Entièrement responsive, entièrement évolutif et absolument fou à construire.",
117117- "It updates itself every 5 minutes, runs completely on GitHub Actions, and doesn’.D6DD34ED3B85DAE2F120": "Il se met à jour automatiquement toutes les 5 minutes, fonctionne entièrement sur GitHub Actions et ne dépend d'aucun service externe. C'est beau. C'est efficace. Et surtout, c'est techniquement absurde dans le meilleur sens du terme.",
118118- "Take a look at a specific example of the final results at some point back in tim.096EC0AF4A7E3D30CE29": "Jetez un œil à un exemple concret du résultat final à un certain point dans le temps.",
119119- "Isn't that bad compared to the [old README.md](https://github.com/trueberryless/.E3E5E0072DF705843179": "Ce n'est pas si mal comparé à l'[ancien README.md](https://github.com/trueberryless/trueberryless/blob/5dce4ad0033b00829f8ec3756827057017447a65/README.md). Et ne commentez pas pourquoi j’écoute du K-pop ! C’est mieux que ce que vous pensez, croyez-moi.",
120120- "Check out the live version on my GitHub [trueberryless](https://github.com/trueb.4FFADA956CF12B9EFE9F": "Consultez la version en direct sur mon GitHub [trueberryless](https://github.com/trueberryless) — si j'ai décidé de la garder... — et laissez un follow si vous y êtes déjà et avez apprécié cette lecture ! ❤️",
121121- "Final Thoughts: Was It Worth It?": "Pensées finales : Est-ce que ça valait le coup ?",
122122- "Absolutely.": "Absolument.",
123123- "This journey was frustrating, time-consuming, and filled with more roadblocks th.9E6BE12D4EDD580594EA": "Ce parcours fut frustrant, chronophage, et rempli de plus d'obstacles que je ne l'aurais jamais imaginé. Mais j'ai appris tellement de choses sur les SVG, les limitations du Markdown, GitHub Actions et l'automatisation en cours de route.",
124124- "Would I do it again? Definitely.": "Est-ce que je le referais ? Définitivement.",
125125- "Would I recommend it? Only if you have way too much patience. 😅": "Est-ce que je le recommanderais ? Seulement si vous avez une patience infinie. 😅",
126126- "But in the end, I created a [GitHub](https://github.com/github) profile README t.2B7EC6933681A24E2F33": "Mais au final, j'ai créé un README de profil [GitHub](https://github.com/github) qui *ne devrait pas exister* — mais il existe. Et je l'adore.",
127127- "A short history of Starlight Sidebar Topics plugins": "Une courte histoire des plugins Starlight Sidebar Topics",
128128- "In this blog post, I'll show you the evolution of Starlight plugins with a case .4AA6D9FADD1A6BE13985": "Dans cet article de blog, je vais vous montrer l'évolution des plugins Starlight avec une étude de cas du plugin Starlight Sidebar Topics.",
129129- "In this post, I'll show you the evolution of <a class=\"gh-badge\" href=\"https://g.995EB19ECCFE1867C83C": "Dans cet article, je vais vous montrer l'évolution des <a class=\"gh-badge\" href=\"https://github.com/withastro/starlight\"><img src=\"/starlight.png\" alt=\"Starlight\" /> Starlight</a> plugins avec une étude de cas du plugin [Starlight Sidebar Topics](https://github.com/hideoo/starlight-sidebar-topics). Préparez-vous à découvrir des faits impressionnants sur les personnes et le code autour de Starlight.",
130130- "Maybe you have heard about this cool documentation framework before. I talk abou.5A104B8E7F80C4B25128": "Peut-être avez-vous déjà entendu parler de ce framework de documentation génial. J'en parle assez souvent et je l'utilise régulièrement. Non seulement parce que je suis un contributeur actif, mais aussi parce que [Starlight](https://starlight.astro.build) m’est vraiment cher. Ses caractéristiques : simplicité et minimalisme, mais tout ce dont vous avez besoin. Sa performance : [plus rapide que 98 % des autres sites Web](https://www.websitecarbon.com/website/starlight-astro-build-getting-started/). Son accessibilité : même pas une question !",
131131- "The Creation": "La Création",
132132- "However, one thing that's objectively missing in my opinion is a granular way of.77A7287A955230B54D96": "Cependant, une chose qui manque objectivement à mon avis, c'est une manière granulaire de séparer les sujets généraux dans votre documentation. Et je ne suis pas seul avec cette opinion subjective largement acceptée. [HiDeoo](https://github.com/HiDeoo) n'est pas seulement l'un des mainteneurs les plus actifs du projet, mais également l'auteur des plugins les plus nombreux et, selon moi, les meilleurs que vous pouvez trouver pour Starlight. Ils ont également remarqué cette fonctionnalité de niche manquante concernant les sujets. C'est pourquoi ils ont décidé de créer le plugin [Starlight Sidebar Topics](https://github.com/hideoo/starlight-sidebar-topics) dès octobre 2024, ce qui vous permet de créer une barre latérale avec des sujets. Lisez-en plus sur les fonctionnalités du plugin dans [sa documentation](https://starlight-sidebar-topics.netlify.app/).",
133133- "The one thing that bothered me personally in the early days of the plugin was th.6F5F49BB9B5B06675F60": "La chose qui me gênait personnellement dans les premiers jours du plugin était la manière dont les sujets étaient affichés dans la barre latérale. Parce qu'il n’utilise pas - comme je l’imaginais - un menu déroulant pour passer d'un sujet à l'autre, mais montre au contraire toujours tous les sujets. Ce choix de conception était, comme [HiDeoo le souligne clairement](https://github.com/HiDeoo/starlight-sidebar-topics/issues/2#issuecomment-2410196392), très intentionnel et non sans raisons : tous les sujets devraient être visibles en même temps. Prouvé par les documents [Astro](https://github.com/withastro) eux-mêmes ([Chris Swithinbank](https://github.com/delucis) a implémenté la [\"barre latérale à onglets\"](https://github.com/withastro/docs/pull/9890) pour la documentation Astro v5 plus tard dans le même mois), cette approche présente de nombreux avantages par rapport à un menu déroulant. Néanmoins, j'étais toujours insatisfait de ce design, alors j’ai créé ma propre version.",
134134- "Copying and pasting was my strength when it came to building a new Starlight plu.860638CCB2BA61F003E9": "Copier et coller était ma force quand il s’agissait de créer un nouveau plugin Starlight pour la communauté. Et c’est ce que j’ai fait. J’ai pris le plugin Starlight Sidebar Topics comme point de départ et j’ai simplement adapté le composant `Topics.astro`, qui inclut le HTML pour afficher les sujets dans la barre latérale. Après avoir lutté un certain temps pour implémenter un menu déroulant qui soit satisfaisant et propre visuellement (désolé pour l'autosatisfaction, mais je suis fier de moi), j’ai finalement trouvé une solution dont je suis très satisfait et j’ai publié ce nouveau plugin sous le nom [Starlight Sidebar Topics Dropdown](https://github.com/trueberryless-org/starlight-sidebar-topics-dropdown) - quelle originalité.",
135135- "The Adaptation": "L'Adaptation",
136136- "You might think that this story is now over because everyone could just use the .B22BDA5C191E4AEC54CE": "Vous pourriez penser que cette histoire est maintenant terminée car tout le monde pourrait simplement utiliser la variante qu’il souhaite, tout le monde est heureux. Mais Starlight a continué et continue de s'améliorer, et environ trois mois plus tard, le 15 février, il y a eu l'ajout tant attendu de « route data » dans Starlight avec la sortie de [v0.32](https://github.com/withastro/starlight/releases/tag/@astrojs/starlight@0.32.0). Cet ajout apparemment simple a ouvert tant de possibilités, auxquelles je n’aurais jamais pensé. HiDeoo a de nouveau été la principale source d'inspiration pour les auteurs de plugins et a poussé cette nouvelle fonctionnalité à ses limites. Il leur a fallu seulement deux jours pour [adapter plus de 11 plugins à la dernière version de Starlight à l’époque](https://bsky.app/profile/hideoo.dev/post/3liffpudc5c2b), et ils ont ensuite amélioré et remanié une grande partie du code pour tirer encore plus parti de cette fonctionnalité puissante.",
137137- "And so comes the day when HiDeoo contacts me to tell me that the Starlight Sideb.CB4E9F542FB4DC96204E": "Et ainsi vint le jour où HiDeoo me contacte pour me dire que le plugin Starlight Sidebar Topics utilise maintenant la nouvelle fonctionnalité de données de route de Starlight. Au début, je ne comprenais pas vraiment quels avantages ces changements d’implémentation auraient, mais HiDeoo a pris le temps de m’expliquer que je pouvais maintenant transformer le plugin Starlight Sidebar Topics Dropdown en un simple composant utilisant les données de route de son plugin. Intuitivement, j’étais opposé à cette idée intelligente car cela donnait l’impression que mon seul plugin ayant une certaine popularité devenait un composant inutile. Je ne pouvais pas être plus loin de la vérité.",
138138- "The Union": "L'Union",
139139- "Eventually, I decided to refactor my plugin into a component - this refactoring .4324540ABE36305F27C5": "Finalement, j’ai décidé de refondre mon plugin en un composant - cette refonte a éliminé exactement [1210 lignes de code et ajouté 68 lignes de changelog](https://github.com/trueberryless-org/starlight-sidebar-topics-dropdown/pull/40) - et j’ai remarqué à quel point il fallait maintenant peu de code pour transformer la liste `Topics.astro` en un menu déroulant du point de vue d’un utilisateur. J’étais convaincu que c’était vraiment la bonne direction pour le ~~plugin~~ composant. Et donc, j’ai mis à jour toute la documentation - plus exactement : supprimé plus de 200 lignes de texte (ça fait du bien) - et j’ai publié la nouvelle [version 0.5](https://github.com/trueberryless-org/starlight-sidebar-topics-dropdown/releases/tag/starlight-sidebar-topics-dropdown%400.5.0).",
140140- "Now you might wonder how such mature plugins could still improve over time. To b.8F9AABD213A178EFB11C": "Vous vous demandez peut-être comment des plugins aussi matures pourraient encore s’améliorer avec le temps. Pour être honnête, moi-même j’ai été très surpris lorsque HiDeoo a lâché une idée brillante dans mes messages privés sur Discord. Son idée était et reste ingénieuse. Sinon, je n’y penserais même plus à ce *sujet*. Mais me voilà, en train d’écrire un texte de 800 mots juste pour vous préparer à ce qui va suivre. Roulement de tambour ! Attachez votre ceinture ! Cette déclaration de HiDeoo va vous épater :",
141141- "\"One could have something like the default built-in list on a desktop view, and .D9D8BC0B8C5FADE63015": "\"On pourrait avoir quelque chose comme la liste intégrée par défaut sur une vue bureau, et utiliser votre composant pour la version mobile, ou quelque chose comme ça 🧠\" — HiDeoo, 21/03/2025 09:54",
142142- "Profound. Timeless. Golden.": "Profond. Intemporel. En or.",
143143- "And that single, beautiful spark of an idea? It’s precisely what I’ll guide you .D5B772B8E2ED479D7F54": "Et cette seule et belle étincelle d’idée ? C’est précisément ce que je vais vous expliquer dans [l’article \"Starlight Topics Dropdown and List together\"](/blog/starlight-dropdown-and-list-together/).",
144144- "How to make your Starlight sidebar items look better": "Comment rendre les éléments de la barre latérale Starlight plus attrayants",
145145- "In this blog post, we'll take a look at how small changes can make a big differe.710EB546A7825319B5BD": "Dans cet article de blog, nous examinerons comment de petits changements peuvent faire une grande différence en termes d'espaces blancs, de tailles de police, de poids et de couleurs dans votre barre latérale Starlight.",
146146- "In this blog post, we'll take a look at how small changes can make a big differe.91CB4D1869F959776162": "Dans cet article de blog, nous examinerons comment de petits changements peuvent faire une grande différence en termes d'espaces blancs dans votre <a class=\"gh-badge\" href=\"https://github.com/withastro/starlight\"><img src=\"/starlight.png\" alt=\"Starlight\" />Starlight</a>.",
147147- "Have you ever wondered why your [Starlight][starlight] sidebar doesn't look that.1641BC1FAEE439920C90": "Vous êtes-vous déjà demandé pourquoi votre barre latérale [Starlight][starlight] n'est pas si attrayante ? Saviez-vous combien l'espace entre les éléments de votre barre latérale est inconsciemment important ? La taille de la police, le poids et les petites différences de couleur ? Dans ce guide, nous examinerons comment personnaliser l'apparence de votre barre latérale Starlight avec des étapes rapides et faciles.",
148148- "Prerequisites": "Prérequis",
149149- "First, you need to [set up your Starlight site][starlight-getting-started]. Afte.DF558576AB082588D034": "Tout d'abord, vous devez [configurer votre site Starlight][starlight-getting-started]. Ensuite, Starlight offre un [guide sur la personnalisation des styles appliqués à votre site Starlight][starlight-css], qui est la fonctionnalité que nous utiliserons dans cet article.",
150150- "As described in [this guide][starlight-css-custom], you need to create a `.css` .0CD83940C89F2D1185A1": "Comme décrit dans [ce guide][starlight-css-custom], vous devez créer un fichier `.css` quelque part dans votre répertoire `src/`, où vous pouvez définir vos styles CSS. N'oubliez pas d'ajouter le chemin vers ce fichier `.css` dans le tableau `customCss` de Starlight dans le fichier `astro.config.mjs` :",
151151- "After completing these preparation steps, you are ready to try out some nice adj.DE7E5B1DE51E76B69982": "Après avoir terminé ces étapes de préparation, vous êtes prêt à essayer quelques ajustements intéressants à la conception de la barre latérale de Starlight.",
152152- "Customizations": "Personnalisations",
153153- "There are endless different possibilities that you can play around with just wit.315492DDFA6948DAD882": "Il existe une infinité de possibilités différentes auxquelles vous pouvez jouer simplement avec votre CSS personnalisé. Je vais vous donner quelques idées que j'ai trouvées très utiles en expérimentant avec la conception de la barre latérale. Bien que certaines de ces idées puissent sembler absurdes, je vous promets que la combinaison de quelques-unes d'entre elles rendra votre barre latérale Starlight encore meilleure.",
154154- "One thing to note though is that in this blog post the focus lies on adjusting t.157A7D5F675513D49CA2": "Une chose à noter cependant, dans cet article, l'accent est mis sur l'ajustement du style des **éléments de niveau racine** (ceux qui n'ont pas d'enfants) dans la barre latérale.",
155155- "But before I do that, I'll show you how the default styling of the Starlight sid.935D4EBD7A75949003B6": "Mais avant cela, je vais vous montrer à quoi ressemble actuellement le style par défaut de la barre latérale Starlight :",
156156- "": "Barre latérale Starlight avec des couleurs plus ternes",
168168- "Adjust the font size of sidebar items": "Ajuster la taille de la police des éléments de la barre latérale",
169169- "Although I don't recommend it, you can also adjust the font size of sidebar item.5B666452173153740723": "Bien que je ne le recommande pas, vous pouvez également ajuster la taille de la police des éléments de la barre latérale. Avec cet exemple de CSS personnalisé ci-dessous, j'ai réduit la taille de la police des éléments de niveau racine.",
170170- " a créé un indicateur de progression horizontal et épuré pour les sites Starlight.",
178178- "You will need to have an existing Starlight website.": "Vous devez disposer d’un site web Starlight existant.",
179179- "Create the progress indicator component": "Créer le composant d'indicateur de progression",
180180- "Let's create a new component called `ProgressIndicator.astro` in the `src/compon.3AF2A56DBB850F8660D1": "Créons un nouveau composant appelé `ProgressIndicator.astro` dans le répertoire `src/components/`. Ce composant sera chargé de rendre l'indicateur de progression.",
181181- "We create a container which spans across the whole width with the progress bar `.BF53914FAF1D12F4D39C": "Nous créons un conteneur qui s'étend sur toute la largeur avec la barre de progression `<div>` à l'intérieur. La largeur de l'élément `<div>` interne est mise à jour chaque fois que l'utilisateur fait défiler la page (et lors du chargement de celle-ci) pour refléter la position de défilement actuelle.",
182182- "In the hidden lines is the styling which makes sure that the progress bar looks .D3205B85D528FA0A2D8A": "Dans les lignes masquées se trouve le style qui s'assure que la barre de progression ressemble à une barre de progression typique. Elle est également adaptée à Starlight car la barre est automatiquement masquée lorsque le site n’a ni barre latérale ni table des matières, mais possède un élément « hero », comme la plupart des pages de destination.",
183183- "One thing to point out is what the global CSS (line 45) does: It pushes the mobi.9D93B4CCEB69834E52E2": "Un point important à noter concernant le CSS global (ligne 45) : il déplace le menu déroulant de la table des matières mobile vers le bas pour créer plus d’espace blanc au niveau de la barre de progression. C'est une préférence personnelle et vous pouvez le supprimer si vous le souhaitez.",
184184- "Starlight Override": "Surcharge dans Starlight",
185185- "Now we can use this component in a [Starlight override](https://starlight.astro..BD7A14DF6609C76376D6": "Nous pouvons maintenant utiliser ce composant dans une [surcharge Starlight](https://starlight.astro.build/guides/overriding-components/). Dans ce cas, il est logique de surcharger le composant [`Header.astro`](https://starlight.astro.build/reference/overrides/#header-1) comme ceci :",
186186- "Do not forget to add this component override to your `astro.config.mjs` file:": "N’oubliez pas d’ajouter cette surcharge de composant à votre fichier `astro.config.mjs` :",
187187- "Source Code": "Code source",
188188- "You can find the whole project code on [GitHub](https://github.com/trueberryless.F650372F9DC07B1F43E8": "Vous pouvez trouver l'intégralité du code du projet sur [GitHub](https://github.com/trueberryless/starlight-progress-indicator) et dans cet [exemple sur Stackblitz](https://stackblitz.com/github/trueberryless/starlight-progress-indicator?file=src%2Fcomponents%2FProgressIndicator.astro).",
189189- "Conclusion": "Conclusion",
190190- "With this setup, the progress indicator will be displayed on every page (except .14DF840C82B37252652E": "Avec cette configuration, l'indicateur de progression sera affiché sur chaque page (sauf les pages de destination) de votre site Starlight. 🥳",
191191- "You can also check out [FrostyBee's](https://github.com/frostybee) [Starlight Sc.2885FB180F098A43BD51": "Vous pouvez également consulter le [plugin Starlight Scroll To Top de FrostyBee](https://github.com/frostybee/starlight-scroll-to-top), qui prend également en charge un [Progress Ring](https://frostybee.github.io/starlight-scroll-to-top/configuration/#showprogressring) intégré depuis la version `0.3.1`. 🙌",
192192- "Starlight Topics Dropdown and List together": "Dropdown et Liste des sujets Starlight ensemble",
193193- "Learn how to combine a desktop list and mobile dropdown for your Starlight sideb.E44A5587DB1652DE8801": "Découvrez comment combiner une liste de bureau et un menu déroulant mobile pour les sujets de votre barre latérale Starlight.",
194194- "Combine two <a class=\"gh-badge\" href=\"https://github.com/withastro/starlight\"><i.F2B401A419A027863D20": "Combinez deux plugins <a class=\"gh-badge\" href=\"https://github.com/withastro/starlight\"><img src=\"/starlight.png\" alt=\"Starlight\" />Starlight</a> Sidebar Topics pour afficher une liste de sujets sur le bureau et un menu déroulant dans la barre latérale mobile.",
195195- "Using the [Starlight Sidebar Topics](https://github.com/hideoo/starlight-sidebar.7183C62B96DBF9A43128": "En utilisant le plugin [Starlight Sidebar Topics](https://github.com/hideoo/starlight-sidebar-topics) avec le composant [Starlight Sidebar Topics Dropdown](https://github.com/trueberryless-org/starlight-sidebar-topics-dropdown), vous pouvez créer un site web qui affiche une liste de sujets sur le bureau et un menu déroulant sur mobile.",
196196- "Install the packages": "Installer les paquets",
197197- "First, install the `starlight-sidebar-topics` plugin and also the `starlight-sid.6A32241A1C081FF4DD1C": "Tout d'abord, installez le plugin `starlight-sidebar-topics` ainsi que le composant `starlight-sidebar-topics-dropdown` :",
198198- "Afterwards, follow the setup guides from [Starlight Sidebar Topics](https://star.754B56EA2499006C8169": "Ensuite, suivez les guides d'installation depuis [Starlight Sidebar Topics](https://starlight-sidebar-topics.netlify.app/docs/getting-started/#installation) et [Starlight Sidebar Topics Dropdown](https://starlight-sidebar-topics-dropdown.trueberryless.org/docs/getting-started/#installation).",
199199- "Modify the Sidebar component": "Modifier le composant de la barre latérale",
200200- "In the setup guide from the dropdown component, you have created a sidebar compo.BD6B58F9BEEFEE582749": "Dans le guide d'installation du composant déroulant, vous avez créé un composant de barre latérale qui ne rend que le menu déroulant. Désormais, vous devez modifier ce composant pour qu'il rende également la barre latérale par défaut si l'utilisateur est sur un bureau.",
201201- "Result": "Résultat",
202202- "If you follow these steps, your sidebar will look like this:": "Si vous suivez ces étapes, votre barre latérale ressemblera à ceci :",
203203- ".",
205205- "Endless possibilities": "Possibilités infinies",
206206- "You could also do it the other way around (list on mobile, dropdown on desktop) .6BA6A2F32E24F0FB3A00": "Vous pourriez également faire l'inverse (liste sur mobile, menu déroulant sur le bureau) en intervertissant les propriétés `display: block` et `display: none` dans le CSS.",
207207- "Moreover, you could also create your own display component, which uses the route.40B5CA2AA37239989091": "De plus, vous pourriez également créer votre propre composant d'affichage, qui utilise les données de route depuis le plugin Starlight Sidebar Topics et rend les sujets d'une manière personnalisée. Cela est un peu plus avancé, mais vous trouverez plus d'informations à ce sujet dans la documentation [\"Custom Topics List\"](https://starlight-sidebar-topics.netlify.app/docs/guides/custom-topic-list/).",
208208- "Setting up Kubernetes with Cilium and Cloudflare": "Mise en place de Kubernetes avec Cilium et Cloudflare",
209209- "Today we'll take a look at how to set up a Kubernetes cluster with K3s and Ciliu.651207C3314901C11632": "Aujourd'hui, nous allons voir comment configurer un cluster Kubernetes avec K3s et Cilium.",
210210- "This blog posts describes the process of setting up a <a class=\"gh-badge\" href=\".E82478488BD3E7D9E2C2": "Cet article de blog décrit le processus de configuration d'un cluster <a class=\"gh-badge\" href=\"https://github.com/kubernetes\"><img src=\"https://github.com/kubernetes.png\" alt=\"Kubernetes\" />Kubernetes</a> avec <a class=\"gh-badge\" href=\"https://github.com/k3s-io\"><img src=\"https://github.com/k3s-io.png\" alt=\"k3s\" />k3s</a> et <a class=\"gh-badge\" href=\"https://github.com/cilium\"><img src=\"https://github.com/cilium.png\" alt=\"Cilium\" />Cilium</a>. Nous utilisons <a class=\"gh-badge\" href=\"https://github.com/helm\"><img src=\"https://github.com/helm.png\" alt=\"Helm\" />Helm</a> comme gestionnaire de packages et <a class=\"gh-badge\" href=\"https://github.com/cloudflare\"><img src=\"https://github.com/cloudflare.png\" alt=\"Cloudflare\" />Cloudflare</a> comme émetteur de certificats. Nous avons utilisé les astuces et conseils de Vegard S. Hagen tirés de [son article](https://blog.stonegarden.dev/articles/2024/02/bootstrapping-k3s-with-cilium/). En gros, ce blog explique comment tous les sites trueberryless.org sont déployés (ce n'est plus le cas).",
211211- "Working with [Docker](https://github.com/docker) Containers can be hard. However.1CC6942704DAE062A463": "Travailler avec les conteneurs [Docker](https://github.com/docker) peut être difficile. Cependant, il existe des outils qui facilitent la gestion des conteneurs, comme [Kubernetes](https://github.com/kubernetes). En fait, Kubernetes est le seul outil, à ma connaissance, qui agit comme un logiciel de gestion pour les conteneurs Docker. Kubernetes est bien intégré dans presque tous les fournisseurs de cloud, comme Google Cloud, Azure et AWS. Par conséquent, il utilise une syntaxe standardisée en `yaml`, ce qui est idéal pour les petits développeurs, car ils peuvent basculer entre « Les Trois Grands » avec peu d'effort.",
212212- "tl;dr": "résumé",
213213- "Install everything and then apply cert-manager. ez": "Installez tout, puis appliquez cert-manager. Facile.",
214214- "Install k3s": "Installer k3s",
215215- "As Hagen explains in [his article](https://blog.stonegarden.dev/articles/2024/02.D5EDD5BC9C49780444EF": "Comme Hagen l'explique dans [son article](https://blog.stonegarden.dev/articles/2024/02/bootstrapping-k3s-with-cilium/), nous voulons installer `k3s` sans configurations et avec tout désactivé. Il décrit en détail quels composants ne sont pas installés.",
216216- "After the installation, there should be some pods running (3). Don't be shocked .56BB9C3C1CCEDAFADEDB": "Après l'installation, quelques pods devraient être en cours d'exécution (3). Ne soyez pas choqués si les pods sont dans l'état `ContainerCreating` ou `Pending`. Cela est dû au fait que les pods ne peuvent pas communiquer entre eux parce que nous avons désactivé le CNI (`--flannel-backend=none`). Nous installerons plus tard [Cilium](https://github.com/cilium), qui remplacera le CNI Flannel.",
217217- "Install Helm": "Installer Helm",
218218- "Helm is the package manager for [Kubernetes](https://github.com/kubernetes), so .B3313537E64D4FFE6667": "Helm est le gestionnaire de packages pour [Kubernetes](https://github.com/kubernetes), vous pouvez soit l'installer directement (suivez la [documentation Helm](https://helm.sh/docs/intro/install/)), soit utiliser les composants d'Helm inclus avec Cilium. Nous avons choisi d'installer Helm directement, ce qui est facilement faisable avec cette commande :",
219219- "Install Cilium": "Installer Cilium",
220220- "[Cilium](https://github.com/cilium) is a networking and security software for Ku.F7DC9A96105A082EC9DB": "[Cilium](https://github.com/cilium) est un logiciel de mise en réseau et de sécurité pour Kubernetes. Cilium est très rapide, évolutif et sécurisé car il repose sur eBPF - une technologie révolutionnaire qui peut exécuter des programmes isolés dans le noyau Linux sans recompiler le noyau ou charger des modules noyau.",
221221- "We could install Cilium with Helm like shown here:": "Nous pourrions installer Cilium avec Helm comme indiqué ici :",
222222- "However, we wanted to install with their CLI and this is how you can do it. Firs.551EA48947BA4759E483": "Cependant, nous avons voulu l'installer avec leur CLI, et voici comment vous pouvez le faire. Tout d'abord, installez la CLI de Cilium en exécutant ce script :",
223223- "Then you can install Cilium with your Server IP-Address:": "Ensuite, vous pouvez installer Cilium avec l'adresse IP de votre serveur :",
224224- "Now we wait until Cilium says, everything is `OK` or `disabled`:": "Nous attendons maintenant que Cilium indique que tout est `OK` ou `disabled` :",
225225- "After a while, all pods should be `Running`.": "Au bout d'un moment, tous les pods devraient être en état `Running`.",
226226- "Last but not least, you can apply some resources for Cilium:": "Enfin, vous pouvez appliquer certaines ressources pour Cilium :",
227227- "Additionally you should upgrade the cilium config. In order to do that with the .B2C737654644F532072A": "De plus, vous devriez mettre à jour la configuration de Cilium. Pour cela, créez d'abord ce fichier dans le répertoire racine où vous souhaitez gérer le cluster k3s. Plus tard, vous pourrez également appliquer des propriétés liées à Hubble et Prometheus si vous souhaitez utiliser [Grafana](https://github.com/Grafana) ou un outil similaire (ouvrez les lignes repliées si vous souhaitez utiliser notre configuration également).",
228228- "Run this command to upgrade:": "Exécutez cette commande pour mettre à jour :",
229229- "Setup Certificate Manager with Cloudflare": "Configurer le gestionnaire de certificats avec Cloudflare",
230230- "In order to be able to create certificates for each subdomain, it is important t.412EB3BCACB9EA434592": "Pour pouvoir créer des certificats pour chaque sous-domaine, il est important d'appliquer un émetteur de certificats qui gère les demandes de certificats et les résout auprès d'un fournisseur. Nous avons choisi [Cloudflare](https://github.com/cloudflare) comme notre émetteur, et voici la configuration que vous devez appliquer à votre cluster Kubernetes. Pour plus d'informations, vous pouvez consulter la [documentation de cert-manager](https://cert-manager.io/docs/configuration/acme/dns01/cloudflare/).",
231231- "But first, we need to install the cert-manager by running the following command:.2C3AE967A1D1E33B0CFD": "Mais d'abord, nous devons installer le cert-manager en exécutant la commande suivante :",
232232- "You can apply a file to the [Kubernetes](https://github.com/kubernetes) cluster,.7C198D3247CB04A61DD9": "Vous pouvez appliquer un fichier au cluster [Kubernetes](https://github.com/kubernetes) en exécutant cette commande k8s (également k3s) :",
233233- "If you want to delete the resource in the Kubernetes cluster, the command is pre.13785BDE8535FD743BB9": "Si vous souhaitez supprimer la ressource dans le cluster Kubernetes, la commande est assez simple :",
234234- "As you may have spotted above, we also need a secret for the API token which aut.EED50E553247233483D4": "Comme vous l'avez peut-être remarqué ci-dessus, nous avons également besoin d'un secret pour le jeton API qui authentifie que ce générateur est autorisé à demander des certificats. Par conséquent, nous créons un secret avec un `API Token` non chiffré de Cloudflare.",
235235- "Nowadays we create a token by going to your [Cloudflare](https://github.com/clou.29311654A42391586C43": "De nos jours, nous créons un jeton en accédant à votre tableau de bord [Cloudflare](https://github.com/cloudflare), puis en cliquant sur votre profil et en sélectionnant l'onglet `API Tokens`. Ici, vous pouvez générer un jeton spécifique pour votre générateur ou utiliser la clé API globale (non recommandée). La solution recommandée est de créer un jeton API avec deux permissions (jeton personnalisé) :",
236236- "Zone - DNS - Edit": "Zone - DNS - Modifier",
237237- "Zone - Zone - Read": "Zone - Zone - Lecture",
238238- "": "Jeton API Cloudflare",
239239- "A more detailed description about the tokens, can be found in the [Cloudflare do.1F2C806B3988F77EF2CC": "Une description plus détaillée des jetons peut être trouvée dans les [docs Cloudflare](https://developers.cloudflare.com/fundamentals/api/get-started/create-token/).",
240240- "After applying this secret to Kubernetes, the issuer should be ready to resolve .6908E4EC999AC0DCA147": "Après avoir appliqué ce secret à Kubernetes, le générateur devrait être prêt à résoudre quelques vilains problèmes !",
241241- "You can now use this issuer by applying this file which will hopefully create a .7987E8195B3DBB4AB6A9": "Vous pouvez maintenant utiliser ce générateur en appliquant ce fichier qui, espérons-le, créera un certificat :",
242242- "It usually takes around 90 seconds to authenticate the request once applied. You.523D684039CD86DF5B8E": "Cela prend généralement environ 90 secondes pour authentifier la demande une fois appliquée. Vous pouvez vérifier l'état actuel de la demande en exécutant cette commande kubernetes. Si cela prend plus de 2 minutes, peut-être que quelques astuces dans [#Dépannage](#no-cloudflare-certificate-approval) peuvent vous aider.",
243243- "The `-n` option stands for namespace.": "L'option `-n` signifie namespace.",
244244- "## Example app [`mutanuq`](https://mutanuq.trueberryless.org)": "Exemple d'application [`mutanuq`](https://mutanuq.trueberryless.org)",
245245- "Then you can use this certificate in your Ingress controller:": "Ensuite, vous pouvez utiliser ce certificat dans votre contrôleur Ingress :",
246246- "Setup Keel": "Configurer Keel",
247247- "We always wanted a clean Continuous Integration (CI) and Continuous Delivery (CD.5A7C877EE9C3CC7E2E7A": "Nous avons toujours voulu une solution propre d'Intégration Continue (CI) et de Livraison Continue (CD) pour nos sites web. Cela signifie qu'un message de commit spécifique devrait déclencher un processus automatisé via [GitHub](https://github.com/github), Docker Hub et notre serveur, qui, à la fin, met à jour le site web correspondant en environ deux minutes.",
248248- "Keel is a robust software tool which enables this feature for Kubernetes. We use.782AFBD621B2DB555C2D": "Keel est un outil logiciel robuste qui permet cette fonctionnalité pour Kubernetes. Nous avons utilisé Keel pour tirer de nouvelles images Docker de Docker Hub en interrogeant toutes les quelques minutes. De plus, Keel fournit un magnifique tableau de bord où vous pouvez contrôler l'interrogation également.",
249249- "In order to set up Keel with the admin dashboard, we created those files:": "Pour configurer Keel avec le tableau de bord d'administration, nous avons créé ces fichiers :",
250250- "`secret-dashboard.yaml` for the Admin Username and Password (not everyone should.BC266314D27DCB36F4CB": "`secret-dashboard.yaml` pour le nom d'utilisateur et le mot de passe administrateur (tout le monde ne devrait pas pouvoir accéder au tableau de bord)",
251251- "`keel.yaml` for the actual k3s configs (copied and adapted from [KeelHQ](https:/.F8A38C5FC9A4505AF62C": "`keel.yaml` pour les configurations réelles de k3s (copié et adapté de [KeelHQ](https://github.com/keel-hq/keel/blob/9f0a7160bbdc3a107ad148933a4269f30e4e479c/deployment/deployment-template.yaml))",
252252- "After applying both files and managing the additional certificate for `keel.true.30388E288EFFF1AD00F9": "Après avoir appliqué les deux fichiers et géré le certificat supplémentaire pour `keel.trueberryless.org`, le tableau de bord Keel fonctionne parfaitement. De plus, chaque `Deployment` Kubernetes peut opter pour un sondage Docker Hub automatisé en ajoutant quelques annotations :",
253253- "Celebrate with a Coffee!": "Célébrez avec un café !",
254254- "Congratulations, you've successfully set up [Kubernetes](https://github.com/kube.C26D3423275F0054D782": "Félicitations, vous avez réussi à configurer [Kubernetes](https://github.com/kubernetes) avec [Cilium](https://github.com/cilium) et [Cloudflare](https://github.com/cloudflare) ! Vous méritez une pause café. Profitez d'une tasse bien méritée, et si vous souhaitez partager un café virtuel avec moi, n'hésitez pas à soutenir mon travail sur [Ko-fi](https://ko-fi.com/trueberryless). Merci !",
255255- "Troubleshooting": "Dépannage",
256256- "Cilium-ingress has no External-IP": "Cilium-ingress n'a pas d'External-IP",
257257- "Make sure that the `ip-pool` includes the address specified by the annotations i.4E44377E5C9AC3845ED3": "Assurez-vous que le `ip-pool` inclut l'adresse spécifiée par les annotations dans le fichier `config.yaml`.",
258258- "Also in some cases, other ingress controllers get the annotated address before t.16FB14B27C64B47E0869": "Dans certains cas, d'autres contrôleurs d'entrée obtiennent l'adresse annotée avant que le contrôleur d'entrée de Cilium puisse y accéder, donc elle resterait en attente...",
259259- "If you don't deploy locally but on one of `The Big Three`, please check out some.4CF2A8E1AE1127E8E9D5": "Si vous ne déployez pas localement mais sur l'une des `Big Three`, veuillez consulter d'autres documentations sur les raisons pour lesquelles l'IP externe reste en attente. Il est principalement de leur responsabilité de vous fournir une adresse.",
260260- "No Cloudflare Certificate Approval": "Pas d'approbation de certificat Cloudflare",
261261- "There can be some problem when the certificate won't get approved by Cloudflare..21242D4E500A87FE26A2": "Il peut y avoir un problème lorsque le certificat ne reçoit pas l'approbation de Cloudflare.",
262262- "Wrong API token": "Jeton API incorrect",
263263- "First make sure that the Cloudflare API token is correct. To make 100 percent su.BE3E293E05F70A765669": "Tout d'abord, assurez-vous que le jeton API Cloudflare est correct. Pour être sûr à 100 %, créez-en un nouveau et insérez-le (non encodé en base64) dans ce fichier :",
264264- "Max auth failures reached": "Maximum d'échecs d'authentification atteint",
265265- "We once ran into the error `Error: 9109: Max auth failures reached, please check.661EAA2B42757CBB4C1D": "Nous avons rencontré une fois l'erreur `Error: 9109: Max auth failures reached, please check your Authorization header.`. Il suffit d'attendre quelques heures, de supprimer la ressource et de l'appliquer à nouveau :",
266266- "Hopefully, you're now good to go!": "Espérons que tout fonctionne maintenant !",
267267- "Setting up Continuous deployment in a GitHub repository": "Configurer le déploiement continu dans un dépôt GitHub",
268268- "Today we'll take a look at how to set up a GitHub repository which will be deplo.210AF277FD26683FD09E": "Aujourd'hui, nous allons voir comment configurer un dépôt GitHub qui sera déployé sur un cluster k3s via Argo CD.",
269269- "Today we'll take a look at how to set up a <a class=\"gh-badge\" href=\"https://git.A040D5A396CEA3FE8E47": "Aujourd'hui, nous allons voir comment configurer un <a class=\"gh-badge\" href=\"https://github.com/github\"><img src=\"https://github.com/github.png\" alt=\"github\" />GitHub</a> dépôt qui sera déployé sur un cluster k3s via Argo CD. En résumé, l'article inclura les fichiers Workflow, le Dockerfile, les manifestes (déploiement) et les dépôts <a class=\"gh-badge\" href=\"https://github.com/docker\"><img src=\"https://github.com/docker.png\" alt=\"Docker Hub\" />Docker Hub</a>. Veuillez consulter [notre blog Argo CD](./setup-argocd-for-kubernetes) car cet article sera une continuation d'un autre post.",
270270- "In today's post, we'll take a quick look at how to set up continuous deployment .837E00D0E73247CB97BC": "Dans le post d'aujourd'hui, nous allons examiner brièvement comment configurer un déploiement continu dans un dépôt [GitHub](https://github.com/github). Nous sommes assez sûrs que cette configuration fonctionne également pour d'autres registres Git, mais si vous en utilisez un autre, gardez à l'esprit que cet article est conçu uniquement pour GitHub.",
271271- "This post also assumes that you use [GitHub](https://github.com/github) Actions .5387D30E9AFCFCF33E71": "Ce post suppose également que vous utilisez [GitHub](https://github.com/github) Actions combiné avec Argo CD pour déployer vos applications sur un cluster Kubernetes. Suivez nos autres [articles sur le déploiement](/blog/tags/deployment) pour des instructions supplémentaires sur la façon de configurer ces deux technologies sur votre serveur personnel.",
272272- "Preparations": "Préparatifs",
273273- "We recommend creating a [Docker Hub](https://hub.docker.com/) account or choose .D653C06B296243188634": "Nous recommandons de créer un compte [Docker Hub](https://hub.docker.com/) ou de choisir un autre registre Docker si vous le souhaitez.",
274274- "Your GitHub repository must fulfil these conditions:": "Votre dépôt GitHub doit remplir ces conditions :",
275275- "Has a Dockerfile (ideally in the root folder)": "A un Dockerfile (idéalement dans le dossier racine)",
276276- "Has two GitHub Secrets ([create GitHub Secret](https://docs.github.com/en/action.5E18F567EA5B8452C4B3": "A deux Secrets GitHub ([créer un Secret GitHub](https://docs.github.com/en/actions/security-guides/using-secrets-in-github-actions#creating-secrets-for-a-repository)) :",
277277- "DOCKER_USERNAME: Your docker username": "DOCKER\\_USERNAME : Votre nom d'utilisateur Docker",
278278- "DOCKER\\_PASSWORD: Your docker password (or [access token](https://docs.docker.co.09AD66E199369AC9AC74": "DOCKER\\_PASSWORD : Votre mot de passe Docker (ou [jeton d'accès](https://docs.docker.com/security/for-developers/access-tokens/))",
279279- "Create workflow file(s)": "Créer un ou plusieurs fichiers de workflow",
280280- "GitHub Actions are special jobs in GitHub which mostly run on Linux servers and .E52CA8DEA2F2414C53E4": "Les GitHub Actions sont des tâches spécifiques sur GitHub qui fonctionnent principalement sur des serveurs Linux et peuvent être contrôlées en créant des fichiers `yaml` dans le répertoire `.github/workflows`. Ces fichiers particuliers permettent de définir les événements déclencheurs des tâches et offrent beaucoup de flexibilité. En tant qu'utilisateur régulier des GitHub Actions, je peux vous dire qu'il faut souvent réécrire vos fichiers `yaml` car les petits détails sont facilement négligés. Mais sans plus attendre, passons directement à la création d'un fichier `deployment.yaml` adapté, qui effectuera les tâches suivantes pour nous :",
281281- "Push a new docker image to Docker Hub (with the newest version).": "Pousser une nouvelle image Docker sur Docker Hub (avec la dernière version).",
282282- "Update the `manifest/deployment.yaml` file, so Argo CD gets notified about the n.745ACECEA48EBB0BD214": "Mettre à jour le fichier `manifest/deployment.yaml` pour qu'Argo CD soit informé de la nouvelle image taguée.",
283283- "(optional) Create a new release on GitHub, so the times of releases are document.5A45740CFC388A713228": "(optionnel) Créer une nouvelle release sur GitHub, afin que les temps de publication soient documentés où ils doivent l'être.",
284284- "Here you have an obsolete `docker-hub.yaml` which we used to use because it has .ACD068BBAB645A580B40": "Voici un fichier `docker-hub.yaml` obsolète que nous utilisions auparavant car il proposait de bonnes stratégies de versioning :",
285285- "After copying the contents of our `deployment.yaml` file and creating the new fi.BA0B84DE711F10368BA7": "Après avoir copié le contenu de notre fichier `deployment.yaml` et créé le nouveau fichier dans le dossier `.github/workflows`, vous devez effectuer quelques adaptations très **importantes** :",
286286- "Change the `IMAGE_NAME` to your personal Docker Hub repository. The image name c.70E854B465ED70C76952": "Modifiez le `IMAGE_NAME` pour qu'il corresponde à votre dépôt personnel sur Docker Hub. Le nom de l'image se compose de votre nom de compte et du nom du dépôt. Si vous n'êtes pas sûr de ce qu'est le nom de votre image, vous pouvez regarder l'URL du dépôt Docker Hub, il devrait y figurer quelque part.",
287287- "Now you should be good to go to add the keyword `deploy` into any commit message.BBFBDF3655BEA5A69ED1": "Maintenant, vous êtes prêt à ajouter le mot-clé `deploy` dans n'importe quel message de commit sur la branche principale de votre dépôt, et cela devrait automatiquement pousser une image Docker sur Docker Hub et mettre à jour le manifeste pour Argo CD.",
288288- "Congratulations, you've successfully set up Argo CD with k3s and [Cilium](https:.F5382A81A78FA5565691": "Félicitations, vous avez configuré Argo CD avec k3s et [Cilium](https://github.com/cilium) avec succès ! Vous méritez une pause café. Savourez une tasse bien méritée, et si vous souhaitez partager un café virtuel avec moi, n'hésitez pas à soutenir mon travail sur [Ko-fi](https://ko-fi.com/trueberryless). Merci !",
289289- "Setting up Argo CD in a k3s cluster": "Configuration d'Argo CD dans un cluster k3s",
290290- "Today we'll take a look at how to set up Argo CD in a k3s cluster.": "Aujourd'hui, nous allons examiner comment configurer Argo CD dans un cluster k3s.",
291291- "Continuing to improve our k3s cluster and especially the CI/CD workflow, we now .A2E0EE988FAFFFAD6A42": "Pour continuer à améliorer notre cluster k3s et surtout le flux de travail CI/CD, nous allons maintenant nous pencher sur l'outil GitOps appelé <a class=\"gh-badge\" href=\"https://github.com/argoproj\"><img src=\"https://github.com/argoproj.png\" alt=\"Argo CD\" />Argo CD</a>, et comment nous pouvons l'intégrer à notre cluster. Notre pile technologique pour le déploiement utilise ces services: k3s, Helm, Cilium et après ce tutoriel, Argo CD également.",
292292- "Having read Vegard S. Hagen's article “[Argo CD Kustomize with Helm](https://blo.A0B58D0615DC386245A0": "Après avoir lu l'article de Vegard S. Hagen “[Argo CD Kustomize with Helm](https://blog.stonegarden.dev/articles/2023/09/argocd-kustomize-with-helm/)” et décidé que leur solution n'était pas adaptée à notre cluster, nous sommes directement passés au guide “[Getting started](https://argo-cd.readthedocs.io/en/stable/getting_started/)” par défaut d'Argo CD. Et maintenant, nous allons vous faire traverser les étapes de configuration d'[Argo CD](https://github.com/argoproj) sur [k3s](https://github.com/k3s-io) et [Cilium](https://github.com/cilium), en poursuivant à partir du chapitre “[Setup Certificate Manager with Cloudflare](/blog/setup-kubernetes-with-cilium-and-cloudflare#setup-certificate-manager-with-cloudflare)” de notre article précédent “[Setting up Kubernetes with Cilium and Cloudflare](/blog/setup-kubernetes-with-cilium-and-cloudflare)”. Dans ce même article récent, nous avons également configuré [Keel](https://github.com/keel-hq) à la fin, mais cette étape sera désormais inutile car nous utiliserons Argo CD pour obtenir le code le plus récent et le plus avancé à partir de chaque dépôt [GitHub](https://github.com/github). Bonne lecture !",
293293- "We assume that you followed [our other blog post](/blog/setup-kubernetes-with-ci.35443F83A3EBC402F568": "Nous supposons que vous avez suivi [notre autre article de blog](/blog/setup-kubernetes-with-cilium-and-cloudflare).",
294294- "Requirements": "Pré-requis",
295295- "Before we can start, we need to make sure we have `kubectl` installed, a kubecon.AF18D970264C891E62E6": "Avant de commencer, nous devons nous assurer que nous avons installé `kubectl`, un fichier kubeconfig (k3s enregistre ce fichier ici :",
296296- ") and CoreDNS (check if you have CoreDNS by running this": ") et CoreDNS (vérifiez si vous avez CoreDNS en exécutant cette commande :",
297297- "command).": "commande).",
298298- "Installation": "Installation",
299299- "First, let's apply all the necessary services, deployments and many other differ.3968A495D46DF328E51D": "Tout d'abord, appliquons tous les services nécessaires, les déploiements et de nombreuses autres ressources Kubernetes différentes en exécutant :",
300300- "Certificate": "Certificat",
301301- "Additionally, we'll need a certificate:": "De plus, nous aurons besoin d'un certificat :",
302302- "Apply this resource by running `kubectl apply -f certificate.yaml`.": "Appliquez cette ressource en exécutant `kubectl apply -f certificate.yaml`.",
303303- "Ingress Controller": "Contrôleur d'Ingress",
304304- "And we'll need a ingress controller which is managed by Cilium:": "Nous aurons également besoin d'un contrôleur d'Ingress géré par Cilium :",
305305- "Apply this resource by running `kubectl apply -f argocd-ingress.yaml`.": "Appliquez cette ressource en exécutant `kubectl apply -f argocd-ingress.yaml`.",
306306- "Deactivate TSL within Argo CD": "Désactiver TLS dans Argo CD",
307307- "With the certificate the connection between the client and server is secured. Ho.198C7766F41D2E4927DA": "Avec le certificat, la connexion entre le client et le serveur est sécurisée. Cependant, il existe toujours un certificat auto-signé au sein des services [Argo CD](https://github.com/argoproj), dont nous n'avons pas strictement besoin. Nous pouvons donc désactiver la sécurité du serveur Argo CD en modifiant la propriété `server.insecure`.",
308308- "In order to do that, we first run this command:": "Pour ce faire, exécutez d'abord cette commande :",
309309- "which will hopefully open a file in vim or neovim (otherwise would be cringe if .8B321BBC80D980EFA538": "ce qui ouvrira, espérons-le, un fichier dans vim ou neovim (sinon ce serait une honte si vous nous demandez, MDR). Le fichier devrait ressembler à ceci :",
310310- "The last two lines will probably be not there at first, but this is exactly the .00E15DF17F5D9A9B4B22": "Les deux dernières lignes ne seront probablement pas là au départ, mais c'est exactement le paramètre que nous voulons atteindre. Allez-y et ajoutez ces deux lignes (marquées ci-dessus) et enregistrez le fichier (`Esc` → `:wq` si vous êtes cool).",
311311- "Restart the Argo CD Server by running and waiting till the rollout is completed:.CDC77B3806BBA44885A8": "Redémarrez le serveur Argo CD en exécutant cette commande et en attendant que le déploiement soit terminé :",
312312- "After all those steps, we should now see the UI under [`https://argo-cd.trueberr.89BC34AD1ECDBC06B87E": "Après toutes ces étapes, nous devrions maintenant voir l'interface utilisateur sur [`https://argo-cd.trueberryless.org`](https://argo-cd.trueberryless.org) (protégé par mot de passe).",
313313- "": "Tableau de bord de l'interface utilisateur d'Argo CD",
314314- "The credentials of Argo CD UI consist of a user and a password. The user is alwa.BE74F043F4C1B4E5AB9E": "Les identifiants de connexion à l'interface utilisateur d'Argo CD se composent d'un utilisateur et d'un mot de passe. L'utilisateur est toujours `admin` et vous pouvez obtenir votre mot de passe en exécutant :",
315315- "Add manifest to repository": "Ajouter le manifest au dépôt",
316316- "Now in order to create a new application in [Argo CD](https://github.com/argopro.B153A0B7CA8710DB4FF2": "Pour créer une nouvelle application dans [Argo CD](https://github.com/argoproj) (via l'interface utilisateur ou l'interface CLI — nous utilisons l'interface utilisateur car nous n'avons pas configuré l'interface CLI), nous devons préparer le dépôt Git. Comme le dépôt est la seule source de vérité, c'est aussi l'endroit où nous définissons toutes les ressources Kubernetes qui devraient être créées par Argo CD.",
317317- "We recommend creating a new folder in the git repository called something like `.505C369206406EFB86A4": "Nous recommandons de créer un nouveau dossier dans le dépôt Git appelé quelque chose comme `manifest`. Dans ce dossier, nous allons créer quelques fichiers :",
318318- "`certificate.yaml`:": "`certificate.yaml` :",
319319- "`deployment.yaml`:": "`deployment.yaml` :",
320320- "`service.yaml`:": "`service.yaml` :",
321321- "`ingress.yaml`:": "`ingress.yaml` :",
322322- "These files are basically the exact same files mentioned in the [other post](/bl.A6639A930D5E316FA4EB": "Ces fichiers sont essentiellement les mêmes que ceux mentionnés dans [l'autre article](/blog/setup-kubernetes-with-cilium-and-cloudflare#example-app-mutanuq) mais séparés en quatre fichiers, car cela nous donne l'avantage de manipuler le manifest depuis [GitHub](https://github.com/github) Actions. Mais chaque chose en son temps, vous verrez comment configurer le manifest avec GitHub Actions dans le [prochain article](/blog/setup-continuous-integration-github-repository).",
323323- "Create new application in Argo CD UI": "Créer une nouvelle application dans l'interface utilisateur d'Argo CD",
324324- "You'll probably see the big `NEW APP` button in the UI of [Argo CD](https://gith.8C955D38A27D41B77691": "Vous verrez probablement le grand bouton `NEW APP` dans l'interface utilisateur d'[Argo CD](https://github.com/argoproj). Cliquez dessus et créez une nouvelle application avec les propriétés adaptées ci-dessous :",
325325- "Application Name: `mutanuq`": "Nom de l'application : `mutanuq`",
326326- "Project Name: `default`": "Nom du projet : `défaut`",
327327- "Sync Policy: Find out more in [this post](/blog/setup-continuous-integration-git.049A9447DEA81CE1B5DD": "Politique de synchronisation : En savoir plus dans [cet article](/blog/setup-continuous-integration-github-repository) / laissez `Manuel` pour l'instant",
328328- "Repository URL: `https://github.com/trueberryless-org/mutanuq`": "URL du dépôt : `https://github.com/trueberryless-org/mutanuq`",
329329- "Revision: `HEAD`": "Révision : `HEAD`",
330330- "Path: `manifest`": "Chemin : `manifest`",
331331- "Cluster URL: `https://kubernetes.default.svc`": "URL du cluster : `https://kubernetes.default.svc`",
332332- "Namespace: `mutanuq`": "Namespace : `mutanuq`",
333333- "Optionally — if you have [the CLI installed](https://argo-cd.readthedocs.io/en/s.4F9EF0A15884AE51DE02": "Optionnellement — si vous avez [le CLI installé](https://argo-cd.readthedocs.io/en/stable/cli_installation/) — vous pouvez exécuter cette commande pour obtenir le même résultat :",
334334- "Now you can hopefully see your website being deployed in the UI. This process ca.9A72C473303559E3BDC1": "Vous devriez maintenant voir votre site web en cours de déploiement dans l'interface utilisateur. Ce processus peut prendre un certain temps, car, par exemple, la demande de certificat doit être approuvée. Une application saine devrait ressembler à ceci :",
335335- " sur un cluster [k3s](https://github.com/k3s-io) ! Vous méritez une pause café. Savourez une tasse bien méritée et, si vous souhaitez partager un café virtuel avec moi, n'hésitez pas à soutenir mon travail sur [Ko-fi](https://ko-fi.com/trueberryless). Merci !",
337337- "Continuation": "Continuation",
338338- "Be continued for our [next blog](/blog/setup-continuous-integration-github-repos.C6E6C542B1FAA026061D": "La suite dans notre [prochain article de blog](/blog/setup-continuous-integration-github-repository), qui décrira comment configurer un dépôt [GitHub](https://github.com/github) pouvant ensuite être déployé via Argo CD.",
339339- "How to create a Rehype plugin that turns GitHub links into beautiful badges": "Comment créer un plugin Rehype qui transforme les liens GitHub en badges attrayants",
340340- "Learn how to build a simple yet delightful Rehype plugin that automatically tran.1DBFD32D56C53FC8C2C2": "Apprenez à construire un plugin Rehype simple mais captivant qui transforme automatiquement des liens de profil GitHub classiques en liens élégants en forme de badge avec des images de profil—parfait pour ajouter de la personnalité à votre blog ou à vos documents.",
341341- "Discover how a tiny Rehype plugin can give your GitHub links a big visual upgrad.95CD8D7DFB0C962AE484": "Découvrez comment un minuscule plugin Rehype peut donner à vos liens GitHub une mise à niveau visuelle majeure. Avec seulement quelques lignes de code, nous transformerons des liens de profil classiques en badges élégants avec avatars, inspirés par le site d'Antfu et propulsés par Astro + Starlight.",
342342- "Recently, I added a very little neat feature to this blog, which you might have .31ECBA06CD87D5CFEC39": "Récemment, j'ai ajouté une petite fonctionnalité sympa à ce blog, que vous avez peut-être remarquée en tant que lecteur régulier. Ce n'est rien de gigantesque, mais cela donne à chaque blog cette petite touche charmante que j'ai recherchée pendant longtemps. Je parle (ou plutôt j'écris) de tous ces badges verts avec des photos de profil que vous pouvez également voir dans ce blog.",
343343- "The inspiration to create them was taken from none other than [Antfu](https://gi.F44018DA56F114106E55": "L'inspiration pour les créer vient de nul autre qu'[Antfu](https://github.com/antfu) lui-même, puisqu'il affiche ces badges partout sur son site web (au moment de cette rédaction).",
344344- "Initially I thought they would require some long and tedious programming session.255FD9F39C231A32E556": "Au départ, je pensais qu'il faudrait une longue et fastidieuse session de programmation pour atteindre la même beauté visuelle. Cependant, après quelques sessions de Vibe Coding - comme [Andrej Karpathy a inventé le terme](https://x.com/karpathy/status/1886192184808149383) - j'ai rapidement réalisé que ces badges n'étaient qu'à un petit [plugin rehype](https://github.com/rehypejs) d'existence.",
345345- "This is the whole code behind the rehype plugin:": "Voici tout le code derrière le plugin rehype :",
346346- "Basically all this plugin does, is walking through the HTML, looking for links w.713A33AB7C816E7ADAF6": "En gros, tout ce que fait ce plugin, c'est parcourir le HTML à la recherche de liens qui font référence à un profil GitHub. Si l'un d'eux est trouvé, il ajoute une balise `<img>` avant le contenu texte avec la photo de profil de l'utilisateur ou de l'organisation GitHub. Cela est possible de manière très cohérente grâce à la fonctionnalité de GitHub qui permet d'obtenir la photo comme ressource derrière le lien du profil suivi de `.png`. Lisez-en plus à ce sujet dans [cet article génial sur `dev.to`](https://dev.to/10xlearner/how-to-get-the-profile-picture-of-a-github-account-1d82).",
347347- "With a little bit of additional styling it looks really cute in my opinion. Plea.3CF02F394DFC8ECF3E94": "Avec un peu de style supplémentaire, cela a un rendu vraiment mignon à mon avis. Veuillez noter que comme ceci est une page [Starlight](https://starlight.astro.build), j'utilise des variables CSS disponibles, comme dans la ligne quatre :",
348348- "Now to put everything together, let's say for example in an Astro site, you just.9BE9659FCADE76D6467F": "Pour tout assembler, disons, par exemple, dans un site Astro, vous devez simplement ajouter le plugin rehype à la configuration comme ceci :",
349349- "Read more about the injection of rehype plugins in Astro in [their configuration.D3124728AFCD14A1CEE8": "Lisez-en davantage sur l'injection des plugins rehype dans Astro dans [leur référence de configuration](https://docs.astro.build/en/reference/configuration-reference/#markdownrehypeplugins).",
350350- "Do not forget to add the CSS in a similar way depending on your framework - in S.8376354E6C8822949CB6": "N'oubliez pas d'ajouter le CSS de manière similaire, en fonction de votre framework - dans Starlight, vous pouvez configurer des styles CSS globaux personnalisés en suivant [ces instructions](https://docs.astro.build/en/guides/styling/#scoped-styles) - et vous pouvez également admirer vos propres liens en badge. N'hésitez pas à partager cet article avec toute personne que vous souhaitez convaincre d'utiliser ces fonctionnalités.",
351351- "✨ Bones point": "✨ Point bonus",
352352- "If you want to use such a badge for other links too, I recommend that you craft .E4245F963D0ACC5A33AD": "Si vous souhaitez utiliser un tel badge pour d'autres liens également, je vous recommande de créer un petit composant Astro comme celui-ci :",
353353- "Just make sure that the CSS is globally (or [scope](https://docs.astro.build/en/.4FF4BAAF51A54FE15B11": "Assurez-vous simplement que le CSS est global (ou [scopé](https://docs.astro.build/en/guides/styling/#scoped-styles) dans le composant ci-dessus) et il est prêt à être utilisé :",
354354- "Earworms and the message hidden within the pattern": "Les chansons obsédantes et le message caché dans le motif",
355355- "Some random thoughts about earworms and their message hidden within the pattern..9902F83DCFE33FCF2F42": "Quelques réflexions aléatoires sur les chansons obsédantes et leur message caché dans le motif.",
356356- "Yes, this title is a small nod to the excellent Netflix series \"Arcane\", but tha.13B50605E73E31D148F1": "Oui, ce titre est un petit clin d'œil à l'excellente série Netflix \"Arcane\", mais ce n'est pas le sujet de cet article.",
357357- "Today, I want to share some thoughts about earworms, a term that originated in G.6A8601A7B3560A913F2E": "Aujourd'hui, je souhaite partager quelques réflexions sur les chansons obsédantes, un terme qui trouve son origine en allemand (« Ohrwurm ») et qui a ensuite été adopté en anglais en tant que traduction littérale. Le sens derrière ce terme plutôt abstrait est la musique accrocheuse—*musique collante*, comme l'appelle Wikipédia. Ce phénomène se produit souvent de manière imprévisible, surtout lorsque nos pensées s'éloignent du moment présent.",
358358- "While many of my blog-post ideas strike on train rides, while lying in bed, or w.25AB9868BD26D2664DE1": "Bien que beaucoup de mes idées de blog se manifestent lors de trajets en train, en étant allongé au lit ou simplement en réfléchissant à la vie, l'inspiration pour cet article m'a littéralement frappé sous la douche, comme le prévoient les bonnes vieilles *pensées sous la douche*. La raison – comme vous avez peut-être deviné en lisant le sujet – était une chanson obsédante concernant une mélodie dont j'aurais juré ne pas avoir entendu parler depuis longtemps, disons 4 à 5 semaines.",
359359- "And this always seems to be the confusing parts about earworms: Nobody really kn.02E8F977B7963E92DD1D": "Et cela semble toujours être la partie déroutante des chansons obsédantes : personne ne sait vraiment qui décide du moment où elles apparaissent. Est-ce le cerveau qui appuie sur « lecture » lorsqu'il est légèrement engourdi ? Vous savez ce que je veux dire, ces moments où vous ne savez pas vraiment à quoi vous pensez en ce moment et où vous n'avez pas besoin de réfléchir à ce à quoi penser, vous profitez simplement du moment. Il existe une autre expression idiomatique autrichienne pour ce scénario exact : \"ins Narrenkastl schauen\", ce qui signifie quelque chose comme *regarder dans le vide*. Et je pense que c'est précisément ces moments d'absence mentale qui sont à l'origine et la raison pour laquelle ces chansons obsédantes surviennent.",
360360- "But this still leaves the question: Who decides what to play in someone's head w.869DDF0A56F11A495705": "Mais cela laisse toujours la question : qui décide de ce qu'il faut jouer dans la tête de quelqu'un lorsque cela se produit ? Qui est le DJ ? Selon mon expérience, j'ai remarqué un schéma récurrent, surtout si vous venez d'écouter de la musique dans la dernière demi-heure. Mon cerveau, au moins, aime répéter des morceaux de la **pénultième chanson** entendue, en d'autres termes la chanson qui a été jouée avant la dernière. Cette théorie fonctionne encore mieux si la dernière chanson a été mise en pause au milieu ou simplement pas exactement à la fin.",
361361- "The exact reason for that is completely unknown to me, but if I had to guess, I .A798D76B65D60FBFC400": "La raison exacte de cela m'est complètement inconnue, mais si je devais deviner, je dirais que les rythmes de la chanson terminée (la pénultième) résonnent encore quelque part dans votre esprit, puisque la chanson elle-même était peut-être de ces chansons du type « je-diminue-mon-volume-pour-mettre-fin-à-ma-durée », ce qui n'est pas mon type préféré de fin musicale, mais encourage le cerveau à continuer.",
362362- "At least that's what I think. I would be very interested if you have experienced.2A5110405B0386450071": "Du moins, c'est ce que je crois. Je serais très intéressé de savoir si vous avez vécu des schémas similaires, alors n'hésitez pas à écrire votre propre article de blog à ce sujet ou à simplement partager celui-ci avec des amis afin que vous puissiez en discuter avec eux !",
363363- "However, one thing that's objectively missing in my opinion is a granular way of.DBB9BD2B7C991AECF1AF": "Cependant, une chose qui manque objectivement à mon avis est une manière granulaire de séparer les sujets larges dans votre documentation. Et je ne suis pas seul avec cette opinion subjectivement acceptée de manière générale. [HiDeoo](https://github.com/HiDeoo) n'est pas seulement l'un des mainteneurs les plus actifs du projet, mais aussi l'auteur des plus nombreux, et selon moi, des meilleurs plugins que vous pouvez trouver pour Starlight. Et ils ont également remarqué cette fonctionnalité de niche manquante concernant les sujets. C’est pourquoi ils ont décidé de créer le plugin [Starlight Sidebar Topics](https://github.com/hideoo/starlight-sidebar-topics) dès le début, en octobre 2024, qui vous permet de créer une barre latérale avec des sujets. Lisez-en davantage sur les fonctionnalités du plugin dans [sa documentation](https://starlight-sidebar-topics.trueberryless.org/).\n",
364364- "Afterwards, follow the setup guides from [Starlight Sidebar Topics](https://star.D6EC61B940DA777E2BEB": "Ensuite, suivez les guides d'installation de [Starlight Sidebar Topics](https://starlight-sidebar-topics.trueberryless.org/docs/getting-started/#installation) et de [Starlight Sidebar Topics Dropdown](https://starlight-sidebar-topics-dropdown.trueberryless.org/docs/getting-started/#installation).",
365365- "Moreover, you could also create your own display component, which uses the route.7237A9BCDFBA80A2B459": "De plus, vous pourriez également créer votre propre composant d'affichage, qui utilise les données de route du plugin Starlight Sidebar Topics et rend les sujets de manière personnalisée. Cela est un peu plus avancé, mais vous pouvez trouver plus d'informations à ce sujet dans la documentation [\"Custom Topics List\"](https://starlight-sidebar-topics.trueberryless.org/docs/guides/custom-topic-list/).",
366366- "Stop Outsourcing Your Soul to AI": "Arrêtez d'externaliser votre âme à l'IA",
367367- "Reflections on AI overuse, its cognitive and social downsides, and a proposed mo.A89AED1EE3DE3D0BCC9B": "Réflexions sur la surutilisation de l'IA, ses effets négatifs cognitifs et sociaux, et un modèle proposé pour utiliser l'IA sans éroder la créativité et la communication humaines.",
368368- "It has been more than two and a half years since the release of ChatGPT. The 30<.25CE9B6E0E88F7C05662": "Cela fait plus de deux ans et demi depuis la sortie de ChatGPT. Le 30<sup>ème</sup> novembre 2022 a marqué le début d'une nouvelle ère. Le début de l'IA. De nos jours, de nombreuses professions et personnes dans leur vie privée, en particulier dans le secteur des technologies de l'information, l'utilisent quotidiennement. Et nous ne savons même pas où nous en sommes sur le cycle des attentes de Gartner ou si l'IA s'améliorera en suivant la \"Loi des rendements accélérés\" de Kurzweil.",
369369- "The trend is still rising, but at the same time I have noticed a slight but stea.4471FBD85DD8F244947F": "La tendance est toujours en hausse, mais en même temps, j'ai remarqué une légère mais constante dégradation des connaissances humaines, car les gens délèguent de plus en plus le travail créatif à l'IA. Par conséquent, j'ai décidé d'écrire un petit article de blog pour partager mes réflexions, en essayant de décourager la surutilisation de l'intelligence artificielle qui pourrait ruiner nos capacités cognitives. Et bien que je sache que très peu de personnes liront ceci, cela ne m'empêche pas d'essayer. Sinon, j'aurais peut-être raté mon occasion d'aider l'avenir de l'humanité.",
370370- "**Disclaimer**: This whole blog post is created from my observations of developm.6E39A6FC36B46BF133B0": "**Avertissement** : Ce billet de blog est entièrement basé sur mes observations concernant les évolutions des changements sociaux, avec une attention particulière aux façons d'utiliser l'intelligence artificielle selon mon interprétation, et est donc très subjectif. Je n'ai pas consulté d'études qui pourraient soutenir ou contredire mon opinion.",
371371- "How people tend to use AI": "Comment les gens ont tendance à utiliser l'IA",
372372- "AI is awesome. I do not want to question this statement. It helped and still hel.1B73784A0B66F1C26560": "L'IA est incroyable. Je ne veux pas remettre en question cette affirmation. Elle m'a aidé et m'aide encore à améliorer mon flux de travail, à acquérir de nouvelles connaissances, à explorer de nouveaux horizons et à découvrir de nouvelles technologies. Pour les personnes qui ne s'intéressent pas au fonctionnement de l'IA, de tels outils intelligents ressemblent à de la magie. En conséquence, j'aime voir leurs yeux briller et leurs bouches s'ouvrir lorsque je leur explique que tout ce sur quoi l'IA est basée, c'est la probabilité. Quel mot est le plus susceptible d'être le suivant, en fonction des propriétés et des émotions dans un espace virtuel hautement dimensionnel. [Mais c'est un autre sujet.](https://www.youtube.com/watch?v=LPZh9BOjkQs)",
373373- "What I would like to focus on is how people have come to use AI, especially over.0645ED8C57D4B143BECD": "Ce sur quoi je souhaite me concentrer, c'est sur la façon dont les gens ont fini par utiliser l'IA, en particulier au cours des derniers mois - voire des dernières années. Comme notre cerveau est paresseux par défaut, nous avons tendance à externaliser davantage de travail à l'IA au fur et à mesure que nous nous concentrons moins sur une tâche spécifique. En d'autres termes, si vous ne mettez pas la plupart de votre engagement dans votre projet actuel, vous êtes probablement sur le point de simplement le transmettre à une IA. Une autre raison potentielle de sous-traiter le travail au monde de l'IA est l'ignorance des technologies sous-jacentes, ce qui rend difficile pour vous de trouver vos propres solutions.",
374374- "I am by no means a scientist, but I think that watching AI doing your work - bec.9C73DF2EC8CE97A8882E": "Je ne suis en aucun cas un scientifique, mais je pense que regarder une IA faire votre travail - parce que, en raison de votre incompétence, le résultat que vous produisez ne correspond pas à votre vision - vous donne tellement de dopamine que votre cerveau veut le faire plus souvent. De plus, l'être humain, en tant que figure sociale, cherche toujours à être connecté à quelqu'un, et interagir avec l'IA satisfait ces besoins. Ce comportement est typique de notre cerveau et se produit également lorsque nous regardons les réseaux sociaux ou consommons du contenu explicite. Il est profondément enraciné dans notre cortex cérébral, et toute l'industrie du jeu et les secteurs du divertissement en profitent sans scrupules pour optimiser leurs gains.",
375375- "I noticed this trend myself, as you can clearly see from [some of my posts where.6F67065684689D74728B": "J'ai moi-même remarqué cette tendance, comme vous pouvez le voir clairement dans [certains de mes articles où j'ai avoué avoir utilisé l'IA](/blog/authors/artificial-intelligence/) pour m'aider à les écrire. Mais je pense que ce n'est pas une honte. Tout créateur de contenu qui utilise l'IA devrait expérimenter de première main les écueils de la création de contenu directement pour le spectateur ou le lecteur, afin de réaliser à quel point il sait peu sur le sujet par la suite. Cela lui permettra d'apprendre de son erreur et d'être conscient de la facilité avec laquelle la paresse peut vous entraîner dans un chemin si méprisable. Seuls les excellents parmi nous se sont toujours efforcés de créer du contenu fait main.",
376376- "Negative side effects": "Effets négatifs",
377377- "I pointed out the main drawbacks of using AI too extensively that I observed. I .5A4212FD0B6A0413D8EA": "J'ai souligné les principaux inconvénients que j'ai observés dans une utilisation excessive de l'IA. Je vais maintenant vous donner deux raisons secondaires que j'ai remarquées chez moi, pour lesquelles vous ne devriez pas utiliser l'IA pour un travail expressif.",
378378- "Communication decline": "Déclin de la communication",
379379- "While watching a promotion video from \"The Browser Company™\" (see the last link .72C7B7D43BFCB10D0126": "En regardant une vidéo promotionnelle de \"The Browser Company™\" (voir le dernier lien dans la [section des ressources ci-dessous](#resources-with-better-evidence)), j'ai remarqué que les visions peuvent être très éloignées de nos jours. Je constate cette tendance non seulement dans le navigateur Dia, mais dans de nombreux aspects différents de la technologie et de nos vies. Un côté de la tendance veut intégrer l'IA partout où c'est possible, élargissant notre dépendance à celle-ci. Un exemple est l'utilisation de l'IA pour composer et écrire des messages à nos amis proches et collègues parce que cela nous rend plus efficaces. Je crois que cela nous rend juste stupides à long terme.",
380380- "If people do not train their brains for coming up with words for communication, .0E50F4E2AEC63CCFA8CD": "Si les gens ne forment pas leur cerveau à trouver des mots pour communiquer, à construire des phrases utiles et un sens pouvant être compris par d'autres êtres humains, notre fondation même de l'interaction les uns avec les autres est brisée et nous reviendrions au niveau de *Homo habilis* - la dernière espèce qui, probablement, n'a pas utilisé un langage verbal pleinement développé. Voyez, j'ai utilisé l'IA pour m'aider à rechercher ce petit bout d'information, mais j'ai choisi mes mots consciemment pour m'exprimer. De cette façon, non seulement j'ai appris quelque chose de nouveau, mais je peux maintenant également m'en souvenir. Une capacité que vous n'aurez jamais en externalisant l'écriture à l'IA.",
381381- "Loneliness": "Solitude",
382382- "Being alone on a mental level is in my opinion one of the most underrated modern.DF4685B2DE4270080DF1": "Être seul sur un plan mental est, à mon avis, l'un des dangers modernes les plus sous-estimés de la société. Le côté ironique de cela, c'est que si tout le monde est seul, nous avons tous cela en commun, ce qui fait que nous ne sommes pas seuls avec la solitude de chacun. Mais mes pensées dérivent à nouveau vers d'autres océans.",
383383- "AI strongly encourages us to be alone. It ~~acts~~ was intentionally trained to .CBE7FABA8A468DBE0C14": "L'IA nous encourage fortement à être seuls. Elle ~~agit~~ a été intentionnellement entraînée à agir comme un parfait ami, collègue ou quel que soit le terme que vous voulez employer. Récemment, j'ai remarqué que les réponses de ChatGPT incluent explicitement mon nom, ce qui est très étrange à plusieurs niveaux si vous voulez mon avis. On pourrait dire qu'il s'agit d'un doxxing artificiel privé, ce qui, bien sûr, est un oxymore en soi, car le doxxing, par définition, est public. Néanmoins, plus vous utilisez l'IA, plus *souvent* vous voulez utiliser l'IA. En particulier après l'introduction des modes vocaux de l'IA, cette tendance a continué à augmenter comme si le lendemain n'existait pas. Félicitations, ClosedAI, vous venez de réinventer l'addiction.",
384384- "In worst case scenarios, this can leads people to fear talking with other people.DE0F55D85004B91A5977": "Dans les pires scénarios, cela peut amener les gens à craindre de parler avec d'autres personnes. À abandonner des amitiés. À se retirer de la société. De telles habitudes sont des problèmes graves et devraient être examinées par un médecin ou un psychologue.",
385385- "Proposal of AI usage layer model": "Proposition de modèle de couche d'utilisation de l'IA",
386386- "Proposing a global solution for all people of such a problem is impossible. Sinc.10DA331D742128D1E376": "Proposer une solution globale pour tous face à un tel problème est impossible. Puisque chaque individu a ses propres expériences avec l'IA, ses propres pensées et sentiments, qu'il soit optimiste ou pessimiste, je ne peux pas parler pour tout le monde. En fait, je pense que je peux seulement parler pour moi-même, apprendre et partager mes propres façons de gérer et de limiter mon utilisation de l'IA, et espérer que ces expériences puissent également vous aider.",
387387- "My ideal experiences with AI - the optimal golden way between the overuse of AI .7279A13F58BE82D3A45D": "Mes expériences idéales avec l'IA - le juste milieu optimal entre la surutilisation de l'IA accompagnée de l'érosion cognitive et le fait de laisser la mode passer à côté de vous sans en tirer aucun avantage - consistent à utiliser l'IA [si et seulement si](https://en.wikipedia.org/wiki/If_and_only_if) vous, et seulement vous, en tirez des avantages. En d'autres termes, contrôlez votre utilisation et limitez-la de manière extrême, où seul vous-même devriez jamais entrer en contact avec le contenu produit par l'IA. Une telle limitation a de nombreuses conséquences, voici quelques exemples pour mieux illustrer et souligner ce que je veux dire :",
388388- "Use AI for personal learning sessions: If you initially want to dive into a new,.DE3EFB49A432DEF98DFD": "Utilisez l'IA pour des sessions d'apprentissage personnelles : Si vous souhaitez initialement plonger dans un nouveau sujet complètement inconnu, l'IA peut vous donner des aperçus généraux et vous montrer des connexions avec d'autres parties du savoir et des usages dans le monde réel. Bien que cela ne signifie pas nécessairement que vous apprendrez plus vite ou plus efficacement, cela aide à faire le premier pas et à se lancer.",
389389- "Use AI for stupid and repetitive workloads and ask for help if you are certain t.ABC71EA43B6FE421530F": "Utilisez l'IA pour des tâches stupides et répétitives et demandez de l'aide si vous êtes certain que le problème ou la tâche a déjà été résolu des milliers de fois par d'autres. Les modèles linguistiques actuels sont formés sur des données existantes, ce qui signifie qu'ils sont censés être performants pour résoudre des problèmes déjà résolus, non pas pour réinventer la roue, mais pour suggérer d'utiliser l'instrument rond existant.",
390390- "Do not use AI to express yourself to other people. Think about what meaning you .68CA5EC714F05E5EC131": "N'utilisez pas l'IA pour vous exprimer auprès des autres. Réfléchissez à ce que vous voulez transmettre, aux connaissances que vous souhaitez partager et exprimez vos pensées avec vos propres mots. Cela vous aide énormément à renforcer vos idées, à mieux vous souvenir de ce que vous avez appris et à vous sentir beaucoup mieux.",
391391- "Do not use AI to generate complex and creative work. Nowadays, there are hundred.572F9E5BBC126B708CF7": "N'utilisez pas l'IA pour générer des travaux complexes et créatifs. De nos jours, il existe des centaines - probablement des milliers - d'outils qui vous aident à créer de l'art, de la musique, du code, des designs, des plans, etc., grâce à l'IA ou entièrement avec elle. Bien que cela puisse donner l'impression que vous êtes plus productif, cela vous rend simplement plus ignorant à mesure que vous revenez souvent à ces méthodes, au lieu de faire ce que vous aimez par vous-même. Il est tout à fait acceptable de dire que des petites parties du travail peuvent être externalisées à l'IA, principalement des tâches répétitives qui prennent seulement plus de temps à faire manuellement. Les œuvres créatives et originales, cependant, devraient rester humaines et réalisées avec amour. Si vous n'aimez pas ce que vous faites du tout, cela peut être un signal qu'il serait peut-être temps d'arrêter entièrement cette activité.",
392392- "Do not fall for all the shiny AI stuff out there. Tools like [Lovable](https://l.730DE3F722D5456EC235": "Ne vous laissez pas séduire par tout le battage autour des outils d'IA. Des outils comme [Lovable](https://lovable.dev), [GitHub Copilot](https://github.com/features/copilot), [Cursor](https://cursor.com/en), [ChatGPT Voice](https://openai.com/index/chatgpt-can-now-see-hear-and-speak/) et le nouveau venu : [GPT-5](https://academy.openai.com/public/resources/intro-gpt-5), pour n'en citer que quelques-uns, ne cherchent pas vraiment à vous aider. Ils veulent soit vos données directement, soit contrôler votre flux de travail afin que vous ne puissiez plus y échapper une fois habitué à leur utilisation. Malheureusement, les gens s'habituent à l'IA de manière fascinante et rapide.",
393393- "In short, what I mean is that AI should be used for brainstorming and helping ea.7E4914372E95A248FB12": "En bref, ce que je veux dire, c'est que l'IA devrait être utilisée pour réfléchir et aider chaque individu à créer un produit final - à ne pas confondre avec l'IA créant le produit final -, mais pas pour communiquer avec d'autres personnes ni pour les résultats finaux eux-mêmes (par exemple, la création d'images, l'écriture de blogs, les publications sur les réseaux sociaux, la communication dans les chats, les discours de motivation, les essais, etc.). À mon avis, le cerveau humain ne peut évoluer et apprendre que par ses propres erreurs et expériences. Et vous ne pouvez jamais apprendre de vos erreurs lorsqu'elles ont en réalité été générées par l'IA.",
394394- "AI has a place in ideation, but expressive work should remain human.": "L'IA a sa place dans l'idéation, mais le travail expressif devrait rester humain.",
395395- "The Paradigm": "Le Paradigme",
396396- "I recently discovered a software design pattern called the \"Onion Architecture\"..1A7DACE78A504AB231FA": "J'ai récemment découvert un modèle de conception de logiciels appelé \"Onion Architecture\" (architecture en couches). Pour faire simple, le principe clé de cette architecture est sa division en couches, où chaque couche n'est connectée qu'à ses deux voisines (les couches parentes et enfants, mais pas les sœurs).",
397397- "To transfer this paradigm into the current context, you can imagine the AI as a .5C827B59D0E80CEDD730": "Pour transposer ce paradigme dans le contexte actuel, vous pouvez imaginer l'IA comme un outil mis à votre disposition, qui est déconnecté de toutes les autres parties en étant uniquement entouré par votre cerveau. Seul votre cerveau peut accéder, manipuler, créer et modifier les couches extérieures - dans cet exemple, écrire des blogs, créer du contenu, communiquer avec les gens via des chats ou des discours, ou vous exprimer avec de l'art ou des designs.",
398398- "Here you can see an image that represents my idea of a limited, but ideal usage .FC6C0DF5BEEB877D3C9A": "Voici une image qui représente mon idée d'un usage limité mais idéal de l'IA :",
399399- " est celle dans laquelle j'ai pris le plus de plaisir à être, car elle est à la fois la plus gratifiante et la plus conviviale. Toutes les communautés n'arrivent pas à atteindre un tel statut parmi les projets OSS.",
422422- "Recently, I discovered another evolving project founded by [pelikhan](https://gi.90E9DCA5FB8FA470B7FE": "Récemment, j'ai découvert un autre projet en évolution fondé par [pelikhan](https://github.com/pelikhan), qui vise à traduire automatiquement toute votre documentation, vos blogs ou vos sites marchands chaque fois qu'un changement survient grâce à l'aide de l'IA. Bien qu'un peu sceptique au début, la lecture approfondie du README.md de ce projet m'a captivé.",
423423- "The approach of strictly guiding AI into only translating little chunks - mostly.EFA08DBC1CAAB5CE6D3C": "L'approche consistant à guider strictement l'IA pour ne traduire que de petits morceaux - principalement des phrases ou des paragraphes avec des instructions perfectionnistes - m'a fait penser que cela pourrait vraiment fonctionner. J'ai donc essayé cela sur mon propre projet, mon blog. Et à ma grande surprise, ces traductions étaient bien meilleures que ce que j'avais imaginé. Bien sûr, on remarque que cela a été traduit par l'IA - le travail fait main ne sera, espérons-le, jamais entièrement remplacé - mais si vous mentionnez honnêtement que vous utilisez l'IA dans une note en marge, cela rend le contenu bien plus accessible aux gens que l'absence de traduction.",
424424- "So I took a closer look at the actual code of the project. After noticing some l.04C2097BA41406300A39": "J'ai donc examiné de plus près le code réel du projet. Après avoir remarqué quelques petites incohérences, des espaces pour des améliorations, et des fonctionnalités manquantes mais très intéressantes ici et là, j'ai commencé à y contribuer également. Après tout, avec un an de contributions dans de plus grands projets, les <span lang=\"en\">PRs</span> n'étaient pas une nouveauté pour moi.",
425425- "You have to know that this was a Friday evening - almost night in my timezone - .F07D43687D090B7997ED": "Il faut savoir que c'était un vendredi soir - presque nuit dans mon fuseau horaire - et que [Peli](https://github.com/pelikhan) était également en ligne, enchaînant les commits sur le projet. J'ai rapidement remarqué qu'à l'inverse des autres projets auxquels je participe, Peli ne perdait pas de temps à fusionner les <span lang=\"en\">PRs</span>. Ce fut très gratifiant ce soir-là car je n'ai cessé de contribuer jusqu'à une heure du matin, Peli fusionnant plus vite que je ne pouvais améliorer les fonctionnalités, les documents et les corrections. Un autre aspect qui a été génial est que, puisque c'était un jeune projet, Peli n'a pas hésité à simplement fusionner, tester localement, puis pousser de petites corrections que j'avais manquées.",
426426- "Fast-forward three days and I am now an official contributor to the project, mak.3479DA18B6C4E8D9A8EE": "Trois jours plus tard, me voici maintenant contributeur officiel du projet, le rendant chaque jour meilleur, principalement en me concentrant sur la documentation et le support pour mon projet de cœur : Starlight - comme vous l'avez peut-être déjà deviné à partir de [mes blogs](/blog/tags/starlight/).",
427427- "Peli and I have our virtual productivity sessions between 4pm and 8pm UTC, exten.51E309B378285EAEEA84": "Peli et moi organisons nos sessions de productivité virtuelles entre 16 h et 20 h UTC, avec des extensions pendant les week-ends. Donc, si vous souhaitez nous rejoindre en tant que pionnier du projet ou si cela a suscité votre intérêt pour l'utiliser, n'hésitez pas à le consulter sur [GitHub](https://github.com/github) : [https://github.com/pelikhan/action-continuous-translation](https://github.com/pelikhan/action-continuous-translation)",
428428- "Designing a No-Account, No-Database Approach to Time Tracking": "Concevoir une approche de suivi du temps sans compte et sans base de données",
429429- "A private time-tracking app storing all data in your browser — no accounts, no d.F138A1009E69F5985E79": "Une application de suivi du temps privée stockant toutes les données dans votre navigateur — pas de comptes, pas de base de données, juste un suivi simple.",
430430- "True Tracker is a minimalist time-tracking app built with Next.js that keeps all.83D3C3B8B44C4975D8DD": "True Tracker est une application minimaliste de suivi du temps construite avec Next.js qui garde toutes les données dans votre navigateur — pas de comptes, pas de base de données, juste une confidentialité et une simplicité totales.",
431431- "The summer of 2024 marked the start of an exciting new chapter for me as a devel.4693500D69418D01C04B": "L'été 2024 a marqué le début d'un nouveau chapitre passionnant pour moi en tant que développeur. Jusqu'à ce moment-là, j'avais principalement travaillé avec Angular, un framework que j'appréciais pour son approche structurée et opinée. Mais j'ai toujours été curieux de découvrir React : cela semblait plus léger, plus flexible, et juste… différent. Lorsque je suis tombé sur Next.js, un framework de [Vercel](https://github.com/vercel) basé sur React qui offrait des fonctionnalités comme le rendu côté serveur et un accent mis sur les performances, j'ai su qu'il était temps d'explorer quelque chose de nouveau.",
432432- "At the same time, I'd been frustrated for ages with session tracking tools like .03C6C9A3C18CFB3FDCD1": "En même temps, j'étais frustré depuis des années par les outils de suivi de sessions comme Toggl. Bien qu'ils soient théoriquement excellents, leurs meilleures fonctionnalités semblaient toujours enfermées derrière des paywalls premium. Comme tout développeur à un moment donné, je me suis dit, *« Pourquoi ne pas simplement créer le mien ? »* C'est pratiquement un rite de passage — chaque programmeur doit au moins une fois dans sa carrière créer une application de tâches ou un tracker. Et ainsi, True Tracker est né.",
433433- "True Tracker wouldn't just be any tracker, though. I wanted to do something diff.A78A97DDBF776E5A3623": "True Tracker n'était pas un tracker comme les autres, cependant. Je voulais faire quelque chose de différent. Pour commencer, je voulais le garder simple : les utilisateurs pouvaient ajouter des projets, les diviser en tâches, et suivre leur temps en sessions. Aucun surplus, aucune fonctionnalité inutile. Mais voici la particularité — True Tracker enregistrerait tout dans le stockage local. Pas de comptes, pas de synchronisation avec le cloud, et surtout, personne (même pas moi) n'aurait accès à vos données. C'est votre tracker, et vos données restent les vôtres.",
434434- "Of course, transitioning from Angular to Next.js wasn't without its challenges. .42B63477ABA3012B4AFB": "Bien sûr, passer d'Angular à Next.js n'a pas été sans défis. Si je devais donner un seul conseil à quiconque apprend un nouveau framework, ce serait celui-ci : *Lisez la documentation.* Sérieusement, ne la sautez pas. Je ne l'ai pas fait, et cela a conduit au chaos. Next.js était récemment passé au routeur d'application, mais je m'étais obstinément lancé dans la construction avec le routeur de pages. Il s'avère que cela a causé une montagne de problèmes lorsque l'application ne voulait pas se construire correctement parce qu'il n'y avait pas de répertoire `app`. J'ai dû garder un fichier `.gitkeep` vide dans le dossier pour que Git ne le supprime pas et ne casse rien à nouveau. Pas mon moment de gloire.",
435435- "After two weeks of nonstop coding, debugging, and running into what felt like ev.6C07E411C9E65C40E90F": "Après deux semaines de codage intensif, de débogage, et d'affrontement avec ce qui semblait être toutes les erreurs imaginables, True Tracker a enfin fonctionné. Je me souviens de cette première exécution réussie — j'avais l'impression de crier *« C'est vivant ! »* dans ma tête.",
436436- "The project also wasn't without its jokes. A friend, after seeing the app's bran.4E6FB3382F951646087C": "Le projet n'était pas non plus sans ses blagues. Un ami, après avoir vu le branding de l'application, a plaisanté : « Donc... le \"true\" dans True Tracker ? C'est un peu exagéré, même pour l'image. C'est *trop de vérité !* » Ils n'avaient pas tort, mais je l'ai assumé. Après tout, si vous allez marquer quelque chose, autant y aller à fond.",
437437- "True Tracker became my first-ever Next.js project—a simple but unique app for tr.252C96FD81AA9227820E": "True Tracker est devenu mon tout premier projet Next.js — une application simple mais unique pour suivre le temps sans aucune contrainte. Elle est maintenant en ligne à l'adresse [https://true-tracker.trueberryless.org](https://true-tracker.trueberryless.org/).",
438438- "The journey taught me more than just how to use Next.js. It taught me about push.4577627813AA93D48F0F": "Le voyage m'a appris plus que simplement comment utiliser Next.js. Il m'a appris à surmonter les défis, à passer d'un framework à un autre, et à embrasser les particularités qui rendent chaque projet unique. True Tracker n'est pas juste une application ; c'est une étape importante — une petite preuve que même les petites idées peuvent avoir un grand impact.",
439439- "Designing a Kafka-Based Pipeline and Interactive Graph for Energy Anomaly Detect.6E40C602D9518B54F990": "Conception d’un pipeline basé sur Kafka et d’un graphique interactif pour la détection des anomalies énergétiques",
440440- "A SOA solution with Siemens AG to analyze power grid anomalies, featuring a Kafk.7FC6E382F6C39EFB4296": "Une solution SOA avec Siemens AG pour analyser les anomalies du réseau électrique, comprenant un pipeline Kafka, PostgreSQL, une API GraphQL et un tableau de bord Angular pour la visualisation.",
441441- "For our diploma thesis with Siemens AG, we built a service-oriented solution to .E03A3AD551F1B141D274": "Dans le cadre de notre thèse avec Siemens AG, nous avons développé une solution orientée services pour détecter les anomalies du réseau électrique — comprenant un pipeline Kafka, PostgreSQL, une API GraphQL et un tableau de bord Angular avec des tableaux et un graphique interactif pour une visualisation en temps réel.",
442442- "During my fifth year at HTL Krems (2023/24), every student was required to compl.33C68E23474119532BF0": "Au cours de ma cinquième année à la HTL Krems (2023/24), chaque étudiant devait réaliser une thèse de diplôme — un projet d’envergure divisé en deux parties principales : théorique et pratique. Travaillant en binôme, nous devions produire un document théorique d’environ 100 pages dans lequel nous présentions, analysions et expliquions notre sujet choisi.",
443443- "The theoretical part was organized into three sections. The first involved gathe.383BAC1FDBC3A2145A6D": "La partie théorique était organisée en trois sections. La première consistait à recueillir et résumer les connaissances existantes issues de sources fiables comme des livres et des thèses précédentes. La deuxième se concentrait sur les idées et conclusions tirées de notre prototype — une solution logicielle que nous avons développée pour la partie pratique. Enfin, la troisième section combinait ces deux parties, offrant une comparaison critique et une réflexion sur ce que nous avions appris à travers l’ensemble du projet.",
444444- "The practical aspect required us to design and implement a solution, either soft.9F57571ADA22C3F461BC": "L’aspect pratique exigeait de concevoir et de mettre en œuvre une solution, soit logicielle, soit matérielle, pour résoudre un problème réel. Mon coéquipier, Clemens Schlipfinger, et moi avons décidé de nous concentrer exclusivement sur le logiciel pour garantir la fiabilité. Le matériel peut introduire des problèmes imprévisibles, tandis que le logiciel — surtout lorsqu’il est déployé dans des conteneurs Docker robustes — offre un environnement cohérent qui fonctionne sans problème partout.",
445445- "What made our project particularly exciting was our partnership with Siemens AG,.E3DFFF62A58AA54FFAF4": "Ce qui rendait notre projet particulièrement excitant, c’était notre partenariat avec Siemens AG, une entreprise multinationale renommée spécialisée dans l’énergie, l’automatisation et la digitalisation. Cette collaboration était rare parmi nos pairs et ajoutait une dimension professionnelle à notre travail. Siemens nous a confié la mission de développer une solution logicielle orientée services pour analyser les anomalies du réseau électrique européen.",
446446- "The system we built comprised several components, each designed to handle a spec.66064ADCDD1375BE0F9A": "Le système que nous avons construit comprenait plusieurs composants, chacun conçu pour remplir une fonction spécifique. Au cœur du système se trouvait une application Kafka responsable de l’ingestion des données — des rapports d’anomalies du réseau électrique que nous appelions Findings. Ces rapports détaillaient les défaillances et irrégularités dans le réseau électrique complexe européen, composé de millions de composants interconnectés comme des transistors, des interrupteurs et des générateurs. Kafka transmettait les anomalies les plus récentes à une base de données PostgreSQL, qui était ensuite rendue accessible via une API GraphQL. Cette API offrait des fonctionnalités complètes comme la pagination, le filtrage et le requêtage pour assurer une intégration fluide avec notre frontend basé sur Angular.",
447447- "The frontend was designed as a user-friendly dashboard with three key sections:": "Le frontend a été conçu comme un tableau de bord convivial avec trois sections clés :",
448448- "Anomalies Table – A searchable, paginated, and filterable table for quick naviga.530B334CB3F183450BCF": "Table des anomalies – Un tableau consultable, paginé et filtrable pour naviguer rapidement parmi les anomalies.",
449449- "Graph View – A dynamic visualisation of anomaly data, making it easier to pinpoi.FA55A622C6F84DDFA484": "Vue Graphique – Une visualisation dynamique des données d’anomalies, facilitant l’identification de la source d’un problème dans le réseau vaste et complexe.",
450450- "Overall Dashboard – Key metrics and insights for quick, actionable overviews.": "Tableau de bord global – Des indicateurs clés et des aperçus pour une vue d’ensemble rapide et exploitable.",
451451- "Clemens and I divided our responsibilities evenly. Clemens handled the backend s.57A227B299EB92B6AC25": "Clemens et moi avons réparti les responsabilités de manière équitable. Clemens s’est occupé des systèmes backend, y compris Kafka, PostgreSQL et l’API GraphQL, garantissant un pipeline de données fiable et efficace. De mon côté, j’ai pris le rôle de chef de projet, coordonnant la communication avec Siemens tout en développant le frontend et en assurant l’intégration fluide des différents composants. Cette collaboration nous a permis de tirer parti de nos points forts et de maintenir une charge de travail équilibrée.",
452452- "Our final product not only met Siemens' requirements but also demonstrated the p.3DFD3D918F5BEBCA8D06": "Notre produit final répondait non seulement aux exigences de Siemens, mais démontrait également la puissance d’une architecture orientée services (SOA) bien conçue dans la résolution de problèmes complexes et réels. C’était extrêmement gratifiant de voir notre logiciel fonctionner de manière fiable et fournir des informations exploitables pour remédier aux anomalies du réseau électrique.",
453453- "For more details about our work, feel free to explore our thesis [here](https://.404251D1094C50B2114B": "Pour plus de détails sur notre travail, n’hésitez pas à consulter notre thèse [ici](https://trueberryless.org/thesis.pdf) 📜 ou à lire notre cours vidéo [ici](https://videos.trueberryless.org/videos/thesis/) 🎥 (tous deux disponibles uniquement en allemand).",
454454- "": "Comment j'ai créé un README de profil GitHub qui ne devrait pas exister (mais qui le fait)",
456456- "Creating a standout <a class=\"gh-badge\" href=\"https://github.com/github\"><img sr.2311B04CBE33507503C4": "Créer un README de profil <a class=\"gh-badge\" href=\"https://github.com/github\"><img src=\"https://github.com/github.png\" alt=\"github\" />GitHub</a> remarquable ne consiste pas seulement à ajouter quelques badges — il s'agit de repousser les limites techniques. Dans cette plongée approfondie, j'explore la manipulation de SVG au niveau bas, la conversion de HTML en SVG, les animations intégrées, et l'automatisation complète avec les GitHub Actions pour construire ce que je crois être l'un des README GitHub les plus techniquement avancés. D'une grille Bento dynamique qui se met à jour toutes les 5 minutes à l'intégration de SVG en direct sans requêtes externes, ce projet a transformé mon profil en une vitrine vivante et auto-mise à jour de mon travail. Vous voulez savoir comment j'ai fait ? Décortiquons cela. 🚀",
457457- "Read the more formal story [here](/blog/github-profile-readme/)": "Lisez l'histoire plus formelle [ici](/blog/github-profile-readme/)",
458458- "GitHub's Markdown [strips out a not a huge number of HTML tags, but important on.205FA73346A246681FB2": "Le Markdown de GitHub [supprime un certain nombre d'étiquettes HTML, mais des étiquettes importantes](https://github.github.com/gfm/#disallowed-raw-html-extension). Des raisons de sécurité, bien sûr (et je respecte totalement cela, GitHub, vraiment ❤️), mais cela signifiait que mon design parfait était complètement **inutilisable**.",
459459- "I tried tweaking it. Replacing unsupported tags with ones that worked. Maybe I c.9C1A1617434D20136447": "J'ai essayé de l'ajuster. De remplacer les étiquettes non prises en charge par celles qui fonctionnaient. Peut-être que je pouvais en sauver une partie ? *Non*. Les limitations du Markdown signifiaient que ma mise en page idéale était impossible.",
460460- "When in doubt, automate. If I couldn't get my HTML in directly, maybe I could ge.1858A8B032C310D0855B": "En cas de doute, automatisez. Si je ne pouvais pas insérer directement mon HTML, peut-être que je pouvais générer quelque chose de dynamique avec un script ? Alors j'ai bricolé un script Python pour récupérer mon dernier dépôt GitHub et l'insérer dans mon README. Je laisse juste ces octets aléatoires que certains appelleraient du code Python ici :",
461461- "This seemed like a step in the right direction. It was automated. It was functio.C4E6DC32E9331691DF3A": "Cela semblait être un pas dans la bonne direction. C'était automatisé. C'était fonctionnel. Mais cela ne résolvait pas mon problème principal. 😢",
462462- "This wasn't about dynamic content — it was about *design*. And no amount of Pyth.DA93C57EF8343BE1D312": "Il ne s'agissait pas de contenu dynamique — il s'agissait de *design*. Et aucun script Python ne rendrait le Markdown beau.",
463463- "",
465465- "Encode all images in **Base64** (because GitHub Markdown won't load external ima.E9111278458075460675": "Encoder toutes les images en **Base64** (parce que le Markdown de GitHub ne chargera pas les images externes à l'intérieur d'un SVG contenant du HTML).",
466466- "It updates itself every 5 minutes, runs completely on GitHub Actions, and doesn'.83A1BE6CD135F68513B3": "Il se met à jour toutes les 5 minutes, fonctionne entièrement avec GitHub Actions, et ne dépend d'aucun service externe. C'est magnifique. C'est efficace. Et surtout, c'est techniquement absurde dans le meilleur des cas.",
467467- "Isn't that bad compared to the [old README.md](https://github.com/trueberryless/.6E17F52CECF11CDBE670": "Ce n'est pas si mal comparé à l'[ancien README.md](https://github.com/trueberryless/trueberryless/blob/5dce4ad0033b00829f8ec3756827057017447a65/README.md). Et ne commentez pas pourquoi j'écoute de la K-pop ! C'est mieux que vous ne le pensez, faites-moi confiance.",
468468- "But in the end, I created a [GitHub](https://github.com/github) profile README t.B8AC0FFCEFB516E68262": "Mais au final, j'ai créé un README de profil [GitHub](https://github.com/github) qui *ne devrait pas exister* — mais il existe. Et je l'adore.",
469469- " dans la [documentation Astro](https://docs.astro.build). Positionné au bas de la table des matières, il était simple mais élégant, et j'aimais la manière subtile de reconnaître l'auteur du projet. Lorsque Starlight a introduit sa propre option de crédit, je l'ai activée dans tous mes projets. C'était discret, petit et placé au bas de chaque page—sympathique, mais facile à manquer.",
479479- "That’s when I thought, *What if others want a cooler credit option, like the one.A4A2F8A54AB64409161B": "C'est alors que je me suis dit, *Et si d'autres voulaient une option de crédit plus cool, comme celle de la documentation Astro ?* Alors, je me suis mis à créer un plugin. Au départ, c'était juste un projet amusant pour faire des liens vers Starlight et Astro d'une manière plus visible. J'ai commencé avec deux préréglages—un pour Starlight et un pour Astro—et j'ai partagé mon travail sur le Discord d'Astro.",
480480- "That’s where things took off. [One awesome Astro maintainer](https://www.rainsbe.B87402A9E163AA44FD52": "C'est là que tout a changé. [Un mainteneur extraordinaire d'Astro](https://www.rainsberger.ca/) a suggéré, *\"Pourquoi ne pas ajouter un lien vers le Starlight Blog également ?\"* et j'ai pensé, *Quelle idée géniale !* J'ai ajouté le blog comme troisième préréglage, et soudainement, le plugin est devenu bien plus que ce que j'avais prévu.",
481481- "But I wasn’t done yet. It bugged me that the credits were always in English, so .2030C81E5E275567F632": "Mais je n'avais pas encore fini. Ça m'agaçait que les crédits soient toujours en anglais, alors j'ai décidé de les faire traduire automatiquement en fonction des langues prises en charge par Starlight. C'est là que la vraie aventure a commencé. J'ai sollicité la communauté pour m'aider à traduire le plugin dans différentes langues. La réponse a été incroyable ! Des personnes du monde entier ont proposé leur aide, et ce qui avait commencé comme un projet solo s'est transformé en une collaboration mondiale. En chemin, j'ai fait de nouvelles rencontres et appris énormément grâce à tous ceux qui ont participé. Maintenant, le plugin prend en charge une dizaine de langues, et de nouvelles traductions continuent d'arriver.",
482482- "What started as a simple idea turned into something I’m really proud of: **Starl.95365D5202F9DED635D6": "Ce qui a commencé comme une idée simple est devenu quelque chose dont je suis vraiment fier : **Starlight Cooler Credit**. Ce n'est pas juste un plugin—c'est une façon de rendre hommage avec style, personnalisation et une touche de travail d'équipe mondial.",
483483- "If you’re curious, you can check it out at [starlight-cooler-credit.trueberryles.6ABA7C0A45AE4104F8C3": "Si vous êtes curieux, vous pouvez le découvrir sur [starlight-cooler-credit.trueberryless.org](https://starlight-cooler-credit.trueberryless.org/). Essayez-le—je pense que vous l'aimerez autant que moi !",
484484- ". Ce chaos était écrasant, rendant difficile de se concentrer sur un apprentissage efficace.",
489489- "Driven by the vision of streamlining this process—not just for me, but also for .767678E51699FE7BA56A": "Animé par la vision de simplifier ce processus—non seulement pour moi, mais aussi pour mes camarades de classe—j'ai décidé de créer une plateforme centralisée pour résumer le contenu scolaire. Mon objectif était double : simplifier l'étude et inspirer la motivation parmi mes pairs.",
490490- "At that time, I wasn’t aware of frameworks that could make building documentatio.46FC3F67CBB578E4C0C2": "À cette époque, je ne connaissais pas de cadres qui pourraient faciliter la création de sites web de style documentation. Au lieu de cela, je me suis appuyé sur du simple HTML, CSS et JavaScript pour concevoir les premières versions de ce que j'appelais *Schneider IT*. Bien que j'adorais travailler dessus, mes premières tentatives étaient maladroites : générer dynamiquement la table des matières et la barre latérale avec mon propre code JavaScript entraînait des temps de chargement douloureusement lents. Il fallait 10 secondes ou plus pour que tout s'affiche !",
491491- "Despite the setbacks, I kept iterating. By 2023, I had created and discarded abo.4C51D8C17C02D0DB4703": "Malgré les revers, j'ai continué à itérer. En 2023, j'avais créé et abandonné environ 10 versions du site, cherchant toujours un design plus épuré et un système de gestion plus efficace. Le potentiel du site était clair pour moi, mais sa convivialité n'était pas encore au rendez-vous.",
492492- "That’s when I stumbled upon [Starlight](https://starlight.astro.build/), a power.2C6631782B77735B3205": "C'est à ce moment-là que je suis tombé sur [Starlight](https://starlight.astro.build/), un cadre puissant et incroyable créé par [Chris Swithinbank (@delucis)](https://github.com/delucis) pour créer des sites web rapides propulsés par Markdown. Découvrir Starlight a été un tournant—cela m'a permis de combiner deux choses qui me passionnent : créer des sites web et utiliser Markdown pour sa simplicité et son élégance.",
493493- "With the transition to Starlight, Schneider IT evolved into *Mutanuq*. The new n.99A51B0573CAAE76AA7D": "Avec la transition vers Starlight, Schneider IT est devenu *Mutanuq*. Le nouveau nom marquait un nouveau départ et reflétait le site web épuré et modernisé qu'il était devenu. J'ai tout réécrit, optimisé les performances du site et concentré mes efforts sur la création de contenu spécifiquement adapté aux besoins de mes camarades de classe, en particulier pour les tests à venir.",
494494- "The transformation paid off. Friends began using the website regularly and gave .0C49D62224878320182A": "La transformation a porté ses fruits. Mes amis ont commencé à utiliser le site régulièrement et à donner des retours enthousiastes comme : *\"Frérot, ce site est vraiment génial !\"* Mutanuq n'était pas seulement un outil pour les examens—il est devenu une ressource de confiance pour mes pairs et une archive personnelle pour toutes les connaissances que je voulais préserver au-delà de l'école.",
495495- "Thanks to Starlight, managing and expanding Mutanuq became effortless, and the p.DA9EDB995FD28655BD1F": "Grâce à Starlight, gérer et développer Mutanuq est devenu un jeu d'enfant, et le projet a évolué en quelque chose que je suis fier de maintenir même aujourd'hui. Ce qui avait commencé comme *Schneider IT*—une petite idée pour organiser mes notes—s'est épanoui en *Mutanuq*, une plateforme qui simplifie l'apprentissage pour les autres tout en préservant des connaissances précieuses pour mon moi futur.",
496496- "Designing a Profile That Works Within GitHub's Rules": "Concevoir un profil qui fonctionne dans les règles de GitHub",
497497- "How I Built a GitHub Profile README That Shouldn't Exist But It Does": "Comment j’ai conçu un README de profil GitHub qui ne devrait pas exister, mais qui existe",
498498- "Every great project starts with a realization of a problem. My GitHub profile RE.481577399AECDF28BE26": "Tout grand projet commence par la prise de conscience d’un problème. Mon README de profil GitHub était en désordre, rempli d’une quantité excessive d’informations, trop de badges, et un contenu accablant qui manquait de style et de structure. Il contenait des réalisations de hackathon, des graphiques de contributions GitHub, divers badges techniques, et bien plus, ce qui le rendait visuellement peu attrayant et difficile à naviguer. Au début, je pensais que c'était une manière efficace de me présenter, mais avec le temps, il est devenu clair que l'information était plus accablante qu'informative. Je voulais quelque chose de nouveau, une approche plus raffinée et visuellement attrayante pour présenter mon profil, et l’idée d’implémenter une grille « bento » m’est venue à l’esprit. L’objectif était de créer une mise en page qui soit non seulement fonctionnelle, mais également esthétiquement impressionnante et structurée.",
499499- "The first step was designing an ideal layout using HTML and CSS. The result was .6D5E560BE64C73324B74": "La première étape consistait à concevoir une mise en page idéale en utilisant HTML et CSS. Le résultat était prometteur, une conception structurée et visuellement agréable qui transmettait efficacement les informations prévues. Cependant, l’implémentation directe de ceci dans mon README de profil GitHub n’était pas simple. Le Markdown propre à GitHub impose des limitations strictes sur les éléments HTML pris en charge en raison des contraintes de sécurité. De nombreuses balises HTML essentielles étaient limitées, rendant impossible l'intégration de la conception telle qu'elle avait été envisagée. Comprendre ces limitations signifiait repenser complètement l’approche.",
500500- "Faced with these restrictions, I considered alternative ways to dynamically gene.2567BD537B285ECB001A": "Confronté à ces restrictions, j’ai envisagé des moyens alternatifs pour générer et présenter dynamiquement le contenu. Une approche consistait à automatiser les mises à jour du contenu à l’aide d’un script Python pour récupérer mon dernier dépôt GitHub et l’insérer dynamiquement dans le README. Le script accédait à l’API GitHub, récupérait le dépôt mis à jour le plus récemment, et modifiait le README en conséquence. Bien que cela ait été une expérimentation intéressante d’automatisation, cela ne résolvait pas le problème central, qui était la nécessité d’un design structuré et visuellement attrayant.",
501501- "Considering alternative approaches, I briefly entertained the idea of taking a s.780BAADFF3D433749DDA": "Envisageant des approches alternatives, j’ai brièvement envisagé l’idée de prendre une capture d’écran de la mise en page HTML conçue et de l’intégrer comme une image statique dans le README. Bien que cela aurait visuellement résolu le problème, cela semblait être une solution peu élégante qui manquait de flexibilité et de réactivité. Avançant, j’ai cherché une méthode qui permettait à la fois la structure et l’adaptabilité tout en maintenant les mises à jour dynamiques du contenu.",
502502- "SVGs emerged as a potential solution. They support scalability, maintain visual .0193206311AC8FC941A3": "Les SVGs se sont révélés être une solution potentielle. Ils assurent l’évolutivité, maintiennent une clarté visuelle sur différentes résolutions, et permettent l’intégration de texte et d’autres éléments. Une première expérimentation impliquait l’intégration de HTML dans un SVG en utilisant la balise `foreignObject`. Bien que conceptuellement prometteuse, la mise en œuvre s'est avérée complexe et a été mise de côté temporairement. En revenant au problème plus tard, une approche plus structurée était nécessaire.",
503503- "The final approach involved using a composite SVG structure. The solution consis.F542E5E0B858565590BE": "L’approche finale consistait à utiliser une structure SVG composite. La solution se composait de plusieurs éléments clés : convertir la mise en page HTML originale en une représentation SVG, encoder les images en Base64 pour garantir leur chargement correct, intégrer des éléments dynamiques tels que des statistiques GitHub et des mises à jour du statut Spotify sous forme de SVG inline, et automatiser les mises à jour via GitHub Actions. En utilisant ces techniques, la mise en page en grille « bento » est devenue entièrement fonctionnelle, capable de se mettre à jour automatiquement tout en conservant une apparence propre et structurée, respectant les contraintes du Markdown propre à GitHub.",
504504- "A critical turning point was the discovery of a Stack Overflow post detailing a .BFAFB816D1969BB990B1": "Un point tournant critique a été la découverte d’un post sur Stack Overflow détaillant une méthode pour convertir HTML en SVG de manière efficace et efficiente. Cette méthode fournissait un moyen structuré de générer les éléments SVG nécessaires tout en préservant le design prévu. En combinant cela avec l’encodage Base64 pour les images et les GitHub Actions pour l’automatisation, cela a permis d’obtenir une solution complète répondant à toutes les exigences initiales.",
505505- "The final implementation consists of a refined and visually striking GitHub prof.C95E5BCA4CC5C610AAF2": "La mise en œuvre finale consiste en un README de profil GitHub raffiné et visuellement remarquable qui intègre des mises à jour dynamiques tout en conservant une structure élégante. Il présente les informations clairement sans surcharge inutile et est entièrement automatisé, se mettant à jour toutes les cinq minutes sans intervention manuelle. Le projet a nécessité des recherches importantes et des expérimentations avec les SVGs, les GitHub Actions, et les limitations du Markdown. Le processus a demandé de la persévérance et de la résolution de problèmes pour travailler dans les contraintes de la plateforme tout en obtenant un résultat techniquement impressionnant. Le résultat est un README de profil GitHub qui équilibre efficacement design, automatisation et fonctionnalité dans les limitations de la plateforme.",
506506- "If you're now inspired to create a stunning GitHub profile README yourself, read.BC2C5ED3BDEE87A869B8": "Si vous êtes maintenant inspiré pour créer vous-même un README de profil GitHub impressionnant, lisez mon [article de blog technique et amusant](/blog/technically-impressive-github-profile-readme/) ou consultez directement mon dépôt [github.com/trueberryless/trueberryless](https://github.com/trueberryless/trueberryless/tree/7519c6f50094bdfd6fb47f610e6638ac8efdd6ad). Et si vous trouvez mon travail utile, pensez à lui donner un ⭐ et à me suivre sur GitHub à [trueberryless](https://github.com/trueberryless)! 🚀",
507507- "![Cognitive Erosion Paradigm: Layered, green circles with \"AI\" in the centre, su.38D1FAC9088D0BD4738E": "Paradigme d'Érosion Cognitive : Couches concentriques vertes avec \"IA\" au centre, entourées par \"Cerveau\", qui est lui-même entouré de plusieurs segments circulaires étiquetés \"Design\", \"Blog\", \"Chats\", \"Art\", \"Contenu\" et \"Discours\" dans le sens des aiguilles d'une montre.",
508508- "From Balloons to Binary: A 20th Birthday Packed with Clues": "Des ballons à la binaire : un 20ème anniversaire rempli d'énigmes",
509509- "This is the story of creating a true art masterpiece.": "Ceci est l'histoire de la création d'un véritable chef-d'œuvre artistique.",
510510- "This year, I turned 20 - and instead of simply lighting candles and inflating ba.CEC0F0AD03DAEF815274": "Cette année, j'ai eu 20 ans - et au lieu de simplement allumer des bougies et gonfler des ballons, je voulais célébrer de manière plus créative et personnelle. L'idée ? Cacher le nombre 20 sous autant de formes surprenantes, astucieuses et dissimulées que possible dans un salon décoré - puis tout capturer dans une seule photo. Que ce soit à travers des énigmes mathématiques ou des clins d'œil visuels, la pièce s'est transformée en une devinette joyeuse pleine de détails ludiques.",
511511- "I Turned 20 - And Turned It Into a Puzzle": "J'ai eu 20 ans - Et j'en ai fait une énigme",
512512- "The final result wasn't just a festive setting, but a carefully designed puzzle .B767471D3FEF6C98BD69": "Le résultat final n'était pas simplement un décor festif, mais une énigme soigneusement élaborée, remplie de sens, d'humour et de clins d'œil subtils à des choses que j'aime. Certains indices sont faciles à repérer, d'autres sont profondément cachés ou nécessitent une interprétation créative - mais maintenant que le défi a été lancé, il est temps de révéler les secrets.",
513513- "Altogether, the number 20 (or variations of it) appears **73 times** throughout .913452A34E0ADB471EF0": "Dans l'ensemble, le nombre 20 (ou ses variations) apparaît **73 fois** sur l'image. Cela inclut 14 occurrences du nombre littéral “20” caché sous des formes astucieuses comme des codes-barres, des QR codes et des valeurs hexadécimales, ainsi que six moments où des objets apparaissent en quantités exactes de vingt. On compte aussi 32 apparitions de “20” imprimées sur des ballons d'anniversaire éparpillés dans la pièce - bien qu'environ la moitié ne soient pas visibles dans l'image - et cinq références supplémentaires reflétant de façon créative mon anniversaire via des nombres comme 2025 ou 2005.",
514514- "Roughly 40 of these clues are clearly visible and solvable from the photo alone..900B0E49D675342ADE28": "Environ 40 de ces indices sont clairement visibles et résolvables uniquement à partir de la photo. Les autres nécessitent une réflexion latérale ou de l'imagination pour les découvrir - surtout ceux qui se cachent juste au-delà du cadre en deux dimensions de l'image.",
515515- "How the “20” Was Hidden": "Comment le \"20\" a été caché",
516516- "Many of the 20s are woven directly into the decor. There's a bright 20 km/h road.DF20030D8A7B9E4CCCF0": "Beaucoup de \"20\" sont intégrés directement dans la décoration. Il y a un panneau de signalisation indiquant 20 km/h, de grands ballons en aluminium en forme des chiffres 2 et 0, et une immense bannière “Joyeux 20ème Anniversaire” accrochée à la fenêtre. Un “gâteau” d'anniversaire fait de 20 rouleaux de papier toilette trône fièrement près du centre, entouré d'éléments décoratifs comme des horloges, des fruits, des chocolats Ferrero Rocher, des bougies de fête et des pièces de jeux - tous groupés intentionnellement par quantités de 20.",
517517- "Then come the mathematical twists: two QR codes subtly lead to the number 20. Th.631C4BD85BA49B72C4E1": "Puis viennent les astuces mathématiques : deux QR codes mènent subtilement au nombre 20. Il y a une bande en code Morse, un code binaire (10100) et une couleur représentée en hexadécimal qui se convertit en 20 en base<sub>10</sub>. Un code-barres cache visuellement le nombre, tandis qu'une main de cartes à jouer (As, Valet, Dame, Roi) s'additionne intelligemment pour atteindre 20. Une paire de dominos, aussi, somme le nombre magique. Même une part de gâteau sur le canapé - précisément 20% du tout - poursuit le thème.",
518518- "Some of the trickiest clues are tucked into logic puzzles. For example, the appl.3E1D246EA1E47E0643AB": "Certains des indices les plus complexes sont cachés dans des énigmes logiques. Par exemple, les pommes et les poires sur l'étagère murale en bois ressemblent à des 1 et des 0, et si elles sont décodées correctement, elles épellent \"Fe\" - un clin d'œil subtil à mon prénom, Félix. Les dés sur la table sont orientés de manière à ce que vous puissiez déduire les faces cachées du dessus, qui, une fois additionnées, donnent 20.[^1] Et le casse-tête le plus difficile : un paquet de mikados dont la valeur totale visible des pointes est de 110 - ce qui, interprété en base<sub>4</sub>, équivaut exactement à 20 en décimal. Une véritable énigme dans l'énigme !",
519519- "Fun fact: The tops of the dice should add up to 20, but in the final picture, th.1AD6690ECD087653EA2B": "Fait amusant : Les faces supérieures des dés devraient totaliser 20, mais sur la photo finale, elles n'atteignent que 12. Cela s'explique par le fait que les cinq dés n'ont pas été fabriqués selon la même disposition — deux suivent une numérotation dans le sens horaire et trois dans le sens antihoraire, comme expliqué [ici sur Wikipédia](https://en.wikipedia.org/wiki/Dice#Arrangement). 😂",
520520- "A few clues also fall under the “pop culture knowledge” category. There's a ment.AB39B4A99B41F7978013": "Quelques indices relèvent également de la “culture pop”. On mentionne Rihanna, qui, comme moi, est née le 20 février. Un petit hommage à Hans Zimmer et Christopher Nolan fait référence à leur collaboration de 2005 sur Batman Begins - l'année de ma naissance.",
521521- "A Snapshot of My Musical Taste": "Un aperçu de mes goûts musicaux",
522522- "While not directly part of the 20-themed puzzle, there's a musical layer hidden .E75B2EA910ADE079A758": "Bien qu'il ne fasse pas directement partie de l'énigme autour du chiffre 20, il y a une couche musicale cachée dans l'image qui reflète quelque chose de profondément personnel : mon amour pour la musique. Dans le coin supérieur gauche, huit pochettes d'albums carrées sont disposées avec soin, chacune présentant un code Spotify pointant vers l'un de mes morceaux préférés de tous les temps. Légèrement décalée à droite, la neuvième pochette représente une playlist rassemblant toutes ces chansons - une petite bande-son de mon univers.",
523523- "Each song on that list has earned its place not just for how it sounds, but for .64FF10782E65A696CFEC": "Chaque chanson sur cette liste a gagné sa place non seulement par son son, mais aussi pour les histoires, souvenirs et émotions qu'elle porte. Et surtout, pour les artistes incroyables qui les ont créées.",
524524- "It starts with *Molossus* from Batman Begins, a powerful, rising track that intr.0B2CCAEA825C10332861": "Cela commence avec *Molossus* de Batman Begins, un morceau puissant et exaltant qui m'a fait découvrir l'étonnant mélange de films et de musique grâce au travail de Hans Zimmer et Christopher Nolan - l'un de mes duos réalisateur-compositeur préférés. Le film est sorti en 2005, l'année de ma naissance, et bien que The Dark Knight soit mon préféré, Molossus restera toujours un morceau emblématique.",
525525- "Next is *9-bit Expedition* from the Fastfall soundtrack, composed by Lifeformed..60068D27CC86091CE517": "Ensuite, c'est *9-bit Expedition* de la bande originale de Fastfall, composée par Lifeformed. Leur style calme et inspiré par le chiptune touche un point sensible auquel je reviens sans cesse. J'admire tellement leur travail que j’ai utilisé leurs morceaux dans des niveaux personnalisés de Celeste que j'ai créés - non seulement parce qu'ils conviennent, mais parce que leur musique représente quelque chose pour moi.",
526526- "And then there's *Resurrections* from Celeste - a game I've easily spent 200-300.94D4BAA5C193535ECDD8": "Et puis, il y a *Resurrections* de Celeste - un jeu auquel j'ai facilement consacré 200-300 heures. La vraie magie de son ambiance, c'est Lena Raine, dont la musique atteint vos émotions et en extrait quelque chose de brut et magnifique. Ses compositions ne sont pas juste des arrière-plans - elles sont l'expérience. Je la considère sincèrement comme l'une des compositrices les plus inspirantes que j'aie jamais écoutées, et son travail sur Celeste est un chef-d'œuvre que j'admirerai toujours.",
527527- "Also in the mix is *22:12 - Until the End of Time* by Danger, from the Haven sou.72EAD217688685BCB963": "Aussi dans le mélange : *22:12 - Until the End of Time* par Danger, de la bande-son de Haven. Je n'ai même pas joué au jeu - la musique à elle seule m'a captivé. C'est cinématographique, émotionnel et complètement immersif. Danger a absolument réussi, créant un monde sonore dans lequel je pourrais me perdre pendant des heures.",
528528- "*Annihilate* from Across the Spider-Verse is another standout. I love both movie.9437FFA646F4451D9745": "*Annihilate* tiré de Across the Spider-Verse est un autre favori. J'adore les deux films de la série, et ce morceau capture parfaitement l'énergie, le style et l'émotion de l'histoire de Miles. C'est une explosion sonore qui ne vieillit jamais.",
529529- "From a totally different genre comes *ROTTWEiLER* by TJ\\_beastboy, a German rapp.B95612C092ABF85A718D": "D'un genre complètement différent vient *ROTTWEiLER* de TJ_beastboy, un rappeur allemand qui, pour moi, est à un niveau complètement différent. Il mélange des vibrations chill et une intensité entraînante d'une manière qui semble fraîche et authentique. Sa musique a toujours quelque chose d'unique à exprimer, et je pense honnêtement qu'il est l'un des meilleurs artistes actuels.",
530530- "Another track I couldn't leave out is *747* from Tenet - another mind-bending No.89615FC31E49EF7EA4BB": "Une autre piste que je ne pouvais pas omettre est *747* de Tenet - un autre film de Nolan aux scénarios alambiqués, avec une bande sonore signée Ludwig Göransson. L'énergie, le rythme et la structure de cette pièce frappent fort. C'est facilement l'une de mes bandes-son de film préférées de tous les temps, et Göransson continue de prouver qu'il est un génie en matière de musique de cinéma.",
531531- "Last but far from least: *MORE* by K/DA - my most-played song ever. It's high-en.12164785491B9D2DAF37": "Enfin, mais loin d'être des moindres : *MORE* de K/DA - ma chanson la plus écoutée. Elle est énergique, polie, confiante et simplement ultra fun. La K-pop en général est bien trop sous-estimée, et ce morceau est la preuve que les frontières de genre n'ont pas d'importance quand une chanson fonctionne à tous les niveaux.",
532532- "These songs - and the brilliant minds behind them - aren't just background music.E5DA08D529E76E42DBB3": "Ces chansons - et les esprits brillants derrière elles - ne sont pas juste de la musique d'ambiance. Elles font partie de mon monde créatif, de mon paysage émotionnel, et de la bande-son de tout ce que j'aime faire.",
533533- "Stats for Nerds": "Statistiques pour les Nerds",
534534- "For those who enjoy data and structure, here's a little summary of all 20s in th.B3CE0613F24C05B8FFE5": "Pour ceux qui apprécient les données et la structure, voici un petit résumé de tous les \"20\" dans l'image :",
535535- "Category": "Catégorie",
536536- "Count": "Nombre",
537537- "Total hidden instances": "Instances cachées totales",
538538- "73x": "73x",
539539- "Clearly visible and solvable": "Clair et résoluble",
540540- "\\~40x": "\\~40x",
541541- "Written \"20\"": "\"20\" écrit",
542542- "14x": "14x",
543543- "Groups of 20 identical items": "Groupes de 20 objets identiques",
544544- "6x": "6x",
545545- "Birthday balloons printed with \"20\"": "Ballons d'anniversaire imprimés avec \"20\"",
546546- "32x": "32x",
547547- "Creative variations (e.g., 2025, 2005)": "Variations créatives (ex. : 2025, 2005)",
548548- "5x": "5x",
549549- "Puzzle Solutions": "Solutions des énigmes",
550550- "Code Type": "Type de Code",
551551- "Representation": "Représentation",
552552- "QR Codes": "Codes QR",
553553- "Bar Code": "Code-barres",
554554- "20\\. February": "20. février",
555555- "Binary Code": "Code binaire",
556556- "Today is February 20th, 2025": "Aujourd'hui, c'est le 20 février 2025",
557557- "Base": "Base",
558558- "Code": "64",
559559- "My birthday is February 20th, 2005": "Mon anniversaire est le 20 février 2005",
560560- "Hex Code (Color Codes)": "Code Hexadécimal (codes couleurs)",
561561- "twenty": "vingt",
562562- "Morse Code": "Code Morse",
563563- "20\\. FEBRUARY 2005": "20. FÉVRIER 2005",
564564- "Playing Cards": "Cartes à jouer",
565565- "King (4) + Queen (3) + Jack (2) + Ace (11) = 20": "Roi (4) + Reine (3) + Valet (2) + As (11) = 20",
566566- "Domino": "Domino",
567567- "(0|2) + (3|3) + (4|0) + (2|1) + (1|0) + (2|2) = 20": "(0|2) + (3|3) + (4|0) + (2|1) + (1|0) + (2|2) = 20",
568568- "Apples (0) and Pears (1)": "Pommes (0) et Poires (1)",
569569- "Binary Code: Fe": "Code binaire : Fe",
570570- "Mikado Sticks Value": "Valeur des bâtons Mikado",
571571- "110 (base": "110 (base",
572572- ") = 20 (base": "4) = 20 (base",
573573- "Dice top sides": "10)",
574574- "It was a joy to turn this celebration into a personal challenge and to see frien.C633AD0611AAAC49C2DA": "3 + 2 + 1 + 1 + 5 = 12",
575575- "How to fully autogenerate Starlight sidebars (without losing control)": "Comment générer automatiquement des barres latérales Starlight sans perdre le contrôle",
576576- "Learn two Starlight techniques to autogenerate large sidebars while keeping clea.20BC1955A37AA7859B18": "Découvrez deux techniques de Starlight pour générer automatiquement de grandes barres latérales tout en conservant des URL et des intitulés propres.",
577577- "Have you ever wanted to simplify sidebar generation in your Starlight project? H.2D5E37D5439F17736C27": "Avez-vous déjà voulu simplifier la génération de barres latérales dans votre projet Starlight ? Avez-vous essayé de générer automatiquement l'intégralité de la barre latérale pour découvrir qu'elle ne vous permet pas de personnaliser la structure selon vos besoins ?",
578578- "This post demonstrates two Starlight features that make fully autogenerated side.BDF2E65CF1AF47E9F83B": "Cet article démontre deux fonctionnalités de Starlight qui rendent les barres latérales entièrement générées automatiquement flexibles et réduisent la maintenance.",
579579- "Use case": "Cas d'utilisation",
580580- "In medium to large Starlight projects, the problem arises that the manual creati.11763E0A14C36D449179": "Dans des projets Starlight de taille moyenne à grande, la création et la maintenance manuelles de la [configuration de la barre latérale Starlight](https://starlight.astro.build/reference/configuration/#sidebar) deviennent une tâche fastidieuse et chronophage.",
581581- "In the past, Starlight didn't provide the right primitives for this, and the rec.48BF051900AF52DB446D": "Par le passé, Starlight ne fournissait pas les primitives adéquates pour cela, et l'approche recommandée consistait à déplacer d'un niveau inférieur la génération automatique de la configuration de la barre latérale — afin que seuls les dossiers sans sous-dossiers imbriqués soient générés automatiquement. Cependant, avec l'introduction de [Route Data](https://starlight.astro.build/guides/route-data/) et du plus récent [`generateId()` hook de `docsLoader`](https://starlight.astro.build/reference/configuration/#generateid), ces scénarios peuvent désormais être résolus beaucoup plus facilement et efficacement.",
582582- "Solving the ordering issue": "Résolution du problème d’ordre",
583583- "A common problem always was: \"How can I customise the order of sidebar folders i.AE2CA0CC5AC2560DCF3C": "Un problème fréquent était toujours : \"Comment puis-je personnaliser l'ordre des dossiers de la barre latérale si je génère automatiquement la barre latérale ?\" D'anciennes problématiques comme [#1223](https://github.com/withastro/starlight/issues/1223) suggèrent une solution inspirée de [Nuxt Content](https://content.nuxt.com) où chaque segment de l'intégralité du chemin peut être [préfixé avec des nombres et des points](https://v2.content.nuxt.com/usage/content-directory#ordering) pour déterminer un ordre numérique au niveau du fichier. Un exemple pour un tel projet pourrait ressembler à ceci :",
584584- "src/content/docs/nested-folder": "src/content/docs/dossier-imbriqué",
585585- "1.frameworks": "1.frameworks",
586586- "1.vue.md": "1.vue.md",
587587- "2.nuxt.md": "2.nuxt.md",
588588- "2.examples": "2.examples",
589589- "1.vercel.md": "1.vercel.md",
590590- "2.netlify.md": "2.netlify.md",
591591- "If you want to use this approach in Starlight, it doesn't work out-of-the-box, b.1799E45D5D83874DE15D": "Si vous souhaitez utiliser cette approche dans Starlight, cela ne fonctionne pas immédiatement, mais avec une configuration simple, vous pouvez y parvenir.",
592592- "Starlight [0.35.0](https://github.com/withastro/starlight/releases/tag/%40astroj.5B25A8356D4B9CE00F94": "Starlight [0.35.0](https://github.com/withastro/starlight/releases/tag/%40astrojs%2Fstarlight%400.35.0) a introduit une fonction de rappel que vous pouvez passer à `docsLoader()` et qui peut manipuler l'identifiant (URL) de la page générée. En divisant l'entrée par `\"/\"` et en supprimant tout nombre + point au niveau des segments, vous disposez maintenant de la même fonctionnalité dans Starlight :",
593593- "The URL to access the pages now changes e.g., from `/nested-folder/1.frameworks/.6941CF02484C8DCB2B28": "L'URL pour accéder aux pages change maintenant par exemple, de `/nested-folder/1.frameworks/1.vue` à `/nested-folder/frameworks/vue`.",
594594- "However, the folder names in the sidebar still include the `1.` prefixes. So let.0CAEBB02FF8EEAA7C1F1": "Cependant, les noms des dossiers dans la barre latérale incluent encore les préfixes `1.`. Alors, résolvons également la manipulation de la barre latérale :",
595595- "Solving the sidebar folder naming issue": "Résolution du problème de nommage des dossiers dans la barre latérale",
596596- "Starlight [0.32.0](https://github.com/withastro/starlight/releases/tag/%40astroj.7F6BC940CC96F2ABA63D": "Starlight [0.32.0](https://github.com/withastro/starlight/releases/tag/%40astrojs%2Fstarlight%400.32.0) a introduit [Route Data](https://starlight.astro.build/guides/route-data/), que nous pouvons maintenant utiliser pour manipuler les noms des dossiers dans la barre latérale afin de",
597597- "remove any leading number + dot from the folder name and": "supprimer tout numéro et point en début de nom de dossier, et",
598598- "apply \"Title Case\" so they don't look completely lowercase": "appliquer la \"Title Case\" afin qu'ils ne soient pas entièrement en minuscules",
599599- "Internationalisation (i18n)": "Internationalisation (i18n)",
600600- "Note that [internationalisation (i18n) of folder names](https://starlight.astro..78D4931CBD055B889B4B": "Notez que [l'internationalisation (i18n) des noms de dossiers](https://starlight.astro.build/guides/sidebar/#internationalization) est une fonctionnalité manquante avec une telle configuration, car il n'y a actuellement aucun endroit pour définir des traductions de noms de dossiers ; ils sont simplement convertis en \"Title Case\". Implémenter une logique pour charger dynamiquement les traductions pourrait impliquer de lire le [champ `locale` à partir des données de route](https://starlight.astro.build/reference/route-data/#locale) et de définir les traductions dans des fichiers `json`. Sinon, [utilisez le plugin de HiDeoo](#using-hideoos-plugin), qui [prend en charge l'i18n](https://starlight-auto-sidebar.netlify.app/guides/i18n/).",
601601- "Don't forget to add the `routeData.ts` file to your `astro.config.mjs`:": "N'oubliez pas d'ajouter le fichier `routeData.ts` à votre fichier `astro.config.mjs` :",
602602- "Of course you can adjust the code to your needs (e.g., remove the \"Title Case\" t.8EE143244F5E89BEFCE4": "Bien sûr, vous pouvez ajuster le code à vos besoins (par exemple, supprimer la transformation \"Title Case\" si vos noms de fichiers sont déjà correctement écrits).",
603603- "Using HiDeoo's plugin": "Utilisation du plugin de HiDeoo",
604604- "If you want to autogenerate your whole sidebar and still have the flexibility to.AB216A94695F22CEA149": "Si vous souhaitez générer automatiquement toute votre barre latérale et conserver la flexibilité nécessaire pour personnaliser tout ce que vous voulez, [HiDeoo](https://github.com/HiDeoo) a également créé un plugin dédié pour de tels cas d'utilisation : [Starlight Auto Sidebar](https://starlight-auto-sidebar.netlify.app).",
605605- "Especially those two features got mentioned in this article:": "En particulier, ces deux fonctionnalités ont été mentionnées dans cet article :",
606606- "Controlling the [order](https://starlight-auto-sidebar.netlify.app/metadata/#ord.08329D63645DA7FDB0F2": "Controllant [l'ordre](https://starlight-auto-sidebar.netlify.app/metadata/#order) des répertoires individuels",
607607- "Adapting the [displayed label](https://starlight-auto-sidebar.netlify.app/metada.41A180D1D992072397D3": "Adaptant [l'intitulé affiché](https://starlight-auto-sidebar.netlify.app/metadata/#label) des dossiers individuels",
608608- "However, if you want to automate the whole generation without having to specify .AA2463868A43906766FA": "Cependant, si vous souhaitez automatiser entièrement la génération sans devoir spécifier manuellement les intitulés et l'ordre pour chaque répertoire, coder la solution vous-même (avec quelques lignes directrices de ce blog) est la solution préférée et recommandée.",
609609- "If you want to check out the code presented in this blog, feel free to visit the.9F7F074B6E1A29450183": "Si vous souhaitez consulter le code présenté dans cet article, n'hésitez pas à visiter le [StackBlitz](https://stackblitz.com/github/trueberryless/starlight-autogenerate-whole-sidebar?file=src%2Fcontent.config.ts) ou le code source dans le [dépôt GitHub](https://github.com/trueberryless/starlight-autogenerate-whole-sidebar).",
610610- "You might think that this story is now over because everyone could just use the .C9618FDEC9BA9ED17D35": "Vous pourriez penser que cette histoire est maintenant terminée, car tout le monde pourrait simplement utiliser la variante qu'il souhaite, et tout le monde est heureux. Mais Starlight a continué et continue de s'améliorer, et environ trois mois plus tard, le 15 février, presque comme un [cadeau d'anniversaire](/blog/20th-birthday/) pour moi, l'ajout tant attendu des données de route dans Starlight est arrivé avec la sortie de la version [v0.32](https://github.com/withastro/starlight/releases/tag/@astrojs/starlight@0.32.0). Cet ajout apparemment mineur a ouvert tant de possibilités, que je n'avais moi-même jamais envisagées. Une fois de plus, HiDeoo a été la principale source d'inspiration pour les auteurs de plugins et a poussé cette nouvelle fonctionnalité à ses limites. Il leur a fallu seulement deux jours pour [adapter plus de 11 plugins à la dernière version de Starlight à l'époque](https://bsky.app/profile/hideoo.dev/post/3liffpudc5c2b) et ils ont ensuite amélioré et refactorisé une grande partie du code pour tirer encore plus parti de cette puissante fonctionnalité.",
611611- "Deactivate TLS within Argo CD": "Désactiver TLS dans Argo CD"
612612-}