{"id":833,"date":"2024-01-30T00:05:47","date_gmt":"2024-01-29T15:05:47","guid":{"rendered":"https:\/\/blog.peddals.com\/?p=833"},"modified":"2024-01-30T00:05:48","modified_gmt":"2024-01-29T15:05:48","slug":"flet-client-side-web-app","status":"publish","type":"post","link":"https:\/\/blog.peddals.com\/en\/flet-client-side-web-app\/","title":{"rendered":"Deploy client-side (static) web app built by Flet"},"content":{"rendered":"\n<p>I edited width, alignment, etc. of my Flet code originally written as a desktop app to make it work as a web app. In this post I&#8217;m going to introduce how to build and deploy your Flet app as a <a href=\"https:\/\/flet.dev\/docs\/guides\/python\/packaging-app-for-distribution\/#flet-build-web\" target=\"_blank\" rel=\"noreferrer noopener\">static website<\/a> (client-side, HTML + JavaScript). This deployment should work on an ordinary web hosting server, and you don&#8217;t need to know about web server side technology. You can learn how to add Google AdSense advertisement to your Flet web app as well.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Preparation<\/h2>\n\n\n\n<p>Please refer to my previous post and build your environment. It&#8217;s mainly targeting macOS. The sample Flet app code is used in this post.<\/p>\n\n\n\n<p><a href=\"https:\/\/blog.peddals.com\/en\/build-flet-app-for-macos\/\" target=\"_blank\" rel=\"noreferrer noopener\">How to build Python GUI app on macOS with Flet<\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">In case you&#8217;re looking for server side deployment<\/h3>\n\n\n\n<p>My another post below introduces how to depoloy your web app on an Apache web server. Should you have a Nginx web server, refer to the <a href=\"https:\/\/flet.dev\/docs\/guides\/python\/deploying-web-app\/hosting-providers\/self-hosting\/\" target=\"_blank\" rel=\"noreferrer noopener\">official guide<\/a>.<\/p>\n\n\n\n<p><a href=\"https:\/\/blog.peddals.com\/en\/flet-webapp-behind-apache-by-reverse-proxy\/\" target=\"_blank\" rel=\"noreferrer noopener\">Host Flet web app behind Apache web server by Reverse Proxy<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Build as a web app<\/h2>\n\n\n\n<p>Complete the <a href=\"https:\/\/blog.peddals.com\/en\/build-flet-app-for-macos\/\" target=\"_blank\" rel=\"noreferrer noopener\">preparation steps 1 through 12 in the other post<\/a>. Build options won&#8217;t make much difference for web, so simply run the command below. It takes some time to complete.<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism off-numbers lang-zsh\" data-lang=\"ZSH\"><code>flet build web<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Test locally<\/h2>\n\n\n\n<p>Built files are placed in <code>build\/web<\/code>. Let&#8217;s test locally before pushing to a server. Execute the command and open the URL (<a href=\"http:\/\/localhost:8000\" target=\"_blank\" rel=\"noreferrer noopener\">http:\/\/localhost:8000<\/a>) in your web browser.<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism off-numbers lang-zsh\" data-lang=\"ZSH\"><code>python -m http.server --directory build\/web\n# Press Ctrl + C to exit.<\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"681\" src=\"https:\/\/blog.peddals.com\/wp-content\/uploads\/2024\/01\/image-5-1024x681.png\" alt=\"\" class=\"wp-image-809\" srcset=\"https:\/\/blog.peddals.com\/wp-content\/uploads\/2024\/01\/image-5-1024x681.png 1024w, https:\/\/blog.peddals.com\/wp-content\/uploads\/2024\/01\/image-5-300x199.png 300w, https:\/\/blog.peddals.com\/wp-content\/uploads\/2024\/01\/image-5-768x511.png 768w, https:\/\/blog.peddals.com\/wp-content\/uploads\/2024\/01\/image-5.png 1074w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><figcaption class=\"wp-element-caption\">On Chrome it works as expected.<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Little more steps to upload<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Specify the directory name<\/h3>\n\n\n\n<p>In this example, the web app will be deployed to <a href=\"https:\/\/blog.peddals.com\/fletpassgen\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/blog.peddals.com\/fletpassgen<\/a>, so change the path in <code>index.html<\/code>. (By adding a build option <code>--base-dir \"\/directoryname\/\"<\/code> you can avoid this step, but you cannot test locally.) Edit <code>index.html<\/code> like the below. Make sure you have the directory name between slashes (<code>\/<\/code>).<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-html\" data-file=\"index.html\" data-lang=\"HTML\" data-start=\"15\"><code>  &lt;base href=&quot;\/fletpassgen\/&quot;&gt;<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Compress the entire folder<\/h3>\n\n\n\n<p>Change the folder name from <code>web<\/code> to the directory name, and compress it as a single file. You get <code>fletpassgen.tar.gz<\/code> as a result of these commands:<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism off-numbers lang-zsh\" data-lang=\"ZSH\" data-show-lang=\"0\"><code>cd build\nmv web fletpassgen\ntar cvzf fletpassgen.tar.gz fletpassgen<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Upload and extract<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Upload the compressed file<\/h3>\n\n\n\n<p>To upload the compressed file to a hosting server, this example uses the <code>scp<\/code> command in Terminal.app. Replace username, hostname and upload directory based on your account details.<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism off-numbers lang-zsh\" data-lang=\"ZSH\"><code>scp fletpassgen.tar.gz username@hostname:~\/public_html<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Login server and extract the file<\/h3>\n\n\n\n<p>If <code>ssh<\/code> is allowed, login your server and extract the file like the below. The directory has to be extracted in the correct location. In this example the web app will be in the subfolder <code>\/fletpassgen\/<\/code> so it&#8217;s extracted in the document root of the website.<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism off-numbers lang-zsh\" data-lang=\"ZSH\"><code>ssh username@hostname\ncd ~\/public_html\ntar xvf fletpassgen.tar.gz\nrm fletpassgen.tar.gz<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Access the site by web browser<\/h2>\n\n\n\n<p>Your web app is ready now. URL should be like this: <a href=\"https:\/\/blog.peddals.com\/fletpassgen\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/blog.peddals.com\/fletpassgen\/<\/a> <\/p>\n\n\n\n<p>After showing an icon for some moments then your web app will start working.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Few things to check if it&#8217;s not working<\/h3>\n\n\n\n<p>With this building method (static web app), the total size of files tends to be big. My example resulted 28MB in total. As the first access will take some time to download all required files, you have to be patient and wait until the app to be ready to start.<\/p>\n\n\n\n<p>In case you don&#8217;t even see the icon after several seconds, take a look into the directory name in <code>index.html<\/code>, actual name of the extracted directory, user\/group ownership and access permissions.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tips and notes<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Use same code for desktop and web apps<\/h3>\n\n\n\n<p>You may notice the layout of contents is broken when opening your app in web browser (I did!) Use <code>ft.Container<\/code> to place contents and <code>width=<\/code> property having the same value as <code>page.window_width=<\/code> so the horizontal layout will be kept in a wider window. For a simple app, having the below parameters keeps your app at the top center even in a web browser.<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>    page.vertical_alignment = ft.MainAxisAlignment.START\n    page.horizontal_alignment = ft.CrossAxisAlignment.CENTER<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">File size is big<\/h3>\n\n\n\n<p>As I wrote, even this small app (Python code is approx. 3.9KB) becomes 28MB in total after a build. You need to put your eye on the available disk space.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">App keeps running once loaded<\/h3>\n\n\n\n<p>Since this deployment method does not require a code to be running on the web server, your app keeps running in a web browser even when the network is down. For a simple tool it can be an advantage (I don&#8217;t know who needs a new password when offline, though).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Copy button won&#8217;t work on Safari (macOS and iOS)<\/h3>\n\n\n\n<p>This is a known issue. Hopefully it will be resolved in the near future, but at this moment copy works on Chrome but not on Safari. I added a code to hide the copy button based on the user agent, but it does not work. <code>flet build web<\/code> deployment won&#8217;t be able to get user agent unfortunately. You need to deploy as a server-side app if you want to add browser specific features.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Bonus: add Google AdSense advertisement<\/h2>\n\n\n\n<p>You can find this type of information for Flutter quite easily, but some of the ways I found didn&#8217;t work for my Flet app. If you&#8217;re looking for a solution, try this:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Get AdSense strings<\/h3>\n\n\n\n<p>Login your Google AdSense account, create new ad or click on the Get code <code>&lt; ><\/code> icon of an existing ad to get strings.<\/p>\n\n\n\n<p>Google AdSense > Ads > By ad unit > Display ads > Give it a name and Create > take note of the below two lines. <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"685\" height=\"421\" src=\"https:\/\/blog.peddals.com\/wp-content\/uploads\/2024\/01\/GoogleAdSense.png\" alt=\"\" class=\"wp-image-842\" srcset=\"https:\/\/blog.peddals.com\/wp-content\/uploads\/2024\/01\/GoogleAdSense.png 685w, https:\/\/blog.peddals.com\/wp-content\/uploads\/2024\/01\/GoogleAdSense-300x184.png 300w\" sizes=\"auto, (max-width: 685px) 100vw, 685px\" \/><\/figure>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism off-numbers lang-html\" data-lang=\"HTML\"><code>             data-ad-client=&quot;xxxxxxxx&quot;\n             data-ad-slot=&quot;yyyyyyyy&quot;<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Add style to index.html<\/h3>\n\n\n\n<p>Edit the <code>index.html<\/code> file in the Flet web app directory and add the below CSS code, right above the <code>&lt;\/style><\/code> tag. Line numbers are just reference (Flet ver. 0.19.0).<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-html\" data-file=\"index.html\" data-lang=\"HTML\" data-start=\"114\"><code>    footer{\n        width: 100%;\n        height: 100px;\n        text-align: center;\n        padding: 0;\n        position: absolute;\n        bottom: 0;\n        z-index: 100;\n    }<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Add &lt;footer>&lt;\/footer> block to index.html<\/h3>\n\n\n\n<p>Right above the last line  <code>&lt;\/body>&lt;\/html><\/code> of the <code>index.html<\/code>, add the below code. Replace highlighted xxxxxxxx and yyyyyyyy with strings you copied. <\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-html\" data-file=\"index.html\" data-lang=\"HTML\" data-line=\"169-170\" data-start=\"159\"><code>  &lt;footer&gt;\n    &lt;style&gt;\n    .example_responsive_1 { width: 320px; height: 100px; }\n    @media(min-width: 500px) { .example_responsive_1 { width: 468px; height: 60px; } }\n    @media(min-width: 800px) { .example_responsive_1 { width: 728px; height: 90px; } }\u3000\n    &lt;\/style&gt;\n        &lt;script async src=&quot;https:\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js&quot;&gt;&lt;\/script&gt;\n        &lt;!-- Home_Page --&gt;\n        &lt;ins class=&quot;adsbygoogle&quot;\n             style=&quot;display:inline-block&quot;\n             data-ad-client=&quot;xxxxxxxx&quot;\n             data-ad-slot=&quot;yyyyyyyy&quot;&gt;\n        &lt;\/ins&gt;\n        &lt;script&gt;\n    (adsbygoogle = window.adsbygoogle || []).push({});\n    &lt;\/script&gt;\n  &lt;\/footer&gt;<\/code><\/pre><\/div>\n\n\n\n<p>Save the file. You&#8217;ll see a horizontal ad at the bottom of the web page. If you just created a new ad, it may take some time for it to appear. Enjoy!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Image by Stable Diffusion<\/h2>\n\n\n\n<p>Date:<br>2024-Jan-29 0:04:44<\/p>\n\n\n\n<p>Model:<br>realisticVision-v20_split-einsum<\/p>\n\n\n\n<p>Size:<br>512 x 512<\/p>\n\n\n\n<p>Include in Image:<br>masterpiece, best quality, retro future, successful upload of application<\/p>\n\n\n\n<p>Exclude from Image:<\/p>\n\n\n\n<p>Seed:<br>3400661084<\/p>\n\n\n\n<p>Steps:<br>20<\/p>\n\n\n\n<p>Guidance Scale:<br>20.0<\/p>\n\n\n\n<p>Scheduler:<br>DPM-Solver++<\/p>\n\n\n\n<p>ML Compute Unit:<br>CPU &amp; Neural Engine<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I edited width, alignment, etc. of my Flet code originally written as a desktop app to make it work as a web a &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/blog.peddals.com\/en\/flet-client-side-web-app\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Deploy client-side (static) web app built by Flet&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":830,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_locale":"en_US","_original_post":"https:\/\/blog.peddals.com\/?p=807","footnotes":""},"categories":[24,8,4],"tags":[17,12,18],"class_list":["post-833","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-flet","category-macos","category-python","tag-cli","tag-mac","tag-python","en-US"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Deploy client-side (static) web app built by Flet | Peddals Blog<\/title>\n<meta name=\"description\" content=\"Deploy client-side (static) web app built by Flet. You can add Google AdSense as well.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.peddals.com\/en\/flet-client-side-web-app\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Deploy client-side (static) web app built by Flet | Peddals Blog\" \/>\n<meta property=\"og:description\" content=\"Deploy client-side (static) web app built by Flet. You can add Google AdSense as well.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.peddals.com\/en\/flet-client-side-web-app\/\" \/>\n<meta property=\"og:site_name\" content=\"Peddals Blog\" \/>\n<meta property=\"article:published_time\" content=\"2024-01-29T15:05:47+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-01-29T15:05:48+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.peddals.com\/wp-content\/uploads\/2024\/01\/masterpiece-best-quality-retro-future-successful-upload-of-applicat.375.3400661084.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"512\" \/>\n\t<meta property=\"og:image:height\" content=\"512\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Handsome\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Handsome\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blog.peddals.com\\\/en\\\/flet-client-side-web-app\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blog.peddals.com\\\/en\\\/flet-client-side-web-app\\\/\"},\"author\":{\"name\":\"Handsome\",\"@id\":\"https:\\\/\\\/blog.peddals.com\\\/#\\\/schema\\\/person\\\/81b2dabca748c3d11a45722f02d9d994\"},\"headline\":\"Deploy client-side (static) web app built by Flet\",\"datePublished\":\"2024-01-29T15:05:47+00:00\",\"dateModified\":\"2024-01-29T15:05:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blog.peddals.com\\\/en\\\/flet-client-side-web-app\\\/\"},\"wordCount\":1003,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/blog.peddals.com\\\/#\\\/schema\\\/person\\\/81b2dabca748c3d11a45722f02d9d994\"},\"image\":{\"@id\":\"https:\\\/\\\/blog.peddals.com\\\/en\\\/flet-client-side-web-app\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blog.peddals.com\\\/wp-content\\\/uploads\\\/2024\\\/01\\\/masterpiece-best-quality-retro-future-successful-upload-of-applicat.375.3400661084.jpg\",\"keywords\":[\"CLI\",\"mac\",\"Python\"],\"articleSection\":[\"Flet\",\"macOS\",\"Python\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blog.peddals.com\\\/en\\\/flet-client-side-web-app\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blog.peddals.com\\\/en\\\/flet-client-side-web-app\\\/\",\"url\":\"https:\\\/\\\/blog.peddals.com\\\/en\\\/flet-client-side-web-app\\\/\",\"name\":\"Deploy client-side (static) web app built by Flet | Peddals Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blog.peddals.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blog.peddals.com\\\/en\\\/flet-client-side-web-app\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blog.peddals.com\\\/en\\\/flet-client-side-web-app\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blog.peddals.com\\\/wp-content\\\/uploads\\\/2024\\\/01\\\/masterpiece-best-quality-retro-future-successful-upload-of-applicat.375.3400661084.jpg\",\"datePublished\":\"2024-01-29T15:05:47+00:00\",\"dateModified\":\"2024-01-29T15:05:48+00:00\",\"description\":\"Deploy client-side (static) web app built by Flet. You can add Google AdSense as well.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blog.peddals.com\\\/en\\\/flet-client-side-web-app\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blog.peddals.com\\\/en\\\/flet-client-side-web-app\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/blog.peddals.com\\\/en\\\/flet-client-side-web-app\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blog.peddals.com\\\/wp-content\\\/uploads\\\/2024\\\/01\\\/masterpiece-best-quality-retro-future-successful-upload-of-applicat.375.3400661084.jpg\",\"contentUrl\":\"https:\\\/\\\/blog.peddals.com\\\/wp-content\\\/uploads\\\/2024\\\/01\\\/masterpiece-best-quality-retro-future-successful-upload-of-applicat.375.3400661084.jpg\",\"width\":512,\"height\":512},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blog.peddals.com\\\/en\\\/flet-client-side-web-app\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u30db\u30fc\u30e0\",\"item\":\"https:\\\/\\\/blog.peddals.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Deploy client-side (static) web app built by Flet\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blog.peddals.com\\\/#website\",\"url\":\"https:\\\/\\\/blog.peddals.com\\\/\",\"name\":\"Peddals Blog\",\"description\":\"AI, LLM, Python, Mac, Pythonista3, iOS, etc. in Japanese and English\",\"publisher\":{\"@id\":\"https:\\\/\\\/blog.peddals.com\\\/#\\\/schema\\\/person\\\/81b2dabca748c3d11a45722f02d9d994\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blog.peddals.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/blog.peddals.com\\\/#\\\/schema\\\/person\\\/81b2dabca748c3d11a45722f02d9d994\",\"name\":\"Handsome\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/51d7363349ec538c4d62c9ebe89488fd7388729ad0c9dfeebd8bb32ebfb11f17?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/51d7363349ec538c4d62c9ebe89488fd7388729ad0c9dfeebd8bb32ebfb11f17?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/51d7363349ec538c4d62c9ebe89488fd7388729ad0c9dfeebd8bb32ebfb11f17?s=96&d=mm&r=g\",\"caption\":\"Handsome\"},\"logo\":{\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/51d7363349ec538c4d62c9ebe89488fd7388729ad0c9dfeebd8bb32ebfb11f17?s=96&d=mm&r=g\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Deploy client-side (static) web app built by Flet | Peddals Blog","description":"Deploy client-side (static) web app built by Flet. You can add Google AdSense as well.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.peddals.com\/en\/flet-client-side-web-app\/","og_locale":"en_US","og_type":"article","og_title":"Deploy client-side (static) web app built by Flet | Peddals Blog","og_description":"Deploy client-side (static) web app built by Flet. You can add Google AdSense as well.","og_url":"https:\/\/blog.peddals.com\/en\/flet-client-side-web-app\/","og_site_name":"Peddals Blog","article_published_time":"2024-01-29T15:05:47+00:00","article_modified_time":"2024-01-29T15:05:48+00:00","og_image":[{"width":512,"height":512,"url":"https:\/\/blog.peddals.com\/wp-content\/uploads\/2024\/01\/masterpiece-best-quality-retro-future-successful-upload-of-applicat.375.3400661084.jpg","type":"image\/jpeg"}],"author":"Handsome","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Handsome","Est. reading time":"17 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.peddals.com\/en\/flet-client-side-web-app\/#article","isPartOf":{"@id":"https:\/\/blog.peddals.com\/en\/flet-client-side-web-app\/"},"author":{"name":"Handsome","@id":"https:\/\/blog.peddals.com\/#\/schema\/person\/81b2dabca748c3d11a45722f02d9d994"},"headline":"Deploy client-side (static) web app built by Flet","datePublished":"2024-01-29T15:05:47+00:00","dateModified":"2024-01-29T15:05:48+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.peddals.com\/en\/flet-client-side-web-app\/"},"wordCount":1003,"commentCount":0,"publisher":{"@id":"https:\/\/blog.peddals.com\/#\/schema\/person\/81b2dabca748c3d11a45722f02d9d994"},"image":{"@id":"https:\/\/blog.peddals.com\/en\/flet-client-side-web-app\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.peddals.com\/wp-content\/uploads\/2024\/01\/masterpiece-best-quality-retro-future-successful-upload-of-applicat.375.3400661084.jpg","keywords":["CLI","mac","Python"],"articleSection":["Flet","macOS","Python"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.peddals.com\/en\/flet-client-side-web-app\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.peddals.com\/en\/flet-client-side-web-app\/","url":"https:\/\/blog.peddals.com\/en\/flet-client-side-web-app\/","name":"Deploy client-side (static) web app built by Flet | Peddals Blog","isPartOf":{"@id":"https:\/\/blog.peddals.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.peddals.com\/en\/flet-client-side-web-app\/#primaryimage"},"image":{"@id":"https:\/\/blog.peddals.com\/en\/flet-client-side-web-app\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.peddals.com\/wp-content\/uploads\/2024\/01\/masterpiece-best-quality-retro-future-successful-upload-of-applicat.375.3400661084.jpg","datePublished":"2024-01-29T15:05:47+00:00","dateModified":"2024-01-29T15:05:48+00:00","description":"Deploy client-side (static) web app built by Flet. You can add Google AdSense as well.","breadcrumb":{"@id":"https:\/\/blog.peddals.com\/en\/flet-client-side-web-app\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.peddals.com\/en\/flet-client-side-web-app\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.peddals.com\/en\/flet-client-side-web-app\/#primaryimage","url":"https:\/\/blog.peddals.com\/wp-content\/uploads\/2024\/01\/masterpiece-best-quality-retro-future-successful-upload-of-applicat.375.3400661084.jpg","contentUrl":"https:\/\/blog.peddals.com\/wp-content\/uploads\/2024\/01\/masterpiece-best-quality-retro-future-successful-upload-of-applicat.375.3400661084.jpg","width":512,"height":512},{"@type":"BreadcrumbList","@id":"https:\/\/blog.peddals.com\/en\/flet-client-side-web-app\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u30db\u30fc\u30e0","item":"https:\/\/blog.peddals.com\/"},{"@type":"ListItem","position":2,"name":"Deploy client-side (static) web app built by Flet"}]},{"@type":"WebSite","@id":"https:\/\/blog.peddals.com\/#website","url":"https:\/\/blog.peddals.com\/","name":"Peddals Blog","description":"AI, LLM, Python, Mac, Pythonista3, iOS, etc. in Japanese and English","publisher":{"@id":"https:\/\/blog.peddals.com\/#\/schema\/person\/81b2dabca748c3d11a45722f02d9d994"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.peddals.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/blog.peddals.com\/#\/schema\/person\/81b2dabca748c3d11a45722f02d9d994","name":"Handsome","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/51d7363349ec538c4d62c9ebe89488fd7388729ad0c9dfeebd8bb32ebfb11f17?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/51d7363349ec538c4d62c9ebe89488fd7388729ad0c9dfeebd8bb32ebfb11f17?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/51d7363349ec538c4d62c9ebe89488fd7388729ad0c9dfeebd8bb32ebfb11f17?s=96&d=mm&r=g","caption":"Handsome"},"logo":{"@id":"https:\/\/secure.gravatar.com\/avatar\/51d7363349ec538c4d62c9ebe89488fd7388729ad0c9dfeebd8bb32ebfb11f17?s=96&d=mm&r=g"}}]}},"_links":{"self":[{"href":"https:\/\/blog.peddals.com\/wp-json\/wp\/v2\/posts\/833","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.peddals.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.peddals.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.peddals.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.peddals.com\/wp-json\/wp\/v2\/comments?post=833"}],"version-history":[{"count":37,"href":"https:\/\/blog.peddals.com\/wp-json\/wp\/v2\/posts\/833\/revisions"}],"predecessor-version":[{"id":879,"href":"https:\/\/blog.peddals.com\/wp-json\/wp\/v2\/posts\/833\/revisions\/879"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.peddals.com\/wp-json\/wp\/v2\/media\/830"}],"wp:attachment":[{"href":"https:\/\/blog.peddals.com\/wp-json\/wp\/v2\/media?parent=833"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.peddals.com\/wp-json\/wp\/v2\/categories?post=833"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.peddals.com\/wp-json\/wp\/v2\/tags?post=833"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}