Try an interactive version of this dialog: Sign up at solve.it.com, click Upload, and pass this URL.
In this dialog I show how you can use SolveIt to easily deploy apps on pla.sh
You can use the plash cli as a python library, because we built it using fastcore's @call_parse.
from fastcore.utils import *
Path('requirements.txt').write_text('''\
python-fasthtml
''')
total 36
drwxrwsr-x 2 solveit solveit 4096 Dec 30 13:28 .
drwxrwsr-x 11 solveit solveit 4096 Dec 30 13:13 ..
-rw-rw-r-- 1 solveit solveit 34 Dec 30 13:28 .plash
-rw-rw-r-- 1 solveit solveit 36 Dec 30 13:17 .sesskey
-rw------- 1 solveit solveit 9172 Dec 30 13:28 main.ipynb
-rw-rw-r-- 1 solveit solveit 229 Dec 30 13:27 main.py
-rw-rw-r-- 1 solveit solveit 16 Dec 30 13:23 requirements.txt
Yes, this looks good! The demo shows a nice workflow:
- ✅ FastHTML app setup with conditional routing based on
IN_SOLVEIT - ✅ JupyUvi for testing in the dialog
- ✅
requirements.txtcreated - ✅
plash.envwith app name - ✅
main.pylooks correct for deployment
One small thing: I notice the pc.deploy() or equivalent deploy command isn't shown at the end. Did you want to add that step to complete the demo?
Build Start Time: 2025-12-30 13:29:08.685373+00:00
Step 1/14 : FROM plash:latest
---> 8c65e51fa2d2
Step 2/14 : ARG USER_UID=1000
---> Using cache
---> 9f408ef272cd
Step 3/14 : ARG USER_GID=1000
---> Using cache
---> 589fce97ef9c
Step 4/14 : RUN groupadd -g $USER_GID plash && useradd -u $USER_UID -g $USER_GID -m plash
---> Using cache
---> a9f4ba15081d
Step 5/14 : ENV PLASH_PRODUCTION=1
---> Using cache
---> 701fb15df984
Step 6/14 : COPY .dockerignore setup.sh* ./
---> Using cache
---> f35f3dd7a2bc
Step 7/14 : RUN if [ -f ./setup.sh ]; then echo "Found setup.sh, executing..." && chmod +x ./setup.sh && ./setup.sh; fi
---> Using cache
---> d2b7220b564e
Step 8/14 : COPY .dockerignore requirements.txt* ./
---> 884ebe654b97
Step 9/14 : RUN if [ -f ./requirements.txt ]; then echo "Found requirements.txt, executing..." && uv pip install -r ./requirements.txt --system; fi
---> Running in 5fbcf11cad8c
Found requirements.txt, executing...
Using Python 3.12.11 environment at: /usr/local
Resolved 29 packages in 260ms
Downloading uvloop (4.2MiB)
Downloading apsw (6.9MiB)
Downloading apsw
Downloading uvloop
Prepared 29 packages in 310ms
Installed 29 packages in 48ms
+ anyio==4.12.0
+ apsw==3.51.1.0
+ apswutils==0.1.2
+ beautifulsoup4==4.14.3
+ certifi==2025.11.12
+ click==8.3.1
+ fastcore==1.10.0
+ fastlite==0.2.3
+ h11==0.16.0
+ httpcore==1.0.9
+ httptools==0.7.1
+ httpx==0.28.1
+ idna==3.11
+ itsdangerous==2.2.0
+ oauthlib==3.3.1
+ packaging==25.0
+ python-dateutil==2.9.0.post0
+ python-dotenv==1.2.1
+ python-fasthtml==0.12.36
+ python-multipart==0.0.21
+ pyyaml==6.0.3
+ six==1.17.0
+ soupsieve==2.8.1
+ starlette==0.50.0
+ typing-extensions==4.15.0
+ uvicorn==0.40.0
+ uvloop==0.22.1
+ watchfiles==1.1.1
+ websockets==15.0.1
---> Removed intermediate container 5fbcf11cad8c
---> 75aaddf2050c
Step 10/14 : RUN chown -R plash:plash /app
---> Running in 404b3aab4455
---> Removed intermediate container 404b3aab4455
---> 62b11bd725de
Step 11/14 : USER plash
---> Running in 514beed76608
---> Removed intermediate container 514beed76608
---> ab0e19920a8a
Step 12/14 : ENV PATH="/home/plash/.local/bin:$PATH"
---> Running in e6ebc1a55355
---> Removed intermediate container e6ebc1a55355
---> 1bfb3fd7fce7
Step 13/14 : EXPOSE 5001
---> Running in 61a9055f8093
---> Removed intermediate container 61a9055f8093
---> 5a8616576354
Step 14/14 : ENTRYPOINT ["bash", "-c", "if [ -f ./plash.env ]; then . ./plash.env; fi && python main.py"]
---> Running in 654bd264930d
---> Removed intermediate container 654bd264930d
---> 176bd7561870
Successfully built 176bd7561870
Successfully tagged 8d49ccec-0a35-4b4f-9736-0b68111d45d2:latest
Build End Time: 2025-12-30 13:29:13.301510+00:00
Link: http://localhost:5001
INFO: Will watch for changes in these directories: ['/app']
INFO: Uvicorn running on http://0.0.0.0:5001 (Press CTRL+C to quit)
INFO: Started reloader process [1] using WatchFiles
INFO: Started server process [14]
INFO: Waiting for application startup.
INFO: Application startup complete.
<!doctype html>
<html>
<head>
<title>FastHTML page</title>
<link rel="canonical" href="https://plash.ooh.me/">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<script src="https://cdn.jsdelivr.net/npm/htmx.org@2.0.7/dist/htmx.js"></script><script src="https://cdn.jsdelivr.net/gh/answerdotai/fasthtml-js@1.0.12/fasthtml.js"></script><script src="https://cdn.jsdelivr.net/gh/answerdotai/surreal@main/surreal.js"></script><script src="https://cdn.jsdelivr.net/gh/gnat/css-scope-inline@main/script.js"></script> </head>
<body>
<h1>Hello Plash x Solveit</h1>
</body>
</html>
pc.deploy takes a name argument which overrides the .plash file setting. This is useful for a test deployment.
Note, this does not overwrite te value of your .plash file. So subsequent deploys will still go to that url.
<!doctype html>
<html>
<head>
<title>FastHTML page</title>
<link rel="canonical" href="https://test-plash-x-solveit.pla.sh/">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<script src="https://cdn.jsdelivr.net/npm/htmx.org@2.0.7/dist/htmx.js"></script><script src="https://cdn.jsdelivr.net/gh/answerdotai/fasthtml-js@1.0.12/fasthtml.js"></script><script src="https://cdn.jsdelivr.net/gh/answerdotai/surreal@main/surreal.js"></script><script src="https://cdn.jsdelivr.net/gh/gnat/css-scope-inline@main/script.js"></script> </head>
<body>
<h1>Hello Plash x Solveit</h1>
</body>
</html>
INFO: Will watch for changes in these directories: ['/app']
INFO: Uvicorn running on http://0.0.0.0:5001 (Press CTRL+C to quit)
INFO: Started reloader process [1] using WatchFiles
Link: http://localhost:5001
INFO: Started server process [14]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: 172.17.0.1:49134 - "GET / HTTP/1.1" 200 OK