<?xml version="1.0" encoding="utf-8"?><rss version="2.0">
  <channel>
    <title>Blog Liip</title>
    <link>https://www.liip.ch/fr/blog</link>
    <lastBuildDate></lastBuildDate>
            <item>
      <title>Reimagining Frontend Frameworks</title>
      <link>https://www.liip.ch/fr/blog/reimagining-reactive-frontend-frameworks</link>
      <guid>https://www.liip.ch/fr/blog/reimagining-reactive-frontend-frameworks</guid>
      <pubDate>Thu, 16 Jul 2026 00:00:00 +0200</pubDate>
      <description><![CDATA[<p>Lately React, Vue and Svelte have converged on similar concepts for building reactive interfaces. Their syntax differs, but every reactive frontend still uses some form of state, computed values, mutations and effects.</p>
<p>Nevertheless, there is a lot of knowledge involved in getting something basic working in any of these frameworks. In this blog post I will explore what the most stripped down version of such a framework could look like, while still keeping the ergonomics of a reactive framework.</p>
<p>Let's get right into it.</p>
<h1>Imagining the framework</h1>
<p>To make this concrete, I built a small framework called <a href="https://www.npmjs.com/package/effectlayer">effectlayer</a>. I will explain its building blocks in this blog post.</p>
<h1>Building blocks</h1>
<p>The framework is built around a single JavaScript class, which the framework enhances with reactive behavior. That reactivity is powered by Signals, a common primitive used in frameworks such as Vue, Svelte, and SolidJS.</p>
<h2>State</h2>
<p>All class properties are treated as state. The framework turns them into Signals, so no state annotations are needed here:</p>
<pre><code class="language-javascript">class MoodSwing {
  energy = 5;
  coffee = 0;
}</code></pre>
<h2>Computed Values</h2>
<p>Computed values use standard JavaScript getters. The framework treats them as derived Signals that update automatically when their dependencies change:</p>
<pre><code class="language-javascript">  get mood() {
    if (this.energy &gt; 8) return "🤪";
    if (this.energy &gt; 4) return "😀";
    if (this.energy &gt; 0) return "😑";
    return "😴";
  }</code></pre>
<h2>Mutations</h2>
<p>Methods are a natural fit for mutations:</p>
<pre><code class="language-javascript">  drinkCoffee() {
    this.coffee++;
    this.energy = Math.min(10, this.energy + 3);
  }

  work() {
    this.energy = Math.max(0, this.energy - 2);
  }</code></pre>
<h2>Effects</h2>
<p>The last concept we need is effects. Effects are a fancy way of saying "a thing that executes when dependent Signals change".</p>
<p>I chose methods starting with <code>$</code> for annotating them:</p>
<pre><code class="language-javascript">  $monitor() {
    if (this.coffee &gt; 10) console.warn("You may want to slow down.");
  }</code></pre>
<p>The framework sees that <code>$monitor()</code> uses <code>coffee</code>. After <code>coffee</code> changes, it calls the method again.</p>
<h2>HTML</h2>
<p>Rendering HTML is also an effect that just returns JSX.</p>
<pre><code class="language-javascript">  $ui() {
    return (
      &lt;main&gt;
        &lt;h1&gt;{this.mood}&lt;/h1&gt;
        &lt;button onClick={() =&gt; this.drinkCoffee()}&gt;☕ Coffee&lt;/button&gt;
        &lt;button onClick={() =&gt; this.work()}&gt;💻 Work&lt;/button&gt;
      &lt;/main&gt;
    );
  }</code></pre>
<p>All that is left is to make the class reactive by wrapping it in an <code>effectlayer</code> call:</p>
<pre><code class="language-javascript">const moodSwing = effectlayer(MoodSwing);
moodSwing.$monitor();
document.body.appendChild(moodSwing.$ui());</code></pre>
<p>Calling an effect once activates it. This means <code>$monitor()</code> will now run whenever <code>coffee</code> changes.</p>
<p>The <code>$ui()</code> call returns an HTML element and keeps it up to date.</p>
<h1>All the concepts we need</h1>
<p>So basically the framework only needs four concepts:</p>
<ul>
<li>properties for state</li>
<li>getters for computed values</li>
<li>methods for mutations</li>
<li>methods starting with <code>$</code> for effects</li>
</ul>
<p>If you want to try out this experimental framework use:</p>
<pre><code class="language-sh">npm create effectlayer</code></pre>
<p>Or check it out on <a href="https://www.npmjs.com/package/effectlayer">npm</a>.</p>
<h1>Deep Dive?</h1>
<p>Let me know if you want to see a deep dive into how I built this framework: <a href="mailto:falk.zwimpfer@liip.ch">falk.zwimpfer@liip.ch</a></p>]]></description>
    </item>
        <item>
      <title>AI Won&#039;t Save Bad Content. A Content Strategy Might.</title>
      <link>https://www.liip.ch/fr/blog/ai-won-t-save-bad-content-a-content-strategy-might</link>
      <guid>https://www.liip.ch/fr/blog/ai-won-t-save-bad-content-a-content-strategy-might</guid>
      <pubDate>Tue, 14 Jul 2026 00:00:00 +0200</pubDate>
      <description><![CDATA[<p>If you want generative AI to produce quality results, you need a solid content strategy and clear guidelines.</p>
<p>Let's be honest: the gen-AI hype is a threat to my content business. We're seeing companies hold back investment in their content. Why?</p>
<p>The capabilities of generative AI make it clear that our field is about to change significantly. But this field is broad — it brings together very different skill sets and areas of work.</p>
<p>So the interesting question becomes: how exactly will content work in organizations change?</p>
<h1>A shift in roles</h1>
<p>A study by AG CommTech and GK Personalberatung looks at how roles and skills are shifting in the communications profession. Their <a href="https://agcommtech.de/wp-portfolio/studie-kuenftige-rollen-und-kompetenzen-in-der-kommunikationsprofession-im-wandel-der-digitalisierung/" rel="noreferrer" target="_blank">meta-study</a> shows that what's needed today is a combination of technological efficiency and human authenticity — a growing need for experts who can interpret data, use AI to extract relevant insights from it, and translate those insights into effective communication strategies.</p>
<p><strong>In other words, strategic skills matter more than ever.</strong></p>
<h1>More quantity, less quality?</h1>
<p>Why is that?<br />
Let's look at one visible area: generated text.</p>
<p>A <a href="https://ai-on-the-internet.github.io/" rel="noreferrer" target="_blank">Stanford study</a> from early 2026 shows that around 35% of all newly published websites are now AI-generated or at least AI-assisted.</p>
<p>The volume of generated content is growing fast. But what about quality?</p>
<p>That's not a simple question, since quality has several dimensions.</p>
<p>Let's ask Claude about it. The bot points to a <a href="https://contentmarketinginstitute.com/b2b-research/b2b-content-marketing-trends-research-2025#AI%20use%20trends" rel="noreferrer" target="_blank">survey by the Content Marketing Institute</a>, in which only 17% of B2B marketers rate the quality of AI-generated content as excellent or very good. 44% rate it as good, 35% as "fair," and 4% as poor. At the same time, 67% say they trust AI output only moderately, and 28% say they trust it little.</p>
<p>That's not exactly a robust finding, but it matches my own experience. So let's dig into the question: how does this middling track record come about?</p>
<h1>Input quality equals output quality</h1>
<p>AI can do a lot, but it can't work miracles. <strong>LLMs need a solid foundation to produce good results.</strong></p>
<p>If I want to generate content for my company's channels, a solid foundation means the following:</p>
<ul>
<li><strong>Complete data</strong> — AI can't generate reliable content if it can't find the relevant information in your existing content.</li>
<li><strong>Target group needs and questions</strong> as the central point of reference for the content.</li>
<li><strong>A content playbook</strong> that personalizes the output and aligns it with the organization's communication rules and goals.</li>
</ul>
<p>That's a fairly sobering realization if you were hoping gen-AI would simply take the work off your hands. Depending on where you're starting from, meeting these requirements actually creates new work first.</p>
<p><strong>But it also shows exactly where you can start to raise the quality of your generated content.</strong></p>
<p>These requirements put <strong>user-centricity</strong> and <strong>content strategy &amp; guidelines</strong> squarely at the center — which brings us right back to strategic skills.</p>
<p>In an upcoming post, I'll describe what belongs in a content strategy, in my view, and which elements deserve priority.</p>]]></description>
    </item>
        <item>
      <title>Why Do You Need a Content Strategy?</title>
      <link>https://www.liip.ch/fr/blog/why-do-you-need-a-content-strategy</link>
      <guid>https://www.liip.ch/fr/blog/why-do-you-need-a-content-strategy</guid>
      <pubDate>Tue, 14 Jul 2026 00:00:00 +0200</pubDate>
      <description><![CDATA[<p>Generative AI means a massive disruption for the content business. The entire production process is being shaken up. Profiles, workflows, tools – everything is being redefined.</p>
<p>As the cost of content production trends toward zero, two things gain massively in importance:</p>
<ul>
<li>Quality of content</li>
<li>Visibility and findability of content</li>
</ul>
<h1>Generative Engine Optimization (GEO) for the benefit of users</h1>
<p>Visibility and findability of content is increasingly becoming a question of AI visibility: whether your own content and your own brand show up in the answers and results of AI chatbots and agents.</p>
<p>Here's some reassurance: LLMs prioritize content based on criteria that are also relevant to users.</p>
<p>Beyond the technical dimension – content must be readable and usable for AI systems – content also needs to meet the following dimensions:</p>
<ul>
<li>Built around the user</li>
<li>Trustworthy</li>
<li>Clear thematic positioning</li>
</ul>
<p>This means the two aspects – quality and findability of content – are closely linked.</p>
<p>For a team to reach the point of producing content at this level of quality, we first need to clarify the fundamentals: without a clean alignment, no content team in the world is able to produce content of this quality in the medium term.</p>
<h1>The Triple Content Line</h1>
<p>We define our alignment as a content team across the following elements:</p>
<ul>
<li>Content strategy</li>
<li>Content guidelines</li>
<li>Content governance</li>
</ul>
<p>As a team, this is where we agree on the common denominator for our content work. Only this way can we produce quality content that meets both internal and external requirements.</p>
<p>The line between content strategy and content guidelines isn't always easy to draw.</p>
<h1>What belongs in a content strategy?</h1>
<p>There's no definitive answer to what belongs in a content strategy. And beyond that, I'd describe a content strategy more as an ongoing area of work than as a finished document.</p>
<p>For me, the following elements belong in a content strategy:</p>
<ul>
<li>Content goals: What do I actually want to achieve with my content?</li>
<li>Target audiences and their content needs</li>
<li>Content journeys of the target audiences</li>
<li>Channel strategy: Which channels do we work with, and how do they play together?</li>
<li>Key messages</li>
<li>Success measurement</li>
<li>Interfaces to content governance and content lifecycle management</li>
</ul>
<h1>What belongs in content guidelines?</h1>
<p>Unlike content strategy, content guidelines need to be embedded in day-to-day work. Alongside fixed reference points (e.g. the targeted language level), they often contain principles for us:</p>
<ul>
<li>Language level</li>
<li>Language rules (e.g. consistent formatting of dates, currencies, and similar, but also topics like gender-neutral language or how to address target audiences)</li>
<li>Tone of voice</li>
<li>Page types</li>
<li>Tools</li>
<li>...</li>
</ul>
<h1>What belongs in content governance?</h1>
<p>Content governance defines who on the content team is responsible for what – and how we work together to make sure strategy and guidelines are actually put into practice. Without governance, strategy and guidelines remain well-intentioned documents that get lost in day-to-day business.</p>
<p>For me, the following elements belong in content governance:</p>
<ul>
<li>Roles and responsibilities: Who creates, who reviews, who approves?</li>
<li>Approval processes: How does content move from idea to publication?</li>
<li>Maintenance and update processes: Who is responsible for updates, and when?</li>
<li>Quality assurance: How do we ensure guidelines are being followed?</li>
<li>Escalation paths: What happens in case of disagreement or edge cases?</li>
<li>Interfaces to other teams (e.g. design, product, marketing)</li>
</ul>
<h1>The goal? Interplay</h1>
<p>Content strategy, content guidelines, and content governance work together: strategy sets the direction, guidelines translate it into daily practice, and governance ensures that both actually happen rather than just existing on paper. Only through the interplay of these three elements does content emerge that is consistent, trustworthy, and findable – both for users and for AI systems – while also meeting the positioning goals of your own organization.</p>
<p>Content production is getting cheaper. But without these fundamentals, it stays arbitrary – no matter how powerful the tools become. Whoever invests in strategy, guidelines, and governance now is laying the foundation for content that will still be found, understood, and trusted tomorrow.</p>
<p><em>How Generative Engine Optimization (GEO) works in practice will follow in upcoming posts.</em></p>]]></description>
    </item>
        <item>
      <title>Apertus after 8 months - what we learned and look forward to using Switzerland&#039;s AI Model</title>
      <link>https://www.liip.ch/fr/blog/apertus-after-8-months-what-we-learned-and-look-forward-using-switzerlands-ai-model</link>
      <guid>https://www.liip.ch/fr/blog/apertus-after-8-months-what-we-learned-and-look-forward-using-switzerlands-ai-model</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:00 +0200</pubDate>
      <description><![CDATA[<p>Since September 2025, we have been running <a href="https://www.apertus-ai.org/">Apertus</a> — the Swiss open-source language model developed by <a href="https://www.epfl.ch/">EPFL</a>, <a href="https://ethz.ch/">ETH Zurich</a> and the <a href="https://www.cscs.ch/">Swiss National Supercomputing Centre (CSCS)</a> — on <a href="https://zuericitygpt.ch">ZüriCityGPT</a>, our reference implementation of a City AI assistant. Eight months later, I want to share what we have learned and what we are curious about for the upcoming Apertus 1.5 release.</p>
<!-- IMAGE: Screenshot of zuericitygpt.ch and oss.zuericitygpt.ch side by side -->
<h1>A brief history of LiipGPT and ZüriCityGPT</h1>
<p>2023, Chregu released the <a href="https://www.liip.ch/en/blog/ask-zuricitygpt-anything-about-the-government-of-the-city-of-zurich">first version of LiipGPT</a>. 2024, we were able to <a href="https://www.liip.ch/en/blog/zuricitygpt-oss-version-using-only-open-source-models">use only open-source models on ZüriCityGPT</a>. 2025, we switched the open-source version to the <a href="https://www.liip.ch/en/blog/apertus-4-ways-to-try-out-switzerland-s-new-ai-model">newly released Apertus model</a>. In this blog post, we talk about the insights gained since then.</p>
<h1>Setting up the experiment</h1>
<p><a href="https://liipgpt.ch">LiipGPT</a>, our <a href="https://www.liip.ch/en/work/projects/liipgpt">generative AI framework</a>, has a pluggable model layer. That means we can swap the underlying language model without changing anything else — same Retrieval-Augmented Generation (RAG) pipeline, same knowledge base of official content from stadt-zuerich.ch. This gave us a straightforward way to compare models in a real deployment.</p>
<p>The production system at <a href="https://zuericitygpt.ch">zuericitygpt.ch</a> runs GPT-4o-mini on Azure Europe. Alongside it, we run an open-source variant at <a href="https://oss.zuericitygpt.ch">oss.zuericitygpt.ch</a> where in the past we compared Llama and Mixtral models. We switched the open-source variant to <a href="https://www.swisscom.ch/en/about/news/2025/09/02-apertus.html">Apertus-70B</a> when it was released in September 2025, then moved to <a href="https://www.infomaniak.com/en/hosting/ai-services/open-source-models">Infomaniak-hosted</a> Apertus in April 2026. (To be clear: ZüriCityGPT itself and the LiipGPT platform are not open source — but the underlying language model on the OSS variant is.)</p>
<p>We run Apertus as the 70-billion-parameter model. It was trained from scratch on the Alps supercomputer using Swiss hydroelectricity, with 15 trillion tokens of training data spanning over 1,800 languages. It is fully open-source under an Apache 2.0 licence.</p>
<p>Over the last eight months, we collected over 39,000 conversations on the production side and 3,400 on the open-source side. Quality is measured using three metrics: how often an answer is acceptable (Match Rate), how often it is actually good (Match Rate +1), and how faithfully it reflects the source documents (Faithfulness). These are metrics our LiipGPT team has established as practical product metrics, not scientific benchmarks — the data is calculated real-time and asynchronously by the LiipGPT platform while users ask different questions over time, evolving website content, and model endpoint changes. Parts of the analysis were prepared with the help of Claude. Our aim is not to provide a scientific study but more a practical report. I share these results with the Apertus community because real-world deployment data of this open-source model is rare — and we think it's useful.</p>
<h1>What we observed</h1>
<p>Both models get the job done. On the basic question — does the user get an acceptable answer? — both models perform similarly. GPT-4o-mini scores 81%, Apertus 82% on historically matched questions. In a controlled test with 20 identical questions asked at the same moment, both hit 100%. Both models generally work as expected.</p>
<p>The gap shows up in answer quality. When we raise the bar to "is this answer actually good?", GPT-4o-mini scores 72% and Apertus 55%. That is a noticeable difference, and it matters for users who expect precise, well-structured responses.</p>
<p>Faithfulness is more nuanced than we expected. GPT-4o-mini averages 0.79, Apertus 0.50 on our faithfulness metric. But these numbers need context. We noticed something we started calling the "faithfulness paradox": when a model says "I cannot answer this," you might expect high faithfulness — no hallucination, after all. In practice, these evasive answers score low because the model is failing to use information that is available. A model that engages with its sources and cites them scores higher, even though it is making more verifiable claims. Both behaviours have tradeoffs, and both showed up across the two systems.</p>
<figure><a href="https://www.liip.ch/media/pages/blog/apertus-after-8-months-what-we-learned-and-look-forward-using-switzerlands-ai-model/ac2f708a50-1783608445/chart_comparison_2x3.png"><img alt="" src="https://liip.rokka.io/www_inarticle_5/b851b8/chart-comparison-2x3.jpg" srcset="https://liip.rokka.io/www_inarticle_5/o-dpr-2/b851b8/chart-comparison-2x3.jpg 2x"></a><figcaption>Three quality metrics compared across a controlled test (20 identical questions) and historically matched real-user questions</figcaption></figure>
<p>Sometimes Apertus gave the better answer. The most striking example was the waste dump question: "What are the rules for using the Zurich waste dump?" GPT-4o-mini responded cautiously, saying it could not provide specific rules. Apertus gave a detailed, structured answer with recycling centre details, phone numbers, and cited sources — scoring 6/6 on quality where GPT-4o-mini scored 3/6. When the knowledge base contains a clear, structured answer, Apertus can be surprisingly good at extracting and presenting it.</p>
<figure><a href="https://www.liip.ch/media/pages/blog/apertus-after-8-months-what-we-learned-and-look-forward-using-switzerlands-ai-model/9436173ed7-1783609912/apertus_gpt4omini_waste_dump.png"><img alt="" src="https://liip.rokka.io/www_inarticle_5/3b465f/apertus-gpt4omini-waste-dump.jpg" srcset="https://liip.rokka.io/www_inarticle_5/o-dpr-2/3b465f/apertus-gpt4omini-waste-dump.jpg 2x"></a><figcaption>GPT-4o-mini and Apertus respond to the same question</figcaption></figure>
<p>That said, this willingness to commit cuts both ways. In cases where the source material is ambiguous, Apertus can feel more helpful while being less strictly grounded — and for public-sector chatbots, traceability matters as much as helpfulness.</p>
<p>GPT-4o-mini is more concise and better at synthesis. Apertus tends to produce longer, more verbose answers. In a public-service chatbot, that is a real UX issue — users want a direct answer with clear next steps, not three paragraphs of context.</p>
<figure><a href="https://www.liip.ch/media/pages/blog/apertus-after-8-months-what-we-learned-and-look-forward-using-switzerlands-ai-model/b6516e51a6-1783610106/apertus_gpt4omini_verbose.png"><img alt="" src="https://liip.rokka.io/www_inarticle_5/677113/apertus-gpt4omini-verbose.jpg" srcset="https://liip.rokka.io/www_inarticle_5/o-dpr-2/677113/apertus-gpt4omini-verbose.jpg 2x"></a><figcaption>GPT-4o-mini responds concise, Apertus more verbose</figcaption></figure>
<p>GPT-4o-mini also handles factual freshness better: it returned Zurich's current population (452,421), while Apertus fell back to a 2013 figure. When information has changed or the answer requires connecting multiple sources, GPT-4o-mini felt more reliable.</p>
<figure><a href="https://www.liip.ch/media/pages/blog/apertus-after-8-months-what-we-learned-and-look-forward-using-switzerlands-ai-model/5ed0fada3b-1783610421/apertus_gpt4omini_population.png"><img alt="" src="https://liip.rokka.io/www_inarticle_5/997ce3/apertus-gpt4omini-population.jpg" srcset="https://liip.rokka.io/www_inarticle_5/o-dpr-2/997ce3/apertus-gpt4omini-population.jpg 2x"></a><figcaption>GPT-4o-mini answers with more recent population data compared to Apertus</figcaption></figure>
<p>Language switching is a weak spot. When we asked "Est-ce que tu parles français?", GPT-4o-mini responded fluently in French. Apertus declined, saying it could not answer questions about its own linguistic capabilities. In more recent tests we saw that Apertus followed the language instructions in better ways, so we are looking forward to see this further improve.</p>
<figure><a href="https://www.liip.ch/media/pages/blog/apertus-after-8-months-what-we-learned-and-look-forward-using-switzerlands-ai-model/0bbc6670a2-1783610288/apertus_gpt4omini_language.png"><img alt="" src="https://liip.rokka.io/www_inarticle_5/0387e4/apertus-gpt4omini-language.jpg" srcset="https://liip.rokka.io/www_inarticle_5/o-dpr-2/0387e4/apertus-gpt4omini-language.jpg 2x"></a><figcaption>GPT-4o-mini follows the language instruction, Apertus did not</figcaption></figure>
<p>The Apertus-70B IFEval score of 44% (vs 58% for comparable models) confirms that instruction following is an area where the model has room to grow.</p>
<figure><a href="https://www.liip.ch/media/pages/blog/apertus-after-8-months-what-we-learned-and-look-forward-using-switzerlands-ai-model/38a7a3a17b-1783609312/chart_monthly_cleaned.png"><img alt="" src="https://liip.rokka.io/www_inarticle_5/c6a834/chart-monthly-cleaned.jpg" srcset="https://liip.rokka.io/www_inarticle_5/o-dpr-2/c6a834/chart-monthly-cleaned.jpg 2x"></a><figcaption>Monthly quality trend from October 2025 to June 2026</figcaption></figure>
<p>The trend is positive. In October 2025, Apertus achieved a Match Rate +1 of 59%. By June 2026, it had climbed to 63% — the best month on record. That is not a dramatic leap, but the direction is consistent and it came without a major model update. Meanwhile, GPT-4o-mini has been stable at 63–83% throughout. The gap is narrowing.</p>
<h1>What we are looking forward to</h1>
<p>The Apertus team is preparing version 1.5, with improvements expected in multimodal support, agentic capabilities, tool calling, enhanced reasoning, and better training for regional Swiss languages. We plan to update ZüriCityGPT's open-source instance as soon as it becomes available and continue our quality monitoring.</p>
<p>What encourages us most is that the collaboration is flowing in both directions. After our <a href="https://www.ailights.ch/">aiLights talk</a>, the Apertus team shared our findings with their staff. This close feedback loop between research and practice is exactly what makes the Swiss AI ecosystem worth investing in.</p>
<figure><img alt="" src="https://liip.rokka.io/www_inarticle_5/3719ab/04.jpg" srcset="https://liip.rokka.io/www_inarticle_5/o-dpr-2/3719ab/04.jpg 2x"><figcaption>Christian Stocker presenting ZüriCityGPT. Photo: Oleg Lavrovsky (CC BY 4.0), source: <a href="https://log.alets.ch/115/">https://log.alets.ch/115/</a></figcaption></figure>
<p>My practical advice, for anyone considering sovereign AI: start with the use case, then choose the model. If your priority is maximum answer quality today, more popular models are usually the stronger choice. If your priority is data sovereignty, transparency, and independence — and your knowledge base is well-curated — Apertus already delivers. The question is not "sovereign AI or quality" but "how much quality gap are you willing to accept for full sovereignty?" And that gap is closing.</p>
<p>Check the <a href="https://docs.google.com/presentation/d/1Q792ccRiiiRk6zIlmCu7GkkjjZ6kiZJfbRk_CSBhxJ8/edit?usp=sharing">Slides</a> and <a href="https://www.youtube.com/watch?v=Fk0g--aWi1M">Recording</a> for further details.</p>
<h1>Acknowledgements</h1>
<p>I would like to thank the ETH Zurich, EPFL, and the wider <a href="https://www.swisscom.ch/en/about/news/2025/09/02-apertus.html">Swiss AI Initiative</a> community for making Apertus available as a public good. As Martin Jaggi from EPFL put it: "We aim to provide a blueprint for how a trustworthy, sovereign, and inclusive AI model can be developed." (<a href="https://ethz.ch/en/news-and-events/eth-news/news/2025/09/press-release-apertus-a-fully-open-transparent-multilingual-language-model.html">source</a>) Eight months in, we can see that blueprint taking shape and are looking forward to test the 1.5 model in practice as well.</p>
<ul>
<li>
<p>Thank you <a href="https://www.liip.ch/de/team/chregu">Christian Stocker</a> and the <a href="https://liipgpt.ch">LiipGPT</a> team for your dedication to build a practical, experiment-driven and scalable solution for AI chat and search.</p>
</li>
<li>
<p>Thank you <a href="https://www.linkedin.com/in/sabine-wildemann/">Sabine Wildemann</a> and the <a href="https://www.ailights.ch/">aiLights</a> team for hosting our talk.</p>
</li>
<li>
<p>Thank you <a href="https://log.alets.ch/">Oleg Lavrovsky</a> and the Apertus community for your feedback and support.</p>
</li>
<li>
<p>Thank you <a href="https://publicai.ch/">Public AI</a> and our partner <a href="https://www.infomaniak.com/en/hosting/ai-services/open-source-models">Infomaniak</a> for providing the infrastructure.</p>
</li>
</ul>
<h1>Build with Apertus: join Hack Apertus</h1>
<p>Want to get hands-on with sovereign Swiss AI? <a href="https://hackapertus.ch/">Hack Apertus</a> is a two-stage open-source hackathon series where teams build on Apertus to develop blueprints for sovereign infrastructure across the public and private sector. Liip is a partner — we are excited to see what the community builds.</p>
<p>Sign up at <a href="https://hackapertus.ch/">hackapertus.ch</a>.</p>
<figure><a href="https://hackapertus.ch"><img alt="" src="https://liip.rokka.io/www_inarticle_5/afc775/hackapertus-partner-liip.jpg" srcset="https://liip.rokka.io/www_inarticle_5/o-dpr-2/afc775/hackapertus-partner-liip.jpg 2x"></a><figcaption>Hackapertus Liip Promo Image</figcaption></figure>]]></description>
    </item>
        <item>
      <title>Un chatbot IA souverain pour l&#039;Etat de Fribourg</title>
      <link>https://www.liip.ch/fr/blog/un-chatbot-ia-souverain-pour-l-etat-de-fribourg</link>
      <guid>https://www.liip.ch/fr/blog/un-chatbot-ia-souverain-pour-l-etat-de-fribourg</guid>
      <pubDate>Mon, 15 Jun 2026 00:00:00 +0200</pubDate>
      <description><![CDATA[<h2>Faciliter l'accès à l'information publique</h2>
<p>Le portail fr.ch rassemble une grande quantité de contenus administratifs: démarches, législation, formulaires, prestations cantonales, informations communales. Trouver la bonne réponse dans un site aussi vaste n'est pas toujours chose aisée.</p>
<p>Il suffit de poser sa question en langage naturel, comme on le ferait à une personne. Si le site <a href="https://www.fr.ch/">fr.ch</a> est rédigé en français et allemand, canton bilingue oblige, on peut poser sa question dans n’importe quelle autre langue, pour que les citoyen·ne·s ne parlant ces langues puissent tout de même trouver les informations nécessaires.</p>
<p>Le chatbot IA identifie les contenus pertinents sur fr.ch et dans la base légale fribourgeoise, puis génère une réponse écrite, en citant les sources officielles utilisées.</p>
<p>Cette transparence est essentielle. L'IA ne remplace pas les contenus officiels, elle en facilite l'accès. </p>
<h2>Une IA pensée pour la souveraineté numérique</h2>
<p>La souveraineté des données est au cœur du projet. La Chancellerie souhaitait en effet absolument garder la maîtrise complète de l'infrastructure et du traitement.</p>
<figure><img alt="" src="https://liip.rokka.io/www_inarticle_5/29d94a/chatbot-souv-num.jpg" srcset="https://liip.rokka.io/www_inarticle_5/o-dpr-2/29d94a/chatbot-souv-num.jpg 2x"></figure>
<p>Le chatbot s'appuie sur <a href="https://www.liip.ch/fr/work/projects/liipgpt">LiipGPT</a>, notre plateforme d'IA générative. Notre moteur de Retrieval Augmented Generation (RAG) sélectionne les contenus officiels pertinents pour chaque question. Il est hébergé en Suisse chez Exoscale.</p>
<p>Côté modèle de langage (Large Language Model, LLM), nous utilisons Mistral AI, un outil européen majeur. Le modèle est lui aussi hébergé en Suisse, chez <a href="https://www.infomaniak.com/fr/hebergement/nos-offres-cloud-computing">Infomaniak</a>, pionnier de l'hébergement web éco-responsable et durable s’il en est. Les serveurs du LLM utilisent exclusivement des énergies renouvelables, avec refroidissement naturel et réutilisation de la chaleur, sans oublier l’utilisation de matériel recyclé et optimisé ainsi qu’une compensation carbone locale.</p>
<p>Cette architecture réduit la dépendance aux grandes plateformes américaines et privilégie une approche suisse et européenne de l'IA générative. Les requêtes sont anonymisées et aucune donnée personnelle n'est transmise à des tiers. L'ensemble reste sous juridiction suisse, conformément à la législation en vigueur sur la protection des données.</p>
<h2>Une collaboration ancrée en Suisse romande</h2>
<p>La Chancellerie d'Etat de Fribourg a piloté le projet, avec une vision claire des enjeux administratifs et politiques. Notre équipe, notamment active à Fribourg, a développé la solution en étroite collaboration avec la Chancellerie. Ceci a permis de répondre au mieux aux besoins réels issus du terrain.</p>
<p>Cette proximité a permis des échanges rapides et une attention forte portée à l'expérience utilisateur·rice. Au-delà de la technologie, l'enjeu était de créer un outil qui soit à la fois utile, fiable et compréhensible pour la population fribourgeoise.</p>
<h2>Une première étape vers une administration plus accessible</h2>
<p>Depuis le premier déploiement en mars, nous avons retravaillé certains éléments afin d’améliorer la qualité des réponses. Pour ce faire, notre client bénéficie notamment de nos solutions d'évaluation automatisées afin de contrôler en continu le niveau de qualité des réponses. </p>
<p>Cette première version couvre les informations publiques se trouvant sur fr.ch et la base légale fribourgeoise. Mais le périmètre ne se limite pas au seul portail cantonal: il s'élargit progressivement aux informations publiées par d'autres institutions cantonales et par certaines communes. Qui dit nouvelles sources, dit bien sûr vigilance accrue pour s’assurer que le niveau de qualité des réponses demeure. L'Etat de Fribourg tient d'ailleurs à jour <a href="https://www.fr.ch/le-chatbot-ia-de-frch">une page d&eacute;di&eacute;e au chatbot</a>, qui détaille notamment les sources de données utilisées.</p>
<p>Une conviction guide ce travail. L'IA dans le secteur public peut être souveraine, transparente et utile. Pour y parvenir, il est nécessaire de toujours garder la maîtrise de l'infrastructure et de citer ses sources.</p>
<p>Envie d'échanger sur l'IA pour votre institution? N'hésitez pas à me <a href="https://www.liip.ch/fr/team/thomas-denervaud">contacter</a>.</p>]]></description>
    </item>
        <item>
      <title>so.ch: des services cantonaux simplifi&#233;s  pour tou&#183;te&#183;s</title>
      <link>https://www.liip.ch/fr/blog/so-ch-des-services-cantonaux-simplifies-pour-tou-te-s</link>
      <guid>https://www.liip.ch/fr/blog/so-ch-des-services-cantonaux-simplifies-pour-tou-te-s</guid>
      <pubDate>Thu, 07 May 2026 00:00:00 +0200</pubDate>
      <description><![CDATA[<p>Le site so.ch poursuit un objectif clair: permettre à l’usager·ère de traiter tes demandes rapidement, directement et sans détours inutiles. Au lieu de refléter la logique administrative classique «Quel service est responsable?», le site se concentre sur <a href="https://www.liip.ch/fr/services/strategy/understand-users">le besoin r&eacute;el de l&rsquo;utilisateur&middot;trice</a>: «que voulez-vous faire?»</p>
<p>La séparation claire entre Services et Administration rend immédiatement la finalité de la plateforme compréhensible et met en évidence sa valeur pour les habitant·e·s et les entreprises. L’intention du site est ainsi immédiatement perceptible, avec des contenus structurés de manière logique et cohérente. Ce n’est pas seulement notre avis: le jury des BOSW l’a également reconnu en attribuant cette année un bronze dans la catégorie User Experience (un peu de fausse modestie: nous avons occupé deux des trois places du podium, avec également l’argent pour le nouveau site du <a href="https://www.liip.ch/de/work/projects/museum-fur-gestaltung-zurich">Museum f&uuml;r Gestaltung Z&uuml;rich</a>).</p>
<figure class="video"><video controls><source src="https://www.liip.ch/media/pages/blog/so-ch-cantonal-services-made-simple-for-everyone/a93f1aef25-1778057223/liip_bosw_kantonsolothurn.mp4" type="video/mp4"></video></figure>
<h2>Une architecture de l’information pensée utilisateur·rice·s</h2>
<p>L’architecture de l’information est soigneusement conçue et adaptée aux besoins des publics cibles. Tous les services sont centralisés, clairement catégorisés et suivent une structure cohérente pour répondre aux questions: de quoi ai-je besoin, comment se déroule le processus et quels sont les canaux disponibles?</p>
<p>Cette standardisation permet de comprendre rapidement les infos pertinentes et de naviguer avec assurance dans des processus complexes. Les informations sur les services sont aussi présentées de manière transparente, afin que même les utilisateur·rice·s occasionnel·le·s puissent immédiatement identifier les étapes à suivre.</p>
<h2>Fonctionnalité, interactivité et utilisabilité au service de l’efficacité</h2>
<p>Les fonctionnalités du site sont conçues en fonction des besoins des utilisateur·rice·s. Chaque page de service propose des instructions claires et faciles à comprendre, ainsi que des éléments intuitifs et simples à utiliser. Le tout avec un accompagnement à chaque étape: que ce soit via des services numériques ou des canaux plus traditionnels comme des formulaires, des appels téléphoniques ou des visites sur place.</p>
<p>Cette approche réduit les incertitudes, limite les demandes de clarification et améliore l’efficacité dans l’accès aux services cantonaux.</p>
<h2>Un site inclusif conçu pour tou·te·s</h2>
<p>so.ch respecte les normes <a href="https://www.liip.ch/en/services/development/custom-development/accessibility">d&rsquo;accessibilit&eacute; num&eacute;rique</a> conformément aux directives WAI, garantissant un accès équitable à tou·te·s les utilisateur·rice·s. Les contenus sont rédigés de manière claire, la navigation est cohérente, les interactions sont intuitives, et la plateforme prend en charge des accès numériques et non numériques.</p>
<p>Ainsi, chacun·e peut utiliser le site de manière efficace et autonome, indépendamment de son expérience technique, de son âge ou de ses capacités.</p>
<p>En se concentrant systématiquement sur les besoins des utilisateur·rice·s, so.ch propose une plateforme intuitive, transparente et inclusive qui rend les processus administratifs complexes compréhensibles. Des objectifs clairs, une architecture de l’information réfléchie, des fonctionnalités accessibles et un design sans barrières créent une expérience centrée sur l’utilisateur·rice. Ce qui permet de simplifier et optimiser les interactions avec les services cantonaux.</p>
<p>Souhaitez-vous améliorer le site web de votre organisation? Je serais <a href="https://www.liip.ch/fr/team/philipp-klein">ravi d&rsquo;en savoir plus sur vos besoins et vos d&eacute;fis</a>.</p>]]></description>
    </item>
        <item>
      <title>Qui a encore besoin d&#039;un apprentissage quand l&#039;IA est l&#224;?</title>
      <link>https://www.liip.ch/fr/blog/qui-a-encore-besoin-d-un-apprentissage-quand-l-ia-est-la</link>
      <guid>https://www.liip.ch/fr/blog/qui-a-encore-besoin-d-un-apprentissage-quand-l-ia-est-la</guid>
      <pubDate>Tue, 21 Apr 2026 00:00:00 +0200</pubDate>
      <description><![CDATA[<h3>L'IA fait déjà partie de mon quotidien</h3>
<p>Au fin 2022, j'ai vu ChatGPT pour la première fois dans une vidéo TikTok et je l'ai tout de suite essayé. Il pouvait m'expliquer des contenus plus rapidement que mes enseignant·e·s, résoudre des tâches mieux que si je les avais faites moi-même, et même développer des idées auxquelles je n'aurais jamais pensé. Ça m'a vraiment fasciné.</p>
<p>Mais c'est seulement en commençant mon apprentissage que j'ai réalisé à quel point l'IA est puissante et importante. Aujourd'hui, je l'utilise quotidiennement. Pas pour qu'elle fasse mon travail à ma place, mais pour apprendre de nouvelles choses, faire des recherches plus efficacement et travailler plus efficacement sur certaines tâches.</p>
<h3>Mon apprentissage est varié. C'est justement ce qui le rend passionnant</h3>
<p>J'effectue un <a href="https://www.ict-berufsbildung.ch/formation-initiale/apprentissages-ict/developpeurse-de-business-numerique-cfc">apprentissage de Développeur·euse en Commerce Numérique CFC</a>. J'en suis actuellement à ma deuxième année. Après la première année au Bbc Basislehrjahr, j'ai rejoint Liip durant l'été 2025.</p>
<p>Ce que je trouve particulièrement passionnant dans cet apprentissage, c'est la diversité des tâches. Je travaille dans différents Circles, des équipes auto-organisées basées sur l'holacratie. Cela me permet de découvrir de nombreuses perspectives, tâches et personnes différentes.</p>
<figure><img alt="" src="https://liip.rokka.io/www_inarticle_5/ccafe5/grafik-1.jpg" srcset="https://liip.rokka.io/www_inarticle_5/o-dpr-2/ccafe5/grafik-1.jpg 2x"></figure>
<p>Cette variété me correspond bien. J'aime travailler de façon structurée, je communique activement et je trouve stimulant d'analyser et d'améliorer les processus de travail. Chez Liip, j'ai la chance de pouvoir prendre des responsabilités tôt dans mon apprentissage. Je travaille sur des projets internes et externes concrets, je prends des décisions et j'apporte mes propres idées. Pour moi, c'est ce qui distingue vraiment Liip de nombreux autres employeurs proposant des apprentissages.</p>
<h3>La relation avec les clients en fait partie</h3>
<p>Un aspect de mon apprentissage peut-être moins visible de l'extérieur réside dans la relation avec les clients. J'apprends à communiquer de façon professionnelle, à bien représenter mon entreprise et à comprendre les facteurs importants pour une bonne collaboration. Cela implique notamment de transmettre des informations claires au sein de l'équipe, de recueillir des exigences et de communiquer de manière structurée dans les projets. Parce que je participe à de vrais projets dès le début de mon apprentissage, je développe rapidement un bon sens de ce qui compte réellement pour les clients.</p>
<h3>Comment j'utilise l'IA concrètement</h3>
<p>L'IA devient particulièrement utile quand je lui fournis beaucoup de contexte. Un outil généraliste se transforme alors en véritable partenaire de réflexion. L'IA me soutient surtout quand j'ai un objectif clair et que j'ai besoin d'une bonne première ébauche rapidement. Je l'utilise pour brainstormer, comprendre de nouveaux termes, faire des recherches ou structurer des textes.</p>
<ul>
<li><em>Anecdote au passage: ce billet de blog a aussi été partiellement structuré avec l'IA. J'ai rassemblé mes idées, expliqué le contexte, puis j'ai reçu de l'aide pour créer une structure cohérente. C'est comme ça que j'utilise l'IA au quotidien.</em></li>
</ul>
<p>Un bon exemple est le manuel pour le backend <a href="https://www.liip.ch/fr/work/projects/liipgpt">LiipGPT</a> que j'ai rédigé. Au départ, je n'avais pratiquement aucune expérience dans la rédaction de manuels. J'ai donc d'abord appris les bases avec l'aide de l'IA. Ensuite, j'ai fourni un maximum de contexte à l'IA et développé une ébauche étape par étape avec elle. Le résultat est un manuel utilisé régulièrement en interne et adapté individuellement pour les clients. Pour moi, c'est le moment où j'ai réalisé la valeur ajoutée que l'IA peut apporter: je pouvais non seulement travailler plus vite et sans expérience préalable, mais aussi créer un résultat qui aide vraiment les autres dans leur quotidien.</p>
<figure><img alt="" src="https://liip.rokka.io/www_inarticle_5/2b6bdf/grafik-2-fr.jpg" srcset="https://liip.rokka.io/www_inarticle_5/o-dpr-2/2b6bdf/grafik-2-fr.jpg 2x"></figure>
<aside>
<blockquote>
<h3>Mes 3 outils IA incontournables au quotidien en Digital Business</h3>
</blockquote>
<p>Un aperçu rapide des outils qui m'aident le plus au quotidien:</p>
<ul>
<li>
<p><strong>Claude</strong></p>
<p>Mon outil principal pour le brainstorming, la rédaction et la compréhension de nouveaux sujets.</p>
</li>
<li>
<p><strong>Cursor</strong></p>
<p>M'aide dans le code, même sans compétences avancées en programmation. Pour un outil de rendu dans Figma, j'ai d'abord expliqué le contexte en mode Plan, puis je l'ai implémenté étape par étape. Cursor m'a vraiment aidé à concrétiser l'idée.</p>
</li>
<li>
<p><strong>NotebookLM</strong></p>
<p>J'y télécharge des documents ou des notes et j'en tire des résumés, des questions ou du matériel d'apprentissage condensé. Particulièrement utile pour les examens ou pour se familiariser avec de nouveaux sujets.</p>
<blockquote>
</aside>
</blockquote>
</li>
</ul>
<p>Je n'utilise pas ces outils sans réfléchir. Je les teste, je les compare et je réfléchis soigneusement aux cas d'usage où ils ont pleinement du sens.</p>
<h3>L'IA, mon meilleur compagnon d'apprentissage</h3>
<p>L'IA a un fort potentiel pour l'apprentissage. Elle simplifie les contenus, donne des exemples et s'adapte à mon niveau. Aucun manuel ne peut faire ça. Prendre en main un nouveau sujet devient ainsi plus rapide. En tant qu'apprenti·e, je pose à l'IA des questions et des questions de suivi que je n'oserais pas poser en classe.</p>
<p>En même temps: <strong>l'IA ne doit jamais remplacer ta propre réflexion. Ceux et celles qui ne comprennent pas comment l'IA fonctionne et comment l'utiliser finiront par très peu apprendre.</strong></p>
<p>Pour moi, l'ouverture d'esprit et le questionnement critique font partie intégrante de l'utilisation de nouveaux outils. L'IA peut autonomiser les apprenant·e·s, mais uniquement si elle est utilisée consciemment comme un outil. C'est pourquoi il est important que les apprenti·e·s se familiarisent avec l'IA pendant leur formation. Pas plus tard, quand tout le monde sera déjà utilisateur·rice chevronné·e.</p>
<h3>Et toi, comment utilises-tu l'IA?</h3>
<p>Peut-être vaut-il la peine de faire une courte pause après ce billet de blog et de réfléchir à ta propre utilisation de l'IA. Comment utilises-tu vraiment l'IA dans ton quotidien aujourd'hui? Quelle valeur ajoutée concrète t'apporte-t-elle? Est-ce simplement un outil que tu essaies de temps en temps? Ou est-ce que tu l'utilises consciemment pour travailler mieux, plus vite ou de façon plus structurée?</p>
<p>Chez Liip, je vis directement comment une organisation n'utilise pas seulement l'IA, mais la façonne activement:</p>
<ul>
<li>des échanges de connaissances réguliers et des Liip Talks sur l'IA, des nouveaux modèles aux questions éthiques.</li>
<li>des formations à l'IA pour tou·te·s les collaborateur·rice·s. En interne, nous proposons des ateliers et des modules spéciaux pour que chacun·e reste à l'aise avec l'utilisation de l'IA.</li>
<li>le développement et la mise à jour de nos propres outils IA comme <a href="https://www.liip.ch/en/work/projects/liipgpt">LiipGPT</a>, déjà utilisé par des clients des secteurs de la santé, du droit et du secteur public.</li>
<li>des <a href="https://www.liip.ch/fr/blog/faconner-l-ia-pour-les-personnes-et-la-planete">lignes directrices sur l'IA durable</a>, un cadre interne qui garantit que les projets d'IA sont mis en oeuvre de façon éthique et durable.</li>
</ul>
<p>Cela me montre à quoi peut ressembler une organisation qui ne déploie pas l'IA aveuglément, mais qui en assume la responsabilité.</p>
<p>Comment les collaborateur·rice·s de ton entreprise utilisent-ils·elles l'IA? Y a-t-il des règles claires ou des offres pour utiliser l'IA de façon pertinente? Où l'IA pourrait-elle concrètement te soutenir dans ton rôle si tu l'utilisais de manière plus délibérée?</p>
<p>L'IA n'est pas un concept figé qui fonctionne de la même manière pour tout le monde. Mais ceux et celles qui l'utilisent tôt réalisent rapidement: <strong>la question n'est pas de savoir si tu as encore besoin d'un apprentissage, mais combien tu en tires davantage grâce à l'IA.</strong></p>]]></description>
    </item>
        <item>
      <title>Retour sur BOSW 26</title>
      <link>https://www.liip.ch/fr/blog/retour-sur-bosw-26</link>
      <guid>https://www.liip.ch/fr/blog/retour-sur-bosw-26</guid>
      <pubDate>Mon, 20 Apr 2026 00:00:00 +0200</pubDate>
      <description><![CDATA[<p>Comme chaque année, The Hall à Dübendorf a réuni un véritable who’s who de l’industrie web suisse pour récompenser les meilleurs projets de l’année dans différentes catégories. De notre côté, nous avons soumis trois projets cette année, tous sélectionnés dans la shortlist. Il s’agit des plateformes digitales développées pour le Museum für Gestaltung Zürich, le portail carrière Migros et le nouveau site du canton de Soleure. La cérémonie de remise des prix a été l’occasion pour les membres des équipes projet, côté client comme chez Liip, de se retrouver. Mais surtout, c’était un moment rempli de suspense pour découvrir quels projets remporteraient l’or, l’argent ou le bronze.</p>
<h2>Museum für Gestaltung: un chef-d’œuvre d’intérêt public et d’expérience utilisateur</h2>
<p>Le nouveau site du Museum für Gestaltung Zürich sert de hub central pour la communication digitale du musée et permet aux visiteur·euse·s de créer un lien avec celui-ci. En co-création, nous avons conçu une solution qui laisse le design s’exprimer pleinement, au service d’une plus grande valeur publique. Le jury des BOSW l’a reconnu en attribuant au site le prix d’argent dans les catégories “User Experience” et “Public Value”.</p>
<p>En savoir plus sur le <a href="https://www.liip.ch/en/work/projects/museum-fur-gestaltung-zurich">projet prim&eacute;</a> </p>
<p>Comme le souligne Clelia Kanai, Head of Marketing &amp; Communication:<br />
«Pour nous, le design signifie clarté et responsabilité – y compris dans le domaine numérique. Avec Liip, nous avons trouvé un partenaire qui partage et porte ces valeurs, de la conception initiale jusqu’à la vérification finale de l’accessibilité. Le fait que ce projet ait été récompensé par deux prix d’argent aux BOSW, dans les catégories User Experience et Public Value, est à la fois une validation et une magnifique reconnaissance pour nous.»</p>
<figure><img alt="" src="https://liip.rokka.io/www_inarticle_5/e48782/bosw2026teampic.jpg" srcset="https://liip.rokka.io/www_inarticle_5/o-dpr-2/e48782/bosw2026teampic.jpg 2x"></figure>
<h2>so.ch: transparence, accessibilité et simplicité pour renforcer la confiance du public</h2>
<p>Nous avons développé un nouveau site pour le canton de Soleure, so.ch. Il crée une véritable valeur publique en rendant les services cantonaux transparents, accessibles et faciles à comprendre, renforçant ainsi la confiance du public, des autorités locales et des acteur·rice·s économiques dans les services publics.</p>
<p>Comme bs.ch nous l’a montré l’an dernier, un site centré utilisateur·rice est essentiel pour améliorer le quotidien des citoyen·ne·s, qui doivent de plus en plus accéder à leurs informations et documents en ligne. Le jury a reconnu la qualité de l’expérience utilisateur de so.ch  en attribuant le bronze dans cette catégorie clé.</p>
<p>En savoir plus sur le <a href="https://www.liip.ch/fr/blog/so-ch-des-services-cantonaux-simplifies-pour-tou-te-s">projet prim&eacute;</a></p>
<p>Même si nous n’avons pas remporté autant de prix que nous l’aurions souhaité (et que nous pensons bien sûr mériter :), c’était une belle occasion de prendre le pouls du secteur. Nous félicitons chaleureusement « Swissgrid 24/7 », Master of Swiss Web 26. À l’année prochaine!</p>]]></description>
    </item>
        <item>
      <title>Zurich Climate Week</title>
      <link>https://www.liip.ch/fr/blog/zurich-climate-week</link>
      <guid>https://www.liip.ch/fr/blog/zurich-climate-week</guid>
      <pubDate>Thu, 16 Apr 2026 00:00:00 +0200</pubDate>
      <description><![CDATA[<p>La première <a href="https://www.climateweekzurich.org/" rel="noreferrer" target="_blank">Zurich Climate Week</a> (du 4 au 9 mai) est lancée et elle arrive à vrai dire au bon moment. Dans le contexte géopolitique actuel, l’initiative aurait pu échouer. C’est tout le contraire: l’accueil est extrêmement positif, l’écho et la participation sont importants et certaines autres villes nous envient déjà… et viennent simplement à Zurich pour en faire partie.</p>
<p>À la lumière des récents développements politiques, un « do-talk gap » a (une fois de plus) été constaté dans le domaine de la durabilité. La Zurich Climate Week s’attaque précisément à ce point: s’engager face à l’urgence climatique et en parler.</p>
<p>Et c’est exactement ce dont nous avons besoin aujourd’hui. Car la transformation durable ne se fait pas en silence. Elle naît là où des perspectives différentes se rencontrent: économie, politique, recherche et société civile. Là où les connaissances sont partagées. Là où des solutions sont développées et mises à l’échelle ensemble.</p>
<h1>Pourquoi nous nous engageons</h1>
<p>Chez Liip, nous avons décidé de contribuer au programme de la Zurich Climate Week pour plusieurs raisons:</p>
<ul>
<li>Pour soutenir l’initiative en participant activement au programme</li>
<li>Pour renforcer notre engagement en faveur de la durabilité au-delà de la Climate Week</li>
<li>Et surtout: pour partager nos expériences, apprendre des autres et élargir notre réseau de personnes engagées</li>
</ul>
<p>Notre contribution à la Climate Week, tout comme les deux thématiques de nos événements, s’inscrit selon un même principe: <strong>assumer notre responsabilité</strong>.</p>
<h1>Notre contribution</h1>
<p>Liip est présent dans le programme avec deux formats, tous deux axés sur l’échange, la pratique et la mise en œuvre concrète.</p>
<h2>Hacking for Sustainable AI</h2>
<p><a href="https://climateweekzurich.glueup.com/event/hacking-for-sustainable-ai-176395/" rel="noreferrer" target="_blank">Plus d&rsquo;informations &amp; inscription</a></p>
<p>L’intelligence artificielle fait désormais partie de notre quotidien. Elle semble offrir des solutions à de nombreux problèmes et constitue souvent le premier réflexe lorsque nous arrivons à une impasse. Pourtant, ses impacts environnementaux et sociétaux restent encore largement sous-estimés.</p>
<p>Dans quels cas l’IA crée-t-elle réellement de la valeur? Et comment l’utiliser de manière à contribuer à un avenir plus durable?</p>
<p>En collaboration avec <a href="http://opendata.ch" rel="noreferrer" target="_blank">opendata.ch</a>, nous mettons ces questions au centre d’un mini hackathon. Développeur·euse·s, designer·euse·s, expert·e·s en durabilité, entreprises et toute personne intéressée sont invité·e·s à imaginer ensemble de nouvelles idées, prototypes et perspectives.</p>
<p>👉 Objectif: développer des approches concrètes pour utiliser l’IA de manière pertinente, responsable et à fort impact.</p>
<h2>Sustainability Reporting for SMEs: Real Cases, Practical Steps</h2>
<p><a href="https://climateweekzurich.glueup.com/event/sustainability-reporting-for-smes-real-cases-practical-steps-176404/" rel="noreferrer" target="_blank">Plus d&rsquo;informations &amp; inscription</a></p>
<p>Les PME jouent un rôle central dans la transformation durable. Et pourtant, beaucoup se posent les mêmes questions: par où commencer? Qu’est-ce qui est vraiment pertinent? Et quel est le niveau d’effort nécessaire?</p>
<p>Dans cette session, 4 PME partagent leur expérience du reporting de durabilité volontaire.</p>
<p>Le format est interactif: sous forme de table ronde, les participant·e·s peuvent poser des questions, partager leurs propres approches et discuter ensemble des moyens de surmonter les obstacles.</p>
<p>👉 Objectif: réduire les difficultés de départ, montrer que le premier pas est accessible et faire grandir une communauté de PME engagées.</p>
<h1>Du discours à l’action collective</h1>
<p>La Zurich Climate Week incarne un état d’esprit que nous partageons: allier urgence et optimisme. Ne pas seulement parler des problèmes, mais faire avancer des solutions concrètes. Assumer ensemble notre responsabilité et générer un impact réel.</p>
<p>Dans un contexte où les incertitudes augmentent et où les priorités évoluent, il est plus important que jamais de rester engagés. La durabilité n’est pas une tendance à court terme mais bien une nécessité à long terme. Et en même temps, une opportunité: pour l’innovation, pour de nouveaux modèles économiques, pour une différenciation réelle et au final pour une meilleure qualité de vie.</p>
<p>Ce dont nous avons besoin, ce sont davantage d’espaces d’échange. Plus de transparence. Et plus de courage pour partager ce qui est encore en construction.</p>
<p>La Zurich Climate Week crée précisément ces espaces. Nous sommes ravis d’en faire partie.</p>]]></description>
    </item>
        <item>
      <title>Iframes are still odd</title>
      <link>https://www.liip.ch/fr/blog/iframes-are-still-odd</link>
      <guid>https://www.liip.ch/fr/blog/iframes-are-still-odd</guid>
      <pubDate>Mon, 23 Mar 2026 00:00:00 +0100</pubDate>
      <description><![CDATA[<h2>The Challenge</h2>
<p>The application does one - rather complicated - task, with lots of business logic. There was no way we could rewrite it to include it directly into the website code. And because the application comes with its own Javascript and CSS, we decided to use an iframe to embed the application with clean isolation.</p>
<p>The company maintaining that application provided us with a version - running as a Docker container - where they had stripped all extra elements like the navigation, so that it would visually fit within the website. There was however no way for us to customise anything within the application.</p>
<h2>iframe security</h2>
<p>The promise of an iframe is to keep a clean security boundary between embedding page and embedded content. This means that it is by design not possible to call Javascript across the boundary. </p>
<p>Because injecting iframes could potentially trick a user into submitting data to an attacker (clickjacking), as the iframe may be from a different origin than the main page. Thus, to even render the iframe, the browser checks the Content-Security-Policy (CSP) HTTP header. That header has a field frame-src to control what may be included as an iframe. With this, I allowed the domain of the application to be included in iframes.</p>
<pre><code>Content-Security-Policy: frame-src https://my-embed.com;</code></pre>
<p>But not only does the including page need to allow an iframe. The page to be embedded also needs to allow being included with the frame-ancestors attribute of the CSP header. As we run the application Docker image under our control, I was able to add that header in the proxy that runs before the Docker image:</p>
<pre><code>Content-Security-Policy: frame-ancestors https://my-website.com;</code></pre>
<p>Several things to note:</p>
<ul>
<li>If you have other CSP rules, merge them with the rules, nginx will overwrite the header and not add to it</li>
<li>Both options also support "self" to allow embedding resp. being embedded with the same webserver</li>
<li>Prior to the CSP becoming a standard, there was an unofficial header <code>X-Frame-Options</code>, which is still supported by browsers</li>
<li><code>Content-Security-Policy</code> must be an actual HTTP header, <code>&lt;meta http-equiv=”...”&gt;</code> is ignored for <code>Content-Security-Policy</code> (and also ignored for <code>X-Frame-Options</code>).</li>
</ul>
<h2>Size of the iframe element</h2>
<p>Now we get to the weird parts. To prevent multiple scrollbars, we need the iframe element to be exactly big enough for the embedded page. If it is too small, there is an additional scrollbar (or hidden content). If it is too large, there is odd whitespace.</p>
<p>The size of the element needs to be set on the iframe, owned by the parent. The dimensions of the content are however only known by the embedded application. HTML / CSS do not provide any means to let the parent page declare that it wants the iframe to have the “necessary size”. </p>
<p>We ended up with a really convoluted way, which seems the only way to achieve this: sending messages from the child page to the parent. This problem spawned dedicated javascript libraries like <a href="https://github.com/davidjbradshaw/iframe-resizer">iframe-resizer</a>. We ended up reimplementing the logic in the React application, as it was so small that a dedicated library felt like overkill. Following the tutorial at <a href="https://github.com/craigfrancis/iframe-height/">iframe-height</a> (which also has some interesting background on the discussion about iframes in the Whatwg), we came up with this code for the containing website:</p>
<pre><code class="language-js">// register an event listener for messages
window.addEventListener('message', receiveMessage, false);

// handle a message
function receiveMessage(event) {
    const origin = event.origin || event.originalEvent.origin;
    // we configure the expected domain to allow for this additional sanity check
    if (expectedDomain !== origin) {
      return;
    }
    if (!event.data.request || 'iframeResize' !== event.data.request) {
      return;
    }
    // the id is known in the js class. we need to find the element that needs to be resized
    const iframe = document.getElementById(`iframe-${id}`);
    if (iframe) {
      // pad the height a bit to avoid unnecessary tiny scrolling
      iframe.style.height = (event.data.height + 20) + 'px';
      // width could be handled the same way if necessary - in our case the width is fix
    }
}</code></pre>
<p>Now we need to make the embedded content send a message with its height. The Javascript for that is a bit verbose to allow for different browsers, but not complicated either:</p>
<pre><code class="language-js">(
    function(document, window) {
      if (undefined === parent || !document.addEventListener) {
        return;
      }
      function init() {
        let owner = null;
        const width = Math.max(document.body.scrollWidth, document.body.offsetWidth, document.documentElement.clientWidth, document.documentElement.scrollWidth, document.documentElement.offsetWidth);
        const height = Math.max(document.body.scrollHeight, document.body.offsetHeight, document.documentElement.clientHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight);
        if (parent.postMessage) {
          owner = parent;
        } else if (parent.contentWindow &amp;&amp; parent.contentWindow.postMessage) {
          owner = parent.contentWindow;
        } else {
          return;
        }
        owner.postMessage({
          'request' : 'iframeResize',
          'width' : width,
          'height' : height
        }, '*');
      }

      if (document.readyState !== 'loading') {
        window.setTimeout(init);
      } else {
        document.addEventListener('DOMContentLoaded', init);
      }
      // this is needed to also adjust the iframe if something (e.g. the Javascript of the application) changes the size of the iframe without an actual page reload.
      const observer = new ResizeObserver(init);
      observer.observe(document.body);
    }
  )(document, window);"</code></pre>
<h3>iframes with same origin</h3>
<p>If the iframe comes from the same origin (= domain) as the parent page, Javascript can cross the boundary. From parent to child, there is a <code>contentWindow</code> property on the <code>iframe</code> element. From child to parent, there is <code>window.parent</code>. With same origin, those elements expose all things the window usually has. For different origins, they only expose the function <code>postMessage</code> for the secure separation.</p>
<h2>Injecting content with Nginx</h2>
<p>Remember how I said we can’t modify the application? That still holds true. If we would have loaded both applications from the same domain, we could have had the parent page add a listener inside the iframe to directly update dimensions as needed. But the application contained absolute paths for its assets, so providing it from a subfolder of the same domain would have been tricky and we had to run it on a separate domain. </p>
<p>I ended up injecting the above snippet of Javascript in the Nginx proxy that sits in front of the Docker container:</p>
<pre><code>proxy_set_header Accept-Encoding ""; # make sure we get plain response for substitution to work
...
sub_filter_last_modified on;
sub_filter "&lt;/body&gt;" "&lt;script language='javascript'&gt;${script}&lt;/script&gt;&lt;/body&gt;";
sub_filter_once on;
...
proxy_pass https://my-embed.com$request_uri;</code></pre>
<p>Now the embedded iframe communicates its size to the containing page, which adjusts the iframe size accordingly.</p>
<p>(Note that Nginx does not execute these statements in order. The sub_filter instructions apply to the response, wihle proxy_set_header and proxy_pass apply to the request.)</p>
<h2>Alternatives</h2>
<p>Web Components are a more lightweight solution to combine separate sources into one website. If what you need to integrate is just an element and not a whole application, they might be a better fit. My collegue Falk wrote about <a href="https://www.liip.ch/en/blog/web-components-the-good-the-bad-and-the-ugly">Web Components</a> last week.</p>
<hr />
<h2>Bonus: Access control for the iframe content</h2>
<p>Because the application is not under our control, we need to manage access to it. We told the supplier of the application to remove access control and simply allow items to be created and edited by ID. Of course, this means that the application must never be directly exposed to the internet, but only reachable through the proxy.</p>
<p>On the embedding side, we track which user is allowed what ids, and have Nginx do a pre-flight check against the website to get the access decision:</p>
<pre><code># at the beginning of the location for the main request to the embeded application
auth_request /auth;

location /auth {
    # preflight authorization request with symfony
    fastcgi_pass phpfcgi;
    include /usr/local/openresty/nginx/conf/fastcgi_params;
    fastcgi_param SCRIPT_FILENAME /app/public/index.php;
    # forward the original request URI to allow our main application to verify access to the specific resource
    fastcgi_param REQUEST_URI /embed-check$request_uri;
    # body is not forwarded. we have to remove content length separately, otherwise PHP-FPM will wait for the body until the auth request times out.
    fastcgi_pass_request_body off;
    fastcgi_param CONTENT_LENGTH "";
    fastcgi_param CONTENT_TYPE "";
    internal;
}</code></pre>
<p>If the call at <code>/embed-check/...</code> returns a 2xx status, Nginx continues with the request, otherwise it returns the response with the status code to the client, allowing for example to redirect to the login page. In my case, i return an empty response with status 204 if the user is allowed to access the specific resource.</p>
<p>On Symfony side, I use Symfony security to make sure the user is logged in. And then parse the path to know which item in the application the request wants to access, and check if the user has access. This leaks knowledge about the URL design of the embedded application, which is not avoidable for granular access control.</p>]]></description>
    </item>
      </channel>
</rss>