<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Giovanni</title>
    <description>The latest articles on DEV Community by Giovanni (@guybrush1973).</description>
    <link>https://dev.to/guybrush1973</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3805745%2F43d9b037-bf56-4395-a48b-2a8656c17a6b.png</url>
      <title>DEV Community: Giovanni</title>
      <link>https://dev.to/guybrush1973</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/guybrush1973"/>
    <language>en</language>
    <item>
      <title>The Real Cost of AI Isn't the Price Tag</title>
      <dc:creator>Giovanni</dc:creator>
      <pubDate>Mon, 30 Mar 2026 14:30:06 +0000</pubDate>
      <link>https://dev.to/guybrush1973/the-real-cost-of-ai-isnt-the-price-tag-29jg</link>
      <guid>https://dev.to/guybrush1973/the-real-cost-of-ai-isnt-the-price-tag-29jg</guid>
      <description>&lt;p&gt;Every few months, a new article drops with the same thesis: AI is too expensive, the bubble is about to pop, nobody can sustain these compute bills.&lt;/p&gt;

&lt;p&gt;And every time, I think the same thing. These people have never looked at an infrastructure cost curve before.&lt;/p&gt;

&lt;p&gt;I pay for inference. I pay for compute. I watch the bills. The cost is real and I'm not here to pretend otherwise. But I've also spent over a decade self-hosting infrastructure, and I've watched this exact movie before. The plot doesn't change. Only the actors do.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Paper Era
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frvj6z5usib22daxosp46.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frvj6z5usib22daxosp46.webp" alt="Retro 16-bit side-scroller style illustration. A small cart overflowing with paper documents travels along a road between two university faculty buildings, like a stage transition in a classic video game" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the 1960s, if a researcher at one university needed data from another faculty, the process was exactly what you think it was. Someone physically carried paper across campus.&lt;/p&gt;

&lt;p&gt;Stacks of documents. Walked down hallways. Handed over at a desk.&lt;/p&gt;

&lt;p&gt;That was the state of the art for knowledge sharing. Slow, expensive, limited to whoever could physically show up. The cost wasn't the paper. It was everything that didn't happen because sharing knowledge required a body in a hallway.&lt;/p&gt;

&lt;h2&gt;
  
  
  One Cable Changed Everything
&lt;/h2&gt;

&lt;p&gt;Then someone connected two computers with a cable.&lt;/p&gt;

&lt;p&gt;A local network. The cost was high, the tech was unproven, and most people didn't see the point. They had paper. Paper worked.&lt;/p&gt;

&lt;p&gt;But once researchers experienced instant data sharing, there was no going back.&lt;/p&gt;

&lt;p&gt;That idea spread across campuses. Then across cities. Then someone looked at the Atlantic Ocean and said: "What if we ran a cable across &lt;em&gt;that&lt;/em&gt;?"&lt;/p&gt;

&lt;p&gt;Submarine cables. Chip fabrication plants. Global routing infrastructure. Trillions of dollars poured into something most people couldn't even visualize.&lt;/p&gt;

&lt;p&gt;And now? You send virtually unlimited data to the other side of the planet. Basically for free.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Is at the Cable-Laying Phase
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpewsjapbj73fvvijrdei.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpewsjapbj73fvvijrdei.webp" alt="Two 16-bit pixel art scenes side by side. Left: a crowd of angry pixel-art characters on a dock protesting a ship lowering submarine cable into the ocean. Right: a nearly identical crowd protesting in front of a glowing data center. Same energy, different era" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AI infrastructure is at the "running cable across the ocean floor" phase right now.&lt;/p&gt;

&lt;p&gt;The hardware is expensive. Training runs cost millions. The compute bills look insane.&lt;/p&gt;

&lt;p&gt;And a whole wave of people are saying the same thing they said about the internet: &lt;em&gt;"This costs too much. It's not sustainable. Who's going to pay for this?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The same people who would have looked at a submarine cable project in the 1990s and called it a waste of money.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Cost Curve Always Wins
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcb4b7x1eayu7l6m2bkzf.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcb4b7x1eayu7l6m2bkzf.webp" alt="Retro CRT terminal display showing a single bright green line graph. The line starts extremely high on the left and plunges in a dramatic exponential decay toward zero on the right. Small pixel-art icons along the bottom progress from paper stacks to servers to AI chips" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's what every "AI is too expensive" take misses: they're evaluating a moving target with a still photograph.&lt;/p&gt;

&lt;p&gt;The return curve on transformative infrastructure always follows the same pattern: unbearable at the start, declining faster than anyone predicted, invisible once it matures.&lt;/p&gt;

&lt;p&gt;OpenAI's GPT-4 API pricing dropped roughly 10x within 18 months of launch. The same pattern played out with cloud compute, storage, and bandwidth. The direction is always the same.&lt;/p&gt;

&lt;p&gt;The question was never "is this expensive?" It was always "is the return worth the investment before the cost drops?"&lt;/p&gt;

&lt;h2&gt;
  
  
  The Builder's Bet
&lt;/h2&gt;

&lt;p&gt;The developers figuring out how to use AI now, while it's expensive and messy, are in the same position as those early networked universities.&lt;/p&gt;

&lt;p&gt;By the time the cost drops and everyone else shows up, the experience gap is already set. You've already learned what works, what fails, what your users actually need from AI-powered features. That knowledge doesn't come from waiting. It comes from building while it's still expensive.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Risk
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5rjevk8feq38vrwvi3ik.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5rjevk8feq38vrwvi3ik.webp" alt="Retro pixel art illustration. A developer crouched between two boxy computer terminals, connecting them with a cable. One screen displays a bright green message on a black terminal background. Small, intimate scene lit only by the monitor glow" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The real cost of AI isn't what you pay for compute today.&lt;/p&gt;

&lt;p&gt;It's what you lose by deciding you can't afford to start. It's the products you don't build, the workflows you don't automate, the competitive gap that opens while you're waiting for prices to drop.&lt;/p&gt;

&lt;p&gt;Nobody at those universities went back to carrying paper after they saw what a network could do. And nobody who integrates AI into their development workflow today is going to rip it out when the cost is 10x lower next year.&lt;/p&gt;

&lt;p&gt;If you're watching from the sideline waiting for the "right time" to invest in AI tooling, ask yourself: would you have waited for internet costs to drop before connecting your first two computers?&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is the short version. The &lt;a href="https://wows.dev/blog/indie-ops/the-real-cost-of-ai" rel="noopener noreferrer"&gt;full article on wows.dev&lt;/a&gt; goes deeper into the cost curve data, the opportunity cost math behind the paper era, and why I'm betting on AI infrastructure for my own projects despite the current price tag.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>infrastructure</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>LinkedIn Silently Killed My Post Reach for 3 Weeks. GDPR Was the Only Thing That Fixed It</title>
      <dc:creator>Giovanni</dc:creator>
      <pubDate>Wed, 25 Mar 2026 22:24:56 +0000</pubDate>
      <link>https://dev.to/guybrush1973/linkedin-silently-killed-my-post-reach-for-3-weeks-gdpr-was-the-only-thing-that-fixed-it-pcg</link>
      <guid>https://dev.to/guybrush1973/linkedin-silently-killed-my-post-reach-for-3-weeks-gdpr-was-the-only-thing-that-fixed-it-pcg</guid>
      <description>&lt;p&gt;If you're a developer building a presence on LinkedIn and your impressions suddenly dropped to near-zero, this post might save you weeks of frustration. Here's exactly what happened to me, what didn't work, and the one thing that did.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Timeline
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Week 1:&lt;/strong&gt; First LinkedIn post ever. Opinionated take on developer skills in the AI era. ~10k impressions, 30+ comments. Solid for a brand new account with barely any connections.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwe5vk9yaliaktp3rmztc.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwe5vk9yaliaktp3rmztc.webp" alt="LinkedIn post analytics screenshot showing approximately 10,000 impressions, 30 reactions, and 30 comments on a first post, with personal details obscured" width="800" height="319"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Same week:&lt;/strong&gt; Published a second post with two external links. Deleted it after a week because it wasn't performing. From the moment I posted those links, every subsequent post got fewer than 50 impressions. Total. Not per hour. Total.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Weeks 2-3:&lt;/strong&gt; Posted consistently. Tried different topics, formats, times. Paused activity for 48-72 hours multiple times. Switched to comment-only engagement. Nothing changed. Under 50 impressions per post, every time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 3:&lt;/strong&gt; Contacted support. Got three rounds of copy-paste responses about how the algorithm works. Nobody confirmed or denied whether my account had any flags.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 3.5:&lt;/strong&gt; Filed a formal GDPR Article 15 data access request in the same support thread.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;20+ hours later&lt;/strong&gt; (previous replies had been 30-60 minutes apart): got a response containing this sentence:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"If you experienced any temporary issues previously, they may have been related to normal system checks or short-term technical behavior, which have since been resolved."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Next day:&lt;/strong&gt; Posted again. 2,000+ impressions on 1,200+ unique members in 9 hours. Normal distribution restored.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbjhpkeua7i42f8u8y8c8.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbjhpkeua7i42f8u8y8c8.webp" alt="LinkedIn weekly content performance chart showing a flat line near zero from March 19 to March 23, followed by a sharp vertical spike on March 25 after the GDPR request was filed" width="727" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Ruled Out
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;No automation tools, ever&lt;/li&gt;
&lt;li&gt;No policy warnings or content removals from LinkedIn&lt;/li&gt;
&lt;li&gt;No engagement pods&lt;/li&gt;
&lt;li&gt;Comments on other people's posts were visible and received replies&lt;/li&gt;
&lt;li&gt;Could log in, message, connect. Everything worked except post distribution&lt;/li&gt;
&lt;li&gt;LinkedIn Premium (activated during this period) had no effect either way&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This wasn't "the algorithm not liking my content." A 99.5% drop that persists for three weeks across all content types, formats, and posting times is a flag on the account, not a content quality issue.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Support Actually Did
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Round 1:&lt;/strong&gt; Generic template about duplicate accounts and identity verification. Completely unrelated to my question.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Round 2:&lt;/strong&gt; "Forwarded to another group." Then a full copy-paste about how the LinkedIn algorithm works. Said they "didn't find any technical inconsistencies" but never confirmed whether my account had any restrictions.&lt;/p&gt;

&lt;p&gt;Note: "no technical inconsistencies" and "no restrictions" are very different statements. Read support responses carefully for what they &lt;em&gt;don't&lt;/em&gt; say.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Round 3:&lt;/strong&gt; After I filed a GDPR request citing Article 15, Article 22, and LinkedIn Ireland as data controller: 20+ hours of silence, then the "short-term technical behavior which has since been resolved" response.&lt;/p&gt;

&lt;p&gt;The funny part? We were both crafting rough replies to each other, mediated by the kindness of each other's LLM.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqlgvsuymwv9hkgz7ix4u.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqlgvsuymwv9hkgz7ix4u.webp" alt="Satirical illustration of two people communicating through AI assistants. On the left, a frustrated developer angrily types while a glowing AI transforms his message into a polite blue speech bubble. On the right, a disengaged support agent copy-pastes while his AI does the same. The two polite bubbles meet in the center while the real emotions are filtered out" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The GDPR Angle (EU Residents)
&lt;/h2&gt;

&lt;p&gt;If you're in the EU, this is your strongest tool. Here's why it works:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Article 15&lt;/strong&gt; of the GDPR gives you the right to access all personal data a company holds on you. This includes automated profiling data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Article 22&lt;/strong&gt; specifically covers automated decision-making that significantly affects you. An algorithm deciding whether to show your content to 10,000 people or 10 people qualifies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Article 12(3)&lt;/strong&gt; requires a response within 30 days.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LinkedIn Ireland Unlimited Company&lt;/strong&gt; is the data controller for all EEA users. Not LinkedIn Corporation in California. LinkedIn Ireland.&lt;/p&gt;

&lt;p&gt;Here's the short version for your initial request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I am an EU resident. Under Article 15 of the GDPR, I request 
disclosure of the following personal data:

a) Any flags, restrictions, or classifications applied to my account
b) Any content moderation actions taken on my posts
c) Any automated profiling scores or signals associated with my 
   account that affect content distribution (including trust scores, 
   spam scores, content quality scores, or distribution throttling)
d) Meaningful information about the logic involved in automated 
   decision-making that affects my content's reach, per Article 15(1)(h)

LinkedIn Ireland Unlimited Company, as data controller for EEA users, 
is required to respond within 30 days (Article 12(3)).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When they inevitably ignore it (mine was ignored twice), here's the full escalation template that actually worked:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hi [contact name],

Thank you for your reply. I appreciate the additional detail, 
but I need to point out two issues:

1. You did not confirm or deny whether my account has any flags, 
   restrictions, trust scores, spam classifications, or content 
   moderation actions applied to it. I'm asking for a direct answer: 
   does my account have any flags or distribution restrictions, 
   yes or no?

2. More importantly, my previous message included a formal data 
   access request under Article 15 of the GDPR. This was not 
   acknowledged in your response. I will restate it clearly:

FORMAL GDPR DATA ACCESS REQUEST
Article 15, Regulation (EU) 2016/679

I, [your name], EU resident ([your country]), hereby exercise my 
right of access under Article 15 of the General Data Protection 
Regulation. I also invoke my rights under Article 22 regarding 
automated decision-making and profiling.

I request that LinkedIn Ireland Unlimited Company, as the data 
controller for EEA users, provide me with the following personal data:

a) Any flags, restrictions, classifications, or labels applied to 
   my account or profile
b) Any content moderation actions or decisions taken regarding my posts
c) Any automated profiling scores or signals associated with my 
   account that affect the distribution or visibility of my content 
   (including but not limited to: trust scores, spam scores, content 
   quality scores, shadow ban status, or distribution throttling 
   indicators)
d) Meaningful information about the logic involved in any automated 
   decision-making that significantly affects my content's reach, 
   as required by Article 15(1)(h)

LinkedIn is required to respond to this request without undue delay 
and no later than 30 days from receipt (Article 12(3)).

If this support channel is not the appropriate place to process GDPR 
requests, please direct me to the correct team or data protection 
officer immediately. Do not close this case until the GDPR request 
has been properly addressed or redirected.

Thank you,
[your name]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This turns a customer service complaint into a legal obligation. First-tier support agents cannot close a ticket with a copy-paste when a formal data access request is sitting in it. It has to go to legal or privacy teams, which is where people with actual access to account-level data sit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If they don't respond within 30 days:&lt;/strong&gt; file a complaint with your national data protection authority. In Italy it's the Garante per la protezione dei dati personali. Every EU country has one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Think Happened
&lt;/h2&gt;

&lt;p&gt;Educated guess, not confirmed:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Post with external links triggered an automated flag. LinkedIn's system classified the account as potentially spammy&lt;/li&gt;
&lt;li&gt;Deleting the post didn't clear the flag. The signal was already recorded (perhaps it even reinforced it)&lt;/li&gt;
&lt;li&gt;The flag suppressed post distribution but left all other features working (comments, messages, profile). This is a "content distribution restriction," not a full shadow ban&lt;/li&gt;
&lt;li&gt;Three weeks of normal behavior didn't auto-clear it&lt;/li&gt;
&lt;li&gt;Multiple 48-72 hour pauses didn't clear it&lt;/li&gt;
&lt;li&gt;Support agents either couldn't see the flag or weren't authorized to discuss it&lt;/li&gt;
&lt;li&gt;GDPR request forced escalation to someone with backend access&lt;/li&gt;
&lt;li&gt;That person found something, cleared it, and the template response called it "short-term technical behavior"&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Practical Takeaways
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;For new LinkedIn accounts:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don't post external links until your account has established a posting history. LinkedIn officially says links aren't penalized. Independent research consistently shows 25-60% reach reduction. My experience suggests it can be much worse on new accounts&lt;/li&gt;
&lt;li&gt;If impressions drop 90%+ overnight and stay there, it's probably not your content. It's a flag&lt;/li&gt;
&lt;li&gt;Common workarounds for sharing links: link in the first comment (still risky according to some sources), asking people to DM you or comment a specific word, or using the Premium custom button (paid only)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For EU-based developers:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GDPR Article 15 is a real tool with real teeth. Use it when support stonewalls you&lt;/li&gt;
&lt;li&gt;Cite LinkedIn Ireland specifically, not LinkedIn Corporation&lt;/li&gt;
&lt;li&gt;Include the 30-day deadline. It changes the urgency&lt;/li&gt;
&lt;li&gt;If they ignore it, restate it in formal legal language. Mine was ignored twice before it worked&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For everyone:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LinkedIn support will copy-paste algorithm explainers at you until you either give up or escalate legally. The system is designed to exhaust you into acceptance&lt;/li&gt;
&lt;li&gt;"No technical inconsistencies" is not the same as "no restrictions." Read support responses carefully for what they don't say&lt;/li&gt;
&lt;li&gt;If your comments are visible but your posts get zero reach, you have a content distribution restriction, not a full account restriction. Support will tell you "your account is fine" because technically it is. Your posts just aren't being shown to anyone&lt;/li&gt;
&lt;li&gt;Don't give up on support replies. Responses in the one-hour range are a waste of tokens. Briefly parse them with AI and craft a reiteration requesting a human review of your account, no matter what they say&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Part That Bothers Me
&lt;/h2&gt;

&lt;p&gt;I'm a senior engineer with 10+ years of experience. I know how to debug systems, read legal documentation, and write formal escalation requests. It still took me three weeks and a GDPR citation to get this resolved.&lt;/p&gt;

&lt;p&gt;What happens to someone earlier in their career who doesn't know any of this? They post, get zero engagement, assume their content is bad, and quit. LinkedIn never tells them what happened. Support never investigates. The platform just silently decides they don't exist.&lt;/p&gt;

&lt;p&gt;That's a systemic problem, not a content strategy problem.&lt;/p&gt;




&lt;p&gt;Has anyone else experienced a similar sudden drop and recovery? Especially interested in hearing from anyone who has filed a GDPR or equivalent data access request with LinkedIn and received a substantive response about automated profiling data.&lt;/p&gt;

&lt;p&gt;I wrote a &lt;a href="https://wows.dev/blog/indie-ops/linkedin-shadow-ban-gdpr-fix" rel="noopener noreferrer"&gt;more detailed version of this story on my blog&lt;/a&gt; with the full support conversation breakdown.&lt;/p&gt;

&lt;p&gt;Drop a comment or reach me directly.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I Built an AI Code Reviewer That Asks Questions Instead of Handing Out Answers</title>
      <dc:creator>Giovanni</dc:creator>
      <pubDate>Wed, 04 Mar 2026 12:43:35 +0000</pubDate>
      <link>https://dev.to/guybrush1973/i-built-an-ai-code-reviewer-that-asks-questions-instead-of-handing-out-answers-23nh</link>
      <guid>https://dev.to/guybrush1973/i-built-an-ai-code-reviewer-that-asks-questions-instead-of-handing-out-answers-23nh</guid>
      <description>&lt;p&gt;Every AI code tool I've tried wants to do the same thing: rewrite my student's function for them. That's great in production. It's terrible in education.&lt;/p&gt;

&lt;p&gt;I teach programming, I've trained over 1,000 developers through bootcamps across Europe. I know exactly what happens when a beginner gets handed the corrected version of their code: they copy it, they move on, they learn nothing. The whole point of a code review in education is to make the student &lt;em&gt;think harder&lt;/em&gt;, not think less.&lt;/p&gt;

&lt;p&gt;So I built something different. A workflow that takes a GitHub repo, runs it through an LLM with structured evaluation prompts, and returns scored feedback that teaches instead of fixing. No auto-corrections. No rewritten functions. Just pointed questions and concept explanations tied to specific lines.&lt;/p&gt;

&lt;p&gt;It runs on N8N, costs almost nothing per evaluation, and took about an afternoon to set up.&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Actually Does
&lt;/h2&gt;

&lt;p&gt;You give it a GitHub repo URL. It comes back with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scores across structured metrics&lt;/strong&gt; naming &amp;amp; expressiveness, structure &amp;amp; decomposition, logic &amp;amp; control flow, and (optionally) assignment completeness&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-file breakdowns&lt;/strong&gt; with 2–3 sentence assessments per metric&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Line-referenced suggestions&lt;/strong&gt; that point at exact code and ask questions instead of providing fixes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A next-steps block&lt;/strong&gt; identifying the single highest-impact habit the student should build&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every suggestion is typed, positive, improvement, or concern, so the feedback isn't just a wall of criticism. The LLM is explicitly told to never write corrected code. Instead, it explains &lt;em&gt;why&lt;/em&gt; something matters and challenges the student to figure out the fix.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Pipeline in 60 Seconds
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxj8pdzdddabna1wtjfk6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxj8pdzdddabna1wtjfk6.png" alt=" " width="800" height="163"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The whole thing is an N8N workflow with three stages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 1: Repository breakdown.&lt;/strong&gt; Fetch the repo's file tree from GitHub, then run a quick LLM pass to figure out which folders contain student-written source code. This filters out &lt;code&gt;node_modules&lt;/code&gt;, build artifacts, config files, and framework boilerplate &lt;em&gt;before&lt;/em&gt; the expensive evaluation starts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 2: Evaluation.&lt;/strong&gt; Download the target files, prepend line numbers, validate the total size (a hard cap at 3,000 lines prevents surprise token bills), and submit everything to the LLM with a carefully structured prompt. The prompt defines exact scoring rubrics, enforces teaching-oriented feedback, and demands JSON output.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 3: Pack the result.&lt;/strong&gt; Parse and validate the LLM's JSON response, clamp all scores to 0–10, compute an overall score, and send it back through the webhook. Optionally, a bonus node transforms the JSON into clean GitHub-compatible Markdown.&lt;/p&gt;

&lt;p&gt;The entire flow fires from a single POST request. One curl command, one structured response.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the Prompt Design Matters Most
&lt;/h2&gt;

&lt;p&gt;The hard part isn't the pipeline. It's the prompt.&lt;/p&gt;

&lt;p&gt;Without careful constraints, the LLM defaults to "helpful developer" mode, it rewrites functions, suggests exact code changes, and hands out vague scores. Three design decisions fix this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explicit persona.&lt;/strong&gt; The system prompt opens by framing the LLM as a patient, experienced mentor whose purpose is helping the student think about code better. Not a linter. Not a grading machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Constrained scoring bands.&lt;/strong&gt; Scores below 7 must reference specific issues. Scores above 8 must reference specific strengths. This prevents the LLM from handing out comfortable 7s across every metric, which is exactly what it does without this constraint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feedback rules that enforce pedagogy.&lt;/strong&gt; Rule 1: teach the concept, never write corrected code. Rule 3: use questions to activate thinking. These two rules are the difference between "rename &lt;code&gt;x&lt;/code&gt; to &lt;code&gt;todosUrl&lt;/code&gt;" and "what does &lt;code&gt;x&lt;/code&gt; tell a reader about what this variable stores? What name would communicate its purpose immediately?"&lt;/p&gt;

&lt;h2&gt;
  
  
  A Real Example
&lt;/h2&gt;

&lt;p&gt;Here's a student submission, a simple fetch-filter-display exercise with the kind of mistakes you see in every beginner codebase:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://jsonplaceholder.typicode.com/todos&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;completed&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;output&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The code works. But look at what the reviewer catches: &lt;code&gt;x&lt;/code&gt; as a URL variable name, &lt;code&gt;r&lt;/code&gt; for the response, loose equality with &lt;code&gt;==&lt;/code&gt;, no &lt;code&gt;.catch()&lt;/code&gt;, an unguarded loop that renders &lt;code&gt;undefined&lt;/code&gt; if fewer than 5 items match, and zero function decomposition.&lt;/p&gt;

&lt;p&gt;The feedback doesn't say "rename &lt;code&gt;x&lt;/code&gt; to &lt;code&gt;TODOS_API_URL&lt;/code&gt;." It says: &lt;em&gt;"&lt;code&gt;x&lt;/code&gt; tells us nothing about what it stores. What is this string? What name would communicate that immediately? Constants in JavaScript are often written in &lt;code&gt;UPPER_SNAKE_CASE&lt;/code&gt; to signal they won't change."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's the difference. The student has to close the gap themselves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final score: 5.3/10&lt;/strong&gt; naming at 3, structure at 3, logic at 5, completeness at 10. Honest, specific, and actionable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who This Is For
&lt;/h2&gt;

&lt;p&gt;If you teach programming, bootcamp, university, corporate training, and you're tired of writing the same "rename this variable" comment for the 400th time, this solves that. The workflow handles the repetitive feedback so you can focus on the students who need deeper one-on-one attention.&lt;/p&gt;

&lt;p&gt;It's also useful if you lead a team with junior developers. The review format works just as well for pull request feedback as it does for homework, the teaching-oriented approach helps juniors internalize patterns instead of just applying patches.&lt;/p&gt;

&lt;p&gt;And if you're a self-taught developer looking for honest feedback on your own projects, you can point it at your own repos. It's surprisingly effective at catching habits you've gone blind to.&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Costs
&lt;/h2&gt;

&lt;p&gt;N8N's cloud starter tier is ~$20/month for 2,500 executions, more than enough for a teacher. Self-host it and the only cost is LLM tokens. A typical student project evaluation runs between a fraction of a cent and a few cents. Complex projects with larger codebases or top-tier models can push higher, but for the teaching use case, mid-tier models work surprisingly well.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2000j4v3lraf7f3knl30.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2000j4v3lraf7f3knl30.png" alt=" " width="761" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One practical note: the workflow uses a cheap model for utility tasks like folder detection and Markdown transformation, and reserves the more capable model for the actual evaluation. That split keeps costs down without sacrificing feedback quality where it matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It, 200 Free Beta Spots
&lt;/h2&gt;

&lt;p&gt;I've opened a limited closed beta: &lt;strong&gt;200 spots&lt;/strong&gt; to test the full workflow on a running instance. No setup, no API keys, no N8N account needed. Submit a public GitHub repo URL and get back a scored, line-by-line evaluation.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://codegrader.wows.dev/beta" rel="noopener noreferrer"&gt;codegrader.wows.dev/beta&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you want to see what the output looks like before committing, here's the &lt;a href="https://codegrader.wows.dev/beta/460aa5c6-e8f1-4a97-be0f-f502eadfec3a/result" rel="noopener noreferrer"&gt;result for the example above&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4tedtwr8ln6ps8vhbxoq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4tedtwr8ln6ps8vhbxoq.png" alt=" " width="800" height="494"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Want the Full Build Guide?
&lt;/h2&gt;

&lt;p&gt;This post covers the &lt;em&gt;what&lt;/em&gt; and &lt;em&gt;why&lt;/em&gt;. If you want the &lt;em&gt;how&lt;/em&gt;, every N8N node, every code block, the complete prompt, the JSON output template, and the Markdown transformation bonus — I wrote the full step-by-step breakdown:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://wows.dev/blog/teach-programming/how-to-built-an-ai-code-reviewer-that-teaches-instead-of-fixing" rel="noopener noreferrer"&gt;How to Build an AI Code Reviewer That Teaches Instead of Fixing&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The full article includes a downloadable N8N workflow JSON you can import directly into your instance and start using today.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm Giovanni — I build tools for developers and teach programming at scale. Currently shipping &lt;a href="https://codegrader.wows.dev" rel="noopener noreferrer"&gt;CodeGrader&lt;/a&gt; and &lt;a href="https://zipops.wows.dev" rel="noopener noreferrer"&gt;ZipOps&lt;/a&gt; from a self-hosted K8s cluster that costs less than $100/month. Find me at &lt;a href="https://wows.dev" rel="noopener noreferrer"&gt;wows.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>codereview</category>
      <category>n8n</category>
      <category>education</category>
    </item>
  </channel>
</rss>
