commit 397f05bc87e3bd93595d75c1d56af3398ad46399 Author: Sean McElwain Date: Fri May 8 12:51:56 2026 -0500 Initial phone message board app diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..379c68f --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +__pycache__/ +*.pyc +messages.txt +.env +.venv/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..b32b51a --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +# Phone Message Board + +A small Flask local message board for transferring text between a phone and laptop over Bluetooth PAN, hotspot, USB tethering, or another local network. + +## Run + + python app.py + +Then open the phone IP from the laptop, for example: + + http://192.168.44.1:8080 diff --git a/app.py b/app.py new file mode 100644 index 0000000..701891f --- /dev/null +++ b/app.py @@ -0,0 +1,290 @@ +from flask import Flask, request, redirect, render_template_string +from datetime import datetime +from pathlib import Path +import uuid + +app = Flask(__name__) +DATA_FILE = Path("messages.txt") + +PAGE = """ + + + + + Phone Message Board + + + +
+
+

Phone Message Board

+
Local transfer page for phone ↔ laptop text
+
+ +
+ +
+ + Clear all +
+
+ +
+ {% if not messages %} +
No messages yet.
+ {% endif %} + + {% for msg in messages %} +
+
+ {{ msg.time }} + +
+
+
{{ msg.text }}
+
+
+ {% endfor %} +
+
+ + + + +""" + +def load_messages(): + if not DATA_FILE.exists(): + return [] + + raw = DATA_FILE.read_text(encoding="utf-8") + blocks = raw.split("\n---MESSAGE---\n") + messages = [] + + for block in blocks: + if not block.strip(): + continue + + try: + time, text = block.split("\n", 1) + except ValueError: + continue + + messages.append({ + "id": "msg_" + uuid.uuid4().hex, + "time": time.strip(), + "text": text.strip(), + }) + + return list(reversed(messages)) + +@app.route("/", methods=["GET", "POST"]) +def index(): + if request.method == "POST": + message = request.form.get("message", "").strip() + if message: + timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + with DATA_FILE.open("a", encoding="utf-8") as f: + f.write(f"{timestamp}\n{message}\n---MESSAGE---\n") + return redirect("/") + + return render_template_string(PAGE, messages=load_messages()) + +@app.route("/clear") +def clear(): + DATA_FILE.write_text("", encoding="utf-8") + return redirect("/") + +if __name__ == "__main__": + app.run(host="0.0.0.0", port=8080) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..7e10602 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +flask