<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog IT</title>
	<atom:link href="https://blogit.create.pt/feed/" rel="self" type="application/rss+xml" />
	<link>https://blogit.create.pt/</link>
	<description>Create IT blogger community</description>
	<lastBuildDate>Sun, 08 Feb 2026 16:55:24 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>
	<item>
		<title>Book Review: Co-Intelligence by Ethan Mollick</title>
		<link>https://blogit.create.pt/davidpereira/2026/02/08/book-review-co-intelligence-by-ethan-mollick/</link>
					<comments>https://blogit.create.pt/davidpereira/2026/02/08/book-review-co-intelligence-by-ethan-mollick/#respond</comments>
		
		<dc:creator><![CDATA[David Pereira]]></dc:creator>
		<pubDate>Sun, 08 Feb 2026 16:45:54 +0000</pubDate>
				<category><![CDATA[Misc]]></category>
		<guid isPermaLink="false">https://blogit.create.pt/?p=13597</guid>

					<description><![CDATA[<p>Table of Contents Introduction We recently finished reading&#160;Co-Intelligence: Living and Working with AI&#160;by Ethan Mollick in our company&#8217;s book club. The book shares four core principles for AI collaboration and outlines various practical applications. Some really stuck with me, and I&#8217;ve tried to incorporate them in my work. Reading the author&#8217;s perspective and learning his [&#8230;]</p>
<p>The post <a href="https://blogit.create.pt/davidpereira/2026/02/08/book-review-co-intelligence-by-ethan-mollick/">Book Review: Co-Intelligence by Ethan Mollick</a> appeared first on <a href="https://blogit.create.pt">Blog IT</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Table of Contents</h2>



<ul style="max-width:985px" class="wp-block-list">
<li>Introduction</li>



<li>AI as a Thinking Companion</li>



<li>The Human-in-the-Loop Principle
<ul style="max-width:960px" class="wp-block-list">
<li>Critical Thinking</li>



<li>Disruption in the job market</li>
</ul>
</li>



<li>Centaur vs Cyborg approaches</li>



<li>Resources</li>



<li>Conclusion</li>
</ul>



<h2 class="wp-block-heading">Introduction</h2>



<p>We recently finished reading&nbsp;<em>Co-Intelligence: Living and Working with AI</em>&nbsp;by Ethan Mollick in our company&#8217;s book club. The book shares four core principles for AI collaboration and outlines various practical applications. Some really stuck with me, and I&#8217;ve tried to incorporate them in my work. Reading the author&#8217;s perspective and learning his way of thinking definitely improved how I look at these tools. But if you know me, you know how skeptical I am. There are some chapters and opinions that I don&#8217;t agree with.</p>



<p>So in this post, I&#8217;ll share the key insights from our book club in the context of software development, plus some personal opinions as always 🙂.</p>



<h2 class="wp-block-heading">AI as a Thinking Companion</h2>



<p>One of the most practical takeaways for me was viewing AI as a co-worker and thinking companion. When done right, this can be incredibly useful. Some people use it heavily for deep research, not so much to delegate tasks for it to do.&nbsp;<a href="https://www.linkedin.com/in/andredsantos/">André Santos</a>&nbsp;gave some examples on the tasks it has been useful, like Terraform code or generating bash scripts. On those tasks, we can write a detailed prompt, alongside proper documentation (e.g. Context7 MCP), and ask it to write Terraform since it&#8217;s simpler and faster.</p>



<p>Even just making a POC, or demo, turning an idea you have into working software to see how viable the idea is. That is a perfect use case for delegating the front-end and back-end to AI. It&#8217;s not code that will ship to production, it&#8217;s a way to make prototypes or quick demo apps that otherwise you&#8217;d never spend the time to build.</p>



<p>I&#8217;ve enjoyed using models like Claude to help me around my tasks at work because they often uncover possibilities I haven&#8217;t thought about. The conversational style of going back and forth helps me fine-tune my own solution. It&#8217;s not just &#8220;give me code,&#8221; it&#8217;s &#8220;let&#8217;s discuss this architecture&#8221;. At the end of the conversation, we can generate a good draft of a PRD (Product Requirements Document). Notice I don&#8217;t delegate my thinking to it, it&#8217;s a tool that helps me think of solutions or just <a href="https://x.com/trq212/status/2005315275026260309" target="_blank" rel="noreferrer noopener">interview me sometimes</a>.</p>



<p>However, it can be annoying. I&#8217;d like to minimize the number of times I have to tell it &#8220;no, you&#8217;re wrong. The Microsoft documentation for Azure Container Apps does not state X as you said&#8221; 😅. To fix this, I&#8217;ve tried giving an explicit instruction in my system prompts:</p>



<pre class="wp-block-code"><code><em>"It's also very important for you to verify if there is official documentation that supports your claims and statements. Please find official documentation supporting your claims before responding to a user. If there isn't documentation confirming your statement, don't include it in the response."</em></code></pre>



<p>I have had better results with this, still not perfect. In a longer conversation, I think it doesn&#8217;t always verify the docs (memory limits, perhaps), but sometimes I get the response: &#8220;(&#8230;) Based on my search through the official documentation, I need to be honest with you (&#8230;)&#8221;.</p>



<p>I really find it funny that Claude &#8220;needs&#8221; to be honest with me 😄. Sycophancy is truly annoying, especially since we are talking about AI as a thinking companion. If your AI partner always agrees with you, how useful is it really as a thinking companion?</p>



<h2 class="wp-block-heading">The Human-in-the-Loop Principle</h2>



<p>While Mollick&#8217;s vision of a collaborative future with AI is profoundly optimistic, he is also a realist. One of the most important principles, and a recurring theme in the book, is the absolute necessity of human oversight &#8211; the &#8220;human-in-the-loop&#8221; principle. This is a key quote from the book:</p>



<pre class="wp-block-code"><code><em>For now, AI works best with human help, and you want to be that helpful human. As AI gets more capable and requires less human help — you still want to be that human. So the second principle is to learn to be the human in the loop.</em></code></pre>



<p>One of Mollick&#8217;s key warnings is about <a href="https://www.linkedin.com/posts/emollick_a-fundamental-mistake-i-see-people-building-activity-7153484182134923265-IxAg" target="_blank" rel="noreferrer noopener">falling asleep at the wheel</a>. When AI performs well, humans stop paying attention. This has been referenced by Simon Willison as well, in his recent insightful post <a href="https://simonwillison.net/2025/Dec/31/the-year-in-llms/#the-year-of-yolo-and-the-normalization-of-deviance" target="_blank" rel="noreferrer noopener">2025: The year in LLMs</a>. All I&#8217;m saying is I understand <code>--dangerously-skip-permissions</code> is useful as a tool when used in a secure sandbox environment. But we should verify our confidence level on the AI&#8217;s output and the autonomy + tools we give it. If we don&#8217;t, we risk using AI on tasks that fall outside the Jagged Frontier, which can lead to security issues, nasty bugs, and hurt our ability to learn.</p>



<p>I say this knowing full well that I trust Claude Opus 4.5 more on any task I give it. So I have to actively force myself to verify its suggestions just as rigorously, verify which tools I gave it access to, and which are denied. For example, I use Claude Code hooks to prevent any&nbsp;<code>appsettings</code>,&nbsp;<code>.env</code>, or similar files from being accessed. I still try to read the LLM reasoning/thinking text, so that I understand better, and simply out of curiosity as well.</p>



<p>I simply can&#8217;t forget when I saw the <a href="https://www.anthropic.com/system-cards" target="_blank" rel="noreferrer noopener">Claude Sonnet 4 and Opus 4 System Card</a>, the &#8220;High-agency behavior&#8221; Anthropic examined. Whistleblowing and other misalignment problems are possible, for example, this is a quote from the Opus 4.6 System card:</p>



<pre class="wp-block-code"><code><em>In our whistleblowing and morally-motivated sabotage evaluations, we observed a low but persistent rate of the model acting against its operator’s interests in unanticipated ways. Overall, Opus 4.6 was slightly more inclined to this behavior than Opus 4.5.</em></code></pre>



<p>All I&#8217;m saying is let&#8217;s be conscious of these behaviors and results on the evals.</p>



<p>In my opinion, the human-in-the-loop principle is crucial. Don&#8217;t just copy/paste or try to vibe your way into production. Engineers are the ones <strong>responsible</strong> for software systems, not tools or alien minds. If there are users who depend on your software, and your AI code causes an incident in production, you are responsible. Claude or Copilot won&#8217;t wake up at 3 AM if prod is on fire (or maybe <a href="https://learn.microsoft.com/en-us/azure/sre-agent/incident-management?tabs=azmon-alerts" target="_blank" rel="noreferrer noopener">Azure SRE agent</a> will if you pay for it 🤔&#8230;). Having an engineering mindset and being in the driver&#8217;s seat is what I expect from myself and anyone I work with.</p>



<h3 class="wp-block-heading">Critical Thinking</h3>



<p>Within this principle, we have a topic I have a lot of strong opinions on. This quote says it all:</p>



<pre class="wp-block-code"><code><em>LLMs are not generally optimized to say "I don’t know" when they don't have enough information. Instead, they will give you an answer, expressing confidence.</em></code></pre>



<p>Basically, to be the human in the loop, we really must have good critical thinking skills. This ability plus our experience, brings something very valuable to this AI collaboration &#8211; detect the &#8220;I don&#8217;t know&#8221;. It may help to know some ways we can <a href="https://docs.anthropic.com/en/docs/test-and-evaluate/strengthen-guardrails/reduce-hallucinations" target="_blank" rel="noreferrer noopener">reduce hallucinations</a> in our prompts. But still, we can&#8217;t blindly believe AI output is correct based on its confidence that the proposed solution works. Now more than ever, we need to continue developing critical thinking skills and apply them when working with AI, so that in the scenarios where it should have responded &#8220;I don&#8217;t know&#8221;, you rely more on your own abilities.</p>



<p>Sure, there are tasks we are more confident delegating for AI to work on, but the ones we know fall outside the Jagged Frontier, we must proceed with caution and care. We discussed our <strong>confidence level</strong> with AI output a lot. For example, <a href="https://www.linkedin.com/in/andredsantos/" target="_blank" rel="noreferrer noopener">André Santos</a> said it depends on the task we give it, but <a href="https://www.linkedin.com/in/asoliveira/">André</a><a href="https://www.linkedin.com/in/asoliveira/" target="_blank" rel="noreferrer noopener"> Oliveira</a> also argues that we can only validate the output in the topics we know. It serves as an <strong>amplifier</strong> because it&#8217;s only a tool. If the wielder of the tool doesn&#8217;t fact-check the output, we risk believing the hallucinations and false statements/claims. <a href="https://www.linkedin.com/in/pedrovala" target="_blank" rel="noreferrer noopener">Pedro Vala</a> also talked about a really good quote from the <a href="https://www.amazon.com/Agentic-Design-Patterns-Hands-Intelligent/dp/3032014018" target="_blank" rel="noreferrer noopener">Agentic Design Patterns book</a> that is super relevant to this topic:</p>



<pre class="wp-block-code"><code><em>An AI trained on "garbage" data doesn’t just produce garbage-out; it produces plausible, confident garbage that can poison an entire process - Marco Argenti, CIO, Goldman Sachs</em></code></pre>



<p>Now imagine, if we read the AI output, and at first glance it looks okay, but it&#8217;s only plausible garbage. Which is a real risk, especially on the AI-generated content that is already <a href="https://graphite.io/five-percent/more-articles-are-now-created-by-ai-than-humans" target="_blank" rel="noreferrer noopener">available in the internet</a>. Again, I hope developers continue to develop their critical thinking skills and don&#8217;t delegate their thinking to tools. Right now, the only process I have of filtering out garbage on the internet is consuming most content from authors I respect, and I know for a fact are real people 😅.</p>



<h3 class="wp-block-heading">Disruption in the job market</h3>



<p>Mollick also talks about the disruption in the job market, which is a hot topic in our industry. Especially the impact AI has on junior roles. We have debated this in a few sessions of our book club, and again, critical thinking and adaptability are crucial. We simply have to adapt and learn how to use this tool, nothing less, nothing more. How much value we bring to the table when working with AI matters, especially if the&nbsp;<strong>value</strong>&nbsp;you bring is very tiny. If you don&#8217;t bring any value to the table and just copy/paste, you are not a valuable professional in my view.</p>



<p>It&#8217;s a good idea to keep <strong>developing our skills and expertise</strong>. Andrej Karpathy talks about <a href="https://www.youtube.com/watch?v=LCEmiRjPEtQ" target="_blank" rel="noreferrer noopener">intelligence &#8220;brownout&#8221; when LLMs go down</a>, this is extremely scary to me, especially if I see this behaviour in junior or college grads. I truly hope we stop delegating so much intelligence to a tool. I don&#8217;t want engineers to <strong>rely</strong> on LLMs when production is down and on fire. It would be sad to see engineers not knowing how to troubleshoot, how to fix these accidents in production&#8230; just because AI tools are not available 😐.</p>



<h2 class="wp-block-heading">Centaur vs Cyborg approaches</h2>



<p>The book distinguishes between two ways of working with AI:</p>



<ol style="max-width:985px" class="wp-block-list">
<li><strong>Centaur</strong>: You divide tasks between human and machine. You handle the &#8220;Just me&#8221; tasks (outside the Jagged Frontier), and delegate specific sub-tasks to the AI that you later verify.</li>



<li><strong>Cyborg</strong>: You integrate AI so deeply that the workflow becomes a hybrid, often automating entire processes.</li>
</ol>



<p>For software development, I&#8217;m definitely in the&nbsp;<strong>Centaur</strong>&nbsp;camp right now. We should be careful about what tasks we delegate. Again, remember the <strong>&#8220;falling asleep at the wheel&#8221;</strong>.&nbsp;When the AI is very good, humans have no reason to work hard and pay attention. They let the AI take over instead of using it as a tool, which can hurt our learning process and skill development. Or in some scenarios, it can lead to your production database being deleted&#8230;</p>



<p>This is just a tool. We are still responsible at work. If the AI pushes a bug to production,&nbsp;<em>you</em>&nbsp;pushed a bug to production!</p>



<p>The author does give some &#8220;Cyborg examples&#8221; of working with AI, here is a quote from the book:</p>



<pre class="wp-block-code"><code><em>I would become a Cyborg and tell the AI: I am stuck on a paragraph in a section of a book about how AI can help get you unstuck. Can you help me rewrite the paragraph and finish it by giving me 10 options for the entire paragraph in various professional styles? Make the styles and approaches different from each other, making them extremely well written.</em></code></pre>



<p>This is that ideation use case that is super useful when you have writer&#8217;s block, or just want to brainstorm a bit on a given topic. In our industry, a lot of teams are integrating AI in many phases of the SDLC. I haven&#8217;t found many workflows that work well in some parts of the SDLC, since we are focusing on adopting AI for coding and code review. But in most workflows, the cyborg practice is to steer more the AI and manage the tasks where you collaborate with AI as a co-worker.</p>



<p>The risk remains even when someone uses cyborg practices, but then fails to spot hallucinations or false claims. The takeaway is really to be conscious of our AI adoption and usage. The number one cyborg practice I try to do naturally is to push back. If I smell something is off, I will disagree with the output and ask the AI to reconsider. This leads to a far more interesting back-and-forth conversation on a given topic.</p>



<h2 class="wp-block-heading">Resources</h2>



<p>Here are some resources if you want to dive deeper:</p>



<ul style="max-width:985px" class="wp-block-list">
<li><a href="https://www.amazon.com/Co-Intelligence-Living-Working-Ethan-Mollick/dp/059371671X" target="_blank" rel="noreferrer noopener">Co-intelligence by Ethan Mollick</a></li>



<li><a href="https://www.hbs.edu/ris/Publication%20Files/24-013_d9b45b68-9e74-42d6-a1c6-c72fb70c7282.pdf" target="_blank" rel="noreferrer noopener">Navigating the Jagged Technological Frontier</a></li>



<li><a href="https://www.amazon.com/Agentic-Design-Patterns-Hands-Intelligent/dp/3032014018" target="_blank" rel="noreferrer noopener">Agentic Design Patterns: A Hands-On Guide to Building Intelligent Systems</a></li>



<li><a href="https://www.youtube.com/watch?v=LCEmiRjPEtQ" target="_blank" rel="noreferrer noopener">Andrej Karpathy: Software Is Changing (Again)</a></li>



<li><a href="https://www.oneusefulthing.org/p/centaurs-and-cyborgs-on-the-jagged" target="_blank" rel="noreferrer noopener">Centaurs and Cyborgs on the Jagged Frontier</a></li>



<li><a href="https://zed.dev/blog/why-llms-cant-build-software" target="_blank" rel="noreferrer noopener">Why LLMs Can&#8217;t Really Build Software</a></li>



<li><a href="https://openai.com/index/why-language-models-hallucinate/" target="_blank" rel="noreferrer noopener">Why language models hallucinate | OpenAI</a></li>
</ul>



<h2 class="wp-block-heading">Conclusion</h2>



<p>This was a great book, I truly recommend it to anyone who is interested in the slightest by AI. Co-intelligence is something we can strive for, focusing on adopting this new tool that can help us develop ourselves. Our expertise and our skills. When it was written, we had GPT 3.5 and GPT-4 was recent I believe&#8230; now we have GPT-5.3-Codex, Opus 4.6, GLM 4.7, and Kimi K2.5. I mean, in 2 years things just keep on changing 😅. The Jagged Frontier will keep changing, so this calls for experimentation. AI pioneers will do most of this experimentation, running evals and whatnot, to understand where each type of task falls in the Jagged Frontier. Pay attention to what they share, what works, and what doesn&#8217;t.</p>



<p>AI has augmented my team and me, mostly on &#8220;Centaur&#8221; tasks while we improve our AI fluency and usage. In my personal opinion, I don&#8217;t see us reaching the AGI scenario Ethan talks about in the last chapter. Actually, most of our industry talks and continues to hype AGI&#8230; even the exponential growth scenario raises some doubts for me.</p>



<p>But I agree with Ethan when he says: &#8220;No one wants to go back to working six days a week (&#8230;)&#8221; 😅. We should continue to focus on building our own expertise, and not delegating critical thinking to AI. There is a new skill in town, we now have LLM whisperers 😅, and having this skill can indeed augment you even further. Just remember the fundamentals don&#8217;t change. Engineers still need to know those! There are hundreds of &#8220;Vibe Coding Cleanup Specialist&#8221; now 🤣. Let&#8217;s remember to be the human in the loop. Apply critical thinking to any AI output, do fact-checking, and take&nbsp;<strong>ownership</strong>&nbsp;of the final result. Please don&#8217;t create AI slop 😅.</p>



<p>Hope you enjoyed this post! My next blog post will be about how we are using agentic coding tools, so stay tuned! Feel free to share in the comments your opinion too, or reach out and we can have a chat 🙂.</p>



<p>If you&#8217;re interested, check out my latest blog posts about AI:</p>



<ul style="max-width:985px" class="wp-block-list">
<li><a href="https://blogit.create.pt/davidpereira/2026/01/09/lessons-learned-improving-code-reviews-with-ai/" id="https://blogit.create.pt/davidpereira/2026/01/09/lessons-learned-improving-code-reviews-with-ai/" target="_blank" rel="noreferrer noopener">Lessons learned improving code reviews with AI</a></li>



<li><a href="https://blogit.create.pt/davidpereira/2025/09/10/becoming-augmented-by-ai/" id="https://blogit.create.pt/davidpereira/2025/09/10/becoming-augmented-by-ai/" target="_blank" rel="noreferrer noopener">Becoming augmented by AI</a></li>
</ul>
<p>The post <a href="https://blogit.create.pt/davidpereira/2026/02/08/book-review-co-intelligence-by-ethan-mollick/">Book Review: Co-Intelligence by Ethan Mollick</a> appeared first on <a href="https://blogit.create.pt">Blog IT</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blogit.create.pt/davidpereira/2026/02/08/book-review-co-intelligence-by-ethan-mollick/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Lessons learned improving code reviews with AI</title>
		<link>https://blogit.create.pt/davidpereira/2026/01/09/lessons-learned-improving-code-reviews-with-ai/</link>
					<comments>https://blogit.create.pt/davidpereira/2026/01/09/lessons-learned-improving-code-reviews-with-ai/#respond</comments>
		
		<dc:creator><![CDATA[David Pereira]]></dc:creator>
		<pubDate>Fri, 09 Jan 2026 12:44:41 +0000</pubDate>
				<category><![CDATA[Misc]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[GenAI]]></category>
		<guid isPermaLink="false">https://blogit.create.pt/?p=13548</guid>

					<description><![CDATA[<p>Table of Contents Introduction I have loved code reviews for years now, and still to this day, I love seeing good open source PRs! When I say good, I mean really great! We have access to tons of open source code, and the greatest PRs are the ones where you can learn a lot from [&#8230;]</p>
<p>The post <a href="https://blogit.create.pt/davidpereira/2026/01/09/lessons-learned-improving-code-reviews-with-ai/">Lessons learned improving code reviews with AI</a> appeared first on <a href="https://blogit.create.pt">Blog IT</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Table of Contents</h2>



<ul style="max-width:1005px" class="wp-block-list">
<li>Introduction</li>



<li>Why we started experimenting</li>



<li>Our AI code review journey
<ul style="max-width:960px" class="wp-block-list">
<li>Claude Code</li>



<li>Saving learnings in memory</li>



<li>GitHub Copilot</li>



<li>CodeRabbit and Qodo</li>
</ul>
</li>



<li>Tool of choice
<ul style="max-width:960px" class="wp-block-list">
<li>Improving multi-agent collaboration</li>
</ul>
</li>



<li>Resources</li>



<li>Conclusion</li>
</ul>



<h2 class="wp-block-heading">Introduction</h2>



<p>I have loved code reviews for years now, and still to this day, I love seeing good open source PRs! When I say good, I mean really great! We have access to tons of open source code, and the greatest PRs are the ones where you can learn a lot from on&nbsp;<strong>how to do it right</strong>. In a sense, this blog post is about just that. This blog post is part of a series where I share how AI is augmenting my work, and what I&#8217;m learning from it. If you&#8217;re interested, you can read the first post here:&nbsp;<a href="https://blogit.create.pt/davidpereira/2025/09/10/becoming-augmented-by-ai/" target="_blank" rel="noreferrer noopener">Becoming augmented by AI</a>. In that post, I reference how AI has augmented me with an &#8220;initial code review&#8221;, but now I&#8217;ll go deeper into this topic. I&#8217;ll share our hands-on experience: what works, what doesn&#8217;t, and a healthy dose of my opinions along the way 😄.</p>



<p><strong>Quick disclaimer</strong>: what works for us might not work for you. Your team and coding guidelines are different, and that&#8217;s fine. These are just our honest experiences.</p>



<p>With that said, let&#8217;s dive into why we started incorporating AI tools in our code review process.</p>



<h2 class="wp-block-heading">Why we started experimenting<a href="https://github.com/BOLT04/Blog-Posts/blob/master/2025/lessons-learned-from-improving-code-reviews-ai.md#why-we-started-experimenting"></a></h2>



<p>I recently watched this amazing&nbsp;<a href="https://www.youtube.com/watch?v=glfB3KLQR7E" target="_blank" rel="noreferrer noopener">video by CodeRabbit</a>. In our team, code review isn&#8217;t really the bottleneck (yet), but it&#8217;s funny because we are also using AI heavily for feature development and trying to improve&#8230; hummm &#8220;velocity&#8221; 🤣.</p>



<p>Anyway, I understand many teams nowadays have increased the number of PRs created. That some PRs simply get a blind LGTM.</p>



<figure class="wp-block-image size-large is-resized"><img fetchpriority="high" decoding="async" width="300" height="168" src="https://blogit.create.pt/wp-content/uploads/2026/01/giphy.gif" alt="" class="wp-image-13589" style="aspect-ratio:1.785770356097909;width:464px;height:auto" /></figure>



<p>Maybe some PRs just have increasingly more AI slop&#8230; which wears down senior engineers tasked to do code review 😅. Not all professionals would&nbsp;<strong>want to do it right</strong>&nbsp;or maybe they just want to ship because their company&#8217;s &#8220;productivity metrics&#8221; incentivize merging more and more PRs 😅. Honestly, it&#8217;s&nbsp;<a href="https://simonwillison.net/2025/Dec/18/code-proven-to-work/" target="_blank" rel="noreferrer noopener">our job to deliver code we have proven to work</a>, I fully agree with Simon Willison. Throwing slop over to the engineers that do code review is unprofessional, just as much as throwing untested features over to QA 😐. In our case, we changed to having a dedicated dev responsible for all code reviews, and we don&#8217;t have that many per day. We simply wanted to improve code quality and reduce bugs, while keeping code review as an educational process for junior engineers.</p>



<p>About five months ago, our team started experimenting with AI tools, GitHub Copilot, Claude Code, Codacy, Qodo, and CodeRabbit to see how they could help us improve our review process without adding a ton of noise. There are more tools we didn&#8217;t try, like Augment Code and Greptile (has some cool&nbsp;<a href="https://www.greptile.com/benchmarks" target="_blank" rel="noreferrer noopener">benchmarks</a>), but hopefully the lessons we learned will be useful to you either way.</p>



<p></p>



<h2 class="wp-block-heading">Our AI code review journey</h2>



<p>We already talked in the last post about our&nbsp;<a href="https://blogit.create.pt/davidpereira/2025/09/10/becoming-augmented-by-ai/#custom-instructions" target="_blank" rel="noreferrer noopener">custom instructions</a>, to some extent. Specifically for code review we took a phased approach and started comparing different tools:</p>



<ol style="max-width:965px" class="wp-block-list">
<li>Started with&nbsp;<a href="https://docs.github.com/en/copilot/concepts/agents/code-review" target="_blank" rel="noreferrer noopener">GitHub Copilot Code Review</a></li>



<li>Integrated Claude Code with GitHub and started comparing code reviews from both tools</li>



<li>Added CodeRabbit, Qodo and Codacy to spot differences between them</li>



<li>Refined prompts/instructions/configs for some tools</li>
</ol>



<p>We didn&#8217;t invest equal time in all of them, though. Copilot and Claude ended up getting most of our attention, especially since we started using Copilot Code Review (CCR) when it was in public preview. Overall, we experimented with these tools in 30+ PRs, and made 20+ PRs to refine our prompts/instructions/agents.</p>



<h3 class="wp-block-heading">Claude Code</h3>



<p>Let&#8217;s go through Claude Code first. Here is a snippet of our&nbsp;<code>code-review</code>&nbsp;Claude Code custom slash command:</p>



<pre class="wp-block-code"><code>---
allowed-tools: Bash(dotnet test), Read, Glob, Grep, LS, Task, Explore, mcp.....
description: Perform a comprehensive code review of the requested PR or code changes, taking into consideration code standards
---

## Role

You are a world-class autonomous code review agent. You operate within a secure GitHub Actions environment.
Your analysis is precise, your feedback is constructive, and your adherence to instructions is absolute.
You do not deviate from your programming. You are tasked with reviewing a GitHub Pull Request.

## Primary Directive

Your sole purpose is to perform a comprehensive and constructive code review of this PR, and post all feedback and suggestions using the **GitHub review system** and provided tools.
All output must be directed through these tools. Any analysis not submitted as a review comment or summary is lost and constitutes a task failure.

## Input data
PR NUMBER: $ARGUMENTS

You MUST follow these steps to review the PR:
1. **Start a review**: Use `mcp__github__create_pending_pull_request_review` to begin a pending review
2. **Get diff information**: Use `mcp__github__get_pull_request_diff` to understand the code changes and line numbers
3. **Get list of files**: If you can't get diff information, use `mcp__github__get_pull_request_files` to get the list of files that were added, removed, and changed in the pull request
4. **Add comments**: Use `mcp__github__add_comment_to_pending_review` for each specific piece of feedback on particular lines
5. **Submit the review**: Use `mcp__github__submit_pending_pull_request_review` with event type "COMMENT" (not "REQUEST_CHANGES") to publish all comments as a non-blocking review

You can find all the code review standards and guidelines that you MUST follow here: `.github/instructions/code-review.instructions.md`

## Output format

**CRITICAL RULE** - DO NOT include compliments, positive notes, or praise in your review comments.
Be thorough but filter your comments aggressively - quality over quantity. Focus ONLY on issues, improvements, and actionable feedback.

**Output Violation Examples** (DO NOT DO THIS):
`The code follows best practices by...`
`Positive changes/notes`

**Important**: Submit as "COMMENT" type so the review doesn't block the PR.</code></pre>



<p>Yes, some wording might be weird like praising the AI with &#8220;You are a world-class&#8221; or &#8220;your adherence to instructions is absolute&#8221;. Like we mentioned about using uppercase &#8220;DO NOT&#8221; or &#8220;IMPORTANT&#8221;, and others, I can&#8217;t explain some of this stuff or find enough research that claims this affects how the LLM pays&nbsp;<strong>attention</strong>&nbsp;to instructions. I just experiment and learn, and&nbsp;<a href="https://github.com/google-github-actions/run-gemini-cli/blob/main/examples/workflows/pr-review/gemini-review.toml" target="_blank" rel="noreferrer noopener">Gemini</a>&nbsp;likes to use this phrase for code reviews as well 😄 (as well has 115 other devs on GitHub 😅).</p>



<p>To be honest, we still have too much noise in AI PR comments, or just tons of fluff. The bright side is, at least the compliments have kind of disappeared 😅 . You might enjoy getting this:</p>



<figure class="wp-block-image size-full"><img decoding="async" width="831" height="182" src="https://blogit.create.pt/wp-content/uploads/2026/01/image-2.png" alt="" class="wp-image-13558" srcset="https://blogit.create.pt/wp-content/uploads/2026/01/image-2.png 831w, https://blogit.create.pt/wp-content/uploads/2026/01/image-2-300x66.png 300w, https://blogit.create.pt/wp-content/uploads/2026/01/image-2-768x168.png 768w, https://blogit.create.pt/wp-content/uploads/2026/01/image-2-696x152.png 696w" sizes="(max-width: 831px) 100vw, 831px" /></figure>



<p>I don&#8217;t 🤣, especially when 1 PR has 5 of these. I do praise comments for my team yes, because positive comments are good&#8230; when it comes from a human who knows the other person, IMO. Also, there are many comments that don&#8217;t belong in a PR, they belong in a linter or other tools. We have&nbsp;<a href="https://csharpier.com/docs/About" target="_blank" rel="noreferrer noopener">CSharpier</a>&nbsp;and&nbsp;<a href="https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/overview?tabs=net-10" target="_blank" rel="noreferrer noopener">.NET analyzers</a>&nbsp;for that.</p>



<p>It also doesn&#8217;t have the best GitHub integration for now, at least we&#8217;ve had some problems (<a href="https://github.com/anthropics/claude-code-action/issues/584" target="_blank" rel="noreferrer noopener">400 errors</a>,&nbsp;<a href="https://github.com/anthropics/claude-code-action/issues/589" target="_blank" rel="noreferrer noopener">branch 404 errors</a>) with the GitHub action. Like&nbsp;<a href="https://github.com/anthropics/claude-code-action/issues/548" target="_blank" rel="noreferrer noopener">not having access to GitHub mcp tools</a>, even though we set it in&nbsp;<code>allowed-tools</code>&nbsp;option.</p>



<figure class="wp-block-image size-full"><img decoding="async" width="782" height="72" src="https://blogit.create.pt/wp-content/uploads/2026/01/image-1.png" alt="" class="wp-image-13557" srcset="https://blogit.create.pt/wp-content/uploads/2026/01/image-1.png 782w, https://blogit.create.pt/wp-content/uploads/2026/01/image-1-300x28.png 300w, https://blogit.create.pt/wp-content/uploads/2026/01/image-1-768x71.png 768w, https://blogit.create.pt/wp-content/uploads/2026/01/image-1-696x64.png 696w" sizes="(max-width: 782px) 100vw, 782px" /></figure>



<p>Anyway, we iterated a lot on instructions and prompts so far, since we use them for both Claude and Copilot. Here is a quick recap of what features we use from Claude Code:</p>



<ul style="max-width:965px" class="wp-block-list">
<li>Sub-agents (custom and built-in)</li>



<li>Built-in&nbsp;<code>/review</code>&nbsp;and&nbsp;<a href="https://www.claude.com/blog/automate-security-reviews-with-claude-code" target="_blank" rel="noreferrer noopener">security review</a>&nbsp;commands</li>



<li>Custom slash commands (<code>code-review.md</code>)</li>



<li>Plugins, specifically&nbsp;<a href="https://github.com/anthropics/claude-code/blob/main/plugins/code-review/commands/code-review.md" target="_blank" rel="noreferrer noopener">code-review plugin</a>&nbsp;authored by Boris Cherny</li>
</ul>



<p>We leverage those 2 built-in commands, in parallel, but it&#8217;s just to see if we get any good feedback. Our custom code review slash command already does a good review following our guidelines, plus the &#8220;code-review&#8221; plugin from Boris is works very well with parallel agents. We basically went through the famous spiral:</p>



<pre class="wp-block-code"><code>Write CLAUDE.md -&gt; Ask for code review -&gt; Find bad comments and noise we don't want -&gt; Re-write CLAUDE.md and other files -&gt; Do some meta-prompting -&gt; Repeat</code></pre>



<p>Like I said, our custom code review prompt/command has evolved through time, and was refined when we learned something new. We started with this&nbsp;<a href="https://github.com/anthropics/claude-code-action/issues/60#issuecomment-2952771401" target="_blank" rel="noreferrer noopener">incredible suggestion</a>&nbsp;to use the GitHub MCP. We also searched for other GitHub repos, mostly .NET related to see how they set up their instructions. In case they have anything particular around code review (e.g. for GitHub Copilot). I find&nbsp;<a href="https://github.com/dotnet/aspire/blob/main/.github/copilot-instructions.md">.NET Aspire</a>&nbsp;to be a super cool real-life example 🙂 . I think a lot of their AI adoption is lead by David Fowler. So I often check their PRs to see what we can learn from them, e.g.&nbsp;<a href="https://github.com/dotnet/aspire/pull/13361" target="_blank" rel="noreferrer noopener">this one</a>.</p>



<p>Anyway, our prompt was still a bit vague, so we had some chats with Claude, good old meta-prompting 🙂. After a while, Claude suggested a new file that has all the coding standards and bad smells we want to avoid &#8211;&nbsp;<code>code-review.instructions.md</code>. It does live under&nbsp;<code>.github/instructions</code>&nbsp;but it doesn&#8217;t matter, Claude can use it. The bad smells are specific and we see them referenced quite often in our PRs now. Still, we don&#8217;t have a perfect solution for overly large PRs. We simply communicate more often or have more than one dev working in the PR for those cases. When a feature genuinely requires lots of new code, the best forum to debate and provide actionable feedback is by talking. Sure, this isn&#8217;t always possible, people are busy or prefer async work. In our team going on call, or during the demo of the PR, helps make large PRs way more digestible. Draft PRs also work somewhat, to get some feedback early on.</p>



<h4 class="wp-block-heading">Avoiding noise comments</h4>



<p>Our biggest lesson learned here is running locally our custom slash command for code review and using sug-agents. Locally, we can try to provide the proper context for the review, the rest is the agent using tools and doing reasoning. No noise gets sent to GitHub comments because all the back-and-forth is done in the chat, plus right now Claude Code works better locally, not on GitHub Actions. Having sub-agents has been amazing since the main reason Claude Code uses it is for context management. Since we now have a built-in&nbsp;<code>Explore</code>&nbsp;sub-agent, our code review command uses that in order to have Explore sub-agents run in parallel (with Haiku 4.5) and not clog up the main context window.</p>



<p>I&#8217;ve learned recently of&nbsp;<a href="https://blog.sshh.io/i/177742847/custom-subagents" target="_blank" rel="noreferrer noopener">other devs using a different workflow</a>, basically leveraging the&nbsp;<code>Task</code>&nbsp;tool for the main agent to spawn sub-agents. Whichever way you want to do it, using a sub-agent that is focused on exploring the codebase and potential impacts of this PR is something I recommend.<a href="https://github.com/BOLT04/Blog-Posts/blob/master/2025/lessons-learned-from-improving-code-reviews-ai.md#avoiding-noise-comments"></a></p>



<h3 class="wp-block-heading">Saving learnings in memory</h3>



<p>Every once in a while, once we&#8217;ve merged a few PRs. We use Claude to improve itself again based on these PRs. This is our prompt:</p>



<pre class="wp-block-code"><code>Please look at the 5 most recent PRs in our GitHub repository, and check for learnings in order to improve the code review workflow. Please ultrathink on this task, so that all necessary memory files are updated taking into account these learnings, like @CLAUDE.md and @.github\instructions\ Focus on seeing code review comments that were good and made it into the codebase afterwards (e.g. coding standards violations). Ignore bad comments that were resolved with a "negative comment" or thumbs down emoji. Ask me clarifying questions before you begin. YOU MUST create a changelog file explaining why you made these edits to instruction files. Each learning must reference a PR that exists. The best is for you to link the exact comment that you used for a given learning</code></pre>



<p>At the end of the session, we usually have a few items that are good enough to add. Mostly are&nbsp;<strong>learnings around bugs</strong>&nbsp;we can catch earlier, some are coding standards. Honestly, a lot of suggestions aren&#8217;t what I want or I just think they won&#8217;t be useful in future code reviews. But doing this has been important for me to also take a step back and think about what we can learn from the work we&#8217;ve already merged. I reflect on it and then discuss with my team. I&#8217;ve seen others also talk about this idea and have a&nbsp;<code>learnings.md</code>, e.g.&nbsp;<a href="https://github.com/nibzard/awesome-agentic-patterns/blob/main/LEARNINGS.md" target="_blank" rel="noreferrer noopener">this repo</a>. At least this process seems better for us than simply using emojis to give feedback that&nbsp;<a href="https://www.coderabbit.ai/blog/why-emojis-suck-for-reinforcement-learning" target="_blank" rel="noreferrer noopener">CodeRabbit blog</a>&nbsp;also eludes to 😅.<a href="https://github.com/BOLT04/Blog-Posts/blob/master/2025/lessons-learned-from-improving-code-reviews-ai.md#saving-learnings-in-memory"></a></p>



<h3 class="wp-block-heading">GitHub Copilot</h3>



<p>Copilot&#8217;s code review features were super basic in the beginning. We tried and experimented with it a lot when it came out. It only caught nitpicks,&nbsp;<code>console.log</code>&nbsp;and typos, really not helpful on any other area. Sure catching this is good, but a human reviewer catches that in the first pass too. It didn&#8217;t support all languages so we often got 0 comments or feedback. Then in the last months, completely different, night and day.</p>



<p>If you have seen GitHub Universe, you know <a href="https://dev.to/bolt04/github-universe-2025-recap-9gl" target="_blank" rel="noreferrer noopener">what&#8217;s new</a>. But in case you don&#8217;t know, the GitHub team has invested heavily in Copilot code review and coding agent, and it shows. The code review agent is often right in every comment, it makes suggestions that are actually based on our instructions and memory files, meaning our PRs follow consistent code style and team conventions (with a link to these&nbsp;<a href="https://docs.github.com/en/copilot/how-tos/configure-custom-instructions/add-repository-instructions" target="_blank" rel="noreferrer noopener">docs</a>).</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="797" height="356" src="https://blogit.create.pt/wp-content/uploads/2026/01/image-4.png" alt="" class="wp-image-13562" style="aspect-ratio:2.2388195797239607;width:799px;height:auto" srcset="https://blogit.create.pt/wp-content/uploads/2026/01/image-4.png 797w, https://blogit.create.pt/wp-content/uploads/2026/01/image-4-300x134.png 300w, https://blogit.create.pt/wp-content/uploads/2026/01/image-4-768x343.png 768w, https://blogit.create.pt/wp-content/uploads/2026/01/image-4-696x311.png 696w" sizes="(max-width: 797px) 100vw, 797px" /></figure>



<p>And the agent session is somewhat transparent, since you can view it in GitHub actions now:</p>



<figure class="wp-block-image size-full"><img decoding="async" width="998" height="262" src="https://blogit.create.pt/wp-content/uploads/2026/01/image-3.png" alt="" class="wp-image-13559" srcset="https://blogit.create.pt/wp-content/uploads/2026/01/image-3.png 998w, https://blogit.create.pt/wp-content/uploads/2026/01/image-3-300x79.png 300w, https://blogit.create.pt/wp-content/uploads/2026/01/image-3-768x202.png 768w, https://blogit.create.pt/wp-content/uploads/2026/01/image-3-696x183.png 696w" sizes="(max-width: 998px) 100vw, 998px" /></figure>



<p>I mean &#8220;somewhat&#8221; because there are things I can&#8217;t configure, just like Claude Code and most tools, I guess 😅. In the logs I can see the option&nbsp;<code>UseGPT5Model=false</code>, and that it&#8217;s using Sonnet 4.5. There is also this &#8220;MoreSeniorReviews&#8221; flag that I couldn&#8217;t find any info on, and believe me&#8230; I wanted to because it was set to false 🤣 &#8211; the logs show <code>ccr[MoreSeniorReviews=false;EnableAgenticTools=true;EnableMemoryUsage=false...</code></p>



<p>Are you telling me there could be a hidden way to get a more senior review&#8230; sign me up! Jokes aside, I couldn&#8217;t find much info on the endpoint&nbsp;<code>api.githubcopilot.com/agents/swe</code>&nbsp;of CAPI (presumably Copilot API) the Autofind agent was calling, and the contents of the&nbsp;<code>ccr/callback</code>&nbsp;saved in&nbsp;<code>results-agent.json</code>. I can only hope some of these options are configurable in the future.</p>



<p>I checked the&nbsp;<a href="https://docs.github.com/en/copilot/how-tos/provide-context/use-mcp/extend-copilot-chat-with-mcp#remote-server-configuration-example-with-oauth" target="_blank" rel="noreferrer noopener">MCP docs</a>, hoping to find details about these options, but no luck.</p>



<p>Anyway, it also now has access to CodeQL and some linters, which is amazing because we didn&#8217;t have this before. It&#8217;s the way we are able to leverage CodeQL analysis in all our PRs now, we couldn&#8217;t do this in any other AI code review tool. We also see that it calls the tool &#8220;store_comment&#8221; during its session, and only submits the comments to GitHub in the end. This is useful since sometimes it stores a comment because it thought something was wrong in the implementation, and afterwards it read more code into context that invalidated the stored comment, so it no longer submits that comment in the PR. Much like the CodeRabbit validation agent, reducing the amount of noise we get in PRs.<a href="https://private-user-images.githubusercontent.com/18630253/523918240-368bf2e4-26fe-4342-8c91-bde756f00f63.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Njc4MjMyNTAsIm5iZiI6MTc2NzgyMjk1MCwicGF0aCI6Ii8xODYzMDI1My81MjM5MTgyNDAtMzY4YmYyZTQtMjZmZS00MzQyLThjOTEtYmRlNzU2ZjAwZjYzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjAxMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwMTA3VDIxNTU1MFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWIwNTE3MzI4YjM0MzhlOTNiZTFiYjc2MTFjM2VhNGJmNDlhYmNkMjUyZWM1OTg1MDRjZjI2OTQxNTZlODc3OWQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.ocuPov64xdo7orLKVnj6MevAujg8_k6GFgn-5lDYHCY" target="_blank" rel="noreferrer noopener"></a></p>



<h3 class="wp-block-heading">CodeRabbit and Qodo</h3>



<p>Let&#8217;s start with the cool features CodeRabbit has:</p>



<ul style="max-width:1005px" class="wp-block-list">
<li>Code diagrams in Mermaid</li>



<li>Generates a poem! Yes, a poem for my PR</li>



<li>Summary of changes added to the description</li>
</ul>



<p>Now&#8230; I gotta be honest, I don&#8217;t care about any of them 😅. They are cool, but I only glance at the poem or ignore it. Never read or care about the summary; I get one from Copilot and edit it myself. All code and sequence diagrams I saw generated in our PRs, were simply not useful, but a lot are from front-end code. I simply don&#8217;t look at them later, and if it makes sense, we update our architecture diagrams later once the code is merged. With that said, the code suggestions and feedback it obscene. By far the best code review AI tool when it comes to actionable and valuable feedback/suggestions (by a long shot)! Even if we didn&#8217;t configure&nbsp;<code>.coderabbit.yaml</code>&nbsp;or tried to optimize it, CodeRabbit already uses&nbsp;<a href="https://docs.coderabbit.ai/integrations/knowledge-base#code-guidelines:-automatic-team-rules" target="_blank" rel="noreferrer noopener">Claude and Copilot instructions</a>&nbsp;so the work we did on those was probably used in CodeRabbit. In some of our PRs it caught some nasty bugs and gave super useful feedback. Our team was impressed!</p>



<p>The insights CodeRabbit adds during code review piqued my interest. I read a few of their blog posts on context engineering like&nbsp;<a href="https://www.coderabbit.ai/blog/context-engineering-ai-code-reviews" target="_blank" rel="noreferrer noopener">this one</a>, where I found it interesting that there is a separate validation agent before submitting comments. This is probably why they maintain a high signal-to-noise ratio. I also read their open-source version of CodeRabbit, they have some&nbsp;<a href="https://github.com/coderabbitai/ai-pr-reviewer/blob/main/src/prompts.ts" target="_blank" rel="noreferrer noopener">prompts</a>&nbsp;there. I know it&#8217;s old, but it&#8217;s what I have access to. I especially like the instructions that we also have 😅 &#8220;Do NOT provide general feedback, summaries, explanations of changes, or praises for making good additions&#8221;.</p>



<p>We basically tried to have Claude and Copilot understand our large codebase, not focusing only on the PR diff. It&#8217;s harder, we still have a lot to improve here.&nbsp;<a href="https://www.coderabbit.ai/blog/how-coderabbit-delivers-accurate-ai-code-reviews-on-massive-codebases" target="_blank" rel="noreferrer noopener">CodeRabbit claims</a>&nbsp;it&#8217;s known to be great at understanding large codebases. I don&#8217;t see any research backing this, just opinions. But yes, we humans don&#8217;t like large PRs either:</p>



<figure class="wp-block-image size-full"><img decoding="async" width="638" height="436" src="https://blogit.create.pt/wp-content/uploads/2026/01/image-7.png" alt="" class="wp-image-13571" srcset="https://blogit.create.pt/wp-content/uploads/2026/01/image-7.png 638w, https://blogit.create.pt/wp-content/uploads/2026/01/image-7-300x205.png 300w, https://blogit.create.pt/wp-content/uploads/2026/01/image-7-615x420.png 615w, https://blogit.create.pt/wp-content/uploads/2026/01/image-7-218x150.png 218w" sizes="(max-width: 638px) 100vw, 638px" /></figure>



<p>In my opinion I couldn&#8217;t find that many large PRs that were way better reviewed by CodeRabbit, in comparison to Claude Code and Copilot. But one thing we liked a lot is that it uses&nbsp;<strong>collapsed sections</strong>&nbsp;in markdown very well, for example:</p>



<figure class="wp-block-image size-full"><img decoding="async" width="897" height="457" src="https://blogit.create.pt/wp-content/uploads/2026/01/image-5.png" alt="" class="wp-image-13563" srcset="https://blogit.create.pt/wp-content/uploads/2026/01/image-5.png 897w, https://blogit.create.pt/wp-content/uploads/2026/01/image-5-300x153.png 300w, https://blogit.create.pt/wp-content/uploads/2026/01/image-5-768x391.png 768w, https://blogit.create.pt/wp-content/uploads/2026/01/image-5-824x420.png 824w, https://blogit.create.pt/wp-content/uploads/2026/01/image-5-696x355.png 696w" sizes="(max-width: 897px) 100vw, 897px" /></figure>



<p>But I mean, we did have cases that we tried to use Claude Code for code review on a PR that was reviewed by CodeRabbit, and like ~60% of the context window was comments made by CodeRabbit. All that markdown ain&#8217;t friendly for AI with limited context windows. There were times I swear I could see Claude behind every word CodeRabbit made, with the &#8220;You&#8217;re absolutely correct&#8221; 🤣, e.g.</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="782" height="164" src="https://blogit.create.pt/wp-content/uploads/2026/01/image-6.png" alt="" class="wp-image-13564" style="width:836px;height:auto" srcset="https://blogit.create.pt/wp-content/uploads/2026/01/image-6.png 782w, https://blogit.create.pt/wp-content/uploads/2026/01/image-6-300x63.png 300w, https://blogit.create.pt/wp-content/uploads/2026/01/image-6-768x161.png 768w, https://blogit.create.pt/wp-content/uploads/2026/01/image-6-696x146.png 696w" sizes="(max-width: 782px) 100vw, 782px" /></figure>



<p>But it could be GPT models or whatever, we never truly know what is behind these products 🙂.</p>



<h4 class="wp-block-heading">Qodo</h4>



<p>As for Qodo, we liked the fact it checks for compliance and flags violations as non-compliant (no other tool had this built in). This was previously just a bullet point in our markdown file. The code review feedback was good, sometimes we ended up doing the suggested changes Qodo leaves in the comment. After reading more about what compliance checks Qodo does, we improved by adding specific instructions on our&nbsp;<code>code-review.instructions.md</code>&nbsp;for ISO 9001, GDPR and others:</p>



<pre class="wp-block-code"><code>## Regulatory Compliance Checks

### Data Protection (GDPR/HIPAA/PCI-DSS)
- Does this code handle PII (Personally Identifiable Information)?
- Are sensitive fields properly encrypted at rest and in transit?
- Is data retention policy followed (deletion after X days)?
- Are audit logs created for data access?
- Is data anonymization/pseudonymization applied where required?

### Security Standards (SOC 2 / ISO 27001)
- Are all external API calls wrapped with proper error handling?
- Is input validation present for all user inputs?
- Are authentication checks present on all sensitive endpoints?
- Are secrets/credentials stored securely (no hardcoding)?
- Is sensitive data logged or exposed in error messages?</code></pre>



<p>We kept experimenting with Qodo for longer than CodeRabbit, but the insights and feedback never reached the level of CodeRabbit. It was still a good tool that improved our codebase and sparked good discussions.</p>



<h2 class="wp-block-heading">Tool of choice</h2>



<p>Our prompts/instructions can still be improved, of course. We&#8217;ve experimented with different prompts, memory and instruction files. We&#8217;ve also researched how other teams use AI for code review, and how tools like CodeRabbit do context engineering. All of this is because our goal is to continue to improve our software development process and ensure high quality. Adopting new tools is a way of achieving this goal. Given that most AI code review tools have a price tag, we decided to focus on using only one/two tools and optimizing them. Yes, it&#8217;s Claude Code and GitHub Copilot 😄. I basically use 100% of both Copilot and Claude every month, but I get more requests from Claude even though I hit the weekly rate limit every time.</p>



<p>We know CodeRabbit is amazing, and these paid AI tools will continue getting better. There is actually a new tool supporting code review we didn&#8217;t use,&nbsp;<a href="https://www.augmentcode.com/product/code-review" target="_blank" rel="noreferrer noopener">Augment Code</a>&nbsp;(these AI companies move so fast 😅). No amount of customizing our setup with Claude or Copilot will reach the same output as these specific code review paid tools. But for us, it makes more sense to pay for one tool, for example, and leverage it in multiple steps of our software development lifecycle.</p>



<h3 class="wp-block-heading">Improving multi-agent collaboration</h3>



<p>Claude and Copilot are working very well for our code review process. But like I&#8217;ve been saying, there is work to do. We learned a lot from using each tool, but there are more areas to improve, at least in Claude Code since we have more flexibility there. I&#8217;m currently looking at implementing the &#8220;Debate and Consensus&#8221; multi-agent design pattern (<a href="https://arxiv.org/abs/2406.11776" target="_blank" rel="noreferrer noopener">Google DeepMind paper</a>&nbsp;and&nbsp;<a href="https://arxiv.org/abs/2509.11035" target="_blank" rel="noreferrer noopener">Free-MAD</a>), basically a&nbsp;<a href="https://learn.microsoft.com/en-us/azure/architecture/ai-ml/guide/ai-agent-design-patterns#group-chat-orchestration" target="_blank" rel="noreferrer noopener">group chat orchestration</a>. I just want to try it out, I&#8217;m not sure I&#8217;ll have better code reviews by having different agents (e.g. Security, Quality and Performance) debate and review the code through different perspectives. If they run sequentially, the quality agent can have questions for the performance agent, and each can agree or disagree with the reported issues. We can try out the LLM-as-a-Judge as well, to focus on reducing noise and following code quality standards.</p>



<p>Anyway, we&#8217;ll continue learning, optimizing, and improving the way we work 🙂.</p>



<h2 class="wp-block-heading">Resources</h2>



<ul style="max-width:1005px" class="wp-block-list">
<li><a href="https://graphite.com/blog/ai-wont-replace-human-code-review" target="_blank" rel="noreferrer noopener">Why AI will never replace human code review</a></li>



<li><a href="https://www.youtube.com/watch?v=-GIiTfKZx6M" target="_blank" rel="noreferrer noopener">AI Code Reviews with CodeRabbit&#8217;s Howon Lee</a></li>



<li><a href="https://www.coderabbit.ai/blog/state-of-ai-vs-human-code-generation-report" target="_blank" rel="noreferrer noopener">CodeRabbit report: AI code creates 1.7x more problems</a></li>



<li><a href="https://awesomereviewers.com/reviewers/" target="_blank" rel="noreferrer noopener">Awesome reviewers GH repo</a></li>



<li><a href="https://www.youtube.com/watch?v=nItsfXwujjg" target="_blank" rel="noreferrer noopener">Anthropic’s NEW Claude Code Review Agent (Full Open Source Workflow)</a></li>



<li><a href="https://blog.sshh.io/p/how-i-use-every-claude-code-feature" target="_blank" rel="noreferrer noopener">How I Use Every Claude Code Feature</a></li>
</ul>



<h2 class="wp-block-heading">Conclusion</h2>



<p>The number one thing we learned is:&nbsp;<strong>experimentation is king</strong>. Like we talked before, the Jagged Frontier changes with every model release. Claude Opus 4.5 behaves a bit differently, for example, on&nbsp;<a href="https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-4-best-practices#tool-usage-and-triggering" target="_blank" rel="noreferrer noopener">tool triggering</a>&#8230; maybe we can stop shouting and being aggressive 🤣. We must experiment and keep learning. We can&#8217;t calibrate the prompt once and expect the best result.</p>



<p>For now we are quite happy, the human reviewer has more time to focus on design decisions and discuss trade-offs with the author of the PR. I don&#8217;t envision a future where AI does 100% of the code review.</p>



<p>If you&#8217;re considering AI for code reviews, my advice is simple: just try it. Pick one tool, run a one-month pilot, and see what happens. The worst case is you turn it off. The best case is that your team becomes augmented and probably improves code quality.</p>



<p>My next blog post in this series will be about how we are using agentic coding tools! Are you using AI code review tools? I&#8217;d love to hear from you what your experience has been. Leave a comment and let&#8217;s chat 🙂 .</p>



<p></p>
<p>The post <a href="https://blogit.create.pt/davidpereira/2026/01/09/lessons-learned-improving-code-reviews-with-ai/">Lessons learned improving code reviews with AI</a> appeared first on <a href="https://blogit.create.pt">Blog IT</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blogit.create.pt/davidpereira/2026/01/09/lessons-learned-improving-code-reviews-with-ai/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Becoming augmented by AI</title>
		<link>https://blogit.create.pt/davidpereira/2025/09/10/becoming-augmented-by-ai/</link>
					<comments>https://blogit.create.pt/davidpereira/2025/09/10/becoming-augmented-by-ai/#respond</comments>
		
		<dc:creator><![CDATA[David Pereira]]></dc:creator>
		<pubDate>Wed, 10 Sep 2025 17:24:13 +0000</pubDate>
				<category><![CDATA[Misc]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[GenAI]]></category>
		<guid isPermaLink="false">https://blogit.create.pt/?p=13531</guid>

					<description><![CDATA[<p>Table of Contents Introduction We&#8217;re deep into Co-Intelligence in Create IT&#8217;s book club — definitely worth your time! Between that and the endless stream of LLM content online, I&#8217;ve been in full research mode. Still, I can&#8217;t just watch and hear others talk about these tools, I must experiment myself and learn how to use [&#8230;]</p>
<p>The post <a href="https://blogit.create.pt/davidpereira/2025/09/10/becoming-augmented-by-ai/">Becoming augmented by AI</a> appeared first on <a href="https://blogit.create.pt">Blog IT</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Table of Contents</h2>



<ul style="max-width:1005px" class="wp-block-list">
<li>Introduction</li>



<li>The &#8220;Jagged Frontier&#8221; concept</li>



<li>Becoming augmented by AI
<ul style="max-width:960px" class="wp-block-list">
<li>AI as a co-worker</li>



<li>AI as a co-teacher</li>
</ul>
</li>



<li>My augmentation list
<ul style="max-width:960px" class="wp-block-list">
<li>Custom instructions</li>



<li>Meta-prompting</li>
</ul>
</li>



<li>Resources</li>



<li>Conclusion</li>
</ul>



<h2 class="wp-block-heading">Introduction</h2>



<p>We&#8217;re deep into <a href="https://www.amazon.com/-/pt/dp/059371671X/ref=sr_1_1">Co-Intelligence</a> in Create IT&#8217;s book club — definitely worth your time! Between that and the endless stream of LLM content online, I&#8217;ve been in full research mode. Still, I can&#8217;t just watch and hear others talk about these tools, I must experiment myself and learn how to use them for my use cases.</p>



<p>Software development is complex. My job isn&#8217;t just churning out code, but there are many concepts in this book that we&#8217;ve internalized and started adopting. In this post, I&#8217;ll share my opinions and some of the practical guidelines our team has been following to be augmented by AI.</p>



<h2 class="wp-block-heading">The &#8220;Jagged Frontier&#8221; concept</h2>



<p>The Jagged Frontier described by the author Ethan Mollick is an amazing concept in my opinion. It&#8217;s where tasks that appear to be of similar difficulty may either be performed better or worse by humans using AI. Due to the &#8220;jagged&#8221; nature of the frontier, the same knowledge workflow of tasks can have tasks on both sides of the frontier according to a <a href="https://www.hbs.edu/ris/Publication%20Files/24-013_d9b45b68-9e74-42d6-a1c6-c72fb70c7282.pdf">publication where the author took part</a>.</p>



<p>This leads to the&nbsp;<strong>Centaur vs. Cyborg</strong>&nbsp;distinction which is really interesting. Using both approaches (deeply integrated collaboration and separation of tasks) seems to be the goal to achieve co-intelligence. One very important Cyborg practice seen in that publication is &#8220;push-back&#8221; and &#8220;demanding logic explanation&#8221;, meaning we disagree with the AI output, give it feedback, and ask it to reconsider and explain better. Or as I often do, ask it to double-check with official documentation that what it&#8217;s telling me is correct. It&#8217;s also important to understand that this frontier can change as these models improve. Hence, the focus on experimentation to understand where the Jagged Frontier lies in each LLM. It&#8217;s definitely knowledge that everyone in the industry right now wants to acquire (maybe share it afterwards 😅).</p>



<h2 class="wp-block-heading">Becoming augmented by AI</h2>



<p>I&#8217;m aware of the marketed productivity gains, where&nbsp;<a href="https://github.blog/news-insights/research/research-quantifying-github-copilots-impact-on-developer-productivity-and-happiness/">GitHub Copilot usage makes devs 55% faster</a>, and other studies that have been posted about GenAI increasing productivity. I&#8217;m also aware of the studies claiming the opposite 😄 like the&nbsp;<a href="https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/">METR study</a>&nbsp;showing AI makes devs&nbsp;<strong>19% slower</strong>. However, I don&#8217;t see 55% productivity gains for myself, and I don&#8217;t think it makes me slower either.</p>



<p>In my opinion, productivity gains aren&#8217;t measured by producing more code. Number of PRs? Nope. Acceptance rate for AI suggestions? Definitely not! I firmly believe the less code, the better. The less slop the better too 😄. I&#8217;m currently focused on assessing&nbsp;<strong>DORA metrics</strong>&nbsp;and others for my team, because we want to measure how AI-assisted coding and the other ways we use it as an augmentation tool, actually improves those metrics, or make them worse. The rest of marketing and hype doesn&#8217;t matter.</p>



<p>Ethan Mollick provides numerous examples and research on how professionals across industries are already leveraging AI tools, like the Cyborg approach. But if we focus on our software industry, what does it mean for a tech lead to be augmented by AI? What tasks would be good to involve an AI in without compromising quality?</p>



<h3 class="wp-block-heading">AI as a co-worker</h3>



<p>For a tech lead that works with Azure services, an important skill is to know how to leverage the correct Azure services to build, deploy, and manage a scalable solution. So it becomes very useful to have an AI partner that can have a conversation about this, for example about Azure Durable Functions. This conversation can be shallow, and not get all the implementation details 100% correct. That&#8217;s okay, because the tech lead (and any dev 😅) also needs to exhibit&nbsp;<strong>critical thinking</strong>&nbsp;and evaluate the AI responses.&nbsp;<strong>This is not a skill we want to delegate</strong>&nbsp;to these models, at least in my opinion and in the&nbsp;<a href="https://www.oneusefulthing.org/p/against-brain-damage">author&#8217;s opinion</a>. There is a relevant&nbsp;<a href="https://www.microsoft.com/en-us/research/wp-content/uploads/2025/01/lee_2025_ai_critical_thinking_survey.pdf">research paper</a>&nbsp;about this by Microsoft as well.</p>



<p>The goal can simply be to have a conversation with a co-worker to spark some new ideas or possible solutions that we haven&#8217;t thought of. Using AI for ideation is a great use case, not just for engineering, but for product features too like UI/UX, important metrics to capture, etc. If it generates 20 ideas, there is a higher chance you find the bad ones, filter them out, and clear your mind or steer it into better ideas. Here is an example to get some ideas on fixing a recurring exception:</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img decoding="async" width="1024" height="810" src="https://blogit.create.pt/wp-content/uploads/2025/09/image-1024x810.png" alt="" class="wp-image-13535" style="width:761px;height:auto" srcset="https://blogit.create.pt/wp-content/uploads/2025/09/image-1024x810.png 1024w, https://blogit.create.pt/wp-content/uploads/2025/09/image-300x237.png 300w, https://blogit.create.pt/wp-content/uploads/2025/09/image-768x607.png 768w, https://blogit.create.pt/wp-content/uploads/2025/09/image-531x420.png 531w, https://blogit.create.pt/wp-content/uploads/2025/09/image-696x550.png 696w, https://blogit.create.pt/wp-content/uploads/2025/09/image-1068x844.png 1068w, https://blogit.create.pt/wp-content/uploads/2025/09/image.png 1185w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Example of using AI to get multiple options</figcaption></figure>
</div>


<p></p>



<p>It asks clarifying questions so that I can give it more useful context. Then I can see the response, iterate, or ask for more ideas, etc. I usually always set these instructions for any LLM:</p>



<pre class="wp-block-code"><code>Ask clarifying questions before giving an answer. Keep explanations not too long. Try to be as insightful as possible, and remember to verify if a solution can be implemented when answering about Azure and architecture in general.
It's also very important for you to verify if there is official documentation that supports your claims and statements. Please find official documentation supporting your claims, before responding to a user. If there isn't documentation confirming your statement, don't include it in the response.</code></pre>



<p>That is also why it searches for docs. I&#8217;ve gotten way too many statements in the LLM&#8217;s response that when I follow-up on, it realizes it made an error, or assumption, etc. When I ask it further about that sentence that it just gave me, I just get &#8220;You&#8217;re right &#8211; I was wrong about that&#8221;&#8230; Don&#8217;t become too over-reliant on these tools 😅.</p>



<h3 class="wp-block-heading">AI as a co-teacher</h3>



<p>With that said, the tech lead and senior devs are also responsible for upskilling their team by sharing knowledge, best practices, challenging juniors with more complex tasks, etc. And this part of the job isn&#8217;t that simple; it&#8217;s hard to be a force multiplier that improves everyone around you. So, what if the tech lead could use AI in this way, by creating&nbsp;<a href="https://code.visualstudio.com/docs/copilot/customization/prompt-files">reusable prompts</a>, documentation, and custom agents? How about the tech lead uses AI as a co-teacher, and then shares how to do it with the rest of the team? All of these are then able to help juniors be onboarded, help them understand our codebase and our domain.&nbsp;<a href="https://www.anthropic.com/engineering/claude-code-best-practices">Claude Code Best practices post</a>&nbsp;also reference onboarding as a good use case that helps Anthropic engineers:</p>



<p><em>&#8220;At Anthropic, using Claude Code in this way has become our core onboarding workflow, significantly improving ramp-up time and reducing load on other engineers.&#8221;</em></p>



<p>A lot of onboarding time is spent on understanding the business logic and then how it&#8217;s implemented. For juniors, it&#8217;s also about the design patterns or codebase structure. So I really think this is a net-positive for the whole team.</p>



<h2 class="wp-block-heading">My augmentation list</h2>



<p>It might not be much, but these are essentially the tasks I&#8217;m augmented by AI:</p>



<p><strong>Technical</strong>:</p>



<ul style="max-width:1005px" class="wp-block-list">
<li><strong>Initial</strong>&nbsp;code review (e.g. nitpicks, typos), some stuff I should really just automate 😅</li>



<li>Generate summaries for the PR description</li>



<li>Architectural discussions, including trade-off and risk analysis
<ul style="max-width:960px" class="wp-block-list">
<li>Draft an ADR (Architecture decision record) based on my analysis and arguments</li>
</ul>
</li>



<li>Co-Teacher and Co-Worker
<ul style="max-width:960px" class="wp-block-list">
<li>&#8220;Deep Research&#8221; and discussion about possible solutions</li>



<li>Learn new tech with analogies or specific Azure features</li>



<li>Find new sources of information (e.g. blog posts, official docs, conference talks)</li>
</ul>
</li>



<li>Troubleshooting for specific infrastructure problems
<ul style="max-width:960px" class="wp-block-list">
<li>Generating KQL queries (e.g. rendering charts, analyzing traces &amp; exceptions &amp; dependencies)</li>
</ul>
</li>



<li>Refactoring and documentation suggestions</li>



<li>Generation of new unit tests given X scenarios</li>
</ul>



<p><strong>Non-technical</strong></p>



<ul style="max-width:1005px" class="wp-block-list">
<li>Summarizing book chapters/blog posts or videos (e.g. NotebookLM)</li>



<li>Role play in various scenarios (e.g. book discussions)</li>
</ul>



<p>Of course, we also need to talk about the tasks that fall outside the Jagged Frontier. Again, these can vary from person to person. From my usage and experiments so far, these are the tasks that currently fall outside the frontier:</p>



<ul style="max-width:1005px" class="wp-block-list">
<li>Being responsible for technical support tickets, where a customer encountered an error or has a question about our product. This involves answering the ticket, asking clarifying questions when necessary, opening up tickets on a 3rd party that are related to this issue, and then resolving the issue.</li>



<li>Deep valuable code review. This includes good insights, suggestions, and knowledge sharing to improve the PR author&#8217;s skills. <a href="https://www.coderabbit.ai/">CodeRabbit</a> does often give valuable code reviews, way better than any other solution. Still not the same as human review 🙂</li>



<li>Development of a v0 (or draft) for new complex features</li>



<li>Fixing bugs that require business domain knowledge</li>
</ul>



<p>Delegating some of those tasks would be cool, at least 50% 😄, while our engineering team focuses on other tasks. But oh well, maybe that day will come.</p>



<h2 class="wp-block-heading">AI-assisted coding</h2>



<p>AI-assisted coding can be very helpful on some tasks, and lately my goal is to increase the number of tasks AI can assist me. In our team, we&#8217;ve read&nbsp;<a href="https://www.anthropic.com/engineering/claude-code-best-practices">Claude Code Best practices</a>&nbsp;in order to learn and see what fits best for our use case. Then we dive deeper in some topics that post references, for example&nbsp;<a href="https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/extended-thinking-tips">these docs</a>&nbsp;were very useful to learn about Claude&#8217;s extended thinking feature, complementing the usage of &#8220;think&#8221; &lt; &#8220;think hard&#8221; &lt; &#8220;think harder&#8221; &lt; &#8220;ultrathink&#8221;. We also found&nbsp;<a href="https://simonwillison.net/2025/Apr/19/claude-code-best-practices/">this post by Simon</a>&nbsp;about this entire feature that was interesting. In most tasks, using an iterative approach, just like normal software development, is indeed way better than one-shot with the perfect prompt. Still, if it takes too many iterations, like some bugfixes were too complex because it&#8217;s hard to pinpoint the location of the bug, then it loses performance and overall becomes bad (infinite load spinner of death 🤣).</p>



<p>Before we can use AI-assisted coding on more complex tasks, we need to improve the output quality. So we&#8217;ve invested a lot of time in fine-tuning custom instructions and meta-prompting. Let&#8217;s talk about these two.</p>



<h3 class="wp-block-heading" id="custom-instructions">Custom Instructions</h3>



<p>According to Copilot docs, instructions should be short, self-contained statements. Most principles in&nbsp;<a href="https://learn.microsoft.com/en-us/training/modules/introduction-prompt-engineering-with-github-copilot/2-prompt-engineering-foundations-best-practices">prompt engineering</a>&nbsp;are about being short, specific, and making sure our critical instructions is something the model takes special attention to. Like everyone talks about, the context window is very important, so it&#8217;s really good if we can just have an instruction file of 200 lines. The longer our instructions are, the greater the risk that the LLM won&#8217;t follow them, since it can pay more attention to other tokens or forget relevant instructions. With that said, keeping instructions short is also a challenge when we use the few-shot prompting technique and add more examples.</p>



<p>To build our custom instructions, we used C# and Blazor files from&nbsp;<a href="https://github.com/github/awesome-copilot/tree/main">the awesome-copilot repo</a>&nbsp;and other sources of inspiration like&nbsp;<a href="https://parahelp.com/blog/prompt-design">parahelp prompt design</a>&nbsp;to get a first version. We wanted to know what techniques other teams use. Then we made specific edits to follow our own guidelines and removed rules specific to explaining concepts, etc. We also added some&nbsp;<strong>capitalized words</strong>&nbsp;that are common in system prompts or commands, like IMPORTANT, NEVER, ALWAYS, MUST. The IMPORTANT word is also at the end of the instruction, to try and&nbsp;<strong>refocus</strong>&nbsp;the attention to coding standards:</p>



<pre class="wp-block-code"><code>IMPORTANT: Follow our coding standards when implementing features or fixing bugs. If you are unsure about a specific coding standard, ask for clarification.</code></pre>



<p>I&#8217;m not 100% sure how this capitalization works, or why it works&#8230; and I have not found docs/evidence/research on this. All I know is that capitalized words have different tokens than lowercase. It&#8217;s probably something the model pays more attention to, since in the training data, when we use these words, it means it&#8217;s important. I do wish Microsoft, OpenAI, and Anthropic included this topic on capitalization in their prompt engineering docs/tutorials.</p>



<p>It&#8217;s at the end of our file since it&#8217;s also&nbsp;<a href="https://huggingface.co/papers/2307.03172">being researched that the beginning and end of a prompt</a>&nbsp;are what the LLM pays more attention to and finds more relevant. Some middle parts are &#8220;meh&#8221; and can be forgotten.&nbsp;<a href="https://learn.microsoft.com/en-us/azure/ai-foundry/openai/concepts/prompt-engineering?tabs=chat#repeat-instructions-at-the-end">Microsoft docs</a>&nbsp;say the same essentially, it&#8217;s known as &#8220;<strong>recency bias</strong>&#8220;. In most prompts we see, this section exists at the end to refocus the LLM&#8217;s attention.</p>



<h3 class="wp-block-heading">Meta-prompting</h3>



<p>Our goal also isn&#8217;t to have the perfect custom instructions and prompt, since refining it later with an iterative/conversational approach works well. But we came across the concept of&nbsp;<a href="https://cookbook.openai.com/examples/enhance_your_prompts_with_meta_prompting">meta-prompting</a>, a term that is becoming more popular. Basically, we asked Claude how to improve our prompt, and it gave us some cool ideas to improve our instructions/reusable prompts.</p>



<p>But don&#8217;t forget to use LLMs with caution&#8230; I keep getting &#8220;You&#8217;re absolutely right&#8230;&#8221; and it&#8217;s annoying how sycophantic it is oftentimes 😅</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="696" height="398" src="https://blogit.create.pt/wp-content/uploads/2025/09/image-3.png" alt="" class="wp-image-13542" srcset="https://blogit.create.pt/wp-content/uploads/2025/09/image-3.png 696w, https://blogit.create.pt/wp-content/uploads/2025/09/image-3-300x172.png 300w" sizes="(max-width: 696px) 100vw, 696px" /></figure>
</div>


<p>The quality of the output is most likely affected by the complexity of the task I&#8217;m working on too. Prompting skills only go so far, from what I&#8217;ve researched and learned so far, I can say there is a learning curve for understanding LLMs. So we need to continue experimenting and learning the layers between our prompt and the output we see.</p>



<h2 class="wp-block-heading">Resources</h2>



<p>This is not an exhaustive list by any means, just some resources I find very useful:</p>



<ul style="max-width:1005px" class="wp-block-list">
<li><a href="https://www.youtube.com/watch?v=EWvNQjAaOHw&amp;t=7238s">Andrej Karpathy &#8211; How I use LLMs</a></li>



<li><a href="https://www.youtube.com/watch?v=LCEmiRjPEtQ">Andrej Karpathy: Software Is Changing (Again)</a>
<ul style="max-width:960px" class="wp-block-list">
<li>Related to this is&nbsp;<a href="https://natesnewsletter.substack.com/p/software-30-vs-ai-agentic-mesh-why">this post from Nate Jones</a></li>
</ul>
</li>



<li><a href="https://www.youtube.com/watch?v=tbDDYKRFjhk">Does AI Actually Boost Developer Productivity? (100k Devs Study) &#8211; Yegor Denisov-Blanch, Stanford</a></li>



<li><a href="https://www.anthropic.com/engineering/claude-code-best-practices">Claude Code: Best practices for agentic coding</a></li>



<li><a href="https://zed.dev/blog/why-llms-cant-build-software">Why LLMs Can&#8217;t Really Build Software</a></li>



<li><a href="https://www.youtube.com/watch?v=-1yH_BTKgXs">Is AI the Future of Software Development, or Just a new Abstraction? Insights from Kelsey Hightower</a></li>



<li><a href="https://cookbook.openai.com/examples/gpt-5/gpt-5_prompting_guide">GPT-5 prompting guide</a></li>
</ul>



<h2 class="wp-block-heading">Conclusion</h2>



<p>I&#8217;ve enjoyed learning and improving myself over the years. But with GenAI I now feel like I could learn a lot more and improve myself even further since I&#8217;m choosing them as&nbsp;<strong>augmentation tools</strong>. Hopefully, this article motivates you to pursue AI augmentation for yourself. It&#8217;s okay to be skeptical about all the hype you watch and hear around these tools. It&#8217;s a good mechanism to not fall for all the sales pitches and fluff CEO&#8217;s and others in the industry talk about. Just don&#8217;t let your skepticism prevent you from learning, experimenting, building your own opinion, and finding ways of improving your work 🙂.</p>



<p>Still&#8230; I can&#8217;t deny my curiosity to know more about how these systems work underneath. How is fine-tuning done exactly? How does post-training work? Can these models emit telemetry (logs, traces, metrics) that we can observe? Why does capitalization (e.g. IMPORTANT, MUST) or setting a&nbsp;<a href="https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/system-prompts">role/persona</a>&nbsp;improve prompts? Can we really not have access to a high-level tree with the weights the LLM uses to correlate tokens, and use it to justify why a given output was produced? Or why an instruction given as input was not followed? It&#8217;s okay to just have a basic understanding and know about the new abstractions we have with these LLMs. But knowing how that abstraction works leads to knowing how to transition to automation.</p>



<p>I will keep searching and learning more in order to answer these questions or find engineers in the industry who have answered them. Especially around&nbsp;<strong>interpretability research</strong>, which is amazing!!! I recommend reading this research, for example &#8211;&nbsp;<a href="https://www.anthropic.com/research/tracing-thoughts-language-model">Tracing the thoughts of a large language model</a>. Hope you enjoyed reading, feel free to share in the comments below how you use AI to augment yourself 🙂.</p>
<p>The post <a href="https://blogit.create.pt/davidpereira/2025/09/10/becoming-augmented-by-ai/">Becoming augmented by AI</a> appeared first on <a href="https://blogit.create.pt">Blog IT</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blogit.create.pt/davidpereira/2025/09/10/becoming-augmented-by-ai/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Learning: Observability</title>
		<link>https://blogit.create.pt/davidpereira/2025/06/20/learning-observability/</link>
					<comments>https://blogit.create.pt/davidpereira/2025/06/20/learning-observability/#respond</comments>
		
		<dc:creator><![CDATA[David Pereira]]></dc:creator>
		<pubDate>Fri, 20 Jun 2025 13:08:49 +0000</pubDate>
				<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Misc]]></category>
		<category><![CDATA[observability]]></category>
		<guid isPermaLink="false">https://blogit.create.pt/?p=13517</guid>

					<description><![CDATA[<p>Table of Contents Introduction In this small post, I&#8217;ll share some resources, notes I&#8217;ve taken while learning, and best practices for making our systems observable. I&#8217;ve always had a knowledge gap regarding observability, and recently I&#8217;ve truly enjoyed learning more about this area in our software industry. Quick note: In this post I&#8217;ll only share [&#8230;]</p>
<p>The post <a href="https://blogit.create.pt/davidpereira/2025/06/20/learning-observability/">Learning: Observability</a> appeared first on <a href="https://blogit.create.pt">Blog IT</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Table of Contents</h2>



<ul style="max-width:1005px" class="wp-block-list">
<li>Introduction</li>



<li>Get Started</li>



<li>Logs
<ul style="max-width:960px" class="wp-block-list">
<li>Canonical logs</li>
</ul>
</li>



<li>Traces</li>



<li>Metrics</li>



<li>General Best Practices</li>



<li>Resources
<ul style="max-width:960px" class="wp-block-list">
<li>GitHub demo repo</li>
</ul>
</li>



<li>Conclusion</li>
</ul>



<h2 class="wp-block-heading">Introduction</h2>



<p>In this small post, I&#8217;ll share some resources, notes I&#8217;ve taken while learning, and best practices for making our systems observable. I&#8217;ve always had a knowledge gap regarding observability, and recently I&#8217;ve truly enjoyed learning more about this area in our software industry.</p>



<p><strong>Quick note</strong>: In this post I&#8217;ll only share about 3 telemetry&nbsp;<a href="https://opentelemetry.io/docs/concepts/signals/" target="_blank" rel="noreferrer noopener">signals</a>.&nbsp;<strong>Profile</strong>&nbsp;is another signal that I will research in the future.</p>



<p></p>



<h2 class="wp-block-heading">Get Started</h2>



<p>Follow these steps to get started with auto-instrumentation in your application using OpenTelemetry:&nbsp;<a href="https://opentelemetry.io/docs/languages/net/getting-started/#instrumentation" target="_blank" rel="noreferrer noopener">https://opentelemetry.io/docs/languages/net/getting-started/#instrumentation</a></p>



<p>For OpenTelemetry in a front-end app you can check these useful resources:</p>



<ul style="max-width:1005px" class="wp-block-list">
<li><a href="https://grafana.com/oss/faro/" target="_blank" rel="noreferrer noopener">Grafana faro</a></li>



<li><a href="https://nextjs.org/docs/app/building-your-application/optimizing/open-telemetry#using-vercelotel" target="_blank" rel="noreferrer noopener">Next.js</a></li>



<li><a href="https://www.checklyhq.com/blog/in-depth-guide-to-monitoring-next-js-apps-with-opentelemetry/" target="_blank" rel="noreferrer noopener">Guide for OpenTelemetry in Next.js</a></li>



<li><a href="https://opentelemetry.io/docs/languages/js/getting-started/browser/" target="_blank" rel="noreferrer noopener">Browser OpenTelemetry getting started</a></li>
</ul>



<p></p>



<p>Client-side instrumentation in OpenTelemetry is part of&nbsp;<a href="https://opentelemetry.io/community/roadmap/#p2-client-instrumentation-rum" target="_blank" rel="noreferrer noopener">their roadmap</a>&nbsp;which is great to see, since I&#8217;ve only seen vendor-specific solutions and products for front-end apps (e.g. New Relic, Datadog). For browser instrumentation otel doesn&#8217;t seem to be super mature yet, but a lot of effort is being put into this area by the OpenTelemetry team.</p>



<h2 class="wp-block-heading">Logs</h2>



<p>We all know about logs 😄. It&#8217;s data that we all need in order to troubleshoot and know what is happening in our applications. We shouldn&#8217;t overdo it, creating tons and tons of logs since that will probably create noise and make it harder to troubleshoot problems.</p>



<p>For logs, we can use&nbsp;<a href="https://github.com/open-telemetry/opentelemetry-dotnet/blob/main/docs/logs/README.md#best-practices" target="_blank" rel="noreferrer noopener">these best practices</a>. From this list, these are an absolute must to follow:</p>



<ul style="max-width:1005px" class="wp-block-list">
<li>Avoid string interpolation</li>



<li>Use structured logging</li>



<li>Log redaction for sensitive information</li>
</ul>



<p>In addition to the list above, we should also include the&nbsp;<code>TraceId</code>&nbsp;and&nbsp;<code>SpanId</code>&nbsp;in our log records, to correlate logs with traces. If you are using the Serilog console sink,&nbsp;<a href="https://github.com/serilog/serilog-sinks-console/blob/4c9a7b6946dfd2d7f07a792c40bb3d46af835ee9/src/Serilog.Sinks.Console/ConsoleLoggerConfigurationExtensions.cs#L32" target="_blank" rel="noreferrer noopener">by default the message template</a>&nbsp;won&#8217;t have those fields so if you want them, consider using&nbsp;<a href="https://github.com/serilog/serilog/wiki/Formatting-Output#formatting-json" target="_blank" rel="noreferrer noopener">JsonFormatter</a>&nbsp;or&nbsp;<code>CompactJsonFormatter</code>. Here is an example Serilog configuration in&nbsp;<code>appsettings.json</code>&nbsp;(setup to remove unnecessary/noisy logs):</p>



<pre class="wp-block-code"><code>"Serilog": {
    "Using": &#091;
      "Serilog.Sinks.Console"
    ],
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft.AspNetCore": "Warning",
        "Microsoft.Extensions.Diagnostics.HealthChecks": "Warning"
      }
    },
    "WriteTo": &#091;
      {
        "Name": "Console",
        "Args": {
          "formatter": {
            "type": "Serilog.Formatting.Json.JsonFormatter, Serilog",
            "renderMessage": true
          }
        }
      }
    ],
    "Enrich": &#091;
      "FromLogContext",
      "WithMachineName",
      "WithThreadId",
      "WithProcessId",
      "WithProcessName",
      "WithExceptionDetails",
      "WithExceptionStackTraceHash",
      "WithEnvironmentName"
    ],
    "Properties": {
      "Application": "GrafanaDemoOtelApp"
    }
  }</code></pre>



<p>Below are some documentation links for logging in .NET. The&nbsp;<code>ILogger</code>&nbsp;extension methods are not always the best choice (e.g.&nbsp;<code>logger.LogInformation</code>), especially in high-performance scenarios or if your logs are in a hot path:</p>



<ul style="max-width:1005px" class="wp-block-list">
<li><a href="https://learn.microsoft.com/en-us/dotnet/core/extensions/high-performance-logging" target="_blank" rel="noreferrer noopener">High-performance logging in .NET</a></li>



<li><a href="https://learn.microsoft.com/en-us/dotnet/core/extensions/logger-message-generator" target="_blank" rel="noreferrer noopener">Compile-time logging source generation</a></li>
</ul>



<h3 class="wp-block-heading">Canonical logs</h3>



<p>There is also a different way of logging, based on having more attributes in one single log line. I&#8217;ve seen this in Stripe where they call it <a href="https://stripe.com/blog/canonical-log-lines" target="_blank" rel="noreferrer noopener">canonical log lines</a>. Charity Majors also references this <strong>canonical logs</strong> term in her blog post about Observability 2.0 (that I reference in the Resources section).</p>



<p>This idea is very interesting, but might lack awareness. At least in .NET land, I didn&#8217;t find many references to this style of logging or example code that we could follow when there are many&nbsp;<code>ILogger</code>&nbsp;instances involved.</p>



<p></p>



<h2 class="wp-block-heading">Traces</h2>



<p>For traces in .NET we have <a href="https://learn.microsoft.com/en-us/dotnet/core/diagnostics/distributed-tracing-instrumentation-walkthroughs#best-practices-1">these best practices</a>. So far I&#8217;ve seen four common solutions for adding <a href="https://microsoft.github.io/code-with-engineering-playbook/observability/correlation-id/" target="_blank" rel="noreferrer noopener">correlation ids</a> in traces (not all are standards):</p>



<ul style="max-width:1005px" class="wp-block-list">
<li><a href="https://www.w3.org/TR/trace-context/" target="_blank" rel="noreferrer noopener">W3C trace context</a>&nbsp;&#8211; current standard in the HTTP protocol for tracing</li>



<li><a href="https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Common_non-standard_request_fields" target="_blank" rel="noreferrer noopener">X-Correlation-Id</a>&nbsp;&#8211; a non-standard HTTP header for RESTful APIs (also known as&nbsp;<a href="https://http.dev/x-request-id" target="_blank" rel="noreferrer noopener">X-Request-Id</a>). I thought this was a standard since it&#8217;s widely used, but I didn&#8217;t find a RFC from IETF or any other organization.</li>



<li><a href="https://github.com/dotnet/runtime/blob/main/src/libraries/System.Diagnostics.DiagnosticSource/src/HttpCorrelationProtocol.md" target="_blank" rel="noreferrer noopener">Request-Id</a>&nbsp;&#8211; this is a known header in the .NET ecosystem</li>



<li><a href="https://github.com/openzipkin/b3-propagation" target="_blank" rel="noreferrer noopener">B3 Zipkin propagation</a>&nbsp;&#8211; Zipkin format standard</li>



<li><a href="https://docs.aws.amazon.com/xray/latest/devguide/xray-concepts.html#xray-concepts-tracingheader" target="_blank" rel="noreferrer noopener">AWS X-Ray Trace Id</a>&nbsp;&#8211; proprietary solution for AWS that adds headers for tracing</li>
</ul>



<p>Not every company/project uses W3C trace context, you have some options above to pick from. I prefer the standard W3C trace context 😄 (maybe the industry will widely adopt this in the future) and using OpenTelemetry to manage these headers (HTTP, AMQP, etc) and correlation with logs automatically. The code you don&#8217;t write can&#8217;t have bugs 😆.</p>



<p>With that said, in some situations, you might have integrations with 3rd party software and need to use their custom headers or project limitations and need to use a particular format. At the end of the day what&#8217;s important is that you have distributed tracing working E2E.</p>



<p>There is also a relevant spec for distributed tracing called&nbsp;<a href="https://www.w3.org/TR/baggage/" target="_blank" rel="noreferrer noopener">Baggage</a>&nbsp;which OpenTelemetry implements and we can use in our apps. The most important part here is trace propagation to get the full trace from the publisher to the consumer.</p>



<p></p>



<h2 class="wp-block-heading">Metrics</h2>



<p>For metrics, it&#8217;s important to follow naming conventions for custom metrics. Especially if your organization has a platform team, setting conventions helps everyone. I do know some otel semantic conventions aren&#8217;t stable, and that also leads to some nuget packages being pre-release.</p>



<p>But anyhow, set conventions for your team or read and follow&nbsp;<a href="https://opentelemetry.io/docs/specs/semconv/general/metrics/" target="_blank" rel="noreferrer noopener">OpenTelemetry semantic conventions</a>.<br>An important resource I found is the comments on&nbsp;<a href="https://prometheus.io/docs/practices/instrumentation/#do-not-overuse-labels" target="_blank" rel="noreferrer noopener">Prometheus best practices</a>&nbsp;related to high cardinality metrics.</p>



<p>When I started trying out custom metrics instrumentation I discovered that OpenTelemetry is not always used (the SDK + OTLP). We have the Prometheus SDK which is mature and widely used. Then for Java there are other solutions like Micrometer and others that integrate very well with Spring. In regards to the Java ecosystem, I read&nbsp;<a href="https://opentelemetry.io/blog/2024/java-metric-systems-compared/#benchmark-opentelemetry-java-vs-micrometer-vs-prometheus-java" target="_blank" rel="noreferrer noopener">this otel Java benchmarks</a>&nbsp;and&nbsp;<a href="https://spring.io/blog/2024/10/28/lets-use-opentelemetry-with-spring" target="_blank" rel="noreferrer noopener">this Spring post</a>&nbsp;just because I was interested in knowing what the industry is adopting and why.</p>



<p></p>



<h2 class="wp-block-heading">General Best Practices</h2>



<p>There is a ton to be learned with SRE principles and practices. But one in particular was very useful for me and my team:&nbsp;<strong>always categorize our custom metrics according to the 4 Golden Signals</strong>. Any metric we can&#8217;t categorize is probably not useful for us.</p>



<figure class="wp-block-image is-resized td-caption-align-center"><img decoding="async" width="800" height="800" src="https://blogit.create.pt/wp-content/uploads/2025/05/deniseyu_art_monitoring.webp" alt="" class="wp-image-13523" style="width:808px;height:auto" srcset="https://blogit.create.pt/wp-content/uploads/2025/05/deniseyu_art_monitoring.webp 800w, https://blogit.create.pt/wp-content/uploads/2025/05/deniseyu_art_monitoring-300x300.webp 300w, https://blogit.create.pt/wp-content/uploads/2025/05/deniseyu_art_monitoring-150x150.webp 150w, https://blogit.create.pt/wp-content/uploads/2025/05/deniseyu_art_monitoring-768x768.webp 768w, https://blogit.create.pt/wp-content/uploads/2025/05/deniseyu_art_monitoring-420x420.webp 420w, https://blogit.create.pt/wp-content/uploads/2025/05/deniseyu_art_monitoring-696x696.webp 696w, https://blogit.create.pt/wp-content/uploads/2025/05/deniseyu_art_monitoring-70x70.webp 70w" sizes="(max-width: 800px) 100vw, 800px" /><figcaption class="wp-element-caption"><em>Image Credit to &#8211; Denise Yu</em></figcaption></figure>



<p><a href="https://deniseyu.io/art/" target="_blank" rel="noreferrer noopener">Source of Denise Yu&#8217;s art</a>.</p>



<p><a href="https://sre.google/sre-book/monitoring-distributed-systems/" target="_blank" rel="noreferrer noopener">Google&#8217;s SRE book</a>&nbsp;is amazing to learn more about the 4 Golden signals and creating SLO-based alerts. All our alerts should be actionable (or the support team will not be happy), so it helps if they are based on SLOs that are defined as a team.</p>



<p>They also have&nbsp;<a href="https://sre.google/sre-book/service-best-practices/" target="_blank" rel="noreferrer noopener">some best practices for production services</a>.</p>



<p></p>



<h2 class="wp-block-heading">Resources</h2>



<ul style="max-width:1005px" class="wp-block-list">
<li>Glossary of many observability terms in case you’re not familiar with them:&nbsp;<a href="https://github.com/prathamesh-sonpatki/o11y-wiki" target="_blank" rel="noreferrer noopener">https://github.com/prathamesh-sonpatki/o11y-wiki</a></li>



<li><a href="https://github.com/magsther/awesome-opentelemetry" target="_blank" rel="noreferrer noopener">Awesome Observability GitHub repo</a></li>



<li>If dashboards make you happy&nbsp;<a href="https://play.grafana.org/d/feg4yc4qw3wn4b/third-annual-observability-survey?pg=survey-2025&amp;plcmt=toc-cta-2&amp;orgId=1&amp;from=2025-03-13T02:49:20.476Z&amp;to=2025-03-14T02:49:20.476Z&amp;timezone=utc&amp;var-region=$__all&amp;var-role=$__all&amp;var-size=$__all&amp;var-industry=$__all&amp;var-filters=%60Region%60%20in%20%28%27Europe%27,%27Asia%27,%27North%20America%27,%27Africa%27,%27South%20America%27,%27Oceania%27,%27Middle%20East%27%29%20AND%20%60Role%60%20IN%20%28%27Platform%20team%27,%27SRE%27,%27CTO%27,%27Engineering%20manager%27,%27Developer%27,%27Director%20of%20engineering%27,%27Other%27%29%20AND%20%60Size_of_organization%60%20IN%20%28%2710%20or%20fewer%20employees%27,%2711%20-%20100%20employees%27,%27101%20-%20500%20employees%27,%27501%20-%201,000%20employees%27,%271,001%20-%202,500%20employees%27,%272,501%20-%205,000%20employees%27,%275,001%2B%20employees%27%29%20AND%20%60Industry%60%20IN%20%28%27Telecommunications%27,%27Healthcare%27,%27IoT%27,%27Financial%20services%27,%27Education%27,%27Government%27,%27Applied%20Sciences%27,%27Software%20%26%20Technology%27,%27Media%20%26%20Entertainment%27,%27Travel%20%26%20Transportation%27,%27Retail%2FE-commerce%27,%27Energy%20%26%20Utilities%27,%27Automotive%20%26%20Manufacturing%27,%27Other%27%29" target="_blank" rel="noreferrer noopener">check the Grafana observability report dashboard</a></li>



<li><a href="https://aws-observability.github.io/observability-best-practices/guides/" target="_blank" rel="noreferrer noopener">AWS observability best practices guide</a></li>



<li><a href="https://grafana.com/blog/2018/08/02/the-red-method-how-to-instrument-your-services/" target="_blank" rel="noreferrer noopener">About RED and USE method</a></li>



<li><a href="https://learn.microsoft.com/en-us/dotnet/core/diagnostics/distributed-tracing-instrumentation-walkthroughs#best-practices-1" target="_blank" rel="noreferrer noopener">Traces Instrumentation best practices in .NET</a></li>



<li><a href="https://signoz.io/guides/what-are-the-limitations-of-prometheus-labels/#what-are-the-limitations-of-prometheus-labels" target="_blank" rel="noreferrer noopener">What are the Limitations of Prometheus Labels?</a></li>



<li><a href="https://www.cncf.io/training/certification/otca/" target="_blank" rel="noreferrer noopener">CNCF OpenTelemetry certification</a></li>



<li><a href="https://github.com/cncf/tag-observability/blob/main/whitepaper.md" target="_blank" rel="noreferrer noopener">TAG Observability whitepaper</a>&nbsp;&#8211; this is an amazing resource with tons of information! I also recommend checking out the other resources they have in the tag-observability repo and community</li>



<li>Resources specifically about&nbsp;<strong>Observability 2.0</strong>:
<ul style="max-width:970px" class="wp-block-list">
<li><a href="https://charity.wtf/tag/observability-2-0/" target="_blank" rel="noreferrer noopener">Observability 2.0 by Charity Majors</a></li>



<li><a href="https://www.aparker.io/post/3leq2g72z7r2t" target="_blank" rel="noreferrer noopener">Re-Redefining Observability</a></li>



<li><a href="https://www.youtube.com/watch?v=ag2ykPO805M" target="_blank" rel="noreferrer noopener">Is It Time To Version Observability? (Signs Point To Yes) &#8211; Charity Majors</a></li>
</ul>
</li>



<li>Talks
<ul style="max-width:970px" class="wp-block-list">
<li><a href="https://www.youtube.com/watch?v=hhZrOHKIxLw" target="_blank" rel="noreferrer noopener">How Prometheus Revolutionized Monitoring at SoundCloud &#8211; Björn Rabenstein</a></li>



<li><a href="https://www.youtube.com/watch?v=X99X-VDzxnw" target="_blank" rel="noreferrer noopener">How to Include Latency in SLO-based Alerting &#8211; Björn Rabenstein, Grafana Labs</a></li>



<li><a href="https://www.youtube.com/watch?v=pLPMAAOSxSE" target="_blank" rel="noreferrer noopener">Myths and Historical Accidents: OpenTelemetry and the Future of Observability Part 1</a></li>



<li><a href="https://youtu.be/3tBj3ZCPGJY?t=687" target="_blank" rel="noreferrer noopener">Modern Platform Engineering: 9 Secrets of Generative Teams &#8211; Liz Fong-Jones</a></li>



<li><a href="https://www.youtube.com/watch?v=gviWKCXwyvY" target="_blank" rel="noreferrer noopener">Context Propagation makes OpenTelemetry awesome</a></li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading">GitHub demo repo</h3>



<p>I&#8217;ve been developing a demo app (it has fewer features than the&nbsp;<a href="https://github.com/open-telemetry/opentelemetry-demo" target="_blank" rel="noreferrer noopener">otel demo</a>) to demonstrate how to build an app with OpenTelemetry, Grafana and Prometheus. It&#8217;s primarily focused on a small app I can showcase in my talks.</p>



<p>If you&#8217;re interested take a look: <a href="https://github.com/BOLT04/grafana-observability-demo">https://github.com/BOLT04/grafana-observability-demo</a></p>



<p></p>



<h2 class="wp-block-heading">Conclusion</h2>



<img decoding="async" src="https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExeGh0em9taDR0N2hodXIycnh4a3RqbXk2cWRoeDFjODU2Mmd0MDJqdSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/tkApIfibjeWt1ufWwj/giphy.gif" alt="happy gif" loading="lazy">



<p>Hopefully, some of these resources I&#8217;ve shared are useful to you 😄. I still have a ton to learn and explore, but I&#8217;m happy with the knowledge I&#8217;ve acquired so far.</p>



<p>There are some specific standards + projects that I&#8217;ll dive in and explore more, like: eBPF; OpenMetrics. OpenMetrics is something I&#8217;d like to spend some quality time reading about, but I know&nbsp;<a href="https://www.cncf.io/blog/2024/09/18/openmetrics-is-archived-merged-into-prometheus/" target="_blank" rel="noreferrer noopener">it&#8217;s archived</a>&nbsp;and&nbsp;<a href="https://www.reddit.com/r/devops/comments/1f5ttdx/openmetrics_is_archived_merged_into_prometheus/?rdt=47070" target="_blank" rel="noreferrer noopener">reddit says the same</a>. Just want to read and watch some talks about it to feed my curiosity 😃.</p>



<p>Last but not least, I want to follow the work that some industry leaders are doing like&nbsp;<a href="https://charity.wtf/" target="_blank" rel="noreferrer noopener">Charity Majors</a>, specifically about Observability 2.0 😄. I discovered this term in the&nbsp;<a href="https://www.thoughtworks.com/radar/techniques/summary/observability-2-0" target="_blank" rel="noreferrer noopener">Thouthworks tech radar</a>, and the part &#8220;high-cardinality event data in a single data store&#8221; caught my interest.<br>I&#8217;m still learning, researching, and listening to the opinions of industry leaders about this term to then develop my own opinions. Maybe I&#8217;ll make a blog post about this in the future 😁.</p>



<p>If you&#8217;re interested, check out my other blog posts:</p>



<ul style="max-width:1005px" class="wp-block-list">
<li><a href="https://blogit.create.pt/davidpereira/2024/02/05/dreamforce-2023-highlights/">Dreamforce 2023 Highlights</a></li>



<li><a href="https://blogit.create.pt/davidpereira/2021/09/16/getting-started-with-cloudevents-and-asyncapi/">Getting Started with CloudEvents and AsyncAPI</a></li>
</ul>



<p></p>
<p>The post <a href="https://blogit.create.pt/davidpereira/2025/06/20/learning-observability/">Learning: Observability</a> appeared first on <a href="https://blogit.create.pt">Blog IT</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blogit.create.pt/davidpereira/2025/06/20/learning-observability/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Configuring Azure Application Insights on a .NET 6 API</title>
		<link>https://blogit.create.pt/andrepires/2024/05/27/configuring-azure-application-insights-on-a-net-6-api/</link>
					<comments>https://blogit.create.pt/andrepires/2024/05/27/configuring-azure-application-insights-on-a-net-6-api/#respond</comments>
		
		<dc:creator><![CDATA[André Pires]]></dc:creator>
		<pubDate>Mon, 27 May 2024 08:21:04 +0000</pubDate>
				<category><![CDATA[Misc]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[azure]]></category>
		<guid isPermaLink="false">https://blogit.create.pt/?p=13492</guid>

					<description><![CDATA[<p>In this blog post we are going to be showing you can configure Azure Application Insights to send your logs, exceptions and performance metrics from a .NET 6 API. InstallationStart by installing the Microsoft.ApplicationInsights.AspNetCore nugget package. Now in your startup class you will need to configure some options for the telemetry collection.You can use the [&#8230;]</p>
<p>The post <a href="https://blogit.create.pt/andrepires/2024/05/27/configuring-azure-application-insights-on-a-net-6-api/">Configuring Azure Application Insights on a .NET 6 API</a> appeared first on <a href="https://blogit.create.pt">Blog IT</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p></p>



<p>In this blog post we are going to be showing you can configure Azure Application Insights to send your logs, exceptions and performance metrics from a .NET 6 API.<br><br><strong>Installation</strong><br>Start by installing the <em>Microsoft.ApplicationInsights.AspNetCore</em> nugget package.<br><br>Now in your startup class you will need to configure some options for the telemetry collection.<br>You can use the <em>AddApplicationInsightsTelemetry </em>extension method on the <em>IServiceCollection </em>and pass your options as so:<br></p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: csharp; title: ; notranslate">
public class Startup
{
    public virtual void ConfigureServices(IServiceCollection services)
    {
        services.AddApplicationInsightsTelemetry(GetApplicationInsightsServiceOptions());    
    }

    private static ApplicationInsightsServiceOptions GetApplicationInsightsServiceOptions()
    {
        return new ApplicationInsightsServiceOptions
        {
            AddAutoCollectedMetricExtractor = false,
            EnableEventCounterCollectionModule = false,
            EnableDiagnosticsTelemetryModule = false,
            EnablePerformanceCounterCollectionModule = true,
            EnableDependencyTrackingTelemetryModule = true,
            EnableRequestTrackingTelemetryModule = false,
            ConnectionString = Configuration&#x5B;ConfigurationConstants.ApplicationInsightsConnectionString],
        };
    }
}
</pre></div>


<p>This is where we define the types of telemetry we want to collect.<br>The documention of the options are here: <a href="https://learn.microsoft.com/en-us/azure/azure-monitor/app/asp-net-core?tabs=netcorenew#use-applicationinsightsserviceoptions">https://learn.microsoft.com/en-us/azure/azure-monitor/app/asp-net-core?tabs=netcorenew#use-applicationinsightsserviceoptions</a><br>We are also getting the connection string of the application insights resource from our appsettings.</p>



<p><strong>Telemetry modules</strong><br>Now if we want to go further, we can even specify what metrics to collect for each module.<br>For instance, let&#8217;s say we want to indicate which performance metrics to collect. Then you can do the following:<br></p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: csharp; title: ; notranslate">
        services.ConfigureTelemetryModule&lt;PerformanceCollectorModule&gt;((module, applicationInsightsServiceOptions) =&gt;
        {
            module.DefaultCounters.Add(new PerformanceCounterCollectionRequest(@&quot;\Process(??APP_WIN32_PROC??)\Private Bytes&quot;, @&quot;\Process(??APP_WIN32_PROC??)\Private Bytes&quot;));
            module.DefaultCounters.Add(new PerformanceCounterCollectionRequest(@&quot;\Process(??APP_WIN32_PROC??)\% Processor Time&quot;, @&quot;\Process(??APP_WIN32_PROC??)\% Processor Time&quot;));
        });
</pre></div>


<p>You can view the documentation on configuring telemetry modules here: <a href="https://learn.microsoft.com/en-us/azure/azure-monitor/app/asp-net-core?tabs=netcorenew#configure-or-remove-default-telemetrymodules">https://learn.microsoft.com/en-us/azure/azure-monitor/app/asp-net-core?tabs=netcorenew#configure-or-remove-default-telemetrymodules</a><br><br><strong>Extensibility</strong><br>To add or remove properties from collected telemetry (before it gets sent to Azure) you can create classes that implement the <em>ITelemetryInitializer </em>class from the Azure Application Insights SDK (<a href="https://learn.microsoft.com/en-us/azure/azure-monitor/app/asp-net-core?tabs=netcorenew#add-telemetryinitializers">https://learn.microsoft.com/en-us/azure/azure-monitor/app/asp-net-core?tabs=netcorenew#add-telemetryinitializers</a>).<br><br>A classic example for a telemetry initializer is a correlation id initializer. You would get a correlation id from your http request and pass it to all telemetry so that you can have a nice trace of everything that went through your system:<br></p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: csharp; title: ; notranslate">
public class CorrelationIdInitializer : ITelemetryInitializer
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    private const string CorrelationIdProperty = &quot;CorrelationId&quot;;

    public CorrelationIdInitializer(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public void Initialize(ITelemetry telemetry)
    {
        ISupportProperties telemetryProperties = (ISupportProperties)telemetry;

        // This is just an extension method where you would extract the correlation id from the request headers according to your header name.
        string correlationId = _httpContextAccessor.HttpContext.GetCorrelationId();

        if (!string.IsNullOrWhiteSpace(correlationId) &amp;&amp; !telemetryProperties.Properties.ContainsKey(CorrelationIdProperty))
        {
            telemetryProperties.Properties.Add(CorrelationIdProperty, correlationId);
        }
    }
</pre></div>


<p>To register the telemetry initializer, simply register the class and its respective interface (always ITelemetryInitializer) on your service collection: <em>services.AddSingleton&lt;ITelemetryInitializer, CorrelationIdInitializer&gt;();</em></p>



<p><strong>Filtering</strong><br>Additionally, you also have the ability to filter out telemetry from being collected. This is a great feature that allows you to focus only storing what you really care about and will save you a LOT of costs.<br>Do keep in mind that filtering out telemetry does mean that you won&#8217;t be able to query it and therefore can make your tracing a bit difficult.<br>This is all related to telemetry processors (<a href="https://learn.microsoft.com/en-us/azure/azure-monitor/app/asp-net-core?tabs=netcorenew#add-telemetry-processors">https://learn.microsoft.com/en-us/azure/azure-monitor/app/asp-net-core?tabs=netcorenew#add-telemetry-processors</a>).<br><br>Imagine you have thousands of fast dependencies (see the list of automatically tracked dependencies <a href="https://learn.microsoft.com/en-us/azure/azure-monitor/app/asp-net-dependencies#automatically-tracked-dependencies">https://learn.microsoft.com/en-us/azure/azure-monitor/app/asp-net-dependencies#automatically-tracked-dependencies</a>) that are being stored by your system but you come to a conclusion that they only make it hard to monitor your system and you don&#8217;t really need them.<br>Filtering them out is the way to go OR you could consider sampling instead <a href="https://learn.microsoft.com/en-us/azure/azure-monitor/app/asp-net-core?tabs=netcorenew#sampling">https://learn.microsoft.com/en-us/azure/azure-monitor/app/asp-net-core?tabs=netcorenew#sampling</a>.<br>Lets create a processor that filters out successful dependencies that had a duration under 500 milliseconds:<br></p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: csharp; title: ; notranslate">
public class FastDependencyProcessor : ITelemetryProcessor
{
    private ITelemetryProcessor Next { get; set; }

    public FastDependencyProcessor(ITelemetryProcessor next)
    {
        Next = next;
    }

    public void Process(ITelemetry item)
    {
        if (!ShouldFilterTelemetry(item))
        {
            Next.Process(item);
        }
    }

    public bool ShouldFilterTelemetry(ITelemetry item)
    {
        bool shouldFilterTelemetry = false;

        DependencyTelemetry dependency = item as DependencyTelemetry;

        if (dependency != null
            &amp;&amp; dependency.Duration.TotalMilliseconds &lt; 500
            &amp;&amp; dependency.Success.HasValue &amp;&amp; dependency.Success.Value)
        {
            shouldFilterTelemetry = true;
        }

        return shouldFilterTelemetry;
    }
}
</pre></div>


<p>After creating the class, you have to register the telemetry processor as part of your service collection like so:<br><em>services.AddApplicationInsightsTelemetryProcessor&lt;FastDependencyProcessor</em>&gt;<em>();</em><br><br>Keep in mind that if your telemetry processors will be executed in the order in which you&#8217;ve called them in your register process.<br><br><strong>Final notes</strong><br><br>&#8211; Azure Application Insights is a great tool that gives you visibility on how your application is doing.<br>You can use the SDK to collect most telemetry automatically or you could even instrument specific scenarios manually by making use of the <em>TelemetryClient</em> instance (<a href="https://learn.microsoft.com/en-us/azure/azure-monitor/app/asp-net-core?tabs=netcorenew#how-can-i-track-telemetry-thats-not-automatically-collected">https://learn.microsoft.com/en-us/azure/azure-monitor/app/asp-net-core?tabs=netcorenew#how-can-i-track-telemetry-thats-not-automatically-collected</a>).<br>&#8211; It is important to monitor your costs as it is easy to end up storing everything and not only what you need. So start by defining what you need to collect and what metrics will be relevant for you.<br>Then you can filter out the irrelevant data and from there on you could even create alerts from the data you collect, using Azure Monitor.<br>If you are trying out Application Insights on a test environment, you can even set a daily cap of X GB so that you control your spending. Simply navigate to the Azure Application Insights resource through the Azure Portal and click &#8220;Usage and estimated Costs&#8221; on the sidebar:<br></p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="248" height="229" src="https://blogit.create.pt/wp-content/uploads/2024/05/image.png" alt="" class="wp-image-13493" style="width:238px;height:auto" /></figure>



<figure class="wp-block-image size-full"><img decoding="async" width="638" height="40" src="https://blogit.create.pt/wp-content/uploads/2024/05/image-1.png" alt="" class="wp-image-13494" srcset="https://blogit.create.pt/wp-content/uploads/2024/05/image-1.png 638w, https://blogit.create.pt/wp-content/uploads/2024/05/image-1-300x19.png 300w" sizes="(max-width: 638px) 100vw, 638px" /></figure>



<p><br>&#8211; From what I&#8217;ve seen so far, the collection of dependencies/exceptions can represent the majority of costs as you may have a lot of dependencies flowing through your system and because exceptions are a type of telemetry that occupies a lot of space. Filtering out irrelevant dependencies will definitely help.<br>As for exceptions, you may consider using the Result pattern instead of using exceptions for the normal control flow of your code. This also has the advantage of decreasing the impact on performance lead by exceptions to your application since you reduce the amount of exceptions thrown.</p>
<p>The post <a href="https://blogit.create.pt/andrepires/2024/05/27/configuring-azure-application-insights-on-a-net-6-api/">Configuring Azure Application Insights on a .NET 6 API</a> appeared first on <a href="https://blogit.create.pt">Blog IT</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blogit.create.pt/andrepires/2024/05/27/configuring-azure-application-insights-on-a-net-6-api/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Integration Tests in .NET WebApi</title>
		<link>https://blogit.create.pt/andresantos/2024/04/01/integration-tests-in-net-webapi/</link>
					<comments>https://blogit.create.pt/andresantos/2024/04/01/integration-tests-in-net-webapi/#respond</comments>
		
		<dc:creator><![CDATA[André Santos]]></dc:creator>
		<pubDate>Mon, 01 Apr 2024 12:47:41 +0000</pubDate>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Automatic Testing]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[inmemorydatabase]]></category>
		<category><![CDATA[integrated]]></category>
		<category><![CDATA[Testing]]></category>
		<guid isPermaLink="false">https://blogit.create.pt/?p=13472</guid>

					<description><![CDATA[<p>In software development, testing is an essential aspect that ensures the stability and reliability of applications. Three primary types of tests are commonly used: unit tests, integration tests, and end-to-end tests. In this blog post, we will discuss these testing types in the context of a .NET WebAPI project and provide an example implementation of integration testing using an in-memory database.</p>
<p>The post <a href="https://blogit.create.pt/andresantos/2024/04/01/integration-tests-in-net-webapi/">Integration Tests in .NET WebApi</a> appeared first on <a href="https://blogit.create.pt">Blog IT</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>In software development, testing is an essential aspect that ensures the stability and reliability of applications. Three primary types of tests are commonly used: unit tests, integration tests, and end-to-end tests. In this blog post, we will discuss these testing types in the context of a .NET WebAPI project and provide an example implementation of integration testing using an in-memory database.</p>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<h2 class="wp-block-heading">Unit Tests, Integration Tests, and End-to-End Tests: What&#8217;s the Difference?</h2>



<ul class="wp-block-list">
<li><strong>Unit tests</strong> focus on testing individual units or components of your application in isolation. This type of test verifies whether the unit/component works correctly and adheres to its business logic.</li>



<li><strong>Integration tests</strong> aim to test multiple units or components together, ensuring that they interact properly. Integration tests can uncover issues related to data flow, communication between components, and external dependencies like databases.</li>



<li><strong>End-to-end (E2E)</strong> tests simulate a complete user scenario by testing the entire application from start to finish. E2E tests can help identify issues related to multiple components, external APIs, and user interfaces.</li>
</ul>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<h2 class="wp-block-heading">Example Implementation in .NET</h2>



<p>To perform integration tests, we will use an in-memory database and the <em>WebApplicationFactory </em>feature of ASP.NET Core. This approach allows us to test our WebAPI application with a real web server in memory, simulating how the components interact with each other when making requests.</p>



<p>First, let&#8217;s create an InMemoryDbAppFactory that sets up our in-memory web server and database:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: csharp; title: ; notranslate">
public class InMemoryDbAppFactory : WebApplicationFactory&lt;Program&gt;
{
    private readonly string _environment;

    public InMemoryDbAppFactory()
    {
        _environment = &quot;IntegrationTests&quot;;
    }

    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        Environment.SetEnvironmentVariable(&quot;ASPNETCORE_ENVIRONMENT&quot;, _environment);
        builder.UseEnvironment(_environment);
        builder.UseSetting(&quot;https_port&quot;, &quot;8080&quot;);

        builder.ConfigureTestServices(services =&gt;
        {
            services.RemoveAll&lt;ITestRepository&gt;();
            services.TryAddTransient&lt;ITestRepository, TestRepositoryTest&gt;();

            // Anonymous authentication
            services
                .AddAuthentication(&quot;Test&quot;)
                .AddScheme&lt;AuthenticationSchemeOptions, TestAuthenticationHandler&gt;(&quot;Test&quot;, options =&gt; { });
        });
    }
}
</pre></div>


<p>In order to use an in-memory database, we will override the connection string injection in our <em>ServiceCollectionExtensions</em>:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: csharp; title: ; notranslate">
public static partial class ServiceCollectionExtensions
{
    public static IServiceCollection AddDbContexts(
        this IServiceCollection services,
        IConfiguration configuration,
        IWebHostEnvironment environment
    )
    {
        if (environment.IsEnvironment(&quot;IntegrationTests&quot;))
        {
            var connDb = new SqliteConnection(&quot;DataSource=db;mode=memory;cache=shared&quot;);
            connDb.Open();
            services.AddDbContext&lt;dbContext&gt;(options =&gt; options.UseSqlite(connDb));
        }
        else
        {
            services.AddDbContext&lt;dbContext&gt;(
                options =&gt; options.UseSqlServer(configuration.GetConnectionString(&quot;ConnectionString&quot;)).UseExceptionProcessor(),
                ServiceLifetime.Scoped
            );
        }

        return services;
    }
}
</pre></div>


<p>Finally, this is how a test looks like:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: csharp; title: ; notranslate">
&#x5B;Collection(&quot;MemoryDbIntegrationTests&quot;)]
public class ApiTests : IClassFixture&lt;InMemoryDbAppFactory&gt;
{
    private readonly InMemoryDbAppFactory _factory;
    private readonly HttpClient _client;

    public ApiTests(InMemoryDbAppFactory factory)
    {
        _factory = factory;
        _client = factory.CreateClient();

        // Ensures a clean database before each test
        factory.ResetDb();
    }

    &#x5B;Fact]
    public async Task GetList_Should_Return_List()
    {
        // Arrange

        // Act
        var response = await _client.GetAsync(&quot;/api/list&quot;);
        var content = await response.Content.ReadFromJsonAsync&lt;IEnumerable&lt;Dto&gt;&gt;();

        // Assert
        response.EnsureSuccessStatusCode(); // Status Code 200-299
        content.Should().NotBeNull();
        content.Should().HaveCount(2);
    }
}

</pre></div></div>
</div>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<h2 class="wp-block-heading">Using an in-memory database for integration tests has both advantages and disadvantages:</h2>



<h3 class="wp-block-heading">Advantages:</h3>



<ul class="wp-block-list">
<li><strong>Faster test execution</strong>: In-memory databases provide quicker test execution times since the data is stored in memory instead of on disk. This can significantly improve your overall testing performance and help you find issues faster.</li>



<li><strong>Easy to set up and tear down</strong>: In-memory databases are easy to create, modify, and delete without the need for external dependencies or configuration changes. This makes it easier to write, run, and maintain your tests.</li>



<li><strong>Consistent test data</strong>: In-memory databases allow you to create a known set of data for your tests, ensuring that each test starts with the same initial conditions. This can help reduce the likelihood of inconsistent test results and make it easier to identify issues related to data flow or dependencies between tests.</li>
</ul>



<h3 class="wp-block-heading">Disadvantages:</h3>



<ul class="wp-block-list">
<li><strong>Limited scalability</strong>: In-memory databases have limited capacity and may not be suitable for testing large datasets or complex scenarios that require high levels of concurrency.</li>



<li><strong>Lack of realism</strong>: In-memory databases may not accurately represent the behavior or performance of a production database, especially when dealing with complex queries or data modification operations. This can make it difficult to identify issues related to database schema, indexing, and query optimization.</li>



<li><strong>Limited support for advanced features</strong>: using SQLite as our in memory database we don&#8217;t have support for multiple schemas and some advanced query features.</li>



<li><strong>Seed data</strong>: the need to create seed data can be tedious and time consuming.</li>
</ul>



<p>When deciding whether to use an in-memory database, mock data, or a real web server in memory for your integration tests, consider the specific requirements of your project and weigh the advantages and disadvantages of each approach. In many cases, using a combination of testing types and approaches can help you ensure the stability, reliability, and performance of your .NET WebAPI application.</p>
<p>The post <a href="https://blogit.create.pt/andresantos/2024/04/01/integration-tests-in-net-webapi/">Integration Tests in .NET WebApi</a> appeared first on <a href="https://blogit.create.pt">Blog IT</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blogit.create.pt/andresantos/2024/04/01/integration-tests-in-net-webapi/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Deconstruct types in C#</title>
		<link>https://blogit.create.pt/andrepires/2024/02/21/deconstruct-types-in-c/</link>
					<comments>https://blogit.create.pt/andrepires/2024/02/21/deconstruct-types-in-c/#respond</comments>
		
		<dc:creator><![CDATA[André Pires]]></dc:creator>
		<pubDate>Wed, 21 Feb 2024 14:57:10 +0000</pubDate>
				<category><![CDATA[Misc]]></category>
		<guid isPermaLink="false">https://blogit.create.pt/?p=13421</guid>

					<description><![CDATA[<p>In C# you have some built-in support for deconstructing system types and for non-supported scenarios, you can always extend your types to support that. Let&#8217;s see how to deconstruct types in C#. Tuples have support for deconstruction which lets you unpackage all their items in a single operation.Here is an example with and without deconstruction: [&#8230;]</p>
<p>The post <a href="https://blogit.create.pt/andrepires/2024/02/21/deconstruct-types-in-c/">Deconstruct types in C#</a> appeared first on <a href="https://blogit.create.pt">Blog IT</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>In C# you have some built-in support for deconstructing system types and for non-supported scenarios, you can always extend your types to support that. Let&#8217;s see how to deconstruct types in C#.</p>



<p>Tuples have support for deconstruction which lets you unpackage all their items in a single operation.<br>Here is an example with and without deconstruction:</p>



<p></p>



<pre class="wp-block-code"><code>public static void Main()
{
    var result = QueryCityData("New York City");

    // Without deconstruction:
    var city = result.Item1;
    var pop = result.Item2;
    var size = result.Item3;

    // With deconstruction:
   (string city, int population, double area) = QueryCityData("New York City");
}

private static (string city, int population, double area) QueryCityData(string name)
{
    return (name, 8175133, 468.48);
}</code></pre>



<p>You may be interested in the values of only some elements.<br>You can take advantage of C#&#8217;s support for discards, which are variables whose values you ignore by using the underscore character.<br>Using the previous example:</p>



<pre class="wp-block-code"><code>public static void Main ()
{
    // city and population were discarded.
    (<em>, </em>, double area) = QueryCityData("Portugal");
}</code></pre>



<p></p>



<h2 class="wp-block-heading">Other system types and deconstruction</h2>



<p>Here are some system types that implement deconstruction, such as dictionary entries:</p>



<p></p>



<pre class="wp-block-code"><code>Dictionary&lt;string,int&gt; customerToTaxMapping = new Dictionary&lt;string, int&gt;();

foreach ((string key, int taxId) in customerToTaxMapping)
{
     // Do something with key and taxId
}</code></pre>



<p>You can deconstruct <strong>KeyValuePair </strong>instances (depending on your C# version, was introduced in .NET Core 2.0):</p>



<p></p>



<pre class="wp-block-code"><code>(string id, string taxId) = new KeyValuePair("id", "taxId");</code></pre>



<p>If you are on C# 12 (.NET 8), then you can make use of the Deconstruct methods for <strong>DateTime</strong>, <strong>DateOnly </strong>and <strong>DateTimeOffset</strong>:</p>



<pre class="wp-block-code"><code>(DateOnly date, TimeOnly time) = new DateTime(2023, 1, 2, 4, 5, 59, 999);

(int year, int month, int day) = new DateTime(2023, 1, 2);

(int year, int month, int day) = new DateOnly(2023, 5, 1);

// Instantiate date and time using years, months, days,
// hours, minutes, seconds and a time span.
(DateOnly date, TimeOnly time, TimeSpan offset) = new DateTimeOffset(2008, 5, 1, 8, 6, 32, new TimeSpan(1, 0, 0));</code></pre>



<p></p>



<h2 class="wp-block-heading">Deconstruct user-defined types:</h2>



<p>You can add public methods named <strong>Deconstruct </strong>and specify the <strong>out </strong>parameters that will define the parameters you want when applying deconstruction.</p>



<pre class="wp-block-code"><code>public class Person
{
    public string Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public void Deconstruct(out string firstName, out string lastName)
    {
        firstName = FirstName;
        lastName = LastName;
    }

    public void Deconstruct(out string id, out string firstName, out string lastName)
    {
        id = Id;
        firstName = FirstName;
        lastName = LastName;
    }
}</code></pre>



<p></p>



<p>If you don&#8217;t have control over the types that you want to provide deconstruction support for, then you can create a static class with a <strong>Deconstruct </strong>extension method with the same signature as displayed previously, for that given type.</p>



<p>Additionally, when you declare a <strong>record </strong>type by using two or more positional parameters, the compiler creates a <strong>Deconstruct </strong>method within the record declaration.</p>



<p><strong>Note</strong>: You can&#8217;t deconstruct dynamic objects.</p>



<p><strong>References</strong>:<br><a href="https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/functional/deconstruct" target="_blank" rel="noreferrer noopener">https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/functional/deconstruct</a><br><a href="https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/expressions#127-deconstruction" target="_blank" rel="noreferrer noopener">https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/expressions#127-deconstruction</a></p>
<p>The post <a href="https://blogit.create.pt/andrepires/2024/02/21/deconstruct-types-in-c/">Deconstruct types in C#</a> appeared first on <a href="https://blogit.create.pt">Blog IT</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blogit.create.pt/andrepires/2024/02/21/deconstruct-types-in-c/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Standard vs Private vs Shared Channels in Microsoft Teams</title>
		<link>https://blogit.create.pt/miguelisidoro/2024/02/21/standard-vs-private-vs-shared-channels-in-microsoft-teams/</link>
					<comments>https://blogit.create.pt/miguelisidoro/2024/02/21/standard-vs-private-vs-shared-channels-in-microsoft-teams/#comments</comments>
		
		<dc:creator><![CDATA[Miguel Isidoro]]></dc:creator>
		<pubDate>Wed, 21 Feb 2024 10:19:52 +0000</pubDate>
				<category><![CDATA[Microsoft 365]]></category>
		<category><![CDATA[Microsoft Teams]]></category>
		<category><![CDATA[microsoft365]]></category>
		<category><![CDATA[office365]]></category>
		<category><![CDATA[sharepoint]]></category>
		<guid isPermaLink="false">https://blogit.create.pt/?p=13206</guid>

					<description><![CDATA[<p>This post explains the difference between Standard, Private and Shared Channels in Microsoft Teams. Introduction Microsoft Teams is the enterprise messaging solution in the Microsoft 365, allowing for real time collaboration, communication, meeting, file and app sharing and more. What is a Microsoft Team? In a simple way, a Team in Microsoft Teams is a [&#8230;]</p>
<p>The post <a href="https://blogit.create.pt/miguelisidoro/2024/02/21/standard-vs-private-vs-shared-channels-in-microsoft-teams/">Standard vs Private vs Shared Channels in Microsoft Teams</a> appeared first on <a href="https://blogit.create.pt">Blog IT</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>This post explains the difference between Standard, Private and Shared Channels in Microsoft Teams.</p>



<h2 class="wp-block-heading">Introduction</h2>



<p><a href="https://www.microsoft.com/en-us/microsoft-teams/" target="_blank" rel="noreferrer noopener">Microsoft Teams</a> is the enterprise messaging solution in the Microsoft 365, allowing for real time collaboration, communication, meeting, file and app sharing and more.</p>



<h2 class="wp-block-heading">What is a Microsoft Team?</h2>



<p>In a simple way, a Team in Microsoft Teams is a collaboration and communication workspace, allowing a set users to chat, hold meetings and share files and apps with its members or a subset of its members. When a team is created in Microsoft Teams, the following is created:</p>



<ul class="wp-block-list">
<li>A Team in Microsoft Teams</li>



<li>A SharePoint Site to hold the Teams&#8217;s files</li>



<li>A Microsoft 365 Group that manages access to the team</li>



<li>An Exchange Online mailbox</li>



<li>A Shared Calendar</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="634" height="621" src="https://blogit.create.pt/wp-content/uploads/2024/02/Team_M365Group.jpg" alt="" class="wp-image-13243" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Team_M365Group.jpg 634w, https://blogit.create.pt/wp-content/uploads/2024/02/Team_M365Group-300x294.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Team_M365Group-429x420.jpg 429w, https://blogit.create.pt/wp-content/uploads/2024/02/Team_M365Group-70x70.jpg 70w" sizes="(max-width: 634px) 100vw, 634px" /></figure>



<p>To create a new Team in Microsoft Teams, follow the following steps:</p>



<ul class="wp-block-list">
<li>Select <strong>Teams</strong> in the left navigation and then <strong>+</strong></li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="469" height="251" src="https://blogit.create.pt/wp-content/uploads/2024/02/Team_Create3.jpg" alt="" class="wp-image-13287" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Team_Create3.jpg 469w, https://blogit.create.pt/wp-content/uploads/2024/02/Team_Create3-300x161.jpg 300w" sizes="(max-width: 469px) 100vw, 469px" /></figure>



<ul class="wp-block-list">
<li>Give the Team a name and description</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="722" height="709" src="https://blogit.create.pt/wp-content/uploads/2024/02/Team_Create.jpg" alt="" class="wp-image-13288" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Team_Create.jpg 722w, https://blogit.create.pt/wp-content/uploads/2024/02/Team_Create-300x295.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Team_Create-696x683.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Team_Create-428x420.jpg 428w, https://blogit.create.pt/wp-content/uploads/2024/02/Team_Create-70x70.jpg 70w" sizes="(max-width: 722px) 100vw, 722px" /></figure>



<ul class="wp-block-list">
<li>Add members to the team. In this case, I will add two members, so the Team will have 3 members (the person who creates the Team is automatically added as Owner of the Team).</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="694" height="530" src="https://blogit.create.pt/wp-content/uploads/2024/02/Team_Create2.jpg" alt="" class="wp-image-13291" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Team_Create2.jpg 694w, https://blogit.create.pt/wp-content/uploads/2024/02/Team_Create2-300x229.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Team_Create2-550x420.jpg 550w, https://blogit.create.pt/wp-content/uploads/2024/02/Team_Create2-80x60.jpg 80w" sizes="(max-width: 694px) 100vw, 694px" /></figure>



<p>You can also create a plan in Microsoft Planner that allows you to easily manage team projects and tasks.</p>



<p>Focusing on Microsoft Teams, a Team is composed by channels. It is essentially a way to&nbsp;separate conversations and documents&nbsp;within a Team by topic. For example, in a Project Alpha Team, you can have a General channel (default channel created as part of every team), a Management Channel, a Technical channel, etc. In summary, it is a way to separate topics/conversations and its associated documents. There are the three types of channels in Microsoft Teams:</p>



<ul class="wp-block-list">
<li>Standard channels</li>



<li>Private channels</li>



<li>Shared channels</li>
</ul>



<p>In this post, I will explain what each type of channel and what is the difference between them.</p>



<h2 class="wp-block-heading">Standard Channels</h2>



<p>The first type of channel is called a&nbsp;Standard Channel. There is always a Standard Channel called&nbsp;General created by default in Teams when you create a new Team.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="524" src="https://blogit.create.pt/wp-content/uploads/2024/02/Teams_General_Channel-1024x524.jpg" alt="" class="wp-image-13260" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Teams_General_Channel-1024x524.jpg 1024w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_General_Channel-300x154.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_General_Channel-768x393.jpg 768w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_General_Channel-696x356.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_General_Channel-1068x547.jpg 1068w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_General_Channel-820x420.jpg 820w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_General_Channel.jpg 1525w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Here is the SharePoint site that was created when the team was created.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="498" src="https://blogit.create.pt/wp-content/uploads/2024/02/Teams_SharePointSite-1024x498.jpg" alt="" class="wp-image-13265" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Teams_SharePointSite-1024x498.jpg 1024w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_SharePointSite-300x146.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_SharePointSite-768x373.jpg 768w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_SharePointSite-696x338.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_SharePointSite-1068x519.jpg 1068w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_SharePointSite-864x420.jpg 864w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_SharePointSite.jpg 1329w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p><strong>Who has access to a Standard Channel?</strong></p>



<p>A Standard Channel is available to all team members.</p>



<p><strong>Where are documents stored in a Standard Channel?</strong></p>



<p>The documents are stored in SharePoint, in a folder inside the &#8220;Documents&#8221; document library. For each channel, a folder in the &#8220;Documents&#8221; document library is created and the files are stored inside that folder.</p>



<p>View of the files in a Channel in Teams:</p>



<figure class="wp-block-image size-full"><img decoding="async" width="1006" height="262" src="https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Documents.jpg" alt="" class="wp-image-13274" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Documents.jpg 1006w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Documents-300x78.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Documents-768x200.jpg 768w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Documents-696x181.jpg 696w" sizes="(max-width: 1006px) 100vw, 1006px" /></figure>



<p>View of the files in SharePoint:</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="292" src="https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Documents_SharePoint-1024x292.jpg" alt="" class="wp-image-13275" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Documents_SharePoint-1024x292.jpg 1024w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Documents_SharePoint-300x86.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Documents_SharePoint-768x219.jpg 768w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Documents_SharePoint-696x199.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Documents_SharePoint-1068x305.jpg 1068w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Documents_SharePoint.jpg 1422w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">Private Channels</h2>



<p>The second type of channel is called a&nbsp;Private Channel. As I said earlier, Standard Channels are accessible by all Team members, making all the information in those channels (chats and documents) accessible to every team member. There are situations, where you want to discuss sensitive information with just a few Team members instead of the whole Team. This is where Private Channels are handy, allows us to have private conversations and store sensitive documents in a secure way.</p>



<p>To create a Private Channel, follow the following steps:</p>



<ul class="wp-block-list">
<li>Click on the <strong>&#8230;</strong> near the Team name, and then <strong>Add channel</strong>.</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="416" height="640" src="https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channels_Create.jpg" alt="" class="wp-image-13303" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channels_Create.jpg 416w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channels_Create-195x300.jpg 195w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channels_Create-273x420.jpg 273w" sizes="(max-width: 416px) 100vw, 416px" /></figure>



<ul class="wp-block-list">
<li>Give the channel a name select <strong>Private</strong> in the channel type.</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="687" height="686" src="https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channels_Create2.jpg" alt="" class="wp-image-13306" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channels_Create2.jpg 687w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channels_Create2-300x300.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channels_Create2-150x150.jpg 150w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channels_Create2-421x420.jpg 421w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channels_Create2-70x70.jpg 70w" sizes="(max-width: 687px) 100vw, 687px" /></figure>



<ul class="wp-block-list">
<li>Add members to the channel<br><br><strong>NOTE: </strong>In Private channels, you can only add users that are already members of the Team.</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="683" height="513" src="https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channels_Create3.jpg" alt="" class="wp-image-13308" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channels_Create3.jpg 683w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channels_Create3-300x225.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channels_Create3-559x420.jpg 559w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channels_Create3-80x60.jpg 80w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channels_Create3-265x198.jpg 265w" sizes="(max-width: 683px) 100vw, 683px" /></figure>



<ul class="wp-block-list">
<li>That&#8217;s it. The Private channel is created and is marked with a lock icon.</li>
</ul>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="363" src="https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channels_Create4-1024x363.jpg" alt="" class="wp-image-13312" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channels_Create4-1024x363.jpg 1024w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channels_Create4-300x106.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channels_Create4-768x272.jpg 768w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channels_Create4-696x246.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channels_Create4.jpg 1062w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p><strong>Who has access to a Private Channel?</strong></p>



<p>Only the Private channel members. The channel is not visible to Team members that are not members of the Private channel. We can only invite users that already members of the team, meaning that if the Team members are Meagan and John, I can only invite them and I cannot invite for instance Peter.</p>



<p><strong>Where are documents stored in a <strong>Private </strong>Channel?</strong></p>



<p>The documents once again are stored in SharePoint but for Private channels, information is stored in a different site than the Team SharePoint site. This was the solution that Microsoft implemented that was the only that guarantees that only the channel members have access to the information in the channel. To access the SharePoint site, click on <strong>Files</strong> in the private channel and then <strong>Open in SharePoint</strong>.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="293" src="https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channel_OpenInSharePoint-1024x293.jpg" alt="" class="wp-image-13326" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channel_OpenInSharePoint-1024x293.jpg 1024w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channel_OpenInSharePoint-300x86.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channel_OpenInSharePoint-768x220.jpg 768w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channel_OpenInSharePoint-696x199.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channel_OpenInSharePoint-1068x306.jpg 1068w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channel_OpenInSharePoint.jpg 1250w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>As in a Standard Channel, documents are stored in the &#8220;Documents&#8221; document library, in the folder with the name of the channel.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="408" src="https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channel_SharePointSite-1024x408.jpg" alt="" class="wp-image-13330" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channel_SharePointSite-1024x408.jpg 1024w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channel_SharePointSite-300x120.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channel_SharePointSite-768x306.jpg 768w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channel_SharePointSite-696x278.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channel_SharePointSite-1068x426.jpg 1068w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channel_SharePointSite-1053x420.jpg 1053w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Private_Channel_SharePointSite.jpg 1271w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">Shared Channels</h2>



<p>The third type of channels are called Shared Channels and were introduced due to some limitations in Private Channels. In Private Channels, we can only add users who are already members of the Team which is enough for most cases. However, if you want to discuss a topic with just a few Team members <strong>and users that are not members of the Team</strong>, this is not not possible using Private channels. This is where Shared channels are handy, allows us to have private conversations and store private documents in a secure way with a restricted set of users <strong>but allowing us to collaborate with users outside the Team</strong>. Before Shared channels, if you had a use case like this, you would have to create a new Team with all the users you want to collaborate and give them access to the Team&#8217;s standard channels, associated SharePoint site, Email, Calendar and Planner.</p>



<p>Because all of this, we now have the Shared channel type, which is similar to Private Channels with the possibility of adding members that are not part of Team.</p>



<p>To create a Shared Channel, please follow the following steps:</p>



<ul class="wp-block-list">
<li>Click on the <strong>&#8230;</strong> near the Team name, and then <strong>Add channel</strong>.</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="479" height="643" src="https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channels_Create.jpg" alt="" class="wp-image-13345" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channels_Create.jpg 479w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channels_Create-223x300.jpg 223w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channels_Create-313x420.jpg 313w" sizes="(max-width: 479px) 100vw, 479px" /></figure>



<ul class="wp-block-list">
<li>Give the channel a name select <strong>Shared</strong> in the channel type</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="671" height="669" src="https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channels_Create2.jpg" alt="" class="wp-image-13346" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channels_Create2.jpg 671w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channels_Create2-300x300.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channels_Create2-150x150.jpg 150w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channels_Create2-421x420.jpg 421w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channels_Create2-70x70.jpg 70w" sizes="(max-width: 671px) 100vw, 671px" /></figure>



<ul class="wp-block-list">
<li>Add members to the channel<br><br><strong>NOTE: </strong>In Shared channels, you can add users that are not members of the Team.</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="673" height="500" src="https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channels_Create3.jpg" alt="" class="wp-image-13348" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channels_Create3.jpg 673w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channels_Create3-300x223.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channels_Create3-565x420.jpg 565w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channels_Create3-80x60.jpg 80w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channels_Create3-265x198.jpg 265w" sizes="(max-width: 673px) 100vw, 673px" /></figure>



<ul class="wp-block-list">
<li>That&#8217;s it. The Shared channel is created and is marked with a &#8220;shared&#8221; icon</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="1007" height="407" src="https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channels_Create4.jpg" alt="" class="wp-image-13349" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channels_Create4.jpg 1007w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channels_Create4-300x121.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channels_Create4-768x310.jpg 768w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channels_Create4-696x281.jpg 696w" sizes="(max-width: 1007px) 100vw, 1007px" /></figure>



<p><strong>Who has access to a Shared Channel?</strong></p>



<p>Only the Shared channel members. The channel is not visible to Team members that are not members of the Shared channel. In many ways, the concept is similar to Private channels but with the possibility of adding members outside the Team.</p>



<p><strong>Where are documents stored in a <strong>Shared </strong>Channel?</strong></p>



<p>For Shared channels, documents are stored in the exact same way documents in a Private channel are stored, in a separate SharePoint site for the same security reasons mentioned for Private channels. To access the SharePoint site, click on <strong>Files</strong> in the shared channel and then <strong>Open in SharePoint</strong>.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="263" src="https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channel_OpenInSharePoint-1024x263.jpg" alt="" class="wp-image-13392" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channel_OpenInSharePoint-1024x263.jpg 1024w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channel_OpenInSharePoint-300x77.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channel_OpenInSharePoint-768x197.jpg 768w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channel_OpenInSharePoint-696x179.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channel_OpenInSharePoint-1068x274.jpg 1068w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channel_OpenInSharePoint.jpg 1254w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>As in Standard and Private channels, documents are stored in the &#8220;Documents&#8221; document library, in the folder with the name of the channel.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="368" src="https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channel_SharePointSite-1024x368.jpg" alt="" class="wp-image-13395" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channel_SharePointSite-1024x368.jpg 1024w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channel_SharePointSite-300x108.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channel_SharePointSite-768x276.jpg 768w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channel_SharePointSite-696x250.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channel_SharePointSite-1068x384.jpg 1068w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channel_SharePointSite-1168x420.jpg 1168w, https://blogit.create.pt/wp-content/uploads/2024/02/Teams_Shared_Channel_SharePointSite.jpg 1396w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">Standard vs Private vs Shared Channels</h2>



<figure class="wp-block-table"><table><tbody><tr><td><strong>Channel Type</strong></td><td><strong>Who has access to the Channel?</strong></td><td><strong>Where are documents stored?</strong></td><td><strong>What Resources do users have access to?</strong></td></tr><tr><td>Standard</td><td>All team members</td><td>In the Team&#8217;s associated SharePoint Site.</td><td>All resources of a Microsoft 365 Group (Team, SharePoint Site, Email, Calendar, Planner)</td></tr><tr><td>Private</td><td>Channel members. Channel members must be members of the Team.</td><td>In a separate SharePoint Site that is only accessible by the members of the channel.</td><td>Team, SharePoint Site</td></tr><tr><td>Shared</td><td>Channel members. Channel members can be members outside the Team.</td><td>In a separate SharePoint Site that is only accessible by the members of the channel.</td><td>Team, SharePoint Site</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">Related Articles</h2>



<p>To learn why your business should migrate to SharePoint Online and Office 365, click&nbsp;<a href="https://blogit.create.pt////miguelisidoro/2019/07/29/why-your-business-should-migrate-to-sharepoint-online-and-office-365-the-value-offer-part-1/" target="_blank" rel="noreferrer noopener">here</a>&nbsp;and&nbsp;<a href="https://blogit.create.pt////miguelisidoro/2019/07/29/why-your-business-should-migrate-to-sharepoint-online-and-office-365-the-value-offer-part-2/" target="_blank" rel="noreferrer noopener">here</a>.</p>



<p>If you want to learn how to develop SPFx solutions, click <a href="https://blogit.create.pt/miguelisidoro/2022/05/09/sharepoint-framework-spfx-learning-guide/" target="_blank" rel="noreferrer noopener">here</a>.</p>



<p>If you want to learn how you can rename a modern SharePoint site, click&nbsp;<a href="https://blogit.create.pt////miguelisidoro/2019/09/23/how-to-rename-a-modern-sharepoint-site-url-in-office-365/" target="_blank" rel="noreferrer noopener">here</a>.</p>



<p>If you want to learn how to save time time scheduling your meetings, click&nbsp;<a href="https://blogit.create.pt////miguelisidoro/2020/04/12/save-time-scheduling-microsoft-teams-meetings-using-findtime/" target="_blank" rel="noreferrer noopener">here</a>.</p>



<p>If you want to learn how to enable Microsoft Teams Attendance List Download, click&nbsp;<a href="https://blogit.create.pt////miguelisidoro/2020/09/20/how-to-enable-teams-meeting-attendance-list-download-in-microsoft-365/" target="_blank" rel="noreferrer noopener">here</a>.</p>



<p>If you want to learn how to create a dynamic org-wide team in Microsoft Teams with all active employees, click&nbsp;<a href="https://blogit.create.pt/miguelisidoro/2020/09/21/how-to-create-a-dynamic-team-in-microsoft-teams-with-all-active-employees-in-microsoft-365/" target="_blank" rel="noreferrer noopener">here</a>.</p>



<p>If you want to modernize your SharePoint classic root site to a modern SharePoint site, click&nbsp;<a rel="noreferrer noopener" href="https://blogit.create.pt////miguelisidoro/2019/08/27/how-to-modernize-your-tenant-root-site-collection-in-office-365-using-invoke-spositeswap/" target="_blank">here</a>.</p>



<p>If you are a SharePoint administrator or a SharePoint developer who wants to learn more about how to install a SharePoint 2019 farm in an automated way using PowerShell, I invite you to click&nbsp;<a rel="noreferrer noopener" href="https://blogit.create.pt////miguelisidoro/2018/12/09/how-to-install-a-sharepoint-2019-farm-using-powershell-and-autospinstaller-part-1/" target="_blank">here</a>&nbsp;and&nbsp;<a rel="noreferrer noopener" href="https://blogit.create.pt////miguelisidoro/2018/12/09/how-to-install-a-sharepoint-2019-farm-using-powershell-and-autospinstaller-part-2/" target="_blank">here</a>.</p>



<p>If you learn how to greatly speed up your SharePoint farm update process to ensure your SharePoint farm keeps updated and you stay one step closer to start your move to the cloud, click&nbsp;<a rel="noreferrer noopener" href="https://blogit.create.pt////miguelisidoro/2019/05/02/how-to-speed-up-the-installation-of-sharepoint-cumulative-updates-using-powershell-step-by-step/" target="_blank">here</a>.</p>



<p>If you prefer to use the traditional method to update your farm and want to learn all the steps and precautions necessary to successfully keep your SharePoint farm updated, click&nbsp;<a rel="noreferrer noopener" href="https://blogit.create.pt////miguelisidoro/2019/04/08/how-to-install-sharepoint-cumulative-updates-in-a-sharepoint-farm-step-by-step/" target="_blank">here</a>.</p>



<p>If you want to learn how to upgrade a SharePoint 2013 farm to SharePoint 2019, click&nbsp;<a rel="noreferrer noopener" href="https://blogit.create.pt////miguelisidoro/2019/03/06/how-to-upgrade-from-sharepoint-2013-to-sharepoint-2019-step-by-step-part-1/" target="_blank">here&nbsp;</a>and&nbsp;<a rel="noreferrer noopener" href="https://blogit.create.pt////miguelisidoro/2019/03/06/how-to-upgrade-from-sharepoint-2013-to-sharepoint-2019-step-by-step-part-2/" target="_blank">here</a>.</p>



<p>If SharePoint 2019 is still not an option, you can learn more about how to install a SharePoint 2016 farm in an automated way using PowerShell, click&nbsp;<a rel="noreferrer noopener" href="https://blogit.create.pt////miguelisidoro/2018/07/28/how-to-install-a-sharepoint-2016-farm-using-powershell-and-autospinstaller-part-1/" target="_blank">here</a>&nbsp;and&nbsp;<a rel="noreferrer noopener" href="https://blogit.create.pt////miguelisidoro/2018/07/28/how-to-install-a-sharepoint-2016-farm-using-powershell-and-autospinstaller-part-2/" target="_blank">here</a>.</p>



<p>If you want to learn how to upgrade a SharePoint 2010 farm to SharePoint 2016, click&nbsp;<a rel="noreferrer noopener" href="https://blogit.create.pt////miguelisidoro/2019/02/04/sharepoint-upgrade-upgrading-a-sharepoint-2010-farm-to-sharepoint-2016-step-by-step-part-1/" target="_blank">here&nbsp;</a>and&nbsp;<a rel="noreferrer noopener" href="https://blogit.create.pt////miguelisidoro/2019/02/04/sharepoint-upgrade-upgrading-a-sharepoint-2010-farm-to-sharepoint-2016-step-by-step-part-2/" target="_blank">here</a>.</p>



<p>If you are new to SharePoint and Office 365 and want to learn all about it, take a look at these&nbsp;<a rel="noreferrer noopener" href="https://blogit.create.pt////miguelisidoro/2018/10/17/sharepoint-and-office-365-learning-resources/" target="_blank">learning resources</a>.</p>



<p>If you are work in a large organization who is using Office 365 or thinking to move to Office 365 and is considering between a single or multiple Office 365 tenants, I invite you to read&nbsp;<a rel="noreferrer noopener" href="https://blogit.create.pt////miguelisidoro/2019/01/07/pros-and-cons-of-single-tenant-vs-multiple-tenants-in-office-365/" target="_blank">this article</a>.</p>



<p>If you want to know all about the latest SharePoint and Office 365 announcements from Ignite and some more recent announcements, including Microsoft Search, What’s New to Build a Modern Intranet with SharePoint in Office 365, Deeper Integration between Microsoft Teams and SharePoint and the latest news on SharePoint development, click&nbsp;<a rel="noreferrer noopener" href="https://blogit.create.pt////miguelisidoro/2018/11/21/whats-new-for-sharepoint-and-office-365-after-microsoft-ignite-2018/" target="_blank">here</a>.</p>



<p>If your organization is still not ready to go all in to SharePoint Online and Office 365, a hybrid scenario may be the best choice. SharePoint 2019 RTM was recently announced and if you to learn all about SharePoint 2019 and all its features, click <a href="https://blogit.create.pt////miguelisidoro/2018/11/01/meet-the-new-modern-sharepoint-server-sharepoint-2019-rtm-is-here/" target="_blank" rel="noreferrer noopener">here</a>.</p>
<p>The post <a href="https://blogit.create.pt/miguelisidoro/2024/02/21/standard-vs-private-vs-shared-channels-in-microsoft-teams/">Standard vs Private vs Shared Channels in Microsoft Teams</a> appeared first on <a href="https://blogit.create.pt">Blog IT</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blogit.create.pt/miguelisidoro/2024/02/21/standard-vs-private-vs-shared-channels-in-microsoft-teams/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>How to protect sensitive information in SharePoint Online using Purview Sensitivity Labels</title>
		<link>https://blogit.create.pt/miguelisidoro/2024/02/06/how-to-protect-sensitive-information-in-sharepoint-online-using-purview-sensitivity-labels/</link>
					<comments>https://blogit.create.pt/miguelisidoro/2024/02/06/how-to-protect-sensitive-information-in-sharepoint-online-using-purview-sensitivity-labels/#comments</comments>
		
		<dc:creator><![CDATA[Miguel Isidoro]]></dc:creator>
		<pubDate>Tue, 06 Feb 2024 15:30:35 +0000</pubDate>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[SharePoint Online]]></category>
		<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[#microsoft365]]></category>
		<category><![CDATA[#office365]]></category>
		<category><![CDATA[#purview]]></category>
		<category><![CDATA[#security]]></category>
		<category><![CDATA[#sharepoint]]></category>
		<category><![CDATA[#sharepointonline]]></category>
		<guid isPermaLink="false">https://blogit.create.pt/?p=12970</guid>

					<description><![CDATA[<p>This post explains how we can use Microsoft Purview Sensitivity Labels to protect sensitive information stored in a SharePoint Online site. What are Sensitivity Labels? Microsoft Purview Sensitivity Labels are a data classification and protection system that helps organizations identify, classify, and protect sensitive information across Microsoft 365 and other services. They help you: Here [&#8230;]</p>
<p>The post <a href="https://blogit.create.pt/miguelisidoro/2024/02/06/how-to-protect-sensitive-information-in-sharepoint-online-using-purview-sensitivity-labels/">How to protect sensitive information in SharePoint Online using Purview Sensitivity Labels</a> appeared first on <a href="https://blogit.create.pt">Blog IT</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>This post explains how we can use Microsoft Purview Sensitivity Labels to protect sensitive information stored in a SharePoint Online site.</p>



<h2 class="wp-block-heading">What are Sensitivity Labels?</h2>



<p>Microsoft Purview Sensitivity Labels are a data classification and protection system that helps organizations identify, classify, and protect sensitive information across Microsoft 365 and other services. They help you:</p>



<ul class="wp-block-list">
<li><strong>Classify your data:</strong>&nbsp;Define different levels of sensitivity for your data, such as Confidential, Highly Confidential, and Public.</li>



<li><strong>Protect your data:</strong>&nbsp;Apply protection settings to different levels of sensitivity, such as encryption, access restrictions, and data loss prevention.</li>



<li><strong>Track your data:</strong>&nbsp;Track the movement of sensitive data and identify potential data breaches.</li>
</ul>



<p>Here are some of the benefits of using Microsoft Purview Sensitivity Labels:</p>



<ul class="wp-block-list">
<li><strong>Reduces the risk of data breaches:</strong>&nbsp;By classifying and protecting your sensitive data, you can make it more difficult for unauthorized users to access it.</li>



<li><strong>Improves compliance:</strong>&nbsp;Sensitivity labels can help you meet compliance requirements for data privacy and security.</li>



<li><strong>Increases productivity:</strong>&nbsp;By making it easier for users to identify and protect sensitive data, you can help them be more productive.</li>
</ul>



<h2 class="wp-block-heading">Allow the creation of Sensitivity Labels</h2>



<p>The creation of Sensitivity Labels, may be disabled in your Office 365 tenant. To ensure you can create Sensitivity Labels, run the following script in a PowerShell window. Make sure to change the variables to your environment accordingly.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
$AdminCenterURL = &quot;https://dev-admin.sharepoint.com&quot;
Connect-SPOService -Url $AdminCenterURL
Set-SPOTenant -EnableAIPIntegration $true

Import-Module AzureAD
Connect-AzureAD
$Setting = Get-AzureADDirectorySetting -Id (Get-AzureADDirectorySetting | where -Property DisplayName -Value &quot;Group.Unified&quot; -EQ).id
$Setting&#x5B;&quot;EnableMIPLabels&quot;] = &quot;True&quot;
Set-AzureADDirectorySetting -Id $Setting.Id -DirectorySetting $Setting

</pre></div>


<p>If you don&#8217;t have the AzureAD PowerShell module installed, install it before executing the script by running:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
Install-Module AzureAD -AllowClobber
</pre></div>


<h2 class="wp-block-heading">Creating a Sensitivity Label</h2>



<p>To create a Sensitivity Label, follow the following steps:</p>



<ul class="wp-block-list">
<li>Access the Microsoft Purview compliance portal at <a href="https://compliance.microsoft.com/">https://compliance.microsoft.com/</a> with your Microsoft 365 credentiais.</li>



<li>Select Information protection &#8211;&gt; Labels</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="329" height="717" src="https://blogit.create.pt/wp-content/uploads/2024/02/Purview_Labels.jpg" alt="" class="wp-image-12993" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Purview_Labels.jpg 329w, https://blogit.create.pt/wp-content/uploads/2024/02/Purview_Labels-138x300.jpg 138w, https://blogit.create.pt/wp-content/uploads/2024/02/Purview_Labels-193x420.jpg 193w" sizes="(max-width: 329px) 100vw, 329px" /></figure>



<ul class="wp-block-list">
<li>Select &#8220;Create a label&#8221;</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="521" height="308" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label.jpg" alt="" class="wp-image-12995" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label.jpg 521w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label-300x177.jpg 300w" sizes="(max-width: 521px) 100vw, 521px" /></figure>



<ul class="wp-block-list">
<li>Give the label a name. Example: Confidential. In the end, click Next.</li>
</ul>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="770" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_2-1024x770.jpg" alt="" class="wp-image-12999" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_2-1024x770.jpg 1024w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_2-300x226.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_2-768x577.jpg 768w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_2-696x523.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_2-1068x803.jpg 1068w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_2-559x420.jpg 559w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_2-80x60.jpg 80w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_2-265x198.jpg 265w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_2.jpg 1100w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<ul class="wp-block-list">
<li>Define the scope of the label. Choose both &#8220;Items&#8221; and &#8220;Groups &amp; sites&#8221;. This will allow you to apply the label to both documents and SharePoint sites. In this post, I will focus on SharePoint sites.</li>
</ul>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="749" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_3-1024x749.jpg" alt="" class="wp-image-13001" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_3-1024x749.jpg 1024w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_3-300x219.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_3-768x562.jpg 768w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_3-696x509.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_3-1068x781.jpg 1068w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_3-574x420.jpg 574w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_3-80x60.jpg 80w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_3.jpg 1118w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<ul class="wp-block-list">
<li>Choose the protection settings for the labeled items. Select &#8220;Apply or remove encryption&#8221;. If you want to apply a content marking to the labeled items, select &#8220;Apply content marking&#8221;.</li>
</ul>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="761" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_4-1024x761.jpg" alt="" class="wp-image-13003" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_4-1024x761.jpg 1024w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_4-300x223.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_4-768x571.jpg 768w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_4-696x517.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_4-1068x794.jpg 1068w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_4-565x420.jpg 565w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_4-80x60.jpg 80w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_4-265x198.jpg 265w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_4.jpg 1102w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<ul class="wp-block-list">
<li>Define the encryption settings. Select &#8220;Configure encryption settings&#8221; with the following parameters:
<ul class="wp-block-list">
<li>Assign permissions now or let users decide? : Assign permissions now. With this setting, when the label is applied, the permissions we will define below will be applied</li>



<li>User access to content expires: Never. With this setting, users will not loose access after a period of time.</li>



<li>Allow offline access: Always. With this setting, users may edit documents offline.</li>
</ul>
</li>
</ul>



<p>In the end, select &#8220;Add permissions&#8221;.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="761" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_5-1024x761.jpg" alt="" class="wp-image-13012" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_5-1024x761.jpg 1024w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_5-300x223.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_5-768x570.jpg 768w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_5-696x517.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_5-1068x793.jpg 1068w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_5-565x420.jpg 565w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_5-80x60.jpg 80w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_5-265x198.jpg 265w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_5.jpg 1104w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<ul class="wp-block-list">
<li>For this example, for simplicity, in the &#8220;Assign permissions&#8221; screen, select &#8220;Add any authenticated users&#8221;.</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="605" height="423" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_6.jpg" alt="" class="wp-image-13018" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_6.jpg 605w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_6-300x210.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_6-601x420.jpg 601w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_6-100x70.jpg 100w" sizes="(max-width: 605px) 100vw, 605px" /></figure>



<ul class="wp-block-list">
<li>Select &#8220;Choose permissions&#8221;</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="583" height="162" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_7.jpg" alt="" class="wp-image-13020" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_7.jpg 583w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_7-300x83.jpg 300w" sizes="(max-width: 583px) 100vw, 583px" /></figure>



<ul class="wp-block-list">
<li>Select &#8220;Viewer&#8221; permission and click &#8220;Save&#8221; twice to close the &#8220;Assign permission&#8221; window.</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="594" height="809" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_8.jpg" alt="" class="wp-image-13021" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_8.jpg 594w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_8-220x300.jpg 220w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_8-308x420.jpg 308w" sizes="(max-width: 594px) 100vw, 594px" /></figure>



<p>With this permission, we are granting all authenticated users the Viewer permissions which will grant readonly permissions to the documents classified with this label.</p>



<ul class="wp-block-list">
<li>Next, we want to add edit permissions to a group of users. Select &#8220;Assign permission&#8221; again.</li>
</ul>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="246" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_9-1024x246.jpg" alt="" class="wp-image-13025" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_9-1024x246.jpg 1024w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_9-300x72.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_9-768x185.jpg 768w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_9-696x167.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_9.jpg 1043w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<ul class="wp-block-list">
<li>Select &#8220;Add users or groups&#8221; and choose a group of users you want to assign edit permissions to.</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="836" height="620" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_10.jpg" alt="" class="wp-image-13027" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_10.jpg 836w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_10-300x222.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_10-768x570.jpg 768w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_10-696x516.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_10-566x420.jpg 566w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_10-80x60.jpg 80w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_10-265x198.jpg 265w" sizes="(max-width: 836px) 100vw, 836px" /></figure>



<ul class="wp-block-list">
<li>Select the &#8220;Reviewer&#8221; permission</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="499" height="653" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_11.jpg" alt="" class="wp-image-13033" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_11.jpg 499w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_11-229x300.jpg 229w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_11-321x420.jpg 321w" sizes="(max-width: 499px) 100vw, 499px" /></figure>



<ul class="wp-block-list">
<li>Confirm all permissions and click Next.</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="787" height="456" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_12.jpg" alt="" class="wp-image-13031" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_12.jpg 787w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_12-300x174.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_12-768x445.jpg 768w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_12-696x403.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_12-725x420.jpg 725w" sizes="(max-width: 787px) 100vw, 787px" /></figure>



<ul class="wp-block-list">
<li>Don&#8217;t select the option &#8220;Auto-labeling for files and emails&#8221;. Click Next. </li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="743" height="773" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_13.jpg" alt="" class="wp-image-13039" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_13.jpg 743w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_13-288x300.jpg 288w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_13-696x724.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_13-404x420.jpg 404w" sizes="(max-width: 743px) 100vw, 743px" /></figure>



<ul class="wp-block-list">
<li>Select &#8220;Privacy and external user access&#8221; and &#8220;External sharing and Conditional Access&#8221; options.</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="761" height="238" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_14.jpg" alt="" class="wp-image-13042" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_14.jpg 761w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_14-300x94.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_14-696x218.jpg 696w" sizes="(max-width: 761px) 100vw, 761px" /></figure>



<ul class="wp-block-list">
<li>In &#8220;Privacy&#8221; section, select &#8220;Private&#8221;. This way, only team owners and members can acess the group or team. In the &#8220;External user access&#8221;, don&#8217;t select the option &#8220;Let Microsoft 365 Group owners add people outside your organization to the group as guests.&#8221;. This way, only users from within the organization can access the SharePoint site.</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="747" height="514" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_15.jpg" alt="" class="wp-image-13043" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_15.jpg 747w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_15-300x206.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_15-218x150.jpg 218w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_15-696x479.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_15-610x420.jpg 610w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_15-100x70.jpg 100w" sizes="(max-width: 747px) 100vw, 747px" /></figure>



<ul class="wp-block-list">
<li>In &#8220;Define external sharing and conditional access settings&#8221;, select &#8220;Control external sharing from labeled SharePoint sites&#8221; and &#8220;Use Microsoft Entra Conditional Access to protect labeled SharePoint sites&#8221;. In the &#8220;Control external sharing from labeled SharePoint sites&#8221; section, select &#8220;Only people in your organization&#8221;. This way, SharePoint sites labeled with this label, will only be acessed by and shared with people in your organization. In the &#8220;Use Microsoft Entra Conditional Access to protect labeled SharePoint sites&#8221;, select &#8220;Allow limited, web-only access&#8221;. This will only allow users from unmanaged devices (devices not managed by your organization, typically personal devices) to access documents in the labeled SharePoint sites using the browser (not being to synchronize the document libraries for offline access, download documents or open documents in the Office desktop applications).</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="760" height="827" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_16.jpg" alt="" class="wp-image-13048" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_16.jpg 760w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_16-276x300.jpg 276w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_16-696x757.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_16-386x420.jpg 386w" sizes="(max-width: 760px) 100vw, 760px" /></figure>



<ul class="wp-block-list">
<li>In the &#8220;Auto-labeling for schematized data assets (preview)&#8221; section, leave the option unselected and click &#8220;Next&#8221;.</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="763" height="242" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_17.jpg" alt="" class="wp-image-13058" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_17.jpg 763w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_17-300x95.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_17-696x221.jpg 696w" sizes="(max-width: 763px) 100vw, 763px" /></figure>



<ul class="wp-block-list">
<li>Review the label settings and click &#8220;Create label&#8221; to finish the label creation process.</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="321" height="810" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_18.jpg" alt="" class="wp-image-13062" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_18.jpg 321w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_18-119x300.jpg 119w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_18-166x420.jpg 166w" sizes="(max-width: 321px) 100vw, 321px" /></figure>



<h2 class="wp-block-heading">Publish a Sensitivity Label</h2>



<p>In order for a label to be made available, we need to publish it. To publish a label, follow the following steps:</p>



<ul class="wp-block-list">
<li>In the Labels page, select the label and the option &#8220;Publish label&#8221;.</li>
</ul>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="642" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_19-1024x642.jpg" alt="" class="wp-image-13067" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_19-1024x642.jpg 1024w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_19-300x188.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_19-768x481.jpg 768w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_19-696x436.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_19-1068x669.jpg 1068w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_19-670x420.jpg 670w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_19.jpg 1095w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<ul class="wp-block-list">
<li>In &#8220;Assign admin units&#8221; page, leave the default values and click &#8220;Next&#8221;.</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="738" height="725" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_21.jpg" alt="" class="wp-image-13069" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_21.jpg 738w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_21-300x295.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_21-696x684.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_21-428x420.jpg 428w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_21-70x70.jpg 70w" sizes="(max-width: 738px) 100vw, 738px" /></figure>



<ul class="wp-block-list">
<li>In &#8220;Publish to users and groups&#8221;, add all users and groups and then click &#8220;Next&#8221;. If you want to test the Label to a restricted group of users, select a group with the users that you want to include in test.</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="739" height="718" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_22.jpg" alt="" class="wp-image-13071" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_22.jpg 739w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_22-300x291.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_22-696x676.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_22-432x420.jpg 432w" sizes="(max-width: 739px) 100vw, 739px" /></figure>



<ul class="wp-block-list">
<li>In &#8220;Policy settings&#8221;, leave all options unselected and click &#8220;Next&#8221;.</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="734" height="719" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_23.jpg" alt="" class="wp-image-13073" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_23.jpg 734w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_23-300x294.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_23-696x682.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_23-429x420.jpg 429w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_23-70x70.jpg 70w" sizes="(max-width: 734px) 100vw, 734px" /></figure>



<ul class="wp-block-list">
<li>In Default settings for documents, select &#8220;None&#8221; for &#8220;Default label&#8221;. With this selection, labels won&#8217;t be applied by default to Office documents. Click &#8220;Next&#8221;.</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="741" height="716" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_24.jpg" alt="" class="wp-image-13075" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_24.jpg 741w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_24-300x290.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_24-696x673.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_24-435x420.jpg 435w" sizes="(max-width: 741px) 100vw, 741px" /></figure>



<ul class="wp-block-list">
<li>In Default settings for emails, select &#8220;Same as document&#8221; in &#8220;Default Label&#8221; and leave the checkbox &#8220;Email inherits highest priority label from attachments&#8221; unchecked  and click &#8220;Next&#8221;.</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="731" height="748" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_25.jpg" alt="" class="wp-image-13091" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_25.jpg 731w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_25-293x300.jpg 293w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_25-696x712.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_25-410x420.jpg 410w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_25-356x364.jpg 356w" sizes="(max-width: 731px) 100vw, 731px" /></figure>



<ul class="wp-block-list">
<li>In &#8220;Default settings for meetings and calendar events&#8221;, select &#8220;None&#8221; for &#8220;Default label&#8221; and click &#8220;Next&#8221;.</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="738" height="756" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_26.jpg" alt="" class="wp-image-13093" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_26.jpg 738w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_26-293x300.jpg 293w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_26-696x713.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_26-410x420.jpg 410w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_26-356x364.jpg 356w" sizes="(max-width: 738px) 100vw, 738px" /></figure>



<ul class="wp-block-list">
<li>In &#8220;Default settings for sites and groups&#8221;, select &#8220;None&#8221; for &#8220;Default label&#8221; and click &#8220;Next&#8221;.</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="743" height="761" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_27.jpg" alt="" class="wp-image-13106" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_27.jpg 743w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_27-293x300.jpg 293w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_27-696x713.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_27-410x420.jpg 410w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_27-356x364.jpg 356w" sizes="(max-width: 743px) 100vw, 743px" /></figure>



<ul class="wp-block-list">
<li>In &#8220;Default settings for Fabric and Power BI content&#8221;, select &#8220;None&#8221; for &#8220;Default label&#8221; and click &#8220;Next&#8221;.</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="736" height="758" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_28.jpg" alt="" class="wp-image-13110" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_28.jpg 736w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_28-291x300.jpg 291w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_28-696x717.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_28-408x420.jpg 408w" sizes="(max-width: 736px) 100vw, 736px" /></figure>



<ul class="wp-block-list">
<li>In &#8220;Name your policy&#8221;, name your policy and give it a description.</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="752" height="757" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_29.jpg" alt="" class="wp-image-13112" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_29.jpg 752w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_29-298x300.jpg 298w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_29-150x150.jpg 150w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_29-696x701.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_29-417x420.jpg 417w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_29-70x70.jpg 70w" sizes="(max-width: 752px) 100vw, 752px" /></figure>



<ul class="wp-block-list">
<li>Review and submit the Label policy to finish the policy creation process.</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="730" height="758" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_30.jpg" alt="" class="wp-image-13114" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_30.jpg 730w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_30-289x300.jpg 289w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_30-696x723.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Label_30-404x420.jpg 404w" sizes="(max-width: 730px) 100vw, 730px" /></figure>



<p><strong>NOTE: </strong>New labels may take up to 1h to be available. Updates to existing labels may take up to 24h to take effect.</p>



<h2 class="wp-block-heading">Testing Access to SharePoint</h2>



<p>To test if the label is successfully applied, we are going to create a SharePoint Team site and apply the label to the site. Follow the following steps:</p>



<ul class="wp-block-list">
<li>Click SharePoint in the left top corner to go to the SharePoint homepage</li>



<li>In the SharePoint homepage, create a new site.</li>
</ul>



<figure class="wp-block-image size-full"><img decoding="async" width="813" height="105" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_01.jpg" alt="" class="wp-image-13123" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_01.jpg 813w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_01-300x39.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_01-768x99.jpg 768w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_01-696x90.jpg 696w" sizes="(max-width: 813px) 100vw, 813px" /></figure>



<ul class="wp-block-list">
<li>Choose a Team Site</li>
</ul>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="710" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_02-1024x710.jpg" alt="" class="wp-image-13125" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_02-1024x710.jpg 1024w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_02-300x208.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_02-768x533.jpg 768w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_02-218x150.jpg 218w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_02-696x483.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_02-1068x741.jpg 1068w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_02-605x420.jpg 605w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_02-100x70.jpg 100w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_02.jpg 1123w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<ul class="wp-block-list">
<li>Choose any template. For simplicity, I selected &#8220;Standard team&#8221;.</li>
</ul>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="724" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_03-1024x724.jpg" alt="" class="wp-image-13127" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_03-1024x724.jpg 1024w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_03-300x212.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_03-768x543.jpg 768w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_03-696x492.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_03-1068x755.jpg 1068w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_03-594x420.jpg 594w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_03-100x70.jpg 100w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_03.jpg 1139w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<ul class="wp-block-list">
<li>Click on &#8220;Use Template&#8221;</li>
</ul>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="723" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_04-1024x723.jpg" alt="" class="wp-image-13131" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_04-1024x723.jpg 1024w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_04-300x212.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_04-768x542.jpg 768w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_04-696x491.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_04-1068x754.jpg 1068w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_04-595x420.jpg 595w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_04-100x70.jpg 100w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_04.jpg 1155w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<ul class="wp-block-list">
<li>Set the site name, group email address and site address.</li>
</ul>



<figure class="wp-block-image size-large"><img decoding="async" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_05.jpg" alt="" /></figure>



<ul class="wp-block-list">
<li>Set the sentitivity label for the new site by choosing the label we created earlier. The privacy will automatically be set to Private as we defined in the label settings.</li>
</ul>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="726" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_06-1024x726.jpg" alt="" class="wp-image-13143" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_06-1024x726.jpg 1024w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_06-300x213.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_06-768x545.jpg 768w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_06-696x494.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_06-1068x758.jpg 1068w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_06-592x420.jpg 592w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_06-100x70.jpg 100w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_06.jpg 1142w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<ul class="wp-block-list">
<li>Add site owners and members to the site.</li>
</ul>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="705" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_07-1024x705.jpg" alt="" class="wp-image-13147" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_07-1024x705.jpg 1024w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_07-300x207.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_07-768x529.jpg 768w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_07-218x150.jpg 218w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_07-696x479.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_07-1068x736.jpg 1068w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_07-610x420.jpg 610w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_07-100x70.jpg 100w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_07.jpg 1089w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<ul class="wp-block-list">
<li>Access the site with an unmanaged device. In this example, the site was created as a “Private” group and with the label “Confidential”. As the site was configured to only allow access from the browser and not allow the use of Office desktop applications by devices not managed by the organization, a message appears at the top of the site indicating that it is not possible to download the documents or sync the documents for offline access.</li>
</ul>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="527" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_08-1024x527.jpg" alt="" class="wp-image-13150" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_08-1024x527.jpg 1024w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_08-300x155.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_08-768x396.jpg 768w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_08-696x359.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_08-1068x550.jpg 1068w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_08-815x420.jpg 815w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_08.jpg 1124w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<ul class="wp-block-list">
<li>In the &#8220;Documents&#8221; document library, verify that it is not possible to sync documents for offline access (&#8220;Sync&#8221; command should not be available in the command bar).</li>
</ul>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="428" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_09-1024x428.jpg" alt="" class="wp-image-13153" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_09-1024x428.jpg 1024w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_09-300x126.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_09-768x321.jpg 768w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_09-696x291.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_09-1068x447.jpg 1068w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_09-1004x420.jpg 1004w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_09.jpg 1133w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<ul class="wp-block-list">
<li>In the &#8220;Documents&#8221; document library, verify that it is not possible to download documents (&#8220;Download&#8221; option should not be available in the document context menu).</li>
</ul>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="804" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_10-1024x804.jpg" alt="" class="wp-image-13164" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_10-1024x804.jpg 1024w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_10-300x236.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_10-768x603.jpg 768w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_10-696x546.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_10-1068x838.jpg 1068w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_10-535x420.jpg 535w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_10.jpg 1126w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<ul class="wp-block-list">
<li>In the &#8220;Documents&#8221; document library, verify that it is not possible to open a document using the desktop application and that documents can only be opened using the browser.</li>
</ul>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="541" src="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_11-1024x541.jpg" alt="" class="wp-image-13167" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_11-1024x541.jpg 1024w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_11-300x159.jpg 300w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_11-768x406.jpg 768w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_11-696x368.jpg 696w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_11-1068x564.jpg 1068w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_11-795x420.jpg 795w, https://blogit.create.pt/wp-content/uploads/2024/02/Create_Site_11.jpg 1126w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">Related Articles</h2>



<p>To learn why your business should migrate to SharePoint Online and Office 365, click&nbsp;<a href="https://blogit.create.pt////miguelisidoro/2019/07/29/why-your-business-should-migrate-to-sharepoint-online-and-office-365-the-value-offer-part-1/" target="_blank" rel="noreferrer noopener">here</a>&nbsp;and&nbsp;<a href="https://blogit.create.pt////miguelisidoro/2019/07/29/why-your-business-should-migrate-to-sharepoint-online-and-office-365-the-value-offer-part-2/" target="_blank" rel="noreferrer noopener">here</a>.</p>



<p>If you want to learn how to develop SPFx solutions, click <a href="https://blogit.create.pt/miguelisidoro/2022/05/09/sharepoint-framework-spfx-learning-guide/" target="_blank" rel="noreferrer noopener">here</a>.</p>



<p>If you want to learn how you can rename a modern SharePoint site, click&nbsp;<a href="https://blogit.create.pt////miguelisidoro/2019/09/23/how-to-rename-a-modern-sharepoint-site-url-in-office-365/" target="_blank" rel="noreferrer noopener">here</a>.</p>



<p>If you want to learn how to save time time scheduling your meetings, click&nbsp;<a href="https://blogit.create.pt////miguelisidoro/2020/04/12/save-time-scheduling-microsoft-teams-meetings-using-findtime/" target="_blank" rel="noreferrer noopener">here</a>.</p>



<p>If you want to learn how to enable Microsoft Teams Attendance List Download, click&nbsp;<a href="https://blogit.create.pt////miguelisidoro/2020/09/20/how-to-enable-teams-meeting-attendance-list-download-in-microsoft-365/" target="_blank" rel="noreferrer noopener">here</a>.</p>



<p>If you want to learn how to create a dynamic org-wide team in Microsoft Teams with all active employees, click&nbsp;<a href="https://blogit.create.pt/miguelisidoro/2020/09/21/how-to-create-a-dynamic-team-in-microsoft-teams-with-all-active-employees-in-microsoft-365/" target="_blank" rel="noreferrer noopener">here</a>.</p>



<p>If you want to modernize your SharePoint classic root site to a modern SharePoint site, click&nbsp;<a rel="noreferrer noopener" href="https://blogit.create.pt////miguelisidoro/2019/08/27/how-to-modernize-your-tenant-root-site-collection-in-office-365-using-invoke-spositeswap/" target="_blank">here</a>.</p>



<p>If you are a SharePoint administrator or a SharePoint developer who wants to learn more about how to install a SharePoint 2019 farm in an automated way using PowerShell, I invite you to click&nbsp;<a rel="noreferrer noopener" href="https://blogit.create.pt////miguelisidoro/2018/12/09/how-to-install-a-sharepoint-2019-farm-using-powershell-and-autospinstaller-part-1/" target="_blank">here</a>&nbsp;and&nbsp;<a rel="noreferrer noopener" href="https://blogit.create.pt////miguelisidoro/2018/12/09/how-to-install-a-sharepoint-2019-farm-using-powershell-and-autospinstaller-part-2/" target="_blank">here</a>.</p>



<p>If you learn how to greatly speed up your SharePoint farm update process to ensure your SharePoint farm keeps updated and you stay one step closer to start your move to the cloud, click&nbsp;<a rel="noreferrer noopener" href="https://blogit.create.pt////miguelisidoro/2019/05/02/how-to-speed-up-the-installation-of-sharepoint-cumulative-updates-using-powershell-step-by-step/" target="_blank">here</a>.</p>



<p>If you prefer to use the traditional method to update your farm and want to learn all the steps and precautions necessary to successfully keep your SharePoint farm updated, click&nbsp;<a rel="noreferrer noopener" href="https://blogit.create.pt////miguelisidoro/2019/04/08/how-to-install-sharepoint-cumulative-updates-in-a-sharepoint-farm-step-by-step/" target="_blank">here</a>.</p>



<p>If you want to learn how to upgrade a SharePoint 2013 farm to SharePoint 2019, click&nbsp;<a rel="noreferrer noopener" href="https://blogit.create.pt////miguelisidoro/2019/03/06/how-to-upgrade-from-sharepoint-2013-to-sharepoint-2019-step-by-step-part-1/" target="_blank">here&nbsp;</a>and&nbsp;<a rel="noreferrer noopener" href="https://blogit.create.pt////miguelisidoro/2019/03/06/how-to-upgrade-from-sharepoint-2013-to-sharepoint-2019-step-by-step-part-2/" target="_blank">here</a>.</p>



<p>If SharePoint 2019 is still not an option, you can learn more about how to install a SharePoint 2016 farm in an automated way using PowerShell, click&nbsp;<a rel="noreferrer noopener" href="https://blogit.create.pt////miguelisidoro/2018/07/28/how-to-install-a-sharepoint-2016-farm-using-powershell-and-autospinstaller-part-1/" target="_blank">here</a>&nbsp;and&nbsp;<a rel="noreferrer noopener" href="https://blogit.create.pt////miguelisidoro/2018/07/28/how-to-install-a-sharepoint-2016-farm-using-powershell-and-autospinstaller-part-2/" target="_blank">here</a>.</p>



<p>If you want to learn how to upgrade a SharePoint 2010 farm to SharePoint 2016, click&nbsp;<a rel="noreferrer noopener" href="https://blogit.create.pt////miguelisidoro/2019/02/04/sharepoint-upgrade-upgrading-a-sharepoint-2010-farm-to-sharepoint-2016-step-by-step-part-1/" target="_blank">here&nbsp;</a>and&nbsp;<a rel="noreferrer noopener" href="https://blogit.create.pt////miguelisidoro/2019/02/04/sharepoint-upgrade-upgrading-a-sharepoint-2010-farm-to-sharepoint-2016-step-by-step-part-2/" target="_blank">here</a>.</p>



<p>If you are new to SharePoint and Office 365 and want to learn all about it, take a look at these&nbsp;<a rel="noreferrer noopener" href="https://blogit.create.pt////miguelisidoro/2018/10/17/sharepoint-and-office-365-learning-resources/" target="_blank">learning resources</a>.</p>



<p>If you are work in a large organization who is using Office 365 or thinking to move to Office 365 and is considering between a single or multiple Office 365 tenants, I invite you to read&nbsp;<a rel="noreferrer noopener" href="https://blogit.create.pt////miguelisidoro/2019/01/07/pros-and-cons-of-single-tenant-vs-multiple-tenants-in-office-365/" target="_blank">this article</a>.</p>



<p>If you want to know all about the latest SharePoint and Office 365 announcements from Ignite and some more recent announcements, including Microsoft Search, What’s New to Build a Modern Intranet with SharePoint in Office 365, Deeper Integration between Microsoft Teams and SharePoint and the latest news on SharePoint development, click&nbsp;<a rel="noreferrer noopener" href="https://blogit.create.pt////miguelisidoro/2018/11/21/whats-new-for-sharepoint-and-office-365-after-microsoft-ignite-2018/" target="_blank">here</a>.</p>



<p>If your organization is still not ready to go all in to SharePoint Online and Office 365, a hybrid scenario may be the best choice. SharePoint 2019 RTM was recently announced and if you to learn all about SharePoint 2019 and all its features, click&nbsp;<a href="https://blogit.create.pt////miguelisidoro/2018/11/01/meet-the-new-modern-sharepoint-server-sharepoint-2019-rtm-is-here/" target="_blank" rel="noreferrer noopener">here</a>.</p>



<p>Happy SharePointing!</p>
<p>The post <a href="https://blogit.create.pt/miguelisidoro/2024/02/06/how-to-protect-sensitive-information-in-sharepoint-online-using-purview-sensitivity-labels/">How to protect sensitive information in SharePoint Online using Purview Sensitivity Labels</a> appeared first on <a href="https://blogit.create.pt">Blog IT</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blogit.create.pt/miguelisidoro/2024/02/06/how-to-protect-sensitive-information-in-sharepoint-online-using-purview-sensitivity-labels/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Dreamforce 2023 Highlights</title>
		<link>https://blogit.create.pt/davidpereira/2024/02/05/dreamforce-2023-highlights/</link>
					<comments>https://blogit.create.pt/davidpereira/2024/02/05/dreamforce-2023-highlights/#respond</comments>
		
		<dc:creator><![CDATA[David Pereira]]></dc:creator>
		<pubDate>Mon, 05 Feb 2024 14:01:48 +0000</pubDate>
				<category><![CDATA[Misc]]></category>
		<category><![CDATA[salesforce]]></category>
		<category><![CDATA[sfcc]]></category>
		<guid isPermaLink="false">https://blogit.create.pt/?p=13007</guid>

					<description><![CDATA[<p>In this post I&#8217;ll go over my highlights of a huge event that took part some months ago &#8211; Salesforce Dreamforce 2023. Many announcements are interesting like Marketing Cloud and Commerce Cloud being integrated into the Einstein 1 platform. I believe for Commerce Cloud this means only the B2B and D2C products… at least for [&#8230;]</p>
<p>The post <a href="https://blogit.create.pt/davidpereira/2024/02/05/dreamforce-2023-highlights/">Dreamforce 2023 Highlights</a> appeared first on <a href="https://blogit.create.pt">Blog IT</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>In this post I&#8217;ll go over my highlights of a huge event that took part some months ago &#8211; Salesforce Dreamforce 2023. Many announcements are interesting like Marketing Cloud and Commerce Cloud being integrated into the Einstein 1 platform. I believe for Commerce Cloud this means only the B2B and D2C products… at least for now 🙂. I&#8217;ll focus on the B2C side of Commerce Cloud, although most features were announced for B2B and D2C.</p>



<p>You can also watch <a href="https://www.youtube.com/watch?v=4j-HyuHDQQ4">Salesforce Keynote highlights of the event</a>.</p>



<h2 class="wp-block-heading">Einstein 1 Platform</h2>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img decoding="async" width="708" height="362" src="https://blogit.create.pt/wp-content/uploads/2024/02/einsteinplatform.webp" alt="einstein 1 platform slide" class="wp-image-13080" style="width:708px;height:auto" srcset="https://blogit.create.pt/wp-content/uploads/2024/02/einsteinplatform.webp 708w, https://blogit.create.pt/wp-content/uploads/2024/02/einsteinplatform-300x153.webp 300w, https://blogit.create.pt/wp-content/uploads/2024/02/einsteinplatform-696x356.webp 696w" sizes="(max-width: 708px) 100vw, 708px" /><figcaption class="wp-element-caption">Image source &#8211; <a href="https://www.youtube.com/watch?v=Ew-xxNhhscU&amp;t=1528s">Dreamforce 2023 Main Keynote</a></figcaption></figure>
</div>


<p>Salesforce announced the&nbsp;<strong>Einstein Trust Layer</strong>&nbsp;which seems to be their focus of what&#8217;s behind the Einstein 1 Platform. This makes sense since Salesforce&#8217;s core value is <strong>trust</strong>, this product might be&nbsp;the core that separates Salesforce AI functionality from other solutions. I&#8217;m very interested in learning more about each specific part they announced, like data masking, zero retention, and dynamic grounding. We should know what prompt is sent to the LLMs, how the <strong>CRM and other enterprise data</strong> are used in prompts (for dynamic grounding), and <strong>how exactly</strong> zero retention is implemented in each LLM provider (e.g. OpenAI). It&#8217;s great seeing a slide explaining Einstein Trust Layer makes sure the prompt is not used by the LLMs to train their model, but I think it&#8217;s important to challenge these claims and ask questions 🙂.</p>



<p>It would also be interesting to try and connect external models or cloud services, like LAMA, Amazon SageMaker or Azure OpenAI service. This way we take advantage of the middleware inside the Trust Layer that guarantees security and input moderation. As partners, we have access to some Salesforce events and I definitely recommend attending &#8220;<strong>AI &amp; Einstein Office Hours</strong>&#8221; on Tuesdays. Claudio Moraes from Salesforce is sharing extremely useful information about Einstein GPT, the details of the Trust Layer, and more AI topics!</p>



<p>Here are some interesting videos that Salesforce has already done, explaining further the Einstein Trust layer and Einstein GPT:</p>



<ul class="wp-block-list">
<li><a href="https://www.youtube.com/watch?v=6KdUfqQ1szE">Build The Future of Business with Einstein GPT  </a></li>



<li><a href="https://www.youtube.com/watch?v=JuYwz5qkSbk">Salesforce AI day: Calling All Trailblazers</a></li>
</ul>



<p></p>



<h2 class="wp-block-heading">Einstein Copilot</h2>



<p>Well… as you know, 2023 was the year of copilots. Salesforce is also taking advantage of that wave and has <a href="https://www.salesforce.com/news/press-releases/2023/09/12/ai-einstein-news-dreamforce/">introduced Einstein Copilot and Einstein Copilot Studio</a>. This looks a lot like what they announced some time ago, Einstein GPT.</p>



<p>I think it&#8217;s great that Einstein is more integrated across various products, especially Commerce and Service Cloud. Facilitating the manual work that the business has to do in various merchandising operations only brings benefits.</p>



<p></p>



<h2 class="wp-block-heading">Generative AI in SFCC Page Designer</h2>



<p>About <a href="https://www.salesforce.com/plus/experience/Dreamforce_2023/series/commerce_at_dreamforce_2023/episode/episode-s1e3">generative Page Designer that they announced</a>, we could simply say &#8220;yup, LGTM&#8221; and simply use it… but I do have some questions that need answering 😅. The demo they showed looks good and it&#8217;s probably a feature that brings tons of value to a lot of customers. But watching it made my mind go through endless questions. At first glance it&#8217;s amazing, we could really speed up the development of new components. UI/UX designers, merchandisers, and other business profiles can ask an AI to generate a component without a dev.</p>



<p>Still, I think as a developer we need to understand what is happening underneath, where is the generated code saved, what is the prompt used to generate the component, does it have context of the whole codebase, etc. This might have been the most interesting announcement and something to watch out for. However, we must also criticize and understand the limitations of this technology. In the demo they created, the user enters a brief description of the layout and content they want in the component, then the code is generated in React (it also supports ISML). I don&#8217;t believe React is actually used in SFRA, only in the Headless architecture, so their demo raises some questions about how it works underneath.</p>



<p>But anyway, I look at this as if it were <a href="https://v0.dev/">v0.dev</a>, that is, the <strong>1st version or v0 of a component</strong>. The business or UI designers can experiment and generate several iterations of a component with this functionality, and then paste the generated code into a user story in a scrum board for a developer to retrieve. But it would just be a v0, something to be iterated over before going to production. I don&#8217;t think we&#8217;re ready yet for generative AI to know the website&#8217;s design system, know what caching considerations to apply to the component, have context about the logic behind add to cart if it&#8217;s integrated with a 3rd party vendor, etc. But we could also be optimistic and in all the use cases where gen AI struggles, it&#8217;s only going to improve.</p>



<p><strong>Note</strong>: Page Designer&#8217;s Generative AI is expected to launch in beta in February 2024.</p>



<p></p>



<h2 class="wp-block-heading">Commerce Concierge</h2>



<p>Salesforce also announced a new product that is in beta called Commerce Concierge. Basically, the product is centered on the concept of Conversational Commerce. We can integrate our e-commerce website into WhatsApp as if it were one of those ChatGPT plugins that allow you to make purchases on a website.</p>



<p>For example, a customer takes a photo of a product and asks if there is a store with stock so they can make the purchase. If the customer happens to make a purchase on WhatsApp, the bot can respond with new product suggestions trying to effectively cross-sell. Technically, Commerce Concierge uses APIs from Commerce Cloud, Service Cloud, Data Cloud, and the AI ​​layer with Einstein GPT. At the moment I think it will only be launched for Commerce B2B and not B2C. This makes sense to me since it is easier to integrate Clouds that are already within the Salesforce Core Platform&#8230; but I hope we have this for SFCC in the future 🙂. I also think it will be possible to expand to more touchpoints, not just WhatsApp.</p>



<p>It&#8217;s also important to be aware of new attack vectors. Innovation is awesome and we should strive for more and tinker with these new capabilities. However, innovation can bring new security concerns. In these apps that will be available straight from WhatsApp or our storefront, we should be aware of <a href="https://learnprompting.org/docs/prompt_hacking/injection">Prompt injection</a>, <a href="https://learnprompting.org/docs/prompt_hacking/jailbreaking">Jailbreaking</a>, etc.</p>



<p></p>



<h2 class="wp-block-heading">Conclusion</h2>



<p>It was a great event and I can&#8217;t wait to get my hands on some Einstein GPT features for B2C! Hopefully, there will be more features on SFCC that are only available for customers of B2B and D2C 🙏. For example generating product descriptions or commerce intelligence 🙂.</p>



<p>Generating product descriptions with Einstein seems to be really useful if we have a batch of new products that we want to launch. It would be great to have this available in an HTTP API, so that we could integrate this functionality in use cases where our PIM (Product Information Management) is a custom system, or just use them in SFCC. Again&#8230; for now some features are only on B2B and D2C side of the commerce products (the ones integrated in Salesforce Core Platform).</p>



<p>If you&#8217;re interested in learning about session management in SFCC <a href="https://blogit.create.pt/davidpereira/2022/06/06/session-management-in-salesforce-b2c-commerce-cloud/">read this blog post</a>.</p>
<p>The post <a href="https://blogit.create.pt/davidpereira/2024/02/05/dreamforce-2023-highlights/">Dreamforce 2023 Highlights</a> appeared first on <a href="https://blogit.create.pt">Blog IT</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blogit.create.pt/davidpereira/2024/02/05/dreamforce-2023-highlights/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
