Welcome to Spotify Electron

Made by Antonio Martínez

Laptop App Display
Laptop App Display
react icontypescript icon electron icon mongodb iconcss iconpython iconfast api iconboostrap iconmaterial ui icongithub actions icon

The

App

Home screenshot

Explore the best artists and music

All of your favourites artists and songs are now in SpotifyElectron. Lets dig in and find all the new features.

Organize your favorite music in playlists

Save your songs into playlist and access them from wherever and whenever you want. Access your friend's playlists for sharing and discovering new music.

Playlist screenshot
Upload song screenshot

Upload your songs

Have you ever missed not finding a not so popular song in other streaming services? That's not the problem from now on, SpotifyElectron allows users to upload their own music and share them globally.

Discover and try the new interface

Modern interface with the best user experience. Search by genre, find your favourite songs or see what your friends are playing : the limit it's up to you.

Explorar screenshot

Goals

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAACfklEQVR4nO2XzWsTQRjGRwQRrM4GiQSVYj3VSz52RUGEdCcErLnag9hDF6SUFrx5cGfC7IC914MfJy+BBkLxKCgJaXd2/wEv3pukh14k9FAJwZWpSYppEqjZhl2ZH7yXPQzPM+8z78wCIJH8XyTt9ajmMF212arG2TvVYVXVYZsgDNzlbF5zmNdfqmNtgzCwUCqd17hVOGnCegvCQpQ+js1urf34qwM2WwVhYOrVwyjE+rdIPuPNbq01eyY4nQNhEa8Q5EGCvt98nbuhcqsoDMRdeg2ESXyUpmPHZ4JlQRjFBx7NZTmNW3vxMm5d33gSLvGQZm4nq/neIY1XzNYlmg12zq++fHAZYt2ABO0oBP1KlM3jMcmtOghoROqpbbo//WHxM8ToQOT8KOsYHU6/f2qndui+6li7KZs+AkEjxa297g6L3Ra7LnYfErQUpekpEGQgyaQSZbPdNZCskqbIPQgDV/IoC7HeFJMlUcE/VU7rgYzIIMQhVQhqdbJeAjR9EZwSY3fTNWpFb1At1YocnBHnINat3iEl6I349i8LGUPEd8t/6XThAsR64Y94vR3Jo5VxljMmZaAzJhuJCj48ukkxOoiYc7lx1zX8MNCd4aptNe58erESMdE8JOh5JyYfFax/FU+A3pismG0xecYV75sBlbNa3ww/UX03aQP4hOG3AfFOUQj6InZedEB0QnREdEZ0yO+b1PDDgPi5FibO4ppXOXMH/bhrnZr8FDolo8Rr0sAECHwHbhWW3ZnCsjesAm9gZoR4aaAmOwAAJMgddDN3K/ARUkaIlwYc2QEAYs/uubHF+96wCnyEYiPESwMF2QFPRkgJ+iGWSCQgVPwGyfy2b7FM1kgAAAAASUVORK5CYII=

Developed for scalability and quick iterations

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEJUlEQVR4nO2YbUwbZRzAH0GXwNiLTubQSQfjbR2MrvVlUROW+LIYky0x66cZJ95RTXTjebqZaO/IkajFschcVTIwaHjZ2ArdHAEdG2BMTBZxH3RhbrTQlkJpaWk7/WK2Sv+mcyPQ0MO213pN+kvu6/9+v/Z/l/ZBKEWKFP+JJ4a8FbKLXn1Zn+f6lh7XtRLDTMvmLsdWlAwoBn21soteKPvOA9IeN5ScdUGh3gl5J6dv5bbZ9yExs33Q9+pS8vmnpkHSZofHWiZvrW+ylSGxUt7vHQ4nv/HrSchptsEjjZbWaOfLLt18YVu/59zWXrdF+q3bWGyYaS/Uz8gEkZfqYUVZ32yAX94K646bTdHMlw/6Pirv90Jp3yxIz7uh2DADBWecsKnD7pe0Tb0Rc4Cix565nPzDOjM8eGzMGuls2YBv71LyeSfv3cPmf7TZEvs3UWxwmfjlx2F1vfF8pHPL+z1XwssH7zEB2V9aOmIOKNI71bzyR02Q+YlpV6SrWdrrDvDJr2+0wkM681jMAUgP6ZJWe084+ZV1xqORjtyht2UsJ78ueI9PxydiD7gbsaHJdniTbmRePlc7DKvqbrwW7ciibucor3xDdKvJC4WZudcPfQiV6lqgCQtKpTI92lmbTzsO8MubYOXHxhcFDwiK37tiCUAcpElap7p55LVIaAQNCMJBWsEXV7n8z36bl39cO+zPqjMpUTwQPAAhRBHNU8FZlYdqoVLNAU2Y34WxTVQAZt5fOJMiTJcwtgkLYC8vCsAsEcY2AQFVanb3wnk0YQMU4QpQMgSoDnK5FGEmQ9bnAoonQgWosEZOYXZq8eowc6rqmqeRmAPeOsgW0oRpoQn7d8jqAE3YIyjeRBqg5LgVVWrmmTtvGsz+vIQ03H1wu4V4IcQUsO8At1qlZp6jSM27NGG+ogn7C42Zv8JJz1+Y+Twh8ksF0Fizh8JsM0UYY/ANsqzsYvFfq6o1LydEPGxA5Fdw93+gMbsXIXRfQuWjDsCsjcJMJ41r3t5/mNuQcOmFUJgJuyYUYW9TmLlKEbaDJux7b2LmJRXW5CAxQYcEBKVpzJ6gq2t2EUIykNihQz/1amYnSiYosvgZqKiouB8lE1Qcfo0mDMXQn88+33Y5sMNggifPjMLOEz+CVD8lzBFgvJEP3vxAfskbKL/ggdLeWdhyzgVFXU7I65y+LcgRYDxRDP3xinzAB6Hy+Z0OkLTbYeM3Nn9Ok1WOxMr2Ad9P4eX/PezKbrSeRqKEg7Rt38/6+eTvHIccN9uQGFFcgQdKe91zvPI6M6xpGHMgsVJy1jXCJ7+2YRyy6o3x/SsYC0Vdjnf45FfVmyBDe303Ei0cpEnap7rDyWdqb+iQ6NFDek7zBM5utJjn5Y+YrmVqR/ejZGPNMcvabG4k6//2SJECCcM/pH6Irx+EA9oAAAAASUVORK5CYII=

Control version and contributions using Git

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB70lEQVR4nO2W3S4DQRTH+x5c4glciWtEtTO8gdB1I7wEicQzeAART0CKK+0LcCG0qmdWUd+Jj5u/zLakqmtmt2tnMb/kJM20+Z05e+bMNpWyWCzaTJ6hlxM2OOFeBiNsTp2hPyk+ZTImUOcCaA25lq6gx7RPifek2pJ9JCWsm/Yp8drsn/DWtE8JJ9xFXECkPiVywPwSyuNg2qeEVzHABK46DV2mgj7TPi3k7SAHzGt/Iza6SZaO2GdJLJzAGGGXEx47DNwjJ+ywKjKmfN/CBVZ8b4uvsRy3T/mkAiRrhIuJuHxKvDYHTUjIx+VTwggPIRLet3sKjlsuOmIwU3qKxKdN4GTNaPcUHBf7jnszs1VDtvTUtU8bHbnc0PhB/VN0KkDG7oKLMEWkwqIjTx9eY2/+EsXchRcFp9aM82Y0Nu91YU4gvygwna8he/qajALkEy/m9AuQsbYqMHH0kIwCfn0HsuXnYDOwnbAZ4Nq3kLidDbF5nogCcqIk3wNhNs+TUMBP+f5+AUzgJUTC57h8SuTf2SBJ5W8ZYSkunzZfxFUMccJw2FZH7VPiJ46qgFSXPlsAtx1oYI+QH3aI27C3UFDsETJ+hAilj9c+odySsNKyfmzKp4QRRrnAKSecyM/v65MCY83NyO9GTPkslv/MG4nSHpylpkX1AAAAAElFTkSuQmCC

Full functionality clone of Spotify

data:image/png;base64,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

Developed with the best programming practices

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFZklEQVR4nO2XbWxTVRzGLyaomJgYE78YdaPjZWvXnjMWyKJRyDQwgjER3BedYZ+UBMGQGGx7O4ZiNAEBZwwhCqMbG2xjsMHG2q3b2G0HERyEtbcNoMGB8tY52ZxA6Xr7mNsXdtvetWVjMEyf5Pl0m/T3O+f0nn8ZJpVUUnmoUWvtCiVr78wyOP7NMvS2qljHy8zjEnVp70sq1n5JxTqgNIi1Q5RgHocoS/nns/V2XoSPEGB7h5ipntzSnmey9fzx7BC8VCDTYLcwUzm5H/VMV7F8czbLI0aAtfdnas/OYaZuME2td5QH4SMFsljHLRXreJWZylHr+S1qfRh+VEDJOrxKli9gpnLUOud6td6JWAG7X8nyK5mpHKJzFmn0vF9OQGng1zFTOUTvWqbWOUc0AfhoAftXj5qPwfGcNHSTNtjoXXRTSGtvfg95JWcgwkcLrC6rvOqxzH+0bxxY6QvoJheiwcX+Znobb2w4BRKClwqsKauEzzoPsJLbsNFPHw1899xnYaNn5OBvdC1G0VYTiM4VI1C8pR4ebj5go5KSAzhGnnt48D2502GjrXLwg9xCFNf0YkX1RSzfao0QWP61CUOdr0XBBytwpA8cnfx7AGCmoZtURoCHIG515eGL6irk7x1E/t6beGffZbz/fUcAfummY3C3L7r3Wb81toKVjAgc2QgwT0yegI1uk1vBES4Xq76rFi8lfFxuxptVA8iv+htLq6/hkx8b0GdeIgstK8KRdnTnvDgJ8ORzOXi/NQfsjh3hWzUw1xTvNGNJ1XUs2/cHzrUXJg3v54IVuogbHFn2AOHp+7BSv5zA5p82jw5lksmycHszGisLMWhSJQSWq9BF/QJHysArn5wYvDWnAFbijV15il3GksB7PVog23AWu38ogqtiJlwVCgwcVSYF7RfbJekxCqGT/AKLZnx3Bo7T+bDRYbkfXlPtaqhFWBmBLWVrQ/Cj7T+SlRSwP1Shc7S+DuIVOuhOdM7LxYm8GcnBd+dmCBxxy21918FiUNZ+byyQCpRuZ2PgA62ciSHxOCUBLIjtkLRdUoukbRRjCggcscjB25tWYEHJ6Yi5JiywdvO38vCh/lqdMTZ0R3LA4fpagx1bwEqHo+H7zAVYuPFEAD5aYOU3u8EbM+IKXKjKmDCwT6x5tIl3IHRWr7flY8mX3D14qcC7m+px1pgZF17slfq54wNujYT2mUJtiSOAjpw0gSNtAkeHByyvdxZs6hoQb9V54htmjwE3zItwu2MB+prfwlALxc0mJdyNWbh6cC4u1c7Gxf2zcH6vAuerFLi4bxb6G7Lgs5AJA/taKEaOhtocRyCcvHWXZxCd0xaeaXaVl8B/+kOgvxXoN8PfU5T4KMgAxzsWvjjAgTZRjByh8B5JQkCj4w9Jh7LrLYsC4Bg8GazblPAoPEhg7+FQG4ONC0+1zkKic0ZMle6WhbECiVb1AQJ7GyjuHiLBHiTxBYjO9XO0QPluneA/VQS4zUH4kx/Ir2o06ESAG0aBA60n8Ig9EEeArHeqAn9KpAI6Xsjb0LPSa6I1I2bql4UdCzQauGl8wB6xdQSe2mDjHZ9tUgG1nr9CtI7F4ecuY/pwX81sDDWq4G0m8LUQWcjwyo53hT1RwHdqQt0f7Ng7oHVeFQU0Wv5PjY5fk1b6+9PS5y5jukX6jj+3R+G7VpeJfxrUuHuYRIIGIO8TuE4eOLrxduAzjda5ataaC0/JPXdWpac5jelt4k44K2a2uozptoixoVLhc9dmYbhePQoahq4PQY8D+E6yAvebREJXqufYb9eRHZ46jcVTq/lrvMB3JksgkRBfoXhl0r4slVRSSSWVVJj/Qf4D+g2egDMettQAAAAASUVORK5CYII=

Cross platform with one codebase

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFRElEQVR4nO2Y2VNTZxiH2RPiP2B73ZlOZ4B2xlY708saBRQRsULYQUCQfaco9qbQaTu96lVnnOm0IFStkoU17BD2JXvY17jhgmj/gF/nO8nJOSc5cBJIuWm+mXP/PI/v971BPz/f8R3f8R3f8R32qTVE+1XprP5VOvhXzcO/cg7+FbMIKJ9BQPkUAsomEVg6gcCScQSWjCGweBRBRSMIKhxGUOEQggoGEXyzH8H5fQjO70VInhohN7oRktuFkNxOiHI6IMpuh+i6EuIsBcRZcogz2yDOeIzQ9L8Rmv4QoWkPEJp6H5KUVkhSWiBJvocTsmarJKE5yk/w1BisftUEXuskMI2AMieBYg1XgMAXDDACeUSghxHIoQVUTgKPIc54xBGQpP5lE0i2CyQ144Tsz203BPRwCFTaBAIqZngExpwEhngESH1GQEQESH22QGYbVyCNCNznEWgiAvBcgNRnCxD4Unp8NAgqIgLs8aEFep0EWOPjEJAz4+MQsI+PQ+AeJKS+2wLVevg7BOacBCZ5BJznf8Bp/nt45p8IKHgEHjoJsMfHTYH6xX/g/N1eeI9blveos7zDt+Y91Jr2UGN6i2rjW1QZdlGpf4MK/RuU616jTPsKpdpXKJl/ieK5lyia20Hh7AsUzLzAzZnnyJ9+jrypZ7gx9RS5k0+RM/GE+rLHrbg+to0szTYyNVvIGN1C+sgm0kY2kDq8gZShdSQPrXsmQIEv0ODvUGtmgRt3UWnYdYA74Odp+B0UzbLgpwn8Mxv8JAOfTcDHrcgaI+DbNvBRAr5pAx/eoMCTBteoz20BweoGVnXda57qOzzV7fCc6lY7PLv6Jqc6AZcNrCFxYFVYQKg6MzKs6tojVtdwqzvg7dVlA6tI7F9FQv+KsMChqs+7Vqfgp1jwB1Uf5VYntT//7gGkd0eo6gT8Wt8KvulbFhZgqu+hxkjgdz27qNOskeFUf8JTfcvlosr61xBe8QdOxjbgw7hGxHdZbPC9y7jauyQs4Gl1ZmQOVz15cB0XW6aoWSdjEmaHJ9+ZRjlV/SqBVy8hXr0oLMBXXXzHAr9ak1e+kHozp/pn1c0U7JeNcoSVO8Hbq8erl3ClZxFxPW4I2Krvcqp7C57+2M/jp3YB9ueAV7PguxdwuXtBWIBv1kVe/BcQ3TFznsfE/hVEVDcx8A1tLtUJeGyXBZe6LMICx7mUZPbnkdSOqGrC6e+d4O3VKfhOC2I6zcICZdrjW0oJrOeRXFQKXM2uTsObEdNhxsUOk7DAkatrXKvvt5Su9S3zXFTX6gT8QrsJ0e1GYQFvLyVPqsdxRoapTsGrjIhSGYQFvLmUyBvvWp1ZSvH7XNQLCgM+Kf0dZ37poKpHqYyIVBpwXumGwFGWkm1khKvTS+kKT3UC/1Heb9SL9EFsI849mrfBK/Q4p9ALC3Au6gHVD/rN7kn1GKURX/2qpsYlWs7An7zcgNM/qxh4uQ5SuU5YgHNRJ2zwonqz1/ZA8G0Tp/rHhXcp4LDaZg78Fz+pcF5pq07Ape4KsP9SItXJyHh7E9OzHtNpRkRdK3cT0/DUyDDgbgtwnkf7rJPfL977LWTiPo8qE8LrWhzwp35UuFT3SOC/XEqX9nselQaE32rFqR/kB8K7JXCcSynK8Ty6zvqhBY5zKUWynkd34N0SoJdSmpeWkq26mae6gQKnn0evCXhzKXFG5gjVpZ4IpI1sWA+7lFyqdzDVOfCHAJfKdTgr1wr/527S0EZU8uD6NgU+SFdfpcAdF5XnLyVvXlTpPvBfK3SRggK+4zu+4zu+8786/wLlOrgPlGKL2QAAAABJRU5ErkJggg==

Full coverage test suite

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFGklEQVR4nO2VS2hjVRjHL8KQ3OSmyU17E20HH+DA0Pf7nT50ShVx5RPFATcqLlwMiC50p1ini3GldtwpKo7MZKZWsE3apEmavtuk043CDIqIFAsyY22mHc/9yz03SW/aNDk3TR9KP/hBICH8/t/5vnM47riO67jyVgB3DyLSY4g6v8CSYxlR5y1EHbcQlZYRdXyOiNSr/IY7ioWI1I6ocxFLTlCijlQicRaleSxIrdxRKYRP8lhy9CHqJDukk+LSFosSsCDJWJAGsCwJhysfcT6JJenmrt3WSqdQBCwUAfNFv2LBfvZgpee4E7jufA4RxwRTt7Uo0lrmExQGMSc+q/x3fkdj0V6CiLMc153dWHKcw5J0FRFpNadupxcHZS7JH5izuzErnsNsYRdmxHKE7SWKiz75qHMiuYyZFjK3bm+XRpJZeyozCURgWgyyB0gnncuILGyTntcpPRNnWkXHCezbiMSxZxefTkWesukMsNcRyaXb0+nFE7AH0D0iRezSjN2WtUyqsAfY74Vk6LasEZcnrRR9AfZ5IVmlZYWwCnuAPS7k3Uk7bvtFrHqslNs+G+6GM0hPpREPb2OiQEeAPSzk3wEbxj87iTderkPvGRd6HmnD6y9VwnfxPqz5rfqkw6p4Ah0BclvIWFCE+8KD6DnTja6uLnR0dKC9vR1tbW1ob2vGt/0lWB9n67asJaTCHmDOHtO7kPKUiJvX7Hji8U50d3ejs7MTLpeLBmhtbUVzczO6XHW44baBpO20dVdxOWQBCVrW9QT4Xe9Cbk6I+Ob8Q7Tziry2+y0tLWhqakJDQwO+fK8YG4Hs3ZZDFpWgCglYfmMPMCNO672z7wRt+PidUzvkE91vbGxEfX09Pnrzftzx7yZdsEN8K4A5zB5g2j6g987eCNpwqf+B5Nikk6+trcVX79+LzUDmbssJAgoChQTMn+oIIL6g785W5/qXazb0PtpMxZWxScgro1NXV4eO1ir8fKUAJJhNXEhlXAAC5ufZA8yJVkyJG8yPTXye1/1WDF4opjeOMvNa+Yb6arjPO7A+lr3bclw6AfGbN+Gz2jg9RSZt7lzu7LWxAgQvFlFxZWwU+ZqaGgQH7FjzsnVbpphV/GYQn+myLnl1jGwdrC/k9oVcGbJQcWXmFfmqqiqsfCcwSAsp4gkwJrTpDqCegjXE8kJuX8iVIYGKV1dXU/mKigqsDApM3Za1+MwgY6ZATvL0FMLWWjJhJdmlUxdS6bYiXllZSeXLysqwMmhO321/OnEThfhMBH6+IecA9BRC1gHWxybB6vcCulpPU/HS0lJ0NJ/C6pA5a7fluDhlzKR0/5M9ydNTGHaaSajgp6x3tma2Y14B7r5CuJpOwdX0MNwfiIh5GKR9qrgqz99AiLPsOQANMVHQQEKWGOudrRDzCLTrCrGR9CMib5NW4UG8/Dp8fH1e5JMhgpazu97ZjAuZSVpWGKXyMjzGF/MqnwwxLryb8frLsJC7io+mAo/xbW4/i/iF/nx1W9bi5UE8hg+5gyj4TW/pWchM0rLXSCEeQ9+ByCdD+PjXiM9M9I6IKm7cEvca/4HX8OqBymtCPE18pjXWEdGKyx4jyIjxL3j4pw5FfiuEcJqM8ctM0nHxuPyPGD5Rzh2FUh4cMspfytTtLQwgI4avcTVPj1Q+C6P8M8RrWE0nTcWHDX9i2PAKd5QLI3wx8RiuJMVHVMiw4bLyHfdfKfxg6CEjhmUF5fNh+xzXcf1f619njg/WTL+5XAAAAABJRU5ErkJggg==

Focused on security

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAADqUlEQVR4nO2ZSU9TURTHC1RaSstUxpaH4gh8DVxIjDFxBwT8GgqCMpVBcQREwLF8AxVwSFgZtwwbkJZCCygtULVGlsfcN7T3Pd5Q4NyN6Un++9/v5JxzX/JMplSlKlVJVZX3z+WaydhGzeQfqPbGoOqNkAuvf/M5/4rkF5x7KeTsi59w5jlJFE5PCKkc3+NzaoxkF04+24WKUZId4J4KKR8Jh9wj4ToTdlVPxkLVXi14ObgWvAC+x4ML8DsUfATKRyLgHo6Ae2g7iC/gjcXh9bouwet1XYLn4l2n4IfD4BoKA7qA3sjodV1/ZCIUfDgOX/Zkm4WAHLyieRq4+nd8yuvfC2kgmeLjbpgWMyPmA7j4fARXo5RPUEZyfZYHl+CZCCi7ztW/xRNo/AyuIQG89DHJD3wBAk6PzHEFLn6NQu2XaFyAhi95xEBAuajHFSDwtZSABE5S/PA7CwH5omKPUAkFz0RAeWUqmmdQl7hYBC96QLKFL2B0HpO57cpFLVF0XYIvvM9AQA0+Aa5925XnUQ2+iAIncQ5u4gtUjtOfA7vAIb8DhRQ8IwH5yGAvsVMEL7hHsoEvoPwIw34HnBR8/l0GAge+IJHfgQIRnCRvIIQvoFxU7BHKp+Bz+5kIyK8M14T3DpQ2z0LeQAI+tz+ILyC/7eEj3Xbn4NaBWc8Xuy7B5/QF+aALYNx2JXyerOsJeEfvOr6A/EUNA9c0hTpCOTy4AG/3MBGQdx17iR0UvN2zhi+gHBnsd8Ahwmf3rPFBF1DOOvY7YKfgbd0BfAHlomKPUDYPLsBndTERkJ9HrmkadYltFDwTAe3bvpn0bZcvqnxkskRwa+cqH3SBo932oOy2KxfV1q0Ob+lgIKAGr9d1CV676wl4KwVu6fBD5h0/voBe1+mPMO2RMe66RYQ/cZuRAA2fANcYGU8AstsXhXSvasJbKHAB3scHXeBQi+oJwLWJRdiM7sNGdB+uji2Arcuv2/VMCt7czkAg2Y8wEtJ1Ai5VaO8vWFvndUbGFwc3t69ARtsKvoDeokrw0qLa2hZUBOYMu24W4dNvMRIwvu3CopKZJ2NDJAj8ldF5sHb4VOHNFLgA/40PusChb3unnx8bS8ucCK/f9QwRPq1VCLpAcrc9oHvblfAZcXAafhlMLcv4AmpdP+xt1xuZNNJ1Ai4Fuxy96yGjF9XotisXNZ0eGRr+5hL+Tz5HX6DO3rMWMvoI015Un2rX06SRoeFvLF1CF0hVqv7T+gdOdplkD8PfkAAAAABJRU5ErkJggg==

Song streaming with AWS services

data:image/png;base64,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

Agile development and team organization

data:image/png;base64,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

Added new functionality

Tech

Architecture

Global Architecture

architecture-diagram

Electron

Develop once and run everywhere is a must if you have a small team of developers. With Electron the application interface can access easily OS resources such as file explorer, clipboard, notification system... The app can be installed as a normal executable and loads significantly faster when it's build. Security is one of the most important Electron goals so every connection with the system OS must be declared beforehand in the preload file. Also both renderer and main threads work in isolation mode and must communicate with the Context Bridge via IPC (Inter-Process Comunication), this ensures security and stability of the app.

React with TypeScript

Runtime errors usually take longer to debug and can cause unexpected issues on production. By using TypeScript & EsLint the amount of bugs and other issues decreased by a lot. Thanks to the type safety and strict linter mode most of the runtime problems can be avoided and fixed in development, this also make the app more robust. React offers us abstraction, hierarchy of components and most important encapsulation between the components. This allows parallel development without making and impact on others code.

Interface

frontend architecture diagram

Graphical elements of the interface are developed using web tech like HTML and CSS, also the app uses components from MaterialUI and inline styles with Boostrap that speeds up the development process.

Python Backend API

Develop using FastAPI larger apps architecture with middlewares for allowing CORS requests and allow the user to reach certain resources with a JWT Token system. Song storage and retrieve of the streaming URL of the song is being made by calling an AWS Lambda function that acts as an API for reaching AWS components such as S3 Bucket Token and Cloudfront.

Middleware

The protection of the endpoint is being made thanks to a JWT Token system. The server on user's login issues a signed JWT Token containing user info and role that is going to be sent by the user on every request to the server. The check of token permissions is made in a middleware that checks the expire date, verifies the signed token and allows or not the request depending on users info.

AWS Lambda

song architecture diagram

This service is working like an API between the Backend and the AWS services. Songs are stored in S3 buckets and for streaming them we need cloudfront as a provider. Our Lambda function allows for a low use of AWS credits and works with the Python SDK Boto with an API Key and a static url.

MongoDB

Perfect for fast development and constant changing features. Stores hashed password from users and all the app data except from song files. Python Backend access the database by using PyMongo driver. It has different databases for both testing and production that are being selected by dependency inyection.

Backend Endpoints

backend-endpoint-diagram

Safety

All endpoints are protected by JWT Token Authorization, if you want to make requests to the API you will need to add the "Authorization" header to all requests.

API Documentation

API documentation is available by checking this page or running the backend and accessing http://127.0.0.1:8000/docs

🤖Github Actions CI/CD

Run tests

Runs both backend and frontend test suite everytime a pull request is created.

Force branch format

On every new branch created checks the if the name of the branch follows a pattern established on CONTRIBUTING.md

Generate backend docs

Everytime a branch is closed and has a merged status runs a script that updates the html file with Backend API documentation.

🧾Testing

Frontend

More than 85% coverage unit testing the component and pages of the interface with React Testing Library and Jest.

Backend

Almost 100% unit test coverage in all the methods that are being used in every endpoint using PyTest.