<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Pages Functions on Jamie Ede</title>
		<link>https://jamieede.com/tags/pages-functions/</link>
		<description>Recent content in Pages Functions on Jamie Ede</description>
		<generator>Hugo</generator>
		<language>en-US</language>
		
		
		
		
			<lastBuildDate>Sat, 04 Jul 2026 00:00:00 +0000</lastBuildDate>
		
			<atom:link href="https://jamieede.com/tags/pages-functions/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>Letting the browser POST straight to Cloudflare Images with Direct Creator Upload</title>
				<link>https://jamieede.com/posts/direct-creator-upload-from-the-browser/</link>
				<pubDate>Sat, 04 Jul 2026 00:00:00 +0000</pubDate>
				<guid>https://jamieede.com/posts/direct-creator-upload-from-the-browser/</guid>
				<description>&lt;p&gt;Multi-megabyte image uploads should not travel through a &lt;a href=&#34;https://developers.cloudflare.com/pages/functions/&#34; target=&#34;_blank&#34; &gt;Pages Function&lt;/a&gt;&#xA; on the way to storage. They do not have to.&lt;/p&gt;&#xA;&lt;p&gt;This is part of the &lt;a href=&#34;https://jamieede.com/posts/building-a-photography-portfolio-on-cloudflares-full-stack/&#34; &gt;photography portfolio series&lt;/a&gt;&#xA;. It covers how the admin upload flow on &lt;a href=&#34;https://alex.edestudio.us&#34; target=&#34;_blank&#34; &gt;alex.edestudio.us&lt;/a&gt;&#xA; and &lt;a href=&#34;https://jamie.edestudio.us&#34; target=&#34;_blank&#34; &gt;jamie.edestudio.us&lt;/a&gt;&#xA; sends photos straight from the browser to &lt;a href=&#34;https://developers.cloudflare.com/images/&#34; target=&#34;_blank&#34; &gt;Cloudflare Images&lt;/a&gt;&#xA; without proxying the bytes through my own code.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&#xA;&lt;h2 id=&#34;the-three-request-handshake&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#the-three-request-handshake&#34;&gt;The three-request handshake&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Every upload is three sequential requests from the browser. The &lt;a href=&#34;https://developers.cloudflare.com/pages/functions/&#34; target=&#34;_blank&#34; &gt;Pages Function&lt;/a&gt;&#xA; in the middle never sees the image bytes.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Hardened admin auth on Cloudflare Pages: JWT validation, AUD pinning, and pages.dev lockdown</title>
				<link>https://jamieede.com/posts/hardened-admin-auth-cloudflare-pages/</link>
				<pubDate>Fri, 26 Jun 2026 00:00:00 +0000</pubDate>
				<guid>https://jamieede.com/posts/hardened-admin-auth-cloudflare-pages/</guid>
				<description>&lt;p&gt;Every admin request to the &lt;a href=&#34;https://jamieede.com/posts/building-a-photography-portfolio-on-cloudflares-full-stack/&#34; &gt;photography portfolio&lt;/a&gt;&#xA; goes through three checks before it can touch a &lt;a href=&#34;https://developers.cloudflare.com/d1/&#34; target=&#34;_blank&#34; &gt;D1&lt;/a&gt;&#xA; row or a &lt;a href=&#34;https://developers.cloudflare.com/images/&#34; target=&#34;_blank&#34; &gt;Cloudflare Images&lt;/a&gt;&#xA; API call: the &lt;a href=&#34;https://developers.cloudflare.com/cloudflare-one/&#34; target=&#34;_blank&#34; &gt;Cloudflare Access&lt;/a&gt;&#xA; edge proves identity, the &lt;a href=&#34;https://developers.cloudflare.com/pages/functions/&#34; target=&#34;_blank&#34; &gt;Pages Function&lt;/a&gt;&#xA; verifies the JWT Access minted, and the verifier rejects anything whose audience claim does not match this specific application.&lt;/p&gt;&#xA;&lt;p&gt;This post is how that pipeline is built, why each layer is there, and the operational decisions around it.&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
