<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/rss.xsl"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Sveltekitblog Engine</title>
        <link>https://svelteblog-13g.pages.dev</link>
        <description>Welcome to the new blog. (Please modify this text in settings.)</description>
        <language>en</language>
        <atom:link href="https://svelteblog-13g.pages.dev/en/rss.xml" rel="self" type="application/rss+xml"/>
        <lastBuildDate>Mon, 29 Jun 2026 22:53:50 GMT</lastBuildDate>
        <item>
            <title><![CDATA[Contact]]></title>
            <link>https://svelteblog-13g.pages.dev/en/contact/contact</link>
            <guid isPermaLink="true">https://svelteblog-13g.pages.dev/en/contact/contact</guid>
            <pubDate>Sat, 27 Jun 2026 18:51:27 GMT</pubDate>
            <description><![CDATA[]]></description>
            <content:encoded><![CDATA[<div style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; line-height: 1.7; color: var(--color-text, #333); max-width: 800px; margin: 0 auto; padding: 20px 10px;">
  
  <!-- Header Section -->
  <header style="text-align: center; margin-bottom: 40px; padding-bottom: 30px; border-bottom: 1px solid rgba(0, 0, 0, 0.1);">
    <h1 style="font-size: 2.3rem; font-weight: 800; margin-bottom: 10px; background: linear-gradient(45deg, #ff3e00, #40b3ff); -webkit-background-clip: text; -webkit-text-fill-color: transparent;" id="contact-us">
      ✉️ Contact Us
    </h1>
    <p style="font-size: 1.1rem; color: #666; margin: 0;">Feel free to reach out with feedback, suggestions, or technical inquiries.</p>
  </header>

  <!-- 1. Intro Message (#ff3e00: Svelte Orange) -->
  <section style="margin-bottom: 35px;">
    <h2 style="font-size: 1.4rem; font-weight: 700; color: #333; margin-bottom: 15px; border-left: 5px solid #ff3e00; padding-left: 12px;" id="welcome-message">
      I look forward to hearing from you.
    </h2>
    <p style="margin-bottom: 15px; color: #555;">
      If you encounter any bugs, have feature requests, theme enhancement ideas, or would like to propose a personal collaboration while using the blog engine, please feel free to share your thoughts through any of the channels below. Your feedback is highly appreciated and will actively contribute to future development.
    </p>
  </section>

  <!-- 2. Contact Channels (#007acc: Technical Blue) -->
  <section style="margin-bottom: 35px;">
    <h2 style="font-size: 1.4rem; font-weight: 700; color: #333; margin-bottom: 20px; border-left: 5px solid #007acc; padding-left: 12px;" id="contact-channels">
      Official Communication Channels
    </h2>
    
    <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 15px; margin-bottom: 20px;">
      
      <!-- Email Card -->
      <div style="border: 1px solid rgba(0, 0, 0, 0.08); padding: 20px; border-radius: 12px; background: rgba(255, 255, 255, 0.5); box-shadow: 0 4px 6px rgba(0,0,0,0.02);">
        <h3 style="margin-top: 0; color: #ff3e00; font-size: 1.2rem; display: flex; align-items: center; gap: 8px;" id="email-inquiry">
          📧 E-mail
        </h3>
        <p style="font-size: 0.95rem; color: #555; margin: 8px 0 12px 0;">
          For collaborations, business inquiries, or general personal matters, please send an email. I will respond as soon as possible.
        </p>
        <a href="mailto:sveltekitblog@gmail.com" style="color: #ff3e00; text-decoration: none; font-weight: 600; font-size: 0.95rem;">
          sveltekitblog@gmail.com
        </a>
      </div>

      <!-- GitHub Issues Card -->
      <div style="border: 1px solid rgba(0, 0, 0, 0.08); padding: 20px; border-radius: 12px; background: rgba(255, 255, 255, 0.5); box-shadow: 0 4px 6px rgba(0,0,0,0.02);">
        <h3 style="margin-top: 0; color: #333; font-size: 1.2rem; display: flex; align-items: center; gap: 8px;" id="github-issue">
          💻 GitHub Issues
        </h3>
        <p style="font-size: 0.95rem; color: #555; margin: 8px 0 12px 0;">
          For source code bugs, technical problems, or specific feature requests, please open an issue in the repository.
        </p>
        <a href="https://github.com/sveltekitblog/sveltekitblogengine" target="_blank" style="color: #333; text-decoration: none; font-weight: 600; font-size: 0.95rem;">
          Report an Issue
        </a>
      </div>

      <!-- Guestbook Card -->
      <div style="border: 1px solid rgba(0, 0, 0, 0.08); padding: 20px; border-radius: 12px; background: rgba(255, 255, 255, 0.5); box-shadow: 0 4px 6px rgba(0,0,0,0.02);">
        <h3 style="margin-top: 0; color: #40b3ff; font-size: 1.2rem; display: flex; align-items: center; gap: 8px;" id="guestbook-message">
          💬 Guestbook
        </h3>
        <p style="font-size: 0.95rem; color: #555; margin: 8px 0 12px 0;">
          If you just want to say hello, leave a friendly greeting, or mark your visit, please feel free to sign our guestbook.
        </p>
        <a href="https://sveltekitblog/guestbook" style="color: #40b3ff; text-decoration: none; font-weight: 600; font-size: 0.95rem;">
          Sign the Guestbook
        </a>
      </div>

    </div>
  </section>

  <!-- 3. Important Notes (#f59e0b: Amber Yellow) -->
  <section style="margin-bottom: 45px; padding: 20px; background: rgba(0, 0, 0, 0.02); border-radius: 12px; border: 1px dashed rgba(0,0,0,0.1);">
    <h2 style="font-size: 1.3rem; font-weight: 700; margin-top: 0; margin-bottom: 12px; color: #333; border-left: 5px solid #f59e0b; padding-left: 12px;" id="guidelines">
      📝 Important Notes
    </h2>
    <ul style="padding-left: 20px; margin: 0; color: #555;">
      <li style="margin-bottom: 8px;"><strong>Provide Detailed Information</strong>: When reporting bugs, including replication steps, error messages, or screenshots will greatly help in fast troubleshooting.</li>
      <li style="margin-bottom: 8px;"><strong>Response Time</strong>: For email inquiries, I typically review and respond within 1 to 2 business days.</li>
      <li style="margin-bottom: 0;"><strong>Spam & Advertising</strong>: Commercial spam, unsolicited pitches, or advertising emails will be ignored and deleted.</li>
    </ul>
  </section>

  <!-- Footer Section -->
  <footer style="text-align: center; margin-top: 50px; padding-top: 20px; border-top: 1px solid rgba(0, 0, 0, 0.05); font-size: 0.9rem; color: #888;">
    <p>If you'd like to support the maintenance and development of this blog, please use the links below.</p>
    <div style="margin-top: 15px; display: flex; justify-content: center; gap: 15px;">
      <a href="https://github.com/sveltekitblog/sveltekitblogengine" target="_blank" style="color: #ff3e00; text-decoration: none; font-weight: 600;">GitHub Repository</a>
      <span>•</span>
      <a href="https://sveltekitblog.com/guestbook" style="color: #40b3ff; text-decoration: none; font-weight: 600;">Sign the Guestbook</a>
    </div>
  </footer>

</div>
]]></content:encoded>
            <category>contact</category>
        </item>
        <item>
            <title><![CDATA[Privacy Policy]]></title>
            <link>https://svelteblog-13g.pages.dev/en/privacy/privacy</link>
            <guid isPermaLink="true">https://svelteblog-13g.pages.dev/en/privacy/privacy</guid>
            <pubDate>Sat, 27 Jun 2026 18:46:40 GMT</pubDate>
            <description><![CDATA[]]></description>
            <content:encoded><![CDATA[<div style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; line-height: 1.7; color: var(--color-text, #333); max-width: 800px; margin: 0 auto; padding: 20px 10px;">
  
  <!-- Header Section -->
  <header style="text-align: center; margin-bottom: 40px; padding-bottom: 30px; border-bottom: 1px solid rgba(0, 0, 0, 0.1);">
    <h1 style="font-size: 2.3rem; font-weight: 800; margin-bottom: 10px; background: linear-gradient(45deg, #ff3e00, #40b3ff); -webkit-background-clip: text; -webkit-text-fill-color: transparent;" id="privacy-policy">
      🔒 Privacy Policy
    </h1>
    <p style="font-size: 0.95rem; color: #888; margin: 0;">Last updated: June 27, 2026</p>
  </header>

  <!-- 1. Purpose of Collection (#ff3e00: Svelte Orange) -->
  <section style="margin-bottom: 35px;">
    <h2 style="font-size: 1.4rem; font-weight: 700; color: #333; margin-bottom: 15px; border-left: 5px solid #ff3e00; padding-left: 12px;" id="1-purpose-of-collecting-and-using-personal-information">
      1. Purpose of Collecting and Using Personal Information
    </h2>
    <p style="margin-bottom: 15px; color: #555;">
      This blog does not collect any personally identifiable information (PII) by default. However, we utilize Google Analytics to analyze website traffic and may display advertisements through Google AdSense.
    </p>
  </section>

  <!-- 2. Information Collected (#007acc: Technical Blue) -->
  <section style="margin-bottom: 35px;">
    <h2 style="font-size: 1.4rem; font-weight: 700; color: #333; margin-bottom: 15px; border-left: 5px solid #007acc; padding-left: 12px;" id="2-information-we-collect">
      2. Information We Collect
    </h2>
    <div style="padding: 20px; background: rgba(0, 0, 0, 0.02); border-radius: 12px; border: 1px solid rgba(0, 0, 0, 0.05); margin-bottom: 15px;">
      <ul style="padding-left: 20px; margin: 0; color: #555;">
        <li style="margin-bottom: 8px;">Visitor IP addresses (in an anonymized format)</li>
        <li style="margin-bottom: 8px;">Browser type and operating system specifications</li>
        <li style="margin-bottom: 8px;">Pages visited and duration of stay</li>
        <li style="margin-bottom: 0;">Traffic statistics gathered via cookies</li>
      </ul>
    </div>
    <p style="color: #666; font-size: 0.95rem;">
      The information listed above is used solely for analytical and website improvement purposes and is never used to personally identify individual visitors.
    </p>
  </section>

  <!-- 3. Cookie Usage (#10b981: Mint Green) -->
  <section style="margin-bottom: 35px;">
    <h2 style="font-size: 1.4rem; font-weight: 700; color: #333; margin-bottom: 15px; border-left: 5px solid #10b981; padding-left: 12px;" id="3-use-of-cookies">
      3. Use of Cookies
    </h2>
    <p style="margin-bottom: 15px; color: #555;">
      This blog utilizes cookies for the following purposes:
    </p>
    <ul style="padding-left: 20px; margin-bottom: 15px; color: #555;">
      <li style="margin-bottom: 8px;"><strong>Google Analytics</strong> — Gathering and analyzing visitor statistics</li>
      <li style="margin-bottom: 8px;"><strong>Google AdSense</strong> — Delivering personalized advertisements</li>
      <li style="margin-bottom: 8px;"><strong>Session Management</strong> — Optimizing user experience</li>
    </ul>
    <p style="color: #555;">
      Most web browsers automatically accept cookies, but you can adjust your browser settings to decline them. Please note that disabling cookies may limit your access to certain features of this website.
    </p>
  </section>

  <!-- 4. Google Analytics (#f59e0b: Amber Yellow) -->
  <section style="margin-bottom: 35px;">
    <h2 style="font-size: 1.4rem; font-weight: 700; color: #333; margin-bottom: 15px; border-left: 5px solid #f59e0b; padding-left: 12px;" id="4-google-analytics">
      4. Google Analytics
    </h2>
    <p style="margin-bottom: 15px; color: #555;">
      This blog uses Google Analytics to compile visitor statistics. Google Analytics uses cookies to gather data on how visitors interact with our website. This information helps us analyze site usage patterns and continuously improve our services.
    </p>
    <p style="color: #555;">
      For more details on how Google collects and processes data, please refer to the <a target="_blank" rel="noopener noreferrer" style="color: #ff3e00; text-decoration: none; font-weight: 600;" href="https://policies.google.com/privacy">Google Privacy Policy</a>.
    </p>
  </section>

  <!-- 5. Google AdSense (#8b5cf6: Violet Purple) -->
  <section style="margin-bottom: 35px;">
    <h2 style="font-size: 1.4rem; font-weight: 700; color: #333; margin-bottom: 15px; border-left: 5px solid #8b5cf6; padding-left: 12px;" id="5-google-adsense">
      5. Google AdSense
    </h2>
    <p style="margin-bottom: 15px; color: #555;">
      This blog may display advertisements through Google AdSense. Google AdSense uses cookies to deliver relevant ads based on users' interests.
    </p>
    <p style="color: #555;">
      If you prefer not to receive personalized ads, you can opt out via the official <a target="_blank" rel="noopener noreferrer" style="color: #40b3ff; text-decoration: none; font-weight: 600;" href="https://www.google.com/settings/ads">Google Ad Settings</a> page.
    </p>
  </section>

  <!-- 6. Data Retention (#06b6d4: Cyan) -->
  <section style="margin-bottom: 35px;">
    <h2 style="font-size: 1.4rem; font-weight: 700; color: #333; margin-bottom: 15px; border-left: 5px solid #06b6d4; padding-left: 12px;" id="6-retention-and-use-period-of-personal-information">
      6. Data Retention and Usage Period
    </h2>
    <p style="color: #555;">
      This blog does not independently store or retain personal data. The retention periods for data collected by Google Analytics and Google AdSense are subject to their respective service policies.
    </p>
  </section>

  <!-- 7. Contact Info (#ec4899: Rose Pink) -->
  <section style="margin-bottom: 35px;">
    <h2 style="font-size: 1.4rem; font-weight: 700; color: #333; margin-bottom: 15px; border-left: 5px solid #ec4899; padding-left: 12px;" id="7-privacy-officer-contact-information">
      7. Privacy Officer & Contact Information
    </h2>
    <p style="color: #555; margin-bottom: 10px;">
      If you have any questions or concerns regarding your privacy on this website, please feel free to reach out via the email address below:
    </p>
    <div style="padding: 15px 20px; background: rgba(255, 62, 0, 0.03); border-radius: 12px; border: 1px solid rgba(255, 62, 0, 0.08); display: inline-block;">
      <span style="font-weight: 600; color: #ff3e00;">📧 Email:</span> 
      <a target="_blank" rel="noopener noreferrer nofollow" style="color: #333; text-decoration: none; font-weight: 600; margin-left: 5px;" href="mailto:sveltekitblog@gmail.com">sveltekitblog@gmail.com</a>
    </div>
  </section>

  <!-- 8. Policy Changes (#6366f1: Indigo) -->
  <section style="margin-bottom: 45px;">
    <h2 style="font-size: 1.4rem; font-weight: 700; color: #333; margin-bottom: 15px; border-left: 5px solid #6366f1; padding-left: 12px;" id="8-changes-to-this-privacy-policy">
      8. Changes to this Privacy Policy
    </h2>
    <p style="color: #555;">
      This Privacy Policy is subject to change in response to updates in relevant laws, policies, or security technologies. Any additions, deletions, or modifications will be announced on this blog at least 7 days prior to taking effect.
    </p>
  </section>

  <!-- External Links Section -->
  <footer style="margin-top: 50px; padding-top: 25px; border-top: 1px solid rgba(0, 0, 0, 0.05); font-size: 0.95rem;">
    <h3 style="font-size: 1.1rem; font-weight: 700; color: #333; margin-top: 0; margin-bottom: 15px;" id="external-links">
      🔗 External Links
    </h3>
    <div style="display: flex; flex-wrap: wrap; gap: 15px;">
      <a target="_blank" rel="noopener noreferrer" style="color: #ff3e00; text-decoration: none; font-weight: 600;" href="https://policies.google.com/privacy">Google Privacy Policy</a>
      <span style="color: #ddd;">|</span>
      <a target="_blank" rel="noopener noreferrer" style="color: #40b3ff; text-decoration: none; font-weight: 600;" href="https://policies.google.com/technologies/ads">Google Advertising Policies</a>
      <span style="color: #ddd;">|</span>
      <a target="_blank" rel="noopener noreferrer" style="color: #ff3e00; text-decoration: none; font-weight: 600;" href="https://www.google.com/settings/ads">Google Ad Settings</a>
    </div>
  </footer>

</div>
]]></content:encoded>
            <category>privacy</category>
        </item>
        <item>
            <title><![CDATA[About]]></title>
            <link>https://svelteblog-13g.pages.dev/en/about/about</link>
            <guid isPermaLink="true">https://svelteblog-13g.pages.dev/en/about/about</guid>
            <pubDate>Sat, 27 Jun 2026 18:26:40 GMT</pubDate>
            <description><![CDATA[]]></description>
            <content:encoded><![CDATA[<div style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; line-height: 1.7; color: var(--color-text, #333); max-width: 800px; margin: 0 auto; padding: 20px 10px;">
  
  <!-- Header Section -->
  <header style="text-align: center; margin-bottom: 40px; padding-bottom: 30px; border-bottom: 1px solid rgba(0, 0, 0, 0.1);">
    <h1 style="font-size: 2.5rem; font-weight: 800; margin-bottom: 10px; background: linear-gradient(45deg, #ff3e00, #40b3ff); -webkit-background-clip: text; -webkit-text-fill-color: transparent;" id="about-this-blog">
      About This Blog
    </h1>
    <p style="font-size: 1.1rem; color: #666; margin: 0;">High-Performance Serverless Blog Engine Powered by Svelte 5.56.3 & SvelteKit 2.66.0</p>
  </header>

  <!-- Body: Welcome Message -->
  <section style="margin-bottom: 40px;">
    <h2 style="font-size: 1.6rem; font-weight: 700; margin-bottom: 15px; border-left: 5px solid #ff3e00; padding-left: 12px;" id="welcome-message">
      Hello! Thank you for visiting.
    </h2>
    <p style="margin-bottom: 15px;">
      Rather than relying on generic templates or out-of-the-box platforms, this blog runs on a highly polished, custom-built blog engine designed from the ground up using <strong>Svelte 5.56.3, SvelteKit 2.66.0, Cloudflare D1, and Better-Auth</strong>.
    </p>
    <p style="margin-bottom: 15px;">
      Built to push the boundaries of web development productivity and user experience (UX), it combines lightning-fast edge computing speeds with sophisticated relational data modeling in a serverless environment. Both the admin operations and writing experience are tailored to ensure peak performance and optimal UX.
    </p>
  </section>

  <!-- Body: Technology Stack -->
  <section style="margin-bottom: 40px;">
    <h2 style="font-size: 1.6rem; font-weight: 700; margin-bottom: 20px; border-left: 5px solid #40b3ff; padding-left: 12px;" id="key-technology-stack">
      Key Technology Stack
    </h2>
    
    <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 15px;">
      
      <!-- Svelte & SvelteKit Card -->
      <div style="border: 1px solid rgba(0, 0, 0, 0.08); padding: 20px; border-radius: 12px; background: rgba(255, 255, 255, 0.5); box-shadow: 0 4px 6px rgba(0,0,0,0.02);">
        <h3 style="margin-top: 0; color: #ff3e00; font-size: 1.2rem; display: flex; align-items: center; gap: 8px;" id="svelte-5563-sveltekit-2660">
          ⚡ Svelte 5.56.3 & SvelteKit 2.66.0
        </h3>
        <p style="font-size: 0.95rem; color: #555; margin: 8px 0 0 0;">
          Utilizes Svelte 5's Runes system for fine-grained reactivity and minimal overhead, integrated with SvelteKit 2's file-based server-side routing and data prefetching.
        </p>
      </div>

      <!-- Database Card -->
      <div style="border: 1px solid rgba(0, 0, 0, 0.08); padding: 20px; border-radius: 12px; background: rgba(255, 255, 255, 0.5); box-shadow: 0 4px 6px rgba(0,0,0,0.02);">
        <h3 style="margin-top: 0; color: #f59e0b; font-size: 1.2rem; display: flex; align-items: center; gap: 8px;" id="d1-database-drizzle">
          💾 D1 Database & Drizzle
        </h3>
        <p style="font-size: 0.95rem; color: #555; margin: 8px 0 0 0;">
          Stores and manages structured blog data securely and quickly using Cloudflare’s edge-native D1 SQL database paired with the type-safe Drizzle ORM.
        </p>
      </div>

      <!-- Authentication Card -->
      <div style="border: 1px solid rgba(0, 0, 0, 0.08); padding: 20px; border-radius: 12px; background: rgba(255, 255, 255, 0.5); box-shadow: 0 4px 6px rgba(0,0,0,0.02);">
        <h3 style="margin-top: 0; color: #000; font-size: 1.2rem; display: flex; align-items: center; gap: 8px;" id="better-auth">
          🔒 Better-Auth
        </h3>
        <p style="font-size: 0.95rem; color: #555; margin: 8px 0 0 0;">
          Adopts Better-Auth, a modern authentication framework, ensuring secure user session management and robust user profile access controls.
        </p>
      </div>

    </div>
  </section>

  <!-- Body: Goals and Vision -->
  <section style="margin-bottom: 40px; padding: 20px; background: rgba(0, 0, 0, 0.02); border-radius: 12px; border: 1px dashed rgba(0,0,0,0.1);">
    <h2 style="font-size: 1.3rem; font-weight: 700; margin-top: 0; margin-bottom: 10px; color: #333;" id="goals-of-this-blog">
      🎯 Goals of This Blog
    </h2>
    <ul style="padding-left: 20px; margin: 0; color: #555;">
      <li style="margin-bottom: 8px;"><strong>Knowledge Archiving</strong>: Sharing hands-on engineering insights and troubleshooting experiences without filtering.</li>
      <li style="margin-bottom: 8px;"><strong>Continuous Engine Evolution</strong>: Documenting performance tuning, feature updates, and patch history transparently.</li>
      <li style="margin-bottom: 0;"><strong>Comprehensive Guides</strong>: Offering in-depth manuals and design tips for those who wish to build a site using this engine.</li>
    </ul>
  </section>
<p style="font-size: 1rem; font-weight: 700; margin-bottom: 15px; border-left: 5px solid #003eff; padding-left: 12px;">This text was translated by Gemini 3.5 Flash. Please be advised that some expressions may be unnatural. We appreciate your understanding.</p>

  <!-- Footer / Social Links -->
  <footer style="text-align: center; margin-top: 50px; padding-top: 20px; border-top: 1px solid rgba(0, 0, 0, 0.05); font-size: 0.9rem; color: #888;">
    <p>For more information about the project, or to contact/support me, please refer to the links below.</p>
    <div style="margin-top: 15px; display: flex; justify-content: center; gap: 15px;">
      <a href="https://github.com/sveltekitblog/sveltekitblogengine" target="_blank" style="color: #ff3e00; text-decoration: none; font-weight: 600;">GitHub Repository</a>
      <span>•</span>
      <a href="https://sveltekitblog.com/guestbook" style="color: #40b3ff; text-decoration: none; font-weight: 600;">Sign Guestbook</a>
      <span>•</span>
      <a href="https://www.buymeacoffee.com/sveltekitblogengine" target="_blank" style="color: #ffe20a; text-decoration: none; font-weight: 600;">Buy me a Coffee</a>
    </div>
  </footer>

</div>
]]></content:encoded>
            <category>about</category>
        </item>
        <item>
            <title><![CDATA[Blog and Admin Feature Integration Overview]]></title>
            <link>https://svelteblog-13g.pages.dev/en/general-guide/general-integration-guide</link>
            <guid isPermaLink="true">https://svelteblog-13g.pages.dev/en/general-guide/general-integration-guide</guid>
            <pubDate>Sat, 20 Jun 2026 02:54:35 GMT</pubDate>
            <description><![CDATA[An integration document linking layout options, communication systems, multi-language publishing, and real-time design editors of the blog and admin console.]]></description>
            <content:encoded><![CDATA[<p><img src="https://sveltekitblog.com/images/posts/general-integration-guide/desktop/img-general-guide-general-integration-guide-ko-001.webp" alt="img-general-guide-general-integration-guide-ko-001"></p>
<h1 id="blog-and-admin-feature-integration-overview">📖 Blog and Admin Feature Integration Overview</h1>
<p>This document links individual feature overview pages to provide a structured map of the blog service and administration (admin) features.</p>
<p><em>Note: Detailed connection guidelines and technical manuals for each feature will be published individually in future posts.</em></p>
<hr>
<h2 id="feature-overview-index">📂 Feature Overview Index</h2>
<ul>
<li><strong>Admin Features</strong><ul>
<li><strong><a href="../admin-guide/admin-install-and-deploy">CMD One-Click Installation and Cloudflare Deployment Guide</a></strong>: Deploying the blog edge infrastructure to Cloudflare with a single terminal command.</li>
<li><strong><a href="../admin-guide/admin-getting-started">Admin First Access and Configuration Guide</a></strong>: Master password login, IP whitelist management, and multi-language UI dictionary configuration.</li>
<li><strong><a href="../admin-guide/admin-core-features">Core Admin Features and Dual Editors</a></strong>: Introduces Visual HTML and Markdown editors, batch-saving, and column layouts for desktop/mobile viewports.</li>
<li><strong><a href="../admin-guide/admin-design-editor">Real-Time Design Editor and Background Showcase</a></strong>: Four background modes (solid, gradient, image, canvas scripts) applied in real-time without rebuilds.</li>
<li><strong><a href="../admin-guide/admin-faq">Admin FAQ and Troubleshooting</a></strong>: Version upgrades, image storage key checks, post-deployment troubleshooting, and IP security unblock procedures.</li>
</ul>
</li>
<li><strong>Blog Features</strong><ul>
<li><strong><a href="../blog-guide/blog-getting-started">Blog Homepage Layout and Login</a></strong>: Highlights homepage widgets, multi-language UI switches, and login integrations.</li>
<li><strong><a href="../blog-guide/blog-core-features">Blog Core Features and Multi-Language Service</a></strong>: Real-time multi-language content switching, translation fallback logic, nested comment threads, and private guestbook communication.</li>
<li><strong><a href="../blog-guide/blog-faq">Reader Policy and FAQ</a></strong>: Data processing upon account deletion, re-registration policies, and ban/kick restriction details.</li>
</ul>
</li>
</ul>
<hr>
<h2 id="core-process-of-blog-management">🚀 Core Process of Blog Management</h2>
<p>An overview of the setup and authoring workflow for blog administrators.</p>
<h3 id="1-ip-whitelisting-and-master-login">1. IP Whitelisting and Master Login</h3>
<ul>
<li>The admin panel requires the user&#39;s public IP address to be registered in the <code>ALLOWED_IP</code> whitelist before access is granted. (A 403 Forbidden page is shown if unregistered.)</li>
<li>Enter the master password on the secure login screen to establish your session.</li>
</ul>
<h3 id="2-multi-language-batch-saving">2. Multi-Language Batch Saving</h3>
<ul>
<li>Switch between the translation tabs in the writing editor to write content, and click the save button to publish or draft all languages simultaneously to the database.</li>
</ul>
<h3 id="3-real-time-theme-updates">3. Real-Time Theme Updates</h3>
<ul>
<li>Configure styles, colors, and interactive canvas backgrounds in the design editor. Saving changes propagates parameters as CSS variables in visitors&#39; browsers instantly, without redeployment.</li>
</ul>
<hr>
<h2 id="closing-remarks">💬 Closing Remarks</h2>
<p>The content covered in this document is a <strong>brief overview</strong> of the features offered by the blog and admin systems. In reality, there are many more detailed features and convenience options that we couldn&#39;t cover here, and discovering them on your own as you explore the system can be quite an enjoyable experience.</p>
<p>We plan to publish in-depth guides with detailed usage instructions and tips for each feature in future posts, so please feel free to visit again whenever you need them. If you have any questions or feedback, don&#39;t hesitate to leave a message via the guestbook or comments section at any time.</p>
]]></content:encoded>
            <category>Integration Guide</category>
            <enclosure url="https://sveltekitblog.com/images/posts/general-integration-guide/desktop/img-general-guide-general-integration-guide-ko-001.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Reader Policy and Frequently Asked Questions (FAQ)]]></title>
            <link>https://svelteblog-13g.pages.dev/en/blog-guide/blog-faq</link>
            <guid isPermaLink="true">https://svelteblog-13g.pages.dev/en/blog-guide/blog-faq</guid>
            <pubDate>Sat, 20 Jun 2026 02:50:33 GMT</pubDate>
            <description><![CDATA[Introduces core principles regarding user data processing upon membership withdrawal and policies for service activity restrictions.]]></description>
            <content:encoded><![CDATA[<p><img src="https://sveltekitblog.com/images/posts/blog-faq/desktop/img-blog-guide-blog-faq-ko-001.webp" alt="img-blog-guide-blog-faq-ko-001"></p>
<h1 id="reader-policy-and-frequently-asked-questions-faq">❓ Reader Policy and Frequently Asked Questions (FAQ)</h1>
<p>This document introduces the basic principles of personal information and data processing upon account deletion, and the service activity restriction policy.</p>
<hr>
<h2 id="q1-what-happens-to-my-comments-and-guestbook-posts-when-i-delete-my-account">🚪 Q1. What happens to my comments and guestbook posts when I delete my account?</h2>
<p>The blog system applies an <strong>author anonymization policy</strong> to simultaneously protect the user&#39;s privacy and maintain the integrity of dialogue threads within the site.</p>
<h3 id="data-processing-principles-upon-deletion">💡 Data Processing Principles Upon Deletion</h3>
<ol>
<li><strong>Personal Identification Data Removal</strong>:<ul>
<li>When you delete your account, your active session and social login connection information are immediately and safely removed from the authentication system. However, for preventing abuse and security audits, minimal data containing the email and social ID connection information at the time of deletion is backed up in a segregated internal deletion log table (<code>deleted_users</code>). This log information is for internal administrative use only, and is completely anonymized and hidden on public pages to prevent any reverse-tracking of the author.</li>
</ul>
</li>
<li><strong>Content Data Retention</strong>:<ul>
<li>Your comments and guestbook messages remain on the screen to preserve the context of past discussions and conversations.</li>
</ul>
</li>
<li><strong>Nickname Anonymization</strong>:<ul>
<li>The link between your account and your posts is severed, and the author name automatically switches to <strong>&quot;Unknown&quot;</strong>. This prevents reverse-tracking of the actual author&#39;s identity.</li>
</ul>
</li>
</ol>
<ul>
<li><em>Note: If the administrator manually deletes your membership record entirely, your comments and guestbook entries may also be removed.</em></li>
</ul>
<hr>
<h2 id="q2-can-i-sign-up-again-immediately-after-deletion-or-withdrawal">🚪 Q2. Can I sign up again immediately after deletion or withdrawal?</h2>
<ul>
<li><strong>Voluntary Withdrawal</strong>:<ul>
<li>If you voluntarily delete your account, you can sign up again immediately using the same email or social account without any grace period.</li>
</ul>
</li>
<li><strong>Activity Ban (Ban) State</strong>:<ul>
<li>If your account is banned due to policy violations, you cannot sign up again with the same email because the email information still exists in the database.</li>
</ul>
</li>
<li><strong>Forced Deletion (Kick) State</strong>:<ul>
<li>If your account is forcibly deleted (Hard Deleted) by an administrator, the existing information is completely removed from the authentication tables, making it technically possible to sign up again with the same email immediately.</li>
<li>Although the email and social ID information from the time of the kick are preserved in the internal deletion log (<code>deleted_users</code>), there is currently no automated system block logic that compares this log at the time of registration to restrict sign-ups.</li>
<li>Therefore, to physically and completely prevent a malicious user from signing up again, the account should be kept in a <strong>&#39;Banned&#39;</strong> state rather than being forcibly deleted. (In a banned state, the email remains in the database, preventing re-registration due to the unique email constraint.)</li>
</ul>
</li>
</ul>
<hr>
<h2 id="q3-my-account-has-been-restricted-banned-or-forced-out-kicked">🚫 Q3. My account has been restricted (banned) or forced out (kicked).</h2>
<p>Checklist when your service usage is restricted (banned) or deleted (kicked) due to policy violations (such as posting spam or offensive content).</p>
<h3 id="core-checklist-for-activity-restrictions">💡 Core Checklist for Activity Restrictions</h3>
<ol>
<li><strong>Activity Ban (Ban)</strong>:<ul>
<li><strong>Status</strong>: Your login state remains active, but direct interactions such as posting comments, nested replies, or guestbook entries are temporarily or permanently restricted.</li>
<li><strong>Checking Reasons</strong>: When restricted, a notice saying <strong>&quot;Banned users cannot write comments.&quot;</strong> will appear in the comment form area, and you can view the specific reason and the expiration date of the restriction.</li>
</ul>
</li>
<li><strong>Forced Deletion (Kick/Delete)</strong>:<ul>
<li><strong>Status</strong>: The login account itself is completely deleted (Hard Deleted) from the database.</li>
<li><strong>Behavior</strong>: Once kicked, your active login session is immediately terminated. Subsequent login attempts will treat you as a new user with no registration history. Depending on the deletion behavior set by the administrator, comments you wrote may either be deleted entirely or anonymized as &#39;Unknown&#39;.</li>
</ul>
</li>
</ol>
]]></content:encoded>
            <category>User Guide</category>
            <enclosure url="https://sveltekitblog.com/images/posts/blog-faq/desktop/img-blog-guide-blog-faq-ko-001.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Blog Core Features and Multi-Language Service Overview]]></title>
            <link>https://svelteblog-13g.pages.dev/en/blog-guide/blog-core-features</link>
            <guid isPermaLink="true">https://svelteblog-13g.pages.dev/en/blog-guide/blog-core-features</guid>
            <pubDate>Sat, 20 Jun 2026 02:47:24 GMT</pubDate>
            <description><![CDATA[An introduction to the blog's core features including real-time multi-language rendering and manual translation fallback, comment/reply hierarchies, and private guestbook posts.]]></description>
            <content:encoded><![CDATA[<h1 id="blog-core-features-and-multi-language-service-overview">🌐 Blog Core Features and Multi-Language Service Overview</h1>
<p>This document introduces core features of the blog, including viewing multi-language post translations and communicating via comments and the guestbook.</p>
<hr>
<h2 id="1-real-time-multi-language-body-switching-i18n">🌐 1. Real-Time Multi-Language Body Switching (i18n)</h2>
<p>This blog features a real-time multi-language viewer that updates not just basic UI labels but the actual post content itself to the selected language.</p>
<h3 id="how-it-works-amp-key-features">⚙️ How It Works &amp; Key Features</h3>
<ul>
<li><strong>Language-Specific URL Routing</strong>: Clicking the globe icon at the top or the language buttons near the post title directs the browser to the language-specific URL (e.g., prefixing with <code>/en</code> or <code>/ja</code>). In addition to default languages (Korean, English, Japanese), administrators can expand and publish in other languages by configuring the translation dictionary.</li>
</ul>
<img src="https://sveltekitblog.com/images/posts/blog-core-features/desktop/img-blog-guide-blog-core-features-ko-001.webp" alt="img-blog-guide-blog-core-features-ko-001" data-align="center" />
<img src="https://sveltekitblog.com/images/posts/blog-core-features/desktop/img-blog-guide-blog-core-features-ko-002.webp" alt="img-blog-guide-blog-core-features-ko-002" data-align="center" />
<figure data-align="center"><img src="https://sveltekitblog.com/images/posts/blog-core-features/desktop/img-blog-guide-blog-core-features-ko-003.webp" alt="img-blog-guide-blog-core-features-ko-003" data-align="center" data-caption="For posts published in multiple languages, clicking the corresponding language button immediately redirects you to the translated page." /><figcaption>For posts published in multiple languages, clicking the corresponding language button immediately redirects you to the translated page.</figcaption></figure><ul>
<li><strong>Manually Authored Data Loading (Not Machine Translation)</strong>: The system does not automatically machine-translate text in real time. Instead, it queries and loads the specific post data manually translated and saved by the author under each language tab (such as content translated using AI or translation services and stored in the database).</li>
<li><strong>Simultaneous Content &amp; Metadata Loading</strong>: More than simple text replacement, the database-stored title, excerpt, tags, and body HTML are completely swapped with the datasets of the selected language.</li>
<li><strong>Untranslated Post Fallback</strong>: If the author has not registered a translation for a specific language, the system shows a notice stating the translation is unavailable and falls back to rendering the default authoring language (e.g., Korean text) to ensure the reader&#39;s flow is uninterrupted.</li>
</ul>
<hr>
<h2 id="2-comment-and-nested-reply-hierarchy">💬 2. Comment and Nested Reply Hierarchy</h2>
<p>A clean comment section is placed below each article to facilitate discussion for both guest visitors and registered members.</p>
<ul>
<li><strong>Sharing Thoughts</strong>: Logged-in users can write and post comments to share ideas.</li>
<li><strong>Hierarchical Replies (Nested Comments)</strong>: Users can reply to a specific comment, organizing discussions in an easy-to-read tree structure.</li>
<li><strong>Security &amp; Integrity Preservation</strong>: Users can delete their own comments. However, if a comment with active replies is deleted, the system masks the content with the text &quot;This comment has been deleted&quot; to prevent breaking the overall thread hierarchy.</li>
</ul>
<hr>
<h2 id="3-guestbook-and-private-posts">📖 3. Guestbook and Private Posts</h2>
<p>Provides communication features through the blog guestbook page.</p>
<h3 id="private-guestbook-features">⚙️ Private Guestbook Features</h3>
<ul>
<li><strong>Writing Private Posts</strong>: Checking the <strong>[🔒 Private Post]</strong> checkbox hides the message from the general public.</li>
<li><strong>Exposure Restriction</strong>: Private guestbook posts are completely excluded from the lists of third-party visitors and logged-out users.</li>
<li><strong>Secure Communication</strong>: The post body is visible only to the author (when logged in) and the site administrator, ensuring private communication.</li>
</ul>
]]></content:encoded>
            <category>User Guide</category>
            <enclosure url="https://sveltekitblog.com/images/posts/blog-core-features/desktop/img-blog-guide-blog-core-features-ko-001.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Blog Homepage Layout and Getting Started with Login]]></title>
            <link>https://svelteblog-13g.pages.dev/en/blog-guide/blog-getting-started</link>
            <guid isPermaLink="true">https://svelteblog-13g.pages.dev/en/blog-guide/blog-getting-started</guid>
            <pubDate>Sat, 20 Jun 2026 02:41:11 GMT</pubDate>
            <description><![CDATA[A brief introduction to the basic homepage layout and login/registration procedures of the blog app.]]></description>
            <content:encoded><![CDATA[<h1 id="blog-homepage-layout-and-getting-started-with-login">🌐 Blog Homepage Layout and Getting Started with Login</h1>
<p>This document provides a brief overview of the blog (<code>apps/blog</code>) homepage layout and basic login/registration methods.</p>
<hr>
<h2 id="1-blog-layout-and-navigation">🎨 1. Blog Layout and Navigation</h2>
<p>The blog layout is designed to help visitors locate information efficiently (Header, Sidebar, Main Content, and Footer).</p>
<ol>
<li><strong>Navigation Header (Header)</strong>:<ul>
<li><strong>Site Logo</strong>: Click to return to the homepage at any time.</li>
<li><strong>Shortcut Menu</strong>: Lists primary links configured by the administrator (e.g., categories, external channels).</li>
<li><strong>Language Selector</strong>: Click the globe icon to switch both menu languages and post translations instantly.</li>
</ul>
</li>
<li><strong>Sidebar</strong>:<ul>
<li>Displays category lists, the author profile card, and popular tags on desktop screens.</li>
<li>Automatically hidden on mobile resolutions to optimize readability and scrolling.</li>
</ul>
</li>
<li><strong>Main Content</strong>:<ul>
<li>Shows category filters and the latest published articles in card format.</li>
</ul>
</li>
</ol>
<hr>
<h2 id="2-registration-and-login">🔑 2. Registration and Login</h2>
<p>Supports account registration and login for writing comments or guestbook entries.</p>
<h3 id="supported-login-and-sign-up-methods">⚙️ Supported Login and Sign-Up Methods</h3>
<ul>
<li><strong>Default Email Login/Sign-Up (Default)</strong>:<ul>
<li>Enabled by default post-installation. Users can sign up by providing an email address, display name (nickname), and password. Auto-login applies immediately upon successful registration.</li>
</ul>
</li>
</ul>
<figure data-align="center"><img src="https://sveltekitblog.com/images/posts/blog-getting-started/desktop/img-blog-guide-blog-getting-started-en-001.webp" alt="img-blog-guide-blog-getting-started-en-001" data-align="center" data-caption="Default email login screen" /><figcaption>Default email login screen</figcaption></figure><ul>
<li><strong>Social Login (Better-Auth)</strong>:<ul>
<li>Powered by the Better-Auth engine, supporting <strong>21 social login providers</strong> including Google, GitHub, Kakao, and Naver.</li>
<li>Social login buttons will only appear and function on the login screen after the administrator configures the respective client IDs and secrets as environment variables on the backend. (Integration details for social providers will be detailed in separate upcoming documents.)</li>
</ul>
</li>
</ul>
<figure data-align="center"><img src="https://sveltekitblog.com/images/posts/blog-getting-started/desktop/img-blog-guide-blog-getting-started-en-002.webp" alt="img-blog-guide-blog-getting-started-en-002" data-align="center" data-caption="Social + email login screen" /><figcaption>Social + email login screen</figcaption></figure><ul>
<li><strong>Login Status Display</strong>:<ul>
<li>Upon logging in, the top-right button switches to your profile image icon and a link to my-page.</li>
<li><em>Note: The user profile photo integration is currently in progress and may display a default profile icon instead.</em></li>
</ul>
</li>
</ul>
]]></content:encoded>
            <category>User Guide</category>
            <enclosure url="https://sveltekitblog.com/images/posts/blog-getting-started/desktop/img-blog-guide-blog-getting-started-en-001.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Admin Frequently Asked Questions (FAQ) and Troubleshooting]]></title>
            <link>https://svelteblog-13g.pages.dev/en/admin-guide/admin-faq</link>
            <guid isPermaLink="true">https://svelteblog-13g.pages.dev/en/admin-guide/admin-faq</guid>
            <pubDate>Sat, 20 Jun 2026 02:34:34 GMT</pubDate>
            <description><![CDATA[Resolve installation and deployment errors, upgrade to the latest version, check mandatory image storage keys, and solve IP security blockages.]]></description>
            <content:encoded><![CDATA[<img src="https://sveltekitblog.com/images/posts/admin-faq/desktop/img-admin-guide-admin-faq-ko-001.webp" alt="img-admin-guide-admin-faq-ko-001" data-align="center"><h1 id="admin-frequently-asked-questions-faq-and-troubleshooting">❓ Admin Frequently Asked Questions (FAQ) and Troubleshooting</h1>
<p>This document provides solutions to common troubleshooting issues that may arise during the installation, deployment, and operation of the blog, as well as a guide to safely upgrading to the latest version.</p>
<hr>
<h2 id="q1-how-do-i-safely-upgrade-to-the-latest-version-or-restore-my-data">🗄️ Q1. How do I safely upgrade to the latest version or restore my data?</h2>
<p>To preserve database integrity and prevent unexpected build crashes, we strongly recommend following the safe upgrade procedures below.</p>
<h3 id="1-safe-upgrade-and-verification-procedure-recommended">1. Safe Upgrade and Verification Procedure (Recommended)</h3>
<p>To prevent database schema mismatches or template conflicts, do not deploy immediately to your production server. Instead, perform verification in a test environment first (applicable to non-Git users as well).</p>
<ol>
<li><strong>Preserve Settings Backup</strong>:<ul>
<li>Copy <code>wrangler.backup.json</code> and <code>.dev.vars</code> from your current development folder to a safe temporary location.</li>
<li><em>※ Note: The <code>.dev.vars</code> file contains critical credentials (passwords, OAuth keys, etc.) but is excluded from Git tracking (<code>.gitignore</code>) for security. Therefore, it is easily lost when updating or pulling source code. Be sure to back it up.</em></li>
</ul>
</li>
<li><strong>Back Up Production Data</strong>:<ul>
<li>Go to the <code>Content Backup</code> menu in your active blog admin panel and download the complete posts and settings backup file.</li>
</ul>
</li>
<li><strong>Clone/Download the New Version in an Isolated Folder</strong>:<ul>
<li>Do not overwrite the existing folder. Download or clone the latest release source code in an <strong>entirely new directory</strong>.</li>
</ul>
</li>
<li><strong>Deploy a Temporary Test Server</strong>:<ul>
<li>Navigate to the new folder, install dependencies (<code>npm install</code>), create a temporary database, and perform a test deployment.</li>
</ul>
</li>
<li><strong>Test Backup Restore</strong>:<ul>
<li>Access the newly deployed test admin panel and load the backup file downloaded in Step 2. Verify thoroughly that all posts and configurations display correctly without errors.</li>
</ul>
</li>
<li><strong>Apply Upgrade to Production Server</strong>:<ul>
<li>Only after validating that everything functions correctly on the test server, return to your original development folder, update the codebase (<code>git pull</code> or overwrite source), and run the individual app deployment commands (<code>npm run deploy:blog</code>, <code>npm run deploy:admin</code>) to complete the official upgrade.</li>
</ul>
</li>
</ol>
<h3 id="2-last-resort-for-data-loss">2. Last Resort for Data Loss</h3>
<ul>
<li><strong>Using the <code>npm run restore</code> Command</strong>:<ul>
<li>If the infrastructure settings or database are severely damaged and require a fresh restoration, use the backed-up <code>wrangler.backup.json</code> file as a <strong>last resort for data recovery</strong> to rebuild the entire infrastructure.</li>
</ul>
</li>
</ul>
<hr>
<h2 id="q2-what-are-the-mandatory-keys-required-when-changing-image-storage-to-r2-supabase-or-imagekit">📂 Q2. What are the mandatory keys required when changing image storage to R2, Supabase, or ImageKit?</h2>
<p>Below is a checklist of mandatory environment variables and configurations required when using each external image storage provider.</p>
<table>
<thead>
<tr>
<th align="left">Storage Type</th>
<th align="left">Mandatory Input Items / Settings</th>
<th align="left">Description</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>Cloudflare R2</strong></td>
<td align="left"><code>IMAGES</code> R2 Bucket Binding</td>
<td align="left">Must be mapped with the R2 bucket information inside <code>wrangler.json</code>.</td>
</tr>
<tr>
<td align="left"><strong>Supabase Storage</strong></td>
<td align="left"><code>supabase_storage_url</code><br><code>supabase_storage_key</code><br><code>supabase_storage_bucket</code></td>
<td align="left">API URL and Service Role Key must be accurate, and the bucket&#39;s access policy in Supabase Storage must be set to <strong>Public</strong> to prevent image rendering failures.</td>
</tr>
<tr>
<td align="left"><strong>ImageKit.io</strong></td>
<td align="left"><code>imagekit_url_endpoint</code><br><code>imagekit_public_key</code><br><code>imagekit_private_key</code></td>
<td align="left">Verify the endpoint URL format and ensure Cross-Origin Resource Sharing (CORS) is configured.</td>
</tr>
</tbody></table>
<hr>
<h2 id="q3-dashboard-analytics-charts-display-only-demo-data">📊 Q3. Dashboard analytics charts display only demo data.</h2>
<ul>
<li><strong>Cause</strong>: If Google Analytics 4 (GA4) API environment variables are missing or invalid, placeholder demo data is shown to prevent dashboard crashes.</li>
<li><strong>Setup</strong>: Add the following environment variables to the Cloudflare Pages settings and redeploy:<ul>
<li><code>GA4_PROPERTY_ID</code>: Google Analytics Property ID</li>
<li><code>GA4_CLIENT_EMAIL</code>: Google Cloud Service Account Email</li>
<li><code>GA4_PRIVATE_KEY</code>: Google Service Account Private Key</li>
</ul>
</li>
<li><strong>Caution</strong>: When writing <code>GA4_PRIVATE_KEY</code> in <code>.dev.vars</code>, ensure the entire key string is enclosed in double quotes (<code>&quot;</code>) so that line break codes (<code>\n</code>) are preserved correctly during parsing.</li>
</ul>
<hr>
<h2 id="q4-i-cannot-access-the-admin-page-or-some-data-sync-seems-to-be-missing-after-the-initial-setup-deployment">⚡ Q4. I cannot access the admin page, or some data sync seems to be missing after the initial setup deployment.</h2>
<ul>
<li><strong>Cause</strong>: Even if environment variable settings are successfully guided during the one-click setup, temporary network errors or system glitches may cause some encryption keys or secret variables (Secrets) to be partially missing or corrupted during deployment.</li>
<li><strong>Solution</strong>: Double-check the values in each app&#39;s <code>.dev.vars</code> file. Then, navigate to each folder and manually execute the deployment commands (<code>npm run deploy:blog</code> and <code>npm run deploy:admin</code>) <strong>once</strong>. The secret environment variables stored in your local <code>.dev.vars</code> will overwrite the environment variables on Cloudflare, resolving the issue.</li>
</ul>
<hr>
<h2 id="q5-an-quotforbidden-ip-not-allowedquot-or-403-forbidden-error-occurs-when-accessing-the-admin-page">🔒 Q5. An &quot;Forbidden (IP Not Allowed)&quot; or 403 Forbidden error occurs when accessing the admin page.</h2>
<p>Due to the security specifications of this blog, the deployment script automatically detects the public IP address of your deployment PC and injects it as the allowed IP (<code>ALLOWED_IP</code>) into the Pages Secret.</p>
<h3 id="admin-security-recommendation">⚠️ Admin Security Recommendation</h3>
<ul>
<li>To prevent account hijacking and unauthorized access, <strong>it is strongly recommended to restrict admin access and writing operations</strong> on public networks (e.g., cafes, libraries) or untrusted public PCs.</li>
</ul>
<h3 id="situation-specific-troubleshooting">💡 Situation-Specific Troubleshooting</h3>
<ul>
<li><strong>Situation A. Change in home or office IP address (e.g., router reboot)</strong>:<ul>
<li>Execute <code>npm run deploy:admin</code> once from your main development PC in the home/office. It will automatically detect the new public IP and redeploy, restoring your access immediately.</li>
</ul>
</li>
<li><strong>Situation B. Relocating development environment to post from an external location</strong>:<ul>
<li>Clone/download the project and execute a new setup deployment using your backed-up configuration file (<code>wrangler.backup.json</code>).</li>
<li><strong>※ Note:</strong> When returning to your original home/office, <strong>you must execute <code>npm run deploy:admin</code> again from your original development PC</strong> to restore the allowed IP back to your primary fixed IP.</li>
</ul>
</li>
</ul>
<hr>
<h2 id="q6-better-auth-social-login-or-signup-errors-or-infinite-login-loops-occur">🔐 Q6. Better Auth (social login or signup) errors or infinite login loops occur.</h2>
<ul>
<li><strong>Cause</strong>: Session verification fails and loops if authentication-related secrets are missing or incorrect.</li>
<li><strong>Solution</strong>: <ol>
<li>Check <code>apps/blog/.dev.vars</code> and ensure that <code>BETTER_AUTH_SECRET</code> is set to a <strong>secure random string of at least 32 characters</strong>.</li>
<li>After correcting it, run <code>npm run deploy:blog</code> to overwrite and sync the secrets, which will restore normal authentication functionality.</li>
</ol>
</li>
</ul>
]]></content:encoded>
            <category>Admin Guide</category>
            <enclosure url="https://sveltekitblog.com/images/posts/admin-faq/desktop/img-admin-guide-admin-faq-ko-001.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Real-Time Design Editor and Background Customization Overview]]></title>
            <link>https://svelteblog-13g.pages.dev/en/admin-guide/admin-design-editor</link>
            <guid isPermaLink="true">https://svelteblog-13g.pages.dev/en/admin-guide/admin-design-editor</guid>
            <pubDate>Sat, 20 Jun 2026 02:26:20 GMT</pubDate>
            <description><![CDATA[Instant real-time theme updates without rebuilds or redeployments.]]></description>
            <content:encoded><![CDATA[<h1 id="real-time-design-editor-and-background-customization-overview">🎨 Real-Time Design Editor and Background Customization Overview</h1>
<p>This document introduces the system that applies theme configurations in real time without requiring server rebuilds or redeployments, and outlines the 4 background settings: Solid, Gradient, Background Image, and Custom JavaScript Canvas.</p>
<hr>
<h2 id="1-real-time-design-editor-overview">🌌 1. Real-Time Design Editor Overview</h2>
<p>When you modify and save configuration values in the design editor, there is no need to rebuild or redeploy the blog server or CDN services. The database updates instantly, and the <strong>CSS variables and background rendering module reflect in the visitor&#39;s browser within seconds</strong>.<br>Before applying the design to the live blog, you can check the style changes through the preview screen inside the admin panel.</p>
<blockquote>
<p>[!WARNING]</p>
<h3 id="notice-differences-between-admin-preview-and-live-blog-design">⚠️ Notice: Differences Between Admin Preview and Live Blog Design</h3>
<p>The <strong>preview feature in the design editor does not guarantee a 100% identical environment</strong> to the live visitor page. Microscopic rendering differences (such as CSS variable evaluation or JavaScript Canvas rendering conditions) may occur between the admin preview and the actual blog.</p>
<p>Therefore, after changing any design configuration, we <strong>strongly recommend visiting your live blog directly and refreshing the page (F5)</strong> to verify the final rendering output.</p>
</blockquote>
<hr>
<h3 id="layout-amp-theme-configuration-settings">🧱 Layout &amp; Theme Configuration Settings</h3>
<h4 id="layout-customization">① Layout Customization</h4>
<ul>
<li><strong>Blog Structure</strong>: Select the base layout structure of the main page (e.g., 2-column, 3-column, etc.).</li>
<li><strong>Column Width Ratios</strong>: Fine-tune the width ratios of the main content column and sidebars (e.g., 1:2:1, 2:1:2, etc.).</li>
<li><strong>Maximum Width</strong>: Limit the maximum horizontal resolution of the entire layout container (e.g., 1200px, 1400px, etc.).</li>
<li><strong>Detailed Layout Values</strong>: Control the container side margins, card border radius, and box shadow depth effects.</li>
</ul>
<h4 id="basic-theme-colors">② Basic Theme Colors</h4>
<ul>
<li>Customize the Primary theme color, Secondary color, body Text color, Accent highlight color, Card Background (Card Bg), and Border colors.</li>
</ul>
<h4 id="typography-settings">③ Typography Settings</h4>
<ul>
<li>Apply web fonts by entering font family names from the Google Fonts directory, and set the base font size.</li>
</ul>
<h4 id="widget-arrangement-management">④ Widget Arrangement Management</h4>
<ul>
<li>Drag and drop available widgets to position them in different columns and arrange their render orders.</li>
</ul>
<hr>
<h2 id="2-device-specific-independent-widget-placement">🧱 2. Device-Specific Independent Widget Placement</h2>
<p>Configure widget positioning in the sidebar and content areas using drag-and-drop. You can customize layouts differently based on the visitor&#39;s screen size.</p>
<ul>
<li><strong>Desktop</strong>: Displays selected widgets (e.g., tag clouds, category trees) only on wider screens. For mobile access, elements are omitted at the HTML transmission stage to maintain fast loading times.</li>
<li><strong>Mobile</strong>: Hides the widget on desktop viewports and restricts exposure exclusively to smartphone-sized mobile resolutions.</li>
</ul>
<hr>
<h2 id="3-4-background-customization-options">🌈 3. 4 Background Customization Options</h2>
<p>Customize the sensory atmosphere of the blog using four supported background types:</p>
<h3 id="solid-solid-background">① Solid (Solid Background)</h3>
<ul>
<li>Choose a HEX code (e.g., <code>#3b82f6</code>) or HSL color code to create a clean, distraction-free screen that helps readers focus on the post content.</li>
</ul>
<h3 id="gradient-gradient-background">② Gradient (Gradient Background)</h3>
<ul>
<li>Create linear gradients where multiple colors blend smoothly using the <strong>Gradient Builder</strong> tool.</li>
<li>Adjust the gradient angle (Direction) slider and add or slide color stops to customize starting, intermediate, and ending colors.</li>
</ul>
<h3 id="image-background-image-amp-glassmorphism">③ Image (Background Image &amp; Glassmorphism)</h3>
<ul>
<li>Specify a remote image URL or use the upload button to add media assets to your library.</li>
<li><strong>Upload Optimization</strong>: Uploaded images are automatically converted to WebP format to prevent initial page load delays.</li>
<li><strong>Glassmorphism Overlay</strong>: Adjust the controls below to build a glassmorphism aesthetic that ensures text readability over background images.</li>
</ul>
<table>
<thead>
<tr>
<th align="left">Setting</th>
<th align="center">Recommended Range</th>
<th align="left">Description</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>Glass Blur</strong></td>
<td align="center"><code>5px ~ 15px</code></td>
<td align="left">Applies a translucent frosted-glass blur filter below the content cards.</td>
</tr>
<tr>
<td align="left"><strong>Overlay Opacity</strong></td>
<td align="center"><code>10% ~ 30%</code></td>
<td align="left">Controls the opacity of the mask overlaid behind the card container.</td>
</tr>
<tr>
<td align="left"><strong>Overlay Color</strong></td>
<td align="center"><code>#000000</code> or <code>#ffffff</code></td>
<td align="left">Selects dark or light mask colors to maintain text contrast.</td>
</tr>
</tbody></table>
<h3 id="custom-javascript-custom-javascript-amp-canvas-background">④ Custom JavaScript (Custom JavaScript &amp; Canvas Background)</h3>
<ul>
<li>Supports custom JavaScript execution to render interactive Canvas animations on the client&#39;s browser background.</li>
<li>Provides direct rendering control over the background canvas element (<code>canvas id=&quot;bg-canvas&quot;</code>). Detailed security restrictions and power-saving policies are explained in <strong>[4. Custom JavaScript Integration Specifications]</strong> below.</li>
</ul>
<hr>
<h2 id="4-custom-javascript-integration-specifications">⚡ 4. Custom JavaScript Integration Specifications</h2>
<p>To prevent security risks and conserve mobile battery life, the following sandbox environment and battery-saving systems are applied.<br><figure data-align="center"><img src="https://sveltekitblog.com/images/posts/admin-design-editor/desktop/img-admin-guide-admin-design-editor-en-001.webp" alt="img-admin-guide-admin-design-editor-en-001" data-align="center" data-caption="Custom JS Canvas animation input window with security sandbox (Before activation)" /><figcaption>Custom JS Canvas animation input window with security sandbox (Before activation)</figcaption></figure><br><figure data-align="center"><img src="https://sveltekitblog.com/images/posts/admin-design-editor/desktop/img-admin-guide-admin-design-editor-en-002.webp" alt="img-admin-guide-admin-design-editor-en-002" data-align="center" data-caption="Custom JS Canvas animation input window with security sandbox (After activation)" /><figcaption>Custom JS Canvas animation input window with security sandbox (After activation)</figcaption></figure></p>
<h3 id="security-sandbox-and-csp">🔒 Security Sandbox and CSP</h3>
<p>The following security measures protect against malicious script injections:</p>
<ol>
<li><strong>Isolated Sandbox Structure</strong>: Canvas code runs inside an isolated <code>iframe</code> with limited execution privileges. Access to the parent page DOM, session cookies, or login credentials is blocked.</li>
<li><strong>Content Security Policy (CSP)</strong>: Outbound network calls and external script injections are completely blocked. Sensitive data cannot be leaked to external servers.</li>
<li><strong>JS API Restrictions</strong>: Disallowed APIs, including <code>fetch</code>, <code>XMLHttpRequest</code>, <code>WebSocket</code>, <code>eval</code>, <code>new Function</code>, <code>document.cookie</code>, and <code>localStorage</code>, are intercepted and commented out (<code>/* f_e_t_c_h (blocked) */</code>) by the validator script (<code>jsValidator.ts</code>).</li>
</ol>
<h3 id="power-and-performance-optimization">🔋 Power and Performance Optimization</h3>
<ul>
<li><strong>Out-of-View Auto-Pause</strong>: If a visitor scrolls and the background animation leaves the viewport, the render loop <strong>enters sleep mode</strong> to conserve CPU and GPU cycles. The animation resumes instantly when scrolled back into view.</li>
<li><strong>Mobile Frame Throttling</strong>: Background scripts are paused on mobile devices by default to prevent device overheating. Enabling the <strong>&quot;Run animation on mobile devices&quot;</strong> option scales down particle counts automatically to match mobile processing thresholds.</li>
</ul>
<hr>
<h2 id="5-sample-background-script-code-3-types">📝 5. Sample Background Script Code (3 Types)</h2>
<p>Choose <strong>[Custom JavaScript]</strong> in the background settings and copy one of the templates below into the code editor.</p>
<blockquote>
<p>[!NOTE]<br>Scripts must acquire the target canvas context using <code>document.getElementById(&#39;bg-canvas&#39;)</code>.</p>
</blockquote>
<h3 id="sample-a-winter-snowfall-snowfall">❄️ Sample A. Winter Snowfall (Snowfall)</h3>
<p>A background animation where snowflakes drift slowly down the screen.</p>
<pre><code class="language-javascript">(function() {
  const canvas = document.getElementById(&#39;bg-canvas&#39;);
  if (!canvas) return;
  const ctx = canvas.getContext(&#39;2d&#39;);
  
  let width = canvas.width = window.innerWidth;
  let height = canvas.height = window.innerHeight;
  
  // Mobile throttle detection
  const divisor = (window.bgConfig &amp;&amp; window.bgConfig.mobileThrottleDivisor) || 1;
  const maxSnowflakes = Math.floor(100 / divisor);
  const snowflakes = [];
  
  class Snowflake {
    constructor() {
      this.reset();
      this.y = Math.random() * height; // Initial random altitude
    }
    
    reset() {
      this.x = Math.random() * width;
      this.y = -10;
      this.radius = Math.random() * 3 + 1;
      this.speed = Math.random() * 1 + 0.5;
      this.opacity = Math.random() * 0.6 + 0.2;
    }
    
    update() {
      this.y += this.speed;
      // Gentle swaying motion
      this.x += Math.sin(this.y / 30) * 0.5;
      
      if (this.y &gt; height || this.x &lt; 0 || this.x &gt; width) {
        this.reset();
      }
    }
    
    draw() {
      ctx.beginPath();
      ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2);
      ctx.fillStyle = `rgba(25, 25, 255, ${this.opacity})`;
      ctx.fill();
    }
  }
  
  // Particle instantiation
  for (let i = 0; i &lt; maxSnowflakes; i++) {
    snowflakes.push(new Snowflake());
  }
  
  function animate() {
    ctx.clearRect(0, 0, width, height);
    
    for (let i = 0; i &lt; snowflakes.length; i++) {
      snowflakes[i].update();
      snowflakes[i].draw();
    }
    requestAnimationFrame(animate);
  }
  
  // Resize handler
  window.addEventListener(&#39;resize&#39;, () =&gt; {
    width = canvas.width = window.innerWidth;
    height = canvas.height = window.innerHeight;
  });
  
  animate();
})();
</code></pre>
<hr>
<h3 id="sample-b-constellation-network">🕸️ Sample B. Constellation Network</h3>
<p>An IT-inspired constellation pattern where floating node particles link with thin translucent lines when they drift close to one another.</p>
<pre><code class="language-javascript">(function() {
  const canvas = document.getElementById(&#39;bg-canvas&#39;);
  if (!canvas) return;
  const ctx = canvas.getContext(&#39;2d&#39;);
  
  let width = canvas.width = window.innerWidth;
  let height = canvas.height = window.innerHeight;
  
  const divisor = (window.bgConfig &amp;&amp; window.bgConfig.mobileThrottleDivisor) || 1;
  const particleCount = Math.floor(80 / divisor);
  const particles = [];
  const connectionDistance = 100;
  
  class Particle {
    constructor() {
      this.x = Math.random() * width;
      this.y = Math.random() * height;
      this.vx = (Math.random() - 0.5) * 0.8;
      this.vy = (Math.random() - 0.5) * 0.8;
      this.radius = Math.random() * 2 + 1.5;
    }
    
    update() {
      this.x += this.vx;
      this.y += this.vy;
      
      // Boundary collision
      if (this.x &lt; 0 || this.x &gt; width) this.vx *= -1;
      if (this.y &lt; 0 || this.y &gt; height) this.vy *= -1;
    }
    
    draw() {
      ctx.beginPath();
      ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2);
      ctx.fillStyle = &#39;rgba(99, 102, 241, 0.4)&#39;; // Pastel indigo
      ctx.fill();
    }
  }
  
  for (let i = 0; i &lt; particleCount; i++) {
    particles.push(new Particle());
  }
  
  function drawLines() {
    for (let i = 0; i &lt; particles.length; i++) {
      for (let j = i + 1; j &lt; particles.length; j++) {
        const dx = particles[i].x - particles[j].x;
        const dy = particles[i].y - particles[j].y;
        const dist = Math.sqrt(dx * dx + dy * dy);
        
        if (dist &lt; connectionDistance) {
          const alpha = (connectionDistance - dist) / connectionDistance * 0.18;
          ctx.beginPath();
          ctx.moveTo(particles[i].x, particles[i].y);
          ctx.lineTo(particles[j].x, particles[j].y);
          ctx.strokeStyle = `rgba(99, 102, 241, ${alpha})`;
          ctx.lineWidth = 1;
          ctx.stroke();
        }
      }
    }
  }
  
  function animate() {
    ctx.clearRect(0, 0, width, height);
    for (let i = 0; i &lt; particles.length; i++) {
      particles[i].update();
      particles[i].draw();
    }
    drawLines();
    requestAnimationFrame(animate);
  }
  
  window.addEventListener(&#39;resize&#39;, () =&gt; {
    width = canvas.width = window.innerWidth;
    height = canvas.height = window.innerHeight;
  });
  
  animate();
})();
</code></pre>
<hr>
<h3 id="sample-c-fluid-sine-waves">🌊 Sample C. Fluid Sine Waves</h3>
<p>A relaxing animation showing multiple overlapping pastel wave ripples flowing smoothly near the bottom of the screen.</p>
<pre><code class="language-javascript">(function() {
  const canvas = document.getElementById(&#39;bg-canvas&#39;);
  if (!canvas) return;
  const ctx = canvas.getContext(&#39;2d&#39;);
  
  let width = canvas.width = window.innerWidth;
  let height = canvas.height = window.innerHeight;
  
  let wave1 = {
    y: height * 0.85,
    length: 0.005,
    amplitude: 25,
    frequency: 0.012
  };
  
  let wave2 = {
    y: height * 0.88,
    length: 0.008,
    amplitude: 15,
    frequency: 0.022
  };
  
  let increment = 0;
  
  function animate() {
    ctx.clearRect(0, 0, width, height);
    
    // Draw background wave (translucent teal)
    ctx.beginPath();
    ctx.moveTo(0, height);
    for (let i = 0; i &lt; width; i++) {
      ctx.lineTo(i, wave1.y + Math.sin(i * wave1.length + increment) * wave1.amplitude);
    }
    ctx.lineTo(width, height);
    ctx.fillStyle = &#39;rgba(45, 212, 191, 0.1)&#39;;
    ctx.fill();
    
    // Draw foreground wave (translucent sky-blue)
    ctx.beginPath();
    ctx.moveTo(0, height);
    for (let i = 0; i &lt; width; i++) {
      ctx.lineTo(i, wave2.y + Math.sin(i * wave2.length - increment * 1.5) * wave2.amplitude);
    }
    ctx.lineTo(width, height);
    ctx.fillStyle = &#39;rgba(56, 189, 248, 0.15)&#39;;
    ctx.fill();
    
    // Adjust speed according to device configuration
    const speedFactor = (window.bgConfig &amp;&amp; window.bgConfig.mobileThrottleDivisor) ? 0.3 : 1;
    increment += wave1.frequency * speedFactor;
    
    requestAnimationFrame(animate);
  }
  
  window.addEventListener(&#39;resize&#39;, () =&gt; {
    width = canvas.width = window.innerWidth;
    height = canvas.height = window.innerHeight;
    wave1.y = height * 0.85;
    wave2.y = height * 0.88;
  });
  
  animate();
})();
</code></pre>
<hr>
<h2 id="6-device-specific-mobile-background-configuration">📱 6. Device-Specific Mobile Background Configuration</h2>
<p>Customize your background settings depending on the user environment to optimize system performance.</p>
<ol>
<li><strong>Desktop Background</strong>: Choose <strong>Custom JavaScript</strong> on PC displays to run beautiful canvas animations.</li>
<li><strong>Enable Independent Mobile Settings</strong>: Check the <strong>&quot;Use different background for mobile devices&quot;</strong> toggle located at the bottom of the design editor.</li>
<li><strong>Mobile Optimization</strong>: Under the separate mobile configuration panel, select <strong>Solid</strong> or <strong>Gradient</strong> backgrounds to minimize processor workloads.</li>
<li><strong>Outcome</strong>: Conserves mobile batteries by running lightweight background styles on smartphones, while maintaining visually rich interactive motion rendering for desktop browsers.</li>
</ol>
]]></content:encoded>
            <category>Admin Guide</category>
            <enclosure url="https://sveltekitblog.com/images/posts/admin-design-editor/desktop/img-admin-guide-admin-design-editor-en-001.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Admin Core Features and Dual Editor Overview]]></title>
            <link>https://svelteblog-13g.pages.dev/en/admin-guide/admin-core-features</link>
            <guid isPermaLink="true">https://svelteblog-13g.pages.dev/en/admin-guide/admin-core-features</guid>
            <pubDate>Sat, 20 Jun 2026 01:23:13 GMT</pubDate>
            <description><![CDATA[A brief introduction to core admin features including multi-language simultaneous saving, visual and markdown dual editor switching, and device-specific widget placement.]]></description>
            <content:encoded><![CDATA[<h1 id="admin-core-features-and-dual-editor-overview">🎨 Admin Core Features and Dual Editor Overview</h1>
<p>This document provides a brief overview of the core features in the admin console, including multi-language simultaneous publishing, device-specific layout configuration, and real-time design theme settings.</p>
<hr>
<h2 id="1-multi-language-writing-and-dual-editor-support">📝 1. Multi-Language Writing and Dual Editor Support</h2>
<p>When entering the writing menu, a multi-language editor layout is provided, with multiple language tabs arranged side-by-side on a single screen.</p>
<h3 id="batch-multi-language-writing-and-saving">① Batch Multi-Language Writing and Saving</h3>
<ul>
<li><strong>Writing Flow</strong>: Switch between the language tabs (KO, EN, JA, etc.) at the top to write titles, excerpts, slugs (URL paths), and body content for each language.</li>
<li><strong>Batch Saving</strong>: Click the <strong>[Save All Tabs Simultaneously]</strong> button at the bottom to save the content of all languages to the database at once. Languages not explicitly set to <strong>Publish</strong> will be saved as <strong>Drafts</strong>, and any empty language tabs will be skipped.</li>
</ul>
<h3 id="dual-editor-support-visual-vs-markdown">② Dual Editor Support (Visual vs. Markdown)</h3>
<ul>
<li><strong>Visual HTML Editor (Visual)</strong>: A rich-text editor that allows direct formatting and media embedding. Image files can be easily uploaded and inserted via the toolbar button.</li>
</ul>
<figure data-align="left"><img src="https://sveltekitblog.com/images/posts/admin-core-features/desktop/img-admin-guide-admin-core-features-en-002.webp" alt="img-admin-guide-admin-core-features-en-002" data-align="left" /></figure><ul>
<li><strong>Markdown Editor (Markdown)</strong>: Provided for users who prefer markdown syntax. Metadata such as titles, excerpts, categories, and tags are automatically managed in the header using YAML Front Matter (<code>---</code>). Both markdown source and parsed HTML are stored in the database upon saving.</li>
</ul>
<figure data-align="left"><img src="https://sveltekitblog.com/images/posts/admin-core-features/desktop/img-admin-guide-admin-core-features-en-003.webp" alt="img-admin-guide-admin-core-features-en-003" data-align="left" /></figure><h3 id="automatic-thumbnail-selection">③ Automatic Thumbnail Selection</h3>
<ul>
<li>If no thumbnail image is manually specified, the system automatically analyzes the content to assign a representative image:<ul>
<li><strong>1st Priority</strong>: The first image element found in the body text.</li>
<li><strong>2nd Priority</strong>: If no images are present but a YouTube video link or iframe embed is found, the official high-resolution YouTube thumbnail URL of the video is used.</li>
</ul>
</li>
</ul>
<hr>
<h2 id="2-device-specific-desktopmobile-independent-widget-placement">🧱 2. Device-Specific (Desktop/Mobile) Independent Widget Placement</h2>
<p>The layout editor supports drag-and-drop widget arrangement for sidebars and content areas, allowing you to configure independent widget exposure based on whether visitors are on desktop or mobile devices.<br><figure data-align="left"><img src="https://sveltekitblog.com/images/posts/admin-core-features/desktop/img-admin-guide-admin-core-features-en-001.webp" alt="img-admin-guide-admin-core-features-en-001" data-align="left" data-caption="Desktop/Mobile Mode Selection Icons" /><figcaption>Desktop/Mobile Mode Selection Icons</figcaption></figure></p>
<h3 id="device-exposure-options">⚙️ Device Exposure Options</h3>
<ol>
<li>Choose the column layout and width ratio in the <strong><code>Blog Structure</code></strong> tab under the <strong><code>Design Editor</code></strong> menu.</li>
<li>Assign device exposure conditions (Device) when adding or modifying widgets:<ul>
<li><strong>Desktop</strong>: Displays the widget only on wider PC screens, preventing unnecessary resource loads on mobile devices.</li>
<li><strong>Mobile</strong>: Hides the widget on PC screens and limits visibility to mobile viewport resolutions.</li>
</ul>
</li>
<li><strong>Effect</strong>: Skipping heavy or redundant widget rendering for mobile visitors optimizes page load times and mobile scrolling performance.</li>
</ol>
<hr>
<h2 id="3-real-time-design-editor-and-theme-settings">🎨 3. Real-Time Design Editor and Theme Settings</h2>
<p>Design theme changes and background configurations apply instantly via CSS variables in the visitor&#39;s browser without requiring server rebuilds or redeployments.</p>
<ul>
<li><strong>4 Background Types</strong>: Select from Solid color, Gradient, Background Image, or interactive HTML5 Canvas animations (Canvas).</li>
<li><strong>Glassmorphism Effect</strong>: When using background images, adjust opacity and blur to ensure text readability with glassmorphism overlays.</li>
<li><strong>Interactive Canvas</strong>: Renders motion artwork (snowflakes, waves, constellations) inside a sandboxed canvas.</li>
</ul>
<blockquote>
<p>[!TIP]<br>Information on background configuration options and script templates can be found in the <strong><a href="./admin-design-editor.md">Design Editor Settings Introduction</a></strong> document.</p>
</blockquote>
<hr>
<h2 id="4-media-storage-support">💾 4. Media Storage Support</h2>
<p>You can switch the active cloud storage provider for uploading and serving media based on your needs.<br><figure data-align="left"><img src="https://sveltekitblog.com/images/posts/admin-core-features/desktop/img-admin-guide-admin-core-features-en-004.webp" alt="img-admin-guide-admin-core-features-en-004" data-align="left" /></figure></p>
<ol>
<li>Navigate to the <strong><code>Storage Settings</code></strong> area at the bottom of the <strong><code>Media Library</code></strong> menu.</li>
<li>Select your storage provider and configure the credentials:<ul>
<li><strong>Cloudflare KV</strong>: Stores assets in edge KV storage for fast global delivery.</li>
<li><strong>Cloudflare R2</strong>: Cost-effective large object storage for managing mass images.</li>
<li><strong>Supabase Storage</strong>: Securely uploads and stores media assets in Supabase storage buckets.</li>
<li><strong>ImageKit.io</strong>: Connects global image CDN platforms for real-time optimization and compressed formatting.</li>
</ul>
</li>
<li><strong>Real-time Switch</strong>: Saving changes instantly shifts the active upload engine to the chosen storage provider.</li>
</ol>
<blockquote>
<p>[!NOTE]<br><strong>Limitations of default storage (Cloudflare KV) in media explorer</strong><br>Cloudflare KV does not support directory listing (read APIs) in the image explorer to minimize Workers usage and costs. Other external storages, such as Cloudflare R2, Supabase Storage, and ImageKit.io, fully support listing and previewing uploaded images.</p>
</blockquote>
]]></content:encoded>
            <category>Admin Guide</category>
            <enclosure url="https://sveltekitblog.com/images/posts/admin-core-features/desktop/img-admin-guide-admin-core-features-en-002.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[First Access to Admin & Getting Started with Configurations]]></title>
            <link>https://svelteblog-13g.pages.dev/en/admin-guide/admin-getting-started</link>
            <guid isPermaLink="true">https://svelteblog-13g.pages.dev/en/admin-guide/admin-getting-started</guid>
            <pubDate>Sat, 20 Jun 2026 00:55:48 GMT</pubDate>
            <description><![CDATA[Learn how to safely access the admin app, maintain login sessions, and utilize the multilingual UI dictionary to manage the blog system.]]></description>
            <content:encoded><![CDATA[<h1 id="first-access-to-admin-amp-getting-started-with-configurations">🔑 First Access to Admin &amp; Getting Started with Configurations</h1>
<p>This document guides administrators on how to safely access the admin page, maintain login sessions, and easily manage various site-wide text strings (multilingual dictionary) to control the blog system.</p>
<hr>
<h2 id="1-ip-security-control-policy-before-admin-login">🔒 1. IP Security Control Policy before Admin Login</h2>
<p>This blog engine adheres to a strict <strong>Access IP Filtering</strong> security policy to completely prevent unauthorized external access or hijacking of posting permissions. Only the administrator&#39;s public IP address detected at the time of deployment is registered in the server&#39;s allowlist (<code>ALLOWED_IP</code>) to permit access.</p>
<blockquote>
<p>[!IMPORTANT]</p>
<h3 id="safe-zone-centered-operation-principle-no-use-in-public-places">🛡️ Safe-Zone Centered Operation Principle (No Use in Public Places)</h3>
<p>Admin management of this blog must be performed only in <strong>places where physical and network security are secured, such as home or a trusted private office.</strong><br><strong>To prevent security leaks, accessing the admin page is strictly discouraged and should be avoided in public places such as PC cafes (PC bangs), libraries, or under public Wi-Fi networks, as they are exposed to high security risks.</strong></p>
</blockquote>
<p>If you encounter a <code>403 Forbidden</code> block screen because your public IP address changed due to router rebooting or network conditions within your safe zone, you must manually update the allowlist according to the following procedure.</p>
<h3 id="allowed-ip-list-renewal-procedure-redeployment-required">⚙️ Allowed IP List Renewal Procedure (Redeployment Required)</h3>
<ol>
<li>Open the terminal under the changed internet environment, and run the command to <strong>redeploy</strong> the blog service admin app once again.</li>
<li><strong>Workflow Guide</strong>: While this is safer than forcedly editing the database internals (which is a risky operation), it is a somewhat tedious and inconvenient process because it requires the build process and file upload waiting time of several minutes each time.</li>
<li>While the deployment script is running, it detects the new public IP address of your currently connected computer and replaces the remote server&#39;s allowed IP list with the latest one.</li>
<li>Once the deployment process is finalized, reconnecting to the admin URL will re-enable the normal login screen.</li>
<li>You only need to redeploy the admin page.</li>
</ol>
<hr>
<h2 id="2-admin-login-amp-session-management">🔑 2. Admin Login &amp; Session Management</h2>
<p>Once the login block is normal, enter the master password (<code>ADMIN_PASSWORD</code>) configured during setup to log in.</p>
<ul>
<li><strong>Secure Session Maintenance</strong>: By utilizing dedicated secure cookies, the admin login session remains safely maintained for 30 days.</li>
<li><strong>Prohibition of Access from Public Computers and Risky Areas</strong>:<br>The most secure practice is to never attempt logging in to the admin console on unverified public computers or PC cafes. If you must log in under public conditions, make sure to click the <strong>[Logout]</strong> button at the bottom left of the admin page immediately after completing work, and also enter <code>npx wrangler logout</code> in your terminal to completely sign out from the Cloudflare management credentials on that computer to prevent any credential leaks.</li>
</ul>
<blockquote>
<p>[!WARNING]</p>
<h3 id="minimize-exposure-of-admin-access-address-domain">🔒 Minimize Exposure of Admin Access Address (Domain)</h3>
<p>While the admin console is double-protected by the IP allowlist, minimizing the attack surface itself is the most robust security practice.</p>
<p>Therefore, we strongly recommend that you do not bind an obvious custom domain like <code>admin.myblog.com</code>, but instead use the randomized subdomain URL (e.g., <code>[project-name].pages.dev</code>) provided default by Cloudflare Pages to keep the admin entry hidden.</p>
</blockquote>
<hr>
<h2 id="3-multilingual-dictionary-i18n-settings-guide">🌐 3. Multilingual Dictionary (i18n) Settings Guide</h2>
<p>Fixed common UI text strings (menu labels, comment buttons, login prompts, etc.) outside of post contents can be modified instantly in English, Korean, or Japanese using the admin dictionary editor without editing a single line of source code.<br><figure data-align="left"><img src="https://sveltekitblog.com/images/posts/admin-getting-started/desktop/img-admin-guide-admin-getting-started-en-002.webp" alt="img-admin-guide-admin-getting-started-en-002" data-align="left" /></figure></p>
<p>You can register a new language by using the <strong><code>Add Language</code></strong> feature. However, for the newly added language to display correctly on the site, you must translate all existing dictionary keys into that language.<br><figure data-align="left"><img src="https://sveltekitblog.com/images/posts/admin-getting-started/desktop/img-admin-guide-admin-getting-started-en-001.webp" alt="img-admin-guide-admin-getting-started-en-001" data-align="left" /></figure></p>
<ol>
<li>Go to the <strong><code>Languages</code></strong> menu on the left sidebar of the admin console.</li>
<li>A list of all dictionary keys and their saved translations used across the site is provided in the <strong><code>UI Dictionary Editor</code></strong> section at the bottom.</li>
<li>Enter your desired text (Korean, English, Japanese) directly into the input field for the key you wish to modify, and click the <strong><code>Save</code></strong> icon on the far right of that row.</li>
<li>Changes apply to the live site immediately upon saving. When visitors switch languages on the blog, the modified texts will be displayed seamlessly in real-time.</li>
</ol>
]]></content:encoded>
            <category>Admin Guide</category>
            <enclosure url="https://sveltekitblog.com/images/posts/admin-getting-started/desktop/img-admin-guide-admin-getting-started-en-002.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[CMD One-Click Installation & Cloudflare Deployment Guide]]></title>
            <link>https://svelteblog-13g.pages.dev/en/admin-guide/admin-install-and-deploy</link>
            <guid isPermaLink="true">https://svelteblog-13g.pages.dev/en/admin-guide/admin-install-and-deploy</guid>
            <pubDate>Sat, 20 Jun 2026 00:27:19 GMT</pubDate>
            <description><![CDATA[Learn how to build the Cloudflare edge infrastructure and deploy/sync both admin and blog apps simultaneously using a single interactive setup script in a terminal (CMD/PowerShell) environment.]]></description>
            <content:encoded><![CDATA[<h1 id="cmd-one-click-installation-amp-cloudflare-deployment-guide">🚀 CMD One-Click Installation &amp; Cloudflare Deployment Guide</h1>
<p>This guide explains the easiest and safest way to build the Cloudflare edge infrastructure and deploy/sync both the admin and blog apps simultaneously by running a single automation command (<code>npm run setup</code>) in a terminal (CMD or PowerShell) environment.</p>
<hr>
<h2 id="1-introduction-to-one-click-deployment-automation">🛠️ 1. Introduction to One-Click Deployment Automation</h2>
<p>The SvelteKit blog engine has fully automated the complex process of server resource creation and configuration file editing through an interactive setup tool in the terminal. </p>
<p>After unpacking the blog source code or downloading it to your computer via <code>git clone</code>, open the terminal, navigate to the project root folder, and run the following commands in sequence:</p>
<pre><code class="language-bash"># Install required packages
npm install
</code></pre>
<ul>
<li><strong>Dependency Library Installation</strong>: Enter <code>npm install</code> in the terminal to install all required packages. If a security warning (vulnerabilities) message appears in the terminal after installation is complete, it is recommended to enter the <code>npm audit fix</code> command to safely apply the latest security patches.</li>
</ul>
<p>Once the package installation is complete and you run <code>npm run setup</code>, the following processes will be handled automatically according to the terminal prompts:</p>
<ul>
<li><strong>Easy Cloudflare Account Authentication</strong>: Link your deployment account with a single click.</li>
<li><strong>Create DB and Storage Resources</strong>: Automatically create 2 D1 databases dedicated to the blog and a KV store for storing images.</li>
<li><strong>Real-time Configuration File Update</strong>: Detect the unique IDs of the created databases and automatically inject them into the monorepo configuration files (<code>wrangler.json</code>).</li>
<li><strong>Database Seed Data Injection</strong>: Create tables and automatically register sample posts and basic configuration information according to the selected default language.</li>
<li><strong>Upload Secrets and Allowed IP</strong>: Automatically transmit the deployer&#39;s current public IP address (<code>ALLOWED_IP</code>) and password environment variables to the cloud for admin access.</li>
<li><strong>Integrated Build &amp; Web Service Deployment</strong>: Bundle both the blog and admin SvelteKit projects and immediately deploy them to Cloudflare Pages.</li>
</ul>
<hr>
<h2 id="2-pre-deployment-checklist">📋 2. Pre-deployment Checklist</h2>
<p>Please make sure all of the following are prepared before starting the safe installation:</p>
<ol>
<li><strong>Install Node.js</strong>: Node.js (version 18 or higher) must be working on your computer.</li>
<li><strong>Cloudflare Account</strong>: A Cloudflare account (the free tier is sufficient) is required to host the blog site and databases.</li>
<li><strong>Create Secret Environment Variable Files (.dev.vars) (Required)</strong>:<ul>
<li>Before starting deployment, you must <strong>manually create</strong> a <code>.dev.vars</code> file in each of the <code>apps/admin/</code> and <code>apps/blog/</code> folders.</li>
<li>In the <code>apps/admin/.dev.vars</code> file, write <code>ADMIN_PASSWORD=YourAdminLoginPassword</code>.</li>
<li>In the <code>apps/blog/.dev.vars</code> file, write <code>BETTER_AUTH_SECRET=ArbitraryStringOfYourChoice</code>.</li>
<li><blockquote>
<p>[!WARNING]<br>If these environment variables are not set, the <strong>installation tool will stop</strong> immediately for correct operation upon running <code>npm run setup</code>.</p>
</blockquote>
</li>
</ul>
</li>
</ol>
<hr>
<h2 id="3-step-by-step-guide-for-npm-run-setup">⚙️ 3. Step-by-Step Guide for npm run setup</h2>
<p>Open the terminal, type <code>npm run setup</code> in the blog project root directory, and press Enter.</p>
<h3 id="step-0-secrets-pre-validation"><strong>Step 0. Secrets Pre-Validation</strong></h3>
<ul>
<li>Immediately upon execution, it checks if the <code>.dev.vars</code> files and the required secret variables (<code>ADMIN_PASSWORD</code>, <code>BETTER_AUTH_SECRET</code>) are entered in the admin and blog folders.</li>
<li>If any value is missing, the guide log is displayed and the script exits, so please make sure to fill them in advance.</li>
</ul>
<h3 id="step-1-configure-deployment-project-name-domain-url"><strong>Step 1. Configure Deployment Project Name (Domain URL)</strong></h3>
<ul>
<li>This step defines the URL that readers will use to access your blog (e.g., <code>[entered-project-name].pages.dev</code>).</li>
<li>It takes two names: one for the blog and one for the admin app. If running in restore mode (<code>--restore</code>), it automatically reads the existing names from the backup configuration file (<code>wrangler.backup.json</code>).</li>
</ul>
<h3 id="step-2-cloudflare-account-authentication"><strong>Step 2. Cloudflare Account Authentication</strong></h3>
<ul>
<li>Verifies Cloudflare authentication. If you have logged in previously, it automatically detects the session and skips this step.</li>
<li>If you are not logged in, a browser window will open showing the authentication request screen. Click <strong>[Allow]</strong> to approve the account integration.</li>
<li><em>Security Information: This automation tool only requests the minimum account API permissions required for infrastructure creation and deployment, so you can proceed with confidence.</em></li>
</ul>
<h3 id="step-3-resource-creation-amp-configuration-binding"><strong>Step 3. Resource Creation &amp; Configuration Binding</strong></h3>
<ul>
<li>This step creates the database and media storage in the cloud for the actual service to run. Look at the prompts in the terminal and enter the appropriate number.<ol>
<li><strong><code>1</code> (Fresh Install)</strong>: <strong>Completely deletes</strong> previously created databases and storage and recreates them. Please note that all existing data will be lost.</li>
<li><strong><code>2</code> (Keep Existing Data) [Recommended]</strong>: If resources already exist, it safely preserves the data and only links the connection information.</li>
</ol>
</li>
<li>Upon completion, the newly issued unique DB and KV IDs are automatically updated in each configuration file (<code>wrangler.json</code>) of the monorepo.</li>
</ul>
<h3 id="step-4-pre-create-web-projects"><strong>Step 4. Pre-create Web Projects</strong></h3>
<ul>
<li>To improve deployment reliability, it pre-registers and reserves empty web projects on Cloudflare Edge.</li>
<li>If a domain with the same name is already occupied, it <strong>reuses the existing domain</strong> and automatically transitions to the next step safely.</li>
</ul>
<h3 id="step-5-remote-sync-of-secrets"><strong>Step 5. Remote Sync of Secrets</strong></h3>
<ul>
<li>Safely uploads and synchronizes the secret values, such as the master password written locally in <code>.dev.vars</code>, to Cloudflare.</li>
<li><strong>Automatic Access IP Registration</strong>: Especially in this step, it detects the public IP address of the administrator&#39;s computer running the deployment in real-time and automatically injects it as the <code>ALLOWED_IP</code> variable. This prevents the administrator from being blocked upon accessing the login screen immediately after deployment.</li>
</ul>
<h3 id="step-6-database-table-configuration-amp-default-theme-setup"><strong>Step 6. Database Table Configuration &amp; Default Theme Setup</strong></h3>
<ul>
<li>Configure the database tables needed for the blog to function and inject default settings.</li>
<li>Following the on-screen prompts, choose your primary language (Korean, English, Japanese). This sets up the translation system, sample categories, header menu structure, and a default welcome post automatically.</li>
</ul>
<h3 id="step-7-build-web-services-amp-final-deployment"><strong>Step 7. Build Web Services &amp; Final Deployment</strong></h3>
<ul>
<li>Performs the integrated build of all monorepo apps and automatically runs the deployment command to Cloudflare servers to complete the installation process. Once deployment is complete, the Pages URLs for both the blog and admin will be displayed.</li>
</ul>
<hr>
<blockquote>
<p>[!TIP]</p>
<h3 id="automatic-secret-settings-and-immediate-connection-support">💡 Automatic Secret Settings and Immediate Connection Support</h3>
<p>The installation process of this project seamlessly handles resource creation, web project provisioning, and secret environment variable transmission.<br>Upon completion, the login password and IP permission settings are perfectly configured on the remote server, so it works immediately without any additional manual configuration.</p>
</blockquote>
<hr>
<h2 id="4-blog-update-amp-data-restore-deployment-npm-run-restore">🔄 4. Blog Update &amp; Data Restore Deployment (npm run restore)</h2>
<p>When a <strong>new patch version or a bug-fixed release code is deployed</strong> while running your blog, this process allows you to safely transfer your existing post data and URLs without data loss while replacing the screen with the new code.</p>
<h3 id="4-step-migration-procedure-for-new-versions">💡 4-Step Migration Procedure for New Versions</h3>
<p>You can safely complete the upgrade without data loss by using the admin data backup and the <strong><code>npm run restore</code></strong> command.</p>
<ol>
<li><strong>[Step 1] Backup Existing Data &amp; Deployment Settings</strong>:<ul>
<li>Access the <strong><code>Backup</code></strong> menu and the backup section at the bottom of the <strong><code>Theme Editor</code></strong> menu of your active admin app, and download the post content data and theme design settings to your computer respectively.</li>
<li>Also, click the &#39;Download Settings Backup&#39; button in the <strong><code>Backup</code></strong> menu to save the [wrangler.backup.json] file to your PC. (This is the most critical file for maintaining the link to your existing production database&#39;s unique ID.)</li>
</ul>
</li>
<li><strong>[Step 2] Isolated Testing of New Code</strong>:<ul>
<li>In the newly downloaded version&#39;s code folder, run <code>npm run setup</code> and enter a <strong>temporary DB for testing</strong> and a <strong>temporary Pages deployment name for testing</strong> to deploy it separately.</li>
<li>Log in to the newly deployed test admin, and import the backup data files saved in Step 1 to verify that the data loads successfully in advance.</li>
</ul>
</li>
<li><strong>[Step 3] Restore Bindings to Existing Production Server (<code>npm run restore</code>)</strong>:<ul>
<li>Once verification is complete, copy and paste the <code>wrangler.backup.json</code> file saved in Step 1 into the root directory of the new version&#39;s project folder.</li>
<li>Run the <strong><code>npm run restore</code></strong> command in the terminal. The tool script will read the <strong>existing production DB and KV unique ID information</strong> written in the backup file and automatically connect them to the new code&#39;s configuration files via override.</li>
</ul>
</li>
<li><strong>[Step 4] Schema Synchronization &amp; Override Deployment</strong>:<ul>
<li>The restore script safely updates only the table structure schema of the existing production DB to the latest specifications, so <strong>actual posts or data already stored will not be corrupted or deleted</strong> and will be perfectly preserved.</li>
<li>Next, run <code>npm run deploy:blog</code> and <code>npm run deploy:admin</code> respectively. The latest upgraded blog system will be safely deployed, overwriting the system while keeping the same URLs you were using.</li>
</ul>
</li>
</ol>
<hr>
<h2 id="5-backup-file-types-and-functions">📦 5. Backup File Types and Functions</h2>
<p>Refer to the table below for the roles of individual files that can be safely imported and exported from the admin backup menu.</p>
<table>
<thead>
<tr>
<th align="left">Backup Type</th>
<th align="left">Extraction Path</th>
<th align="left">Recommended Filename Example</th>
<th align="left">Detailed Feature &amp; Preserved Content</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>1. Content DB Data</strong></td>
<td align="left"><strong><code>Backup</code></strong> Menu</td>
<td align="left"><code>blog-content-backup-[date].json</code></td>
<td align="left">Preserves all written blog post content, created category information, tag lists, and basic system settings.</td>
</tr>
<tr>
<td align="left"><strong>2. Deployment Config Backup</strong></td>
<td align="left"><strong><code>Backup</code></strong> Menu</td>
<td align="left"><code>wrangler.backup.json</code></td>
<td align="left">Safely preserves the deployment name and unique UUID information required for Cloudflare D1 DB and KV storage binding (<strong>Essential for server migration</strong>).</td>
</tr>
<tr>
<td align="left"><strong>3. Media File Backup</strong></td>
<td align="left"><code>Media Backup &amp; Restore</code> section in the <strong><code>Backup</code></strong> menu<br>or <code>[Backup / Restore]</code> button in the top right of the <strong><code>Media Library</code></strong> menu</td>
<td align="left"><code>[storage-name]-images-backup-[date].zip</code> <br>(e.g., <code>r2-images-backup-[date].zip</code>)</td>
<td align="left">Downloads and preserves all image media files uploaded to the active image storage (R2, Supabase, etc.) as a ZIP file.</td>
</tr>
<tr>
<td align="left"><strong>4. Design Settings Backup</strong></td>
<td align="left">Bottom of <strong><code>Theme Editor</code></strong> menu</td>
<td align="left"><code>blog-design-backup-[date].json</code></td>
<td align="left">Preserves blog theme color information, background types, and device-specific (desktop/mobile) widget layout structures configured in the Theme Editor.</td>
</tr>
<tr>
<td align="left"><strong>5. Full System Backup</strong></td>
<td align="left">Bottom of <strong><code>Site Settings</code></strong> menu</td>
<td align="left"><code>full-system-backup-[date].json</code></td>
<td align="left">Gathers raw data of all tables from both databases (BLOG_DB, USER_DB) into a single JSON file for a complete backup and restore.</td>
</tr>
</tbody></table>
<figure data-align="left"><img src="https://sveltekitblog.com/images/posts/admin-install-and-deploy/desktop/img-admin-guide-admin-install-and-deploy-en-001.webp" alt="img-admin-guide-admin-install-and-deploy-en-001" data-align="left" data-caption="Content DB Data" /><figcaption>Content DB Data</figcaption></figure>
<figure data-align="left"><img src="https://sveltekitblog.com/images/posts/admin-install-and-deploy/desktop/img-admin-guide-admin-install-and-deploy-en-002.webp" alt="img-admin-guide-admin-install-and-deploy-en-002" data-align="left" data-caption="Deployment Config Backup" /><figcaption>Deployment Config Backup</figcaption></figure>
<figure data-align="left"><img src="https://sveltekitblog.com/images/posts/admin-install-and-deploy/desktop/img-admin-guide-admin-install-and-deploy-en-003.webp" alt="img-admin-guide-admin-install-and-deploy-en-003" data-align="left" data-caption="Media File Backup" /><figcaption>Media File Backup</figcaption></figure>
<figure data-align="left"><img src="https://sveltekitblog.com/images/posts/admin-install-and-deploy/desktop/img-admin-guide-admin-install-and-deploy-en-004.webp" alt="img-admin-guide-admin-install-and-deploy-en-004" data-align="left" data-caption="Design Settings Backup" /><figcaption>Design Settings Backup</figcaption></figure>
<figure data-align="left"><img src="https://sveltekitblog.com/images/posts/admin-install-and-deploy/desktop/img-admin-guide-admin-install-and-deploy-en-005.webp" alt="img-admin-guide-admin-install-and-deploy-en-005" data-align="left" data-caption="Full System Backup" /><figcaption>Full System Backup</figcaption></figure>]]></content:encoded>
            <category>Admin Guide</category>
            <enclosure url="https://sveltekitblog.com/images/posts/admin-install-and-deploy/desktop/img-admin-guide-admin-install-and-deploy-en-001.webp" length="0" type="image/webp"/>
        </item>
    </channel>
</rss>