{"id":5633,"date":"2026-09-03T13:08:06","date_gmt":"2026-09-03T13:08:06","guid":{"rendered":"https:\/\/anasalassi.com\/projects\/paste-studio\/"},"modified":"2026-09-03T13:08:06","modified_gmt":"2026-09-03T13:08:06","slug":"paste-studio","status":"publish","type":"page","link":"https:\/\/anasalassi.com\/ar\/projects\/paste-studio\/","title":{"rendered":"Paste Studio \u2014 \u0623\u062f\u0627\u0629 \u062a\u0646\u0632\u064a\u0644 \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0648\u0645\u0639\u0627\u0644\u062c\u0629 \u0627\u0644\u0635\u0648\u0631"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"5633\" class=\"elementor elementor-5633 elementor-bc-flex-widget\" data-elementor-post-type=\"page\">\n\t\t\t\t<span id=\"aa-main\" tabindex=\"-1\"><\/span><div class=\"elementor-element elementor-element-3ddc112 aa-cs-hero e-flex e-con-boxed e-con e-parent\" data-id=\"3ddc112\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-65e79c7 elementor-widget elementor-widget-html\" data-id=\"65e79c7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<a class=\"aa-cs-back\" href=\"https:\/\/anasalassi.com\/projects\/\"><svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\"><path d=\"M15 18l-6-6 6-6\"\/><\/svg>All projects<\/a>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-708a40d elementor-widget elementor-widget-html\" data-id=\"708a40d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<span class=\"aa-cs-status aa-cs-status--live\"><span class=\"aa-cs-status__dot\" aria-hidden=\"true\"><\/span>Live Demo<\/span>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-67e6c93 aa-cs-h1 elementor-widget elementor-widget-heading\" data-id=\"67e6c93\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Paste Studio \u2014 Social Media Downloader &amp; Image Toolkit<\/h1>\t\t\t\t<\/div>\n\t\t<span id=\"aa-main\" tabindex=\"-1\"><\/span>\t\t<div class=\"elementor-element elementor-element-4ae8c59 elementor-widget elementor-widget-text-editor\" data-id=\"4ae8c59\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>A privacy-conscious media workspace for pasting, converting, resizing, optimising, and downloading authorised content through one streamlined bilingual experience.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a24c9ac elementor-widget elementor-widget-html\" data-id=\"a24c9ac\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<dl class=\"aa-cs-facts\"><div class=\"aa-cs-fact\"><dt>Role<\/dt><dd>Product design and full-stack delivery<\/dd><\/div><div class=\"aa-cs-fact\"><dt>Category<\/dt><dd>Media utility<\/dd><\/div><div class=\"aa-cs-fact\"><dt>Status<\/dt><dd>Live public demo<\/dd><\/div><div class=\"aa-cs-fact\"><dt>Stack<\/dt><dd>PHP 8.3 &middot; Canvas API &middot; no framework<\/dd><\/div><\/dl>\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-ceb27be aa-cs-cta-row e-con-full e-flex e-con e-parent\" data-id=\"ceb27be\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-552be18 aa-el-btn aa-el-btn--primary elementor-widget elementor-widget-button\" data-id=\"552be18\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/paste-studio.3dot.tech\" target=\"_blank\" rel=\"noopener noreferrer\" aria-label=\"Try the Paste Studio live demo (opens in a new tab)\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Try Live Demo<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-85935af aa-el-btn aa-el-btn--ghost elementor-widget elementor-widget-button\" data-id=\"85935af\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/anasalassi.com\/#contact\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Book a Call<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-12574fc e-flex e-con-boxed e-con e-parent\" data-id=\"12574fc\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3cf2f04 elementor-widget elementor-widget-html\" data-id=\"3cf2f04\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<figure class=\"aa-cs-shot\"><img loading=\"lazy\" src=\"https:\/\/anasalassi.com\/wp-content\/uploads\/2026\/09\/paste-studio-hero-en.jpg\" alt=\"Paste Studio home screen with a large paste, upload or drop area and a link input below it\" width=\"1456\" height=\"829\" loading=\"lazy\" decoding=\"async\" class=\"aa-cs-shotimg\"><figcaption class=\"aa-cs-cap\">One input area accepts a clipboard paste, a drop, a file picker, the camera, or a link.<\/figcaption><\/figure>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-207eed2 e-flex e-con-boxed e-con e-parent\" data-id=\"207eed2\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b30663b aa-cs-h2 elementor-widget elementor-widget-heading\" data-id=\"b30663b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Overview<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-97d9701 elementor-widget elementor-widget-text-editor\" data-id=\"97d9701\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Paste Studio turns a clipboard image into a finished file in as few steps as possible, and tells the truth about what it can do with a social-media link. Images are converted, resized, cropped, optimised and stripped of metadata entirely inside the browser. Links are inspected through each platform&#8217;s own public interfaces \u2014 nothing is scraped and no protection is circumvented.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-d75c66c aa-cs-two e-con-full e-flex e-con e-parent\" data-id=\"d75c66c\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-6ff7769 e-flex e-con-boxed e-con e-parent\" data-id=\"6ff7769\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5c5437d aa-cs-h3 elementor-widget elementor-widget-heading\" data-id=\"5c5437d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">The problem<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d5b8ff3 elementor-widget elementor-widget-html\" data-id=\"d5b8ff3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<ul class=\"aa-cs-list\"><li>Resizing one image for four networks means four tools or a heavyweight editor.<\/li><li>Most \u201cdownloader\u201d sites are advertising traps with fake download buttons.<\/li><li>Uploading a private screenshot to an unknown server to crop it is a poor trade.<\/li><li>Photos carry EXIF and GPS that people publish without realising.<\/li><li>Tools promise formats and qualities the source never had.<\/li><\/ul>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-aaef91a e-flex e-con-boxed e-con e-parent\" data-id=\"aaef91a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-acd62b4 aa-cs-h3 elementor-widget elementor-widget-heading\" data-id=\"acd62b4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">What Paste Studio does<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-051e296 elementor-widget elementor-widget-html\" data-id=\"051e296\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<ul class=\"aa-cs-list aa-cs-list--check\"><li>Presets for every major network, in one place.<\/li><li>No advertising, no fake buttons, no dark patterns.<\/li><li>Images never leave the browser \u2014 there is nothing to upload.<\/li><li>Metadata is dropped by default, and the interface says so.<\/li><li>It states plainly what is and is not possible, per platform.<\/li><\/ul>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-8079766 e-flex e-con-boxed e-con e-parent\" data-id=\"8079766\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c3503ef aa-cs-h2 elementor-widget elementor-widget-heading\" data-id=\"c3503ef\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">My role<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5b4842e elementor-widget elementor-widget-text-editor\" data-id=\"5b4842e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p class='aa-cs-contrib'>Everything: the product decision about what to build and what to refuse, the brand and interface, the Arabic and English content, the client-side image engine, the SSRF-hardened link service, the test suites, the server configuration, and the deployment.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-e414ecd e-flex e-con-boxed e-con e-parent\" data-id=\"e414ecd\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3d67e07 aa-cs-h2 elementor-widget elementor-widget-heading\" data-id=\"3d67e07\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">The decision that shaped the product<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4362b71 elementor-widget elementor-widget-text-editor\" data-id=\"4362b71\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>The original brief asked for YouTube and social-media downloads. Building that means using a tool like yt-dlp, which works by deciphering YouTube&#8217;s signature and throttling parameters. That is circumventing a technical protection measure, and it breaks terms that bind the <em>operator<\/em> of the service \u2014 a checkbox from a visitor cannot waive them.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4c6ed03 elementor-widget elementor-widget-text-editor\" data-id=\"4c6ed03\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>So Paste Studio does not download video or audio streams. Instead it uses each platform&#8217;s own public oEmbed endpoint for metadata, relays the thumbnails they already publish as ordinary images, offers the official embed code, and points content owners at the platform&#8217;s own download. The Supported Platforms page states this in a table rather than burying it.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ed57fa7 elementor-widget elementor-widget-text-editor\" data-id=\"ed57fa7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>That constraint turned out to be the product&#8217;s strength. With no media pipeline there is no job queue, no temporary media on disk, no cleanup to get wrong, and no retention question to answer carefully \u2014 because nothing is retained.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-273920b e-flex e-con-boxed e-con e-parent\" data-id=\"273920b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5bea2b5 aa-cs-h2 elementor-widget elementor-widget-heading\" data-id=\"5bea2b5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">The journey<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-689dd70 elementor-widget elementor-widget-html\" data-id=\"689dd70\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<ol class=\"aa-cs-steps\"><li><strong>Paste or upload<\/strong><span>Clipboard, drag and drop, file picker, mobile camera, or a link.<\/span><\/li><li><strong>Preview<\/strong><span>Type, dimensions, file size, transparency, EXIF presence \u2014 before anything is changed.<\/span><\/li><li><strong>Choose<\/strong><span>A preset, or format, size, fit and quality. Advanced options stay folded away.<\/span><\/li><li><strong>Download<\/strong><span>One file, or the whole batch as a ZIP built in the browser.<\/span><\/li><\/ol>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7ee81de elementor-widget elementor-widget-text-editor\" data-id=\"7ee81de\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Nothing downloads automatically on paste. The preview comes first and the visitor decides.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-dfd972f elementor-widget elementor-widget-html\" data-id=\"dfd972f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<figure class=\"aa-cs-shot\"><img loading=\"lazy\" src=\"https:\/\/anasalassi.com\/wp-content\/uploads\/2026\/09\/paste-studio-image-studio-en.jpg\" alt=\"Paste Studio Image Studio showing preset, size, fit, format and quality controls beside a file card with original and result sizes\" width=\"1456\" height=\"829\" loading=\"lazy\" decoding=\"async\" class=\"aa-cs-shotimg\"><figcaption class=\"aa-cs-cap\">The controls a person reaches for are visible; the rest is behind Advanced options.<\/figcaption><\/figure>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-8faa618 e-flex e-con-boxed e-con e-parent\" data-id=\"8faa618\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d3223ba aa-cs-h2 elementor-widget elementor-widget-heading\" data-id=\"d3223ba\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Image Studio<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-78ded17 elementor-widget elementor-widget-text-editor\" data-id=\"78ded17\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>All of this runs on a canvas in the visitor&#8217;s browser. There is no upload, no queue and no server round trip.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-76d3984 elementor-widget elementor-widget-html\" data-id=\"76d3984\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<ul class=\"aa-cs-list aa-cs-list--check\"><li>Convert between PNG, JPEG, WebP and AVIF \u2014 and the encoder is probed at load, so a format the browser cannot actually write is disabled rather than silently producing something else.<\/li><li>Resize with locked aspect ratio, and fit as contain, cover or stretch.<\/li><li>Rotate, flip horizontally and vertically, reset.<\/li><li>Quality control with a live before-and-after file size and a saved percentage.<\/li><li>A background colour for transparent images flattened into JPEG, so alpha never becomes black.<\/li><li>Presets for Instagram, Facebook, X, LinkedIn, YouTube, TikTok, WhatsApp and Open Graph.<\/li><li>Batch up to 20 images, each keeping its own dimensions unless a size is chosen.<\/li><li>ZIP export, assembled byte by byte in the browser with correct CRC32 and central directory.<\/li><\/ul>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-ee6f397 e-flex e-con-boxed e-con e-parent\" data-id=\"ee6f397\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a4e9044 aa-cs-h2 elementor-widget elementor-widget-heading\" data-id=\"a4e9044\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Link tools, and honesty about them<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-77c73d8 elementor-widget elementor-widget-text-editor\" data-id=\"77c73d8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Eleven platforms are recognised. For each, the capability table lists what is genuinely available: metadata, thumbnail, official embed \u2014 and, in every case, no video or audio.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b11b58a elementor-widget elementor-widget-html\" data-id=\"b11b58a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<figure class=\"aa-cs-shot\"><img loading=\"lazy\" src=\"https:\/\/anasalassi.com\/wp-content\/uploads\/2026\/09\/paste-studio-link-tools-youtube.jpg\" alt=\"Paste Studio inspecting a YouTube link: thumbnail, title, channel, a notice that streams are not downloaded, an unchecked rights confirmation, four thumbnail sizes and the official embed code\" width=\"1512\" height=\"805\" loading=\"lazy\" decoding=\"async\" class=\"aa-cs-shotimg\"><figcaption class=\"aa-cs-cap\">A YouTube link. The limitation is stated where the reader is looking, not on another page.<\/figcaption><\/figure>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-13c82ae elementor-widget elementor-widget-text-editor\" data-id=\"13c82ae\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>For YouTube the video id is parsed locally and the four published thumbnail sizes are probed directly against the official image host, so the list shows only sizes that really exist, with their real byte sizes. Choosing one requires an explicit, unchecked rights confirmation, and the thumbnail then opens in the Image Studio like any other image.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f1c59e2 elementor-widget elementor-widget-html\" data-id=\"f1c59e2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<figure class=\"aa-cs-shot\"><img loading=\"lazy\" src=\"https:\/\/anasalassi.com\/wp-content\/uploads\/2026\/09\/paste-studio-supported-platforms.jpg\" alt=\"The Supported Platforms table listing metadata, thumbnail, embed and video columns for eleven platforms, with video marked No throughout\" width=\"1512\" height=\"805\" loading=\"lazy\" decoding=\"async\" class=\"aa-cs-shotimg\"><figcaption class=\"aa-cs-cap\">The capability table is generated from the same source the code uses, so it cannot drift.<\/figcaption><\/figure>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-331662f e-flex e-con-boxed e-con e-parent\" data-id=\"331662f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e2a3c0a aa-cs-h2 elementor-widget elementor-widget-heading\" data-id=\"e2a3c0a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Security: treating every URL as hostile<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3e6b386 elementor-widget elementor-widget-text-editor\" data-id=\"3e6b386\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>The link service is the only part that talks to the internet, so it is the only part that can be turned against the server. The attack to defend is Server-Side Request Forgery: persuading this machine to fetch something only it can reach \u2014 localhost, the private network, or the cloud metadata endpoint that hands out credentials.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e750dbf elementor-widget elementor-widget-text-editor\" data-id=\"e750dbf\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>A hostname allowlist alone does not stop that. <code>evil.com<\/code> can resolve to 169.254.169.254, and a name that resolves safely during validation can resolve elsewhere moments later when the HTTP client looks it up again \u2014 DNS rebinding. So the fetcher does three things a naive one does not:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-20f529e elementor-widget elementor-widget-html\" data-id=\"20f529e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<ol class=\"aa-cs-steps\"><li><strong>Allowlist by name<\/strong><span>Exact match or true subdomain, after normalising. An IP literal is never a valid host.<\/span><\/li><li><strong>Resolve and judge every address<\/strong><span>Both A and AAAA records. Every one must be public unicast \u2014 one private answer rejects the host.<\/span><\/li><li><strong>Pin the connection<\/strong><span>curl is given the exact address that was validated, so the name cannot resolve somewhere else between check and connect. Redirects are followed manually and re-validated from scratch.<\/span><\/li><\/ol>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7c52bf5 elementor-widget elementor-widget-html\" data-id=\"7c52bf5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<ul class=\"aa-cs-list aa-cs-list--check\"><li>IPv4 private, loopback, link-local, CGNAT, benchmarking, multicast and reserved ranges are all rejected.<\/li><li>IPv6 loopback, unique-local, link-local and multicast are rejected \u2014 and IPv4-mapped, IPv4-compatible and NAT64 forms are unwrapped and judged as the IPv4 address they really are.<\/li><li>HTTPS only, standard port only, no credentials in the URL, at most three redirects.<\/li><li>The protocol is restricted at the curl handle, so a redirect cannot hand it a file:\/\/ or gopher:\/\/ URL.<\/li><li>Responses are capped mid-transfer, and the bytes are type-checked with libmagic rather than trusted from the Content-Type header.<\/li><li>No shell is involved anywhere \u2014 there is no media tool to invoke and no command line to inject into.<\/li><\/ul>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-028b9b2 e-flex e-con-boxed e-con e-parent\" data-id=\"028b9b2\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-97223ac aa-cs-h2 elementor-widget elementor-widget-heading\" data-id=\"97223ac\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">What the tests actually try<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8f5d3bf elementor-widget elementor-widget-text-editor\" data-id=\"8f5d3bf\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>The security claims above are assertions in a suite, not adjectives. Among the cases: the AWS and GCP metadata endpoints, <code>localhost<\/code>, <code>127.0.0.1<\/code>, <code>[::1]<\/code>, every private IPv4 range, IPv6 unique-local and link-local, IPv4-mapped IPv6 forms of private addresses, NAT64-wrapped loopback, <code>file:\/\/<\/code>, <code>gopher:\/\/<\/code>, a suffix-confusion host (<code>youtube.com.attacker.example<\/code>), credentials embedded in the URL, a non-standard port, and a malformed video id.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e0376d6 elementor-widget elementor-widget-html\" data-id=\"e0376d6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<div class=\"aa-cs-tablewrap\"><table class=\"aa-cs-table\"><thead><tr><th>Suite<\/th><th>Covers<\/th><th>Assertions<\/th><\/tr><\/thead><tbody><tr><td>Unit<\/td><td>Address classification, host allowlist, URL validation, platform detection, YouTube id parsing, capability honesty, bilingual parity<\/td><td>139<\/td><\/tr><tr><td>Live HTTP<\/td><td>Both language trees, metadata and assets, security headers, path exposure, link API, SSRF refusals, thumbnail relay, rate limiting, copy honesty<\/td><td>105<\/td><\/tr><\/tbody><\/table><\/div>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b674aa5 elementor-widget elementor-widget-text-editor\" data-id=\"b674aa5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>The image engine was verified in a real browser: a PNG with genuine alpha, conversion to JPEG and WebP at several qualities, a JPEG carrying a hand-built EXIF APP1 block \u2014 confirmed present on input and confirmed absent from the exported bytes \u2014 batch processing of differently sized files, and a ZIP whose entries were extracted and decoded back into images.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-63002c0 e-flex e-con-boxed e-con e-parent\" data-id=\"63002c0\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a33f33c aa-cs-h2 elementor-widget elementor-widget-heading\" data-id=\"a33f33c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Privacy that is structural, not promised<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7b3e2df elementor-widget elementor-widget-text-editor\" data-id=\"7b3e2df\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>The privacy page does not say \u201cnothing is stored\u201d, because a web server keeps an access log and that would be untrue. What it says is narrower and verifiable: images never reach the server at all.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-bd40dc4 elementor-widget elementor-widget-html\" data-id=\"bd40dc4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<ul class=\"aa-cs-list aa-cs-list--check\"><li>Image processing is client-side, so there is no upload, no temporary file, and no cleanup job that could fail.<\/li><li>The link endpoint receives a URL and nothing else; the response is handled in memory and never written to disk.<\/li><li>Exported images are re-encoded, which drops EXIF, GPS, camera details, timestamps and embedded comments by default.<\/li><li>No accounts, no tracking cookies, no analytics, no third-party requests from the page.<\/li><li>Rate-limit counters are keyed to a hash of the client address and swept after an hour.<\/li><li>The server cannot reach anything outside a fixed allowlist \u2014 it is not a proxy.<\/li><\/ul>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-441f9f7 e-flex e-con-boxed e-con e-parent\" data-id=\"441f9f7\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d01a95d aa-cs-h2 elementor-widget elementor-widget-heading\" data-id=\"d01a95d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Keeping a public demo affordable<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0f17c5c elementor-widget elementor-widget-html\" data-id=\"0f17c5c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<ul class=\"aa-cs-list aa-cs-list--check\"><li>25 MB per image and 20 images at a time, enforced before decoding.<\/li><li>A 50-megapixel ceiling, so a decompression bomb is refused rather than expanded.<\/li><li>File type judged from the byte signature, not the name or the declared type.<\/li><li>Link and thumbnail endpoints rate limited both at nginx and in PHP, answering 429 as JSON the interface can read.<\/li><li>PHP file uploads disabled outright in the pool \u2014 the application has no use for them.<\/li><li>Workers run as a dedicated unprivileged user confined by open_basedir, with a hard request timeout.<\/li><li>Because the expensive work happens on the visitor's own device, load does not scale with popularity.<\/li><\/ul>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-611d8a2 e-flex e-con-boxed e-con e-parent\" data-id=\"611d8a2\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-646642f aa-cs-h2 elementor-widget elementor-widget-heading\" data-id=\"646642f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Arabic and English<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a27c514 elementor-widget elementor-widget-text-editor\" data-id=\"a27c514\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Each language has its own URL \u2014 <code>\/privacy<\/code> and <code>\/ar\/privacy<\/code> \u2014 rather than a client-side toggle, so both are separately indexable and hreflang means something. The locale is a property of the path, never a cookie, which keeps pages cacheable.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2774e72 elementor-widget elementor-widget-html\" data-id=\"2774e72\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<ul class=\"aa-cs-list aa-cs-list--check\"><li>130 strings, generated from one shared source so a key cannot exist in one language and not the other.<\/li><li>The interface mirrors with CSS logical properties; the drawer opens from the edge the menu button sits on in both directions.<\/li><li>Arabic-Indic numerals in the Arabic interface, including file sizes.<\/li><li>Filenames render with plaintext bidi isolation so a Latin name inside an Arabic page does not truncate at the wrong end.<\/li><\/ul>\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-2f5690a aa-cs-two e-con-full e-flex e-con e-parent\" data-id=\"2f5690a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ce66925 elementor-widget elementor-widget-html\" data-id=\"ce66925\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<figure class=\"aa-cs-shot\"><img loading=\"lazy\" src=\"https:\/\/anasalassi.com\/wp-content\/uploads\/2026\/09\/paste-studio-mobile-ar-light.png\" alt=\"Paste Studio Arabic mobile interface in the light theme, fully right to left\" width=\"780\" height=\"1560\" loading=\"lazy\" decoding=\"async\" class=\"aa-cs-shotimg\"><figcaption class=\"aa-cs-cap\">Arabic, right to left, light theme.<\/figcaption><\/figure>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-503e6a3 elementor-widget elementor-widget-html\" data-id=\"503e6a3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<figure class=\"aa-cs-shot\"><img loading=\"lazy\" src=\"https:\/\/anasalassi.com\/wp-content\/uploads\/2026\/09\/paste-studio-mobile-en-dark.png\" alt=\"Paste Studio English mobile interface in the dark theme\" width=\"780\" height=\"1560\" loading=\"lazy\" decoding=\"async\" class=\"aa-cs-shotimg\"><figcaption class=\"aa-cs-cap\">English, left to right, dark theme.<\/figcaption><\/figure>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-40d40f8 e-flex e-con-boxed e-con e-parent\" data-id=\"40d40f8\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d3e3137 aa-cs-h2 elementor-widget elementor-widget-heading\" data-id=\"d3e3137\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Mobile and accessibility<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b129e8b elementor-widget elementor-widget-html\" data-id=\"b129e8b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<ul class=\"aa-cs-list aa-cs-list--check\"><li>Verified at 320, 360, 390, 430, 740, 768, 1024, 1440 and 1920 pixels across twelve pages in both languages: 108 combinations, zero horizontal overflow, zero undersized touch targets.<\/li><li>Below 380px the wordmark collapses to its mark so the header controls still fit \u2014 in Arabic the language button reads \u201cEnglish\u201d, which is wider and was the case that broke first.<\/li><li>The mobile drawer is a real dialog: focus moves in and is trapped, Escape and the backdrop close it, focus returns to the menu button, and background scrolling is locked.<\/li><li>Single h1 per page, landmark regions, labelled controls, a skip link, and a live region for status messages.<\/li><li>Status is never colour alone, and prefers-reduced-motion stops every transition.<\/li><\/ul>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-9337672 e-flex e-con-boxed e-con e-parent\" data-id=\"9337672\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-22cfef2 aa-cs-h2 elementor-widget elementor-widget-heading\" data-id=\"22cfef2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Architecture<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-971d3bf elementor-widget elementor-widget-text-editor\" data-id=\"971d3bf\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>PHP 8.3 rendering both language trees, a tiny JSON API, and vanilla JavaScript doing the image work. No framework, no build step, no package manager, no runtime dependencies.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f92e2d7 elementor-widget elementor-widget-html\" data-id=\"f92e2d7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<ul class=\"aa-cs-list aa-cs-list--check\"><li><strong>SafeFetch<\/strong> \u2014 the outbound HTTP guard: allowlist, address validation, connection pinning, manual redirect handling.<\/li><li><strong>Sources<\/strong> \u2014 the platform table, which drives both the API and the public capability page, so documentation cannot drift from behaviour.<\/li><li><strong>Rate<\/strong> \u2014 file-backed per-client limiting that trusts the proxy header only when the peer really is the local proxy.<\/li><li><strong>app.js<\/strong> \u2014 decode, canvas pipeline, encoder probing, EXIF detection, batch, and a ZIP writer.<\/li><li>Its own system user, PHP-FPM pool and open_basedir; nginx serves only the public directory and denies everything above it.<\/li><li>A service worker caches the static shell for offline use and never caches anything under \/api\/.<\/li><\/ul>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ad3acce elementor-widget elementor-widget-text-editor\" data-id=\"ad3acce\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>One bug worth recording: the worker originally matched cached assets with <code>ignoreSearch: true<\/code>, which quietly defeated the mtime-based cache busting \u2014 a new build produced a new URL and the worker served the old body anyway. Matching the full URL fixed it.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-a833a81 e-flex e-con-boxed e-con e-parent\" data-id=\"a833a81\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4ff7e71 aa-cs-h2 elementor-widget elementor-widget-heading\" data-id=\"4ff7e71\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">What was measured<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5be5d53 elementor-widget elementor-widget-text-editor\" data-id=\"5be5d53\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Figures from the build itself. There are no user numbers or download counts here, because this is a portfolio demo and has none.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6350604 elementor-widget elementor-widget-html\" data-id=\"6350604\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<ul class=\"aa-cs-metrics\"><li><strong>244<\/strong><span>automated assertions passing<\/span><\/li><li><strong>51<\/strong><span>SSRF and URL-validation cases refused<\/span><\/li><li><strong>108<\/strong><span>page &times; width checks with no horizontal overflow<\/span><\/li><li><strong>0<\/strong><span>bytes of visitor imagery reaching the server<\/span><\/li><li><strong>130<\/strong><span>strings, complete in both languages<\/span><\/li><li><strong>11<\/strong><span>platforms, each stated honestly<\/span><\/li><\/ul>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-780a8b5 e-flex e-con-boxed e-con e-parent\" data-id=\"780a8b5\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-677c956 aa-cs-h2 elementor-widget elementor-widget-heading\" data-id=\"677c956\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Technology<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3028180 elementor-widget elementor-widget-html\" data-id=\"3028180\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<ul class=\"aa-cs-chips\"><li>PHP 8.3<\/li><li>Vanilla JavaScript<\/li><li>Canvas API<\/li><li>createImageBitmap<\/li><li>nginx<\/li><li>PHP-FPM<\/li><li>No framework<\/li><li>CSS logical properties<\/li><li>Progressive Web App<\/li><li>Service worker<\/li><li>oEmbed<\/li><li>Bilingual AR \/ EN<\/li><\/ul>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-26f40ed aa-cs-final e-flex e-con-boxed e-con e-parent\" data-id=\"26f40ed\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-49deb7c aa-cs-h2 elementor-widget elementor-widget-heading\" data-id=\"49deb7c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Try it<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d4b520f elementor-widget elementor-widget-text-editor\" data-id=\"d4b520f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Paste a screenshot, drop a photo, or try a public YouTube link and see exactly what it will and will not do.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-f9a2905 aa-cs-cta-row e-con-full e-flex e-con e-parent\" data-id=\"f9a2905\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-83a9f7a aa-el-btn aa-el-btn--primary elementor-widget elementor-widget-button\" data-id=\"83a9f7a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/paste-studio.3dot.tech\" target=\"_blank\" rel=\"noopener noreferrer\" aria-label=\"Try the Paste Studio live demo (opens in a new tab)\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Try Live Demo<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-79d7d03 aa-el-btn aa-el-btn--ghost elementor-widget elementor-widget-button\" data-id=\"79d7d03\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/anasalassi.com\/projects\/\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">All projects<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>\u0645\u0633\u0627\u062d\u0629 \u0639\u0645\u0644 \u062a\u0631\u0627\u0639\u064a \u0627\u0644\u062e\u0635\u0648\u0635\u064a\u0629 \u0644\u0644\u0635\u0642 \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0648\u062a\u062d\u0648\u064a\u0644\u0647\u0627 \u0648\u062a\u063a\u064a\u064a\u0631 \u0645\u0642\u0627\u0633\u0627\u062a\u0647\u0627 \u0648\u062a\u062d\u0633\u064a\u0646\u0647\u0627 \u0648\u062a\u0646\u0632\u064a\u0644 \u0627\u0644\u0645\u062d\u062a\u0648\u0649 \u0627\u0644\u0645\u0635\u0631\u0651\u062d \u0628\u0647 \u0636\u0645\u0646 \u062a\u062c\u0631\u0628\u0629 \u062b\u0646\u0627\u0626\u064a\u0629 \u0627\u0644\u0644\u063a\u0629.<\/p>","protected":false},"author":0,"featured_media":5626,"parent":5422,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-5633","page","type-page","status-publish","has-post-thumbnail","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/anasalassi.com\/ar\/wp-json\/wp\/v2\/pages\/5633","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/anasalassi.com\/ar\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/anasalassi.com\/ar\/wp-json\/wp\/v2\/types\/page"}],"replies":[{"embeddable":true,"href":"https:\/\/anasalassi.com\/ar\/wp-json\/wp\/v2\/comments?post=5633"}],"version-history":[{"count":0,"href":"https:\/\/anasalassi.com\/ar\/wp-json\/wp\/v2\/pages\/5633\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/anasalassi.com\/ar\/wp-json\/wp\/v2\/pages\/5422"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/anasalassi.com\/ar\/wp-json\/wp\/v2\/media\/5626"}],"wp:attachment":[{"href":"https:\/\/anasalassi.com\/ar\/wp-json\/wp\/v2\/media?parent=5633"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}