As developers, we often build for ourselves. But sometimes, the best projects come from wanting to make someone else’s day a little easier—or a lot more thoughtful.
I recently wanted to create a simple, shared wishlist app for my partner and me. No ads, no clutter, just a place where we could drop gift ideas for anniversaries, birthdays, or just because.
Here’s a minimal Flask version you can clone and customize in 10 minutes.
The Setup
We’ll use Flask and SQLite. No frontend framework, just clean HTML and a tiny bit of CSS.
First, install Flask:
pip install flask
The Core App
Create app.py:
from flask import Flask, render_template, request, redirect, url_for
import sqlite3
app = Flask(__name__)
def init_db():
conn = sqlite3.connect('wishlist.db')
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS wishes
(id INTEGER PRIMARY KEY AUTOINCREMENT,
item TEXT NOT NULL,
note TEXT,
added_by TEXT)''')
conn.commit()
conn.close()
@app.route('/')
def index():
conn = sqlite3.connect('wishlist.db')
c = conn.cursor()
c.execute("SELECT * FROM wishes ORDER BY id DESC")
wishes = c.fetchall()
conn.close()
return render_template('index.html', wishes=wishes)
@app.route('/add', methods=['POST'])
def add():
item = request.form['item']
note = request.form.get('note', '')
added_by = request.form.get('added_by', '')
conn = sqlite3.connect('wishlist.db')
c = conn.cursor()
c.execute("INSERT INTO wishes (item, note, added_by) VALUES (?, ?, ?)",
(item, note, added_by))
conn.commit()
conn.close()
return redirect(url_for('index'))
@app.route('/delete/<int:id>')
def delete(id):
conn = sqlite3.connect('wishlist.db')
c = conn.cursor()
c.execute("DELETE FROM wishes WHERE id=?", (id,))
conn.commit()
conn.close()
return redirect(url_for('index'))
if __name__ == '__main__':
init_db()
app.run(debug=True)
The Template
Create templates/index.html:
<!DOCTYPE html>
<html>
<head><title>Our Wishlist</title></head>
<body>
<h1>❤️ Our Couple Wishlist</h1>
<form method="POST" action="/add">
<input type="text" name="item" placeholder="Gift idea" required>
<input type="text" name="note" placeholder="Note (optional)">
<input type="text" name="added_by" placeholder="Who suggested?">
<button type="submit">Add</button>
</form>
<ul>
{% for wish in wishes %}
<li>
<strong>{{ wish[1] }}</strong>
{% if wish[2] %} <em>{{ wish[2] }}</em> {% endif %}
{% if wish[3] %} <small>by {{ wish[3] }}</small> {% endif %}
<a href="/delete/{{ wish[0] }}">x</a>
</li>
{% endfor %}
</ul>
</body>
</html>
Why This Matters
Beyond the code, this is about building something that strengthens connection. You can extend it—add a “purchased” flag, a countdown to your anniversary, or even a link to where you found the item (like this curated collection of couple gifts I stumbled upon: Frishay Couple Gifts).
The best projects are the ones that make your real life better. Try it, and let me know what you add.
Top comments (2)
Thanks for sharing this practical approach. I've implemented something similar and noticed a significant boost in team productivity, especially when pairing it with automated tests. Any tips for onboarding new team members to this workflow?
Great breakdown of the architecture! One thing I'd add is the importance of considering edge cases early in the design phase—it saved me hours of refactoring on a recent project. What tools do you use for visualizing these flows?