[{"data":1,"prerenderedAt":506},["ShallowReactive",2],{"navigation_docs":3,"landing":87},[4,35,51,80],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"\u002Fgetting-started","1.getting-started",[10,15,20,25,30],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F2.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F3.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Configuration","\u002Fgetting-started\u002Fconfiguration","1.getting-started\u002F4.configuration","i-lucide-settings",{"title":26,"path":27,"stem":28,"icon":29},"Server Requirements","\u002Fgetting-started\u002Fserver-requirements","1.getting-started\u002F5.server-requirements","i-lucide-server",{"title":31,"path":32,"stem":33,"icon":34},"Troubleshooting","\u002Fgetting-started\u002Ftroubleshooting","1.getting-started\u002F6.troubleshooting","i-lucide-wrench",{"title":36,"icon":37,"path":38,"stem":39,"children":40,"page":6},"Guide","i-lucide-book-open","\u002Fguide","2.guide",[41,46],{"title":42,"path":43,"stem":44,"icon":45},"URL Pattern","\u002Fguide\u002Furl-pattern","2.guide\u002F1.url-pattern","i-lucide-link",{"title":47,"path":48,"stem":49,"icon":50},"Transformation Parameters","\u002Fguide\u002Ftransformation-parameters","2.guide\u002F2.transformation-parameters","i-lucide-sliders",{"title":52,"icon":53,"path":54,"stem":55,"children":56,"page":-1},"Deployment","i-lucide-rocket","\u002Fdeployment","3.deployment",[57,60,65,70,75],{"title":58,"path":54,"stem":59,"icon":53},"Overview","3.deployment\u002Findex",{"title":61,"path":62,"stem":63,"icon":64},"Render","\u002Fdeployment\u002Frender","3.deployment\u002F1.render","i-simple-icons-render",{"title":66,"path":67,"stem":68,"icon":69},"Railway","\u002Fdeployment\u002Frailway","3.deployment\u002F2.railway","i-simple-icons-railway",{"title":71,"path":72,"stem":73,"icon":74},"Fly.io","\u002Fdeployment\u002Ffly-io","3.deployment\u002F3.fly-io","i-simple-icons-flydotio",{"title":76,"path":77,"stem":78,"icon":79},"Cloudflare Sandbox","\u002Fdeployment\u002Fcloudflare-sandbox","3.deployment\u002F4.cloudflare-sandbox","i-simple-icons-cloudflare",{"title":81,"path":82,"stem":83,"children":84,"icon":86},"Roadmap","\u002Froadmap","5.roadmap\u002Findex",[85],{"title":81,"path":82,"stem":83,"icon":86},"i-lucide-map",{"id":88,"title":89,"body":90,"description":89,"extension":254,"meta":498,"navigation":499,"path":500,"seo":501,"stem":504,"__hash__":505},"landing\u002Findex.md","",{"type":91,"value":92,"toc":496},"minimark",[93,119,182,322,492],[94,95,96,100,103],"u-page-hero",{},[97,98,99],"template",{"v-slot:title":89},"Repix",[97,101,102],{"v-slot:description":89},"Self-hosted image transformation service. Resize, crop, and convert images on-the-fly via URL. No SDK required.",[97,104,105,112],{"v-slot:links":89},[106,107,111],"u-button",{"color":108,"size":109,"to":17,"trailing-icon":110},"neutral","xl","i-lucide-arrow-right","Get started",[106,113,118],{"color":108,"size":109,"to":114,"icon":115,"target":116,"variant":117},"https:\u002F\u002Fgithub.com\u002Fbansal\u002Frepix","simple-icons-github","_blank","outline","View on GitHub",[120,121,122,125],"u-page-section",{},[97,123,124],{"v-slot:title":89},"Features",[97,126,127,137,146,155,164,173],{"v-slot:features":89},[128,129,131,134],"u-page-feature",{"icon":130},"i-lucide-sparkles",[97,132,133],{"v-slot:title":89},"URL-based API",[97,135,136],{"v-slot:description":89},"Transform images via intuitive URL patterns. No SDK required—just construct URLs with presets or inline parameters.",[128,138,140,143],{"icon":139},"i-lucide-zap",[97,141,142],{"v-slot:title":89},"Modern Formats",[97,144,145],{"v-slot:description":89},"Full support for JPEG, PNG, WebP, and AVIF. Automatic format conversion with quality optimization.",[128,147,149,152],{"icon":148},"i-lucide-layers",[97,150,151],{"v-slot:title":89},"Preset System",[97,153,154],{"v-slot:description":89},"General-purpose presets with incremental sizes (xs 64px → xl 1024px → full) for icons, thumbnails, cards, galleries, and more. Define custom presets or restrict to presets for security.",[128,156,158,161],{"icon":157},"i-lucide-box",[97,159,160],{"v-slot:title":89},"Docker Ready",[97,162,163],{"v-slot:description":89},"Multi-stage Dockerfile. Deploy to Render, Railway, Fly.io, or Cloudflare.",[128,165,167,170],{"icon":166},"i-lucide-shield",[97,168,169],{"v-slot:title":89},"Secure by Default",[97,171,172],{"v-slot:description":89},"Configurable dimension limits, fetch timeouts, and preset-only mode to prevent abuse.",[128,174,176,179],{"icon":175},"i-lucide-scroll-text",[97,177,178],{"v-slot:title":89},"Logging",[97,180,181],{"v-slot:description":89},"Structured request logging. Optional OTLP drain for PostHog, Datadog, or any OTLP-compatible backend.",[120,183,184,187,195],{},[97,185,186],{"v-slot:title":89},"Default Presets",[97,188,189,190,194],{"v-slot:description":89},"General-purpose presets with incremental sizes for various use cases—icons, thumbnails, cards, galleries, hero images, and more. Use them out of the box or override with custom presets via the ",[191,192,193],"code",{},"PRESETS"," env var.",[196,197,198,214],"table",{},[199,200,201],"thead",{},[202,203,204,208,211],"tr",{},[205,206,207],"th",{},"Preset",[205,209,210],{},"Value",[205,212,213],{},"Use case",[215,216,217,233,248,263,278,292,307],"tbody",{},[202,218,219,225,230],{},[220,221,222],"td",{},[191,223,224],{},"xs",[220,226,227],{},[191,228,229],{},"w=64,q=85",[220,231,232],{},"Icons, favicons",[202,234,235,240,245],{},[220,236,237],{},[191,238,239],{},"sm",[220,241,242],{},[191,243,244],{},"w=128,q=85",[220,246,247],{},"Small thumbnails",[202,249,250,255,260],{},[220,251,252],{},[191,253,254],{},"md",[220,256,257],{},[191,258,259],{},"w=256,q=85",[220,261,262],{},"Cards, list items",[202,264,265,270,275],{},[220,266,267],{},[191,268,269],{},"lg",[220,271,272],{},[191,273,274],{},"w=512,q=85",[220,276,277],{},"Gallery, detail views",[202,279,280,284,289],{},[220,281,282],{},[191,283,109],{},[220,285,286],{},[191,287,288],{},"w=1024,q=85",[220,290,291],{},"Hero images, lightbox",[202,293,294,299,304],{},[220,295,296],{},[191,297,298],{},"full",[220,300,301],{},[191,302,303],{},"q=85",[220,305,306],{},"Unresized, quality-only",[202,308,309,314,319],{},[220,310,311],{},[191,312,313],{},"placeholder",[220,315,316],{},[191,317,318],{},"w=64,q=50,blur=15",[220,320,321],{},"Low-quality image placeholder (LQIP)",[120,323,324,327,330],{},[97,325,326],{"v-slot:title":89},"FAQ",[97,328,329],{"v-slot:description":89},"Frequently asked questions about Repix.",[331,332,333,346,377,403,465],"accordion",{},[334,335,337,338,341,342,345],"accordion-item",{"label":336},"How do I hide my image hosting domain?","Deploy Repix on your own domain (e.g. ",[191,339,340],{},"img.yourdomain.com","). All image URLs will show your Repix domain—users see ",[191,343,344],{},"https:\u002F\u002Fimg.yourdomain.com\u002Fsm\u002Fpath\u002Fto\u002Fimage.jpg",", not your S3, R2, or CDN origin. The source URL lives in the path, but the browser address bar and referrer show only your domain. Your storage backend stays hidden.",[334,347,349,350,353,354,356,357,360,361,364,365,368,369,372,373,376],{"label":348},"How do I prevent abuse?","Use several controls together: set ",[191,351,352],{},"ALLOW_CUSTOM_TRANSFORMS=false"," and define presets in ",[191,355,193],{}," so only allowed transformations work. Lower ",[191,358,359],{},"IMAGE_MAX_WIDTH"," and ",[191,362,363],{},"IMAGE_MAX_HEIGHT"," (e.g. 1024) to cap output size. Reduce ",[191,366,367],{},"FETCH_TIMEOUT"," for slow or abusive origins. Set ",[191,370,371],{},"ALLOW_ORIGINAL_IMAGE=false"," to block unprocessed passthrough. Optionally restrict ",[191,374,375],{},"CORS_ORIGIN"," to your app's domain.",[334,378,380,381,384,385,388,389,391,392,395,396,395,399,402],{"label":379},"How do I make URLs clean?","Use presets instead of inline parameters. Compare ",[191,382,383],{},"https:\u002F\u002Fimg.yourdomain.com\u002Fsm\u002Fexample.com\u002Fphoto.jpg"," (clean) vs ",[191,386,387],{},"https:\u002F\u002Fimg.yourdomain.com\u002Fw=128,q=85\u002Fexample.com\u002Fphoto.jpg"," (verbose). Define short preset names in ",[191,390,193],{}," for your common sizes and fits—e.g. ",[191,393,394],{},"thumb",", ",[191,397,398],{},"card",[191,400,401],{},"hero","—and use those in URLs.",[334,404,406,417,454],{"label":405},"I have many presets—how do I manage them?",[407,408,409,410,412,413,416],"p",{},"Repix uses the ",[191,411,193],{}," env var (JSON). Put it in ",[191,414,415],{},".env"," for easier editing. For many presets, use a single-line JSON string or build it from a script:",[418,419,423],"pre",{"className":420,"code":421,"language":422,"meta":89,"style":89},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# In .env\nPRESETS='{\"thumb\":\"w=200,h=200,fit=cover\",\"card\":\"w=400,h=300,fit=cover\",\"hero\":\"w=1200,h=600,fit=cover\",\"avatar\":\"w=100,h=100,fit=cover,f=webp,q=85\"}'\n","bash",[191,424,425,434],{"__ignoreMap":89},[426,427,430],"span",{"class":428,"line":429},"line",1,[426,431,433],{"class":432},"sHwdD","# In .env\n",[426,435,437,440,444,447,451],{"class":428,"line":436},2,[426,438,193],{"class":439},"sTEyZ",[426,441,443],{"class":442},"sMK4o","=",[426,445,446],{"class":442},"'",[426,448,450],{"class":449},"sfazB","{\"thumb\":\"w=200,h=200,fit=cover\",\"card\":\"w=400,h=300,fit=cover\",\"hero\":\"w=1200,h=600,fit=cover\",\"avatar\":\"w=100,h=100,fit=cover,f=webp,q=85\"}",[426,452,453],{"class":442},"'\n",[407,455,456,457,460,461,464],{},"You can also keep a ",[191,458,459],{},"presets.json"," file and inject it: ",[191,462,463],{},"PRESETS=$(cat presets.json)"," before starting the server.",[334,466,468,469,360,472,475,476,479,480,483,484,487,488,491],{"label":467},"Can I use multiple image sources?","Yes. Repix fetches from any publicly accessible HTTPS URL. Use different domains in the path for each request: ",[191,470,471],{},"https:\u002F\u002Fimg.yourdomain.com\u002Fsm\u002Fcdn1.com\u002Fphoto.jpg",[191,473,474],{},"https:\u002F\u002Fimg.yourdomain.com\u002Fsm\u002Fbucket.s3.amazonaws.com\u002Fother.png"," both work. ",[191,477,478],{},"SOURCE_PREFIX"," (default ",[191,481,482],{},"https:\u002F\u002F",") is prepended to the path, so you can mix S3, R2, your CDN, and other origins in the same Repix instance. To restrict which origins are allowed, set ",[191,485,486],{},"SOURCE_HOSTNAME"," to a comma-separated list (e.g. ",[191,489,490],{},"cdn.example.com,images.example.com","); when set, only those hostnames are accepted.",[493,494,495],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":89,"searchDepth":436,"depth":436,"links":497},[],{},true,"\u002F",{"title":502,"description":503},"Repix - Self-Hosted Image Transformation Service","Self-hosted image transformation. Resize, crop, and convert images on-the-fly via URL. Built with TypeScript, Hono, and Sharp.","index","iTsQYykt26M9CBSue6aglkn9KdsAqHRuNAoS4jEpF-E",1781442144011]