
Show HN: My first complete full stack web app, greekdeals.gr - hambos22
https://greekdeals.gr
======
hambos22
Hey HN,

I would like to present you my first full stack web app. A side project which
took me 1.5 years of great effort to complete, for the sole purpose to upgrade
my skills on many contexts outside of my daily job.

It's in greek language but if that bothers you, you can translate it to your
language using your browser functionality [0]

I would really appreciate to hear feedback from you. Reading HN all these
years, really altered my mindset which affected many design choices which I
had to make.

\----

Intro:

Greek Deals is a greek community where users can find and share -legit- deals
& offers across every commerce sector eg from amazon online deals to local
neighborhood market deals. To compel users to find & share deals, a point
system has been made. When user creates a deal and depending of how complete
it is (description, image, duration etc) he earns the analogous points. Users
can also vote for deals. Votes have exponential effect to points. Users can
redeem their points (WIP) for a variety of rewards (vouchers, netflix,
services etc).

Tech stack:

* Front End: Next.js, React.js, Typescript

* Admin Dashboard: React.js, Typescript, Electron

* Backend: Flask, Python, a bit D, Postgres, Redis, Celery, Docker / compose

Key Features:

* Performant fuzzy autocomplete search with latin character support (greeklish), stemming, weights etc

* Deal faceted search

* Real time, daily and weekly deal alerts based on user's choices

* OWASP practices

* Dependencies to minimum

* No 3rd party UI frameworks, every React component is custom (except Mapbox).

* Automatic image conversion to WEBP, fallback to JPG for unsupported browsers

* Infinite scrolling with the ability to restore scroll position

* Took a good dive to Postgres. I leveraged many of its goodies, like geo queries, full / fuzzy text search, materialized views, CTE, functions etc

* Dynamic banner creation for og:graph by visiting a HTTP endpoint, suitable for social media use. That resulted in a decent increase of impressions & engagements through out our social channels. example [1]

Flutter app for iOS and Android is WIP

LOCs: ~30K

Monthly budget: $75 (2xDO droplets, DO managed db, s3, mapbox, rsync.net)

[0] unfortunately using the translate.google.com proxy breaks JS and the
sidebar on desktop monitors won't appear. Using the in-place translation
through the context menu works normally.

[1]
[https://api.greekdeals.gr/v1/social/images/deals/XobXd4D](https://api.greekdeals.gr/v1/social/images/deals/XobXd4D)

edit: syntax & formatting

~~~
onemiketwelve
What do you mean by 0? Are you saying including the script breaks the front
end? If so, could you just create a proxy for it on the server and expose an
API?

About fuzzy search, do you feel ok about the performance? I had a general
feeling that for that type of stuff you need a dedicated search thingy, maybe
elastic search?

~~~
hambos22
I mean that if you visit [0] to see the translated version through google, JS
throws errors: the sidebar won't render, search won't work and pretty much
everything which needs JS doesn't respond. Using the in-place translate
doesn't have that issue.

About the search part, imagine that in busy days we'll have at most 2-3K
active deals, therefore Postgres can do the job really fine with that amount
of data. Elastic search was in the table but I think it would be overkill for
my use case. Also by having 100% indexable queries performance impact is
small. PG provides a lot of goodies to get the job done.

You can try to play with it, just type an english word in the search bar eg
"game" and then "geme"

[0]
[https://translate.google.com/translate?sl=el&tl=en&u=https%3...](https://translate.google.com/translate?sl=el&tl=en&u=https%3A%2F%2Fgreekdeals.gr%2F)

[1]
[https://github.com/wolfgarbe/SymSpell](https://github.com/wolfgarbe/SymSpell)

