[{"data":1,"prerenderedAt":440},["ShallowReactive",2],{"posts":3},[4,41,230],{"id":5,"title":6,"body":7,"categories":27,"date":29,"description":30,"extension":31,"meta":32,"navigation":35,"path":36,"seo":37,"stem":38,"tags":39,"__hash__":40},"posts\u002Fposts\u002Fsoftware-revolution.md","The quiet revolution reshaping how we build software",{"type":8,"value":9,"toc":22},"minimark",[10,14,19],[11,12,13],"p",{},"Software development is changing faster than most of us can keep up with. Not in the loud, press-release way — but quietly, in the daily habits of working developers.",[15,16,18],"h2",{"id":17},"the-shift-nobody-announced","The shift nobody announced",[11,20,21],{},"It started with better tooling. Then smarter editors. Then something harder to name...",{"title":23,"searchDepth":24,"depth":24,"links":25},"",2,[26],{"id":17,"depth":24,"text":18},[28],"Technology","2026-03-25T00:00:00.000Z","A deep dive into the tools and workflows that are fundamentally changing the craft of programming — and what it means for developers everywhere.","md",{"readTime":33,"image":34},12,"\u002Fimages\u002Fposts\u002Fsoftware-revolution.jpg",true,"\u002Fposts\u002Fsoftware-revolution",{"title":6,"description":30},"posts\u002Fsoftware-revolution",null,"rNsQ-FzF7EDJDUjR0m7XGahvOQ7aLmY2HCntzdlOxhY",{"id":42,"title":43,"body":44,"categories":214,"date":216,"description":217,"extension":31,"meta":218,"navigation":35,"path":219,"seo":220,"stem":221,"tags":222,"__hash__":229},"posts\u002Fposts\u002Fsending-notifications-to-django-users.md","Sending Notifications to Django Users",{"type":8,"value":45,"toc":209},[46,50,53,58,69,102,109,118,121,125,128,171,182,186,189,195,202,205],[47,48,43],"h1",{"id":49},"sending-notifications-to-django-users",[11,51,52],{},"So, you want to notify the user via email or push notification or sms or whatsapp or whatever, after they did something on your website\u002Fapp.",[54,55,57],"h3",{"id":56},"installation","Installation",[11,59,60,61,65,66],{},"Install ",[62,63,64],"code",{},"mad_notifications"," from using ",[62,67,68],{},"pip install mad_notifications",[70,71,75],"pre",{"className":72,"code":73,"language":74,"meta":23,"style":23},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","INSTALLED_APPS = [\n    ...\n    'mad_notifications',\n]\n","python",[62,76,77,85,90,96],{"__ignoreMap":23},[78,79,82],"span",{"class":80,"line":81},"line",1,[78,83,84],{},"INSTALLED_APPS = [\n",[78,86,87],{"class":80,"line":24},[78,88,89],{},"    ...\n",[78,91,93],{"class":80,"line":92},3,[78,94,95],{},"    'mad_notifications',\n",[78,97,99],{"class":80,"line":98},4,[78,100,101],{},"]\n",[11,103,104,105,108],{},"update your project's ",[62,106,107],{},"urls.py"," and add",[70,110,112],{"className":72,"code":111,"language":74,"meta":23,"style":23},"path('notifications\u002F', include('mad_notifications.api.urls')),\n",[62,113,114],{"__ignoreMap":23},[78,115,116],{"class":80,"line":81},[78,117,111],{},[11,119,120],{},"Its installed now, what next?",[54,122,124],{"id":123},"basic-usage","Basic Usage",[11,126,127],{},"Call it where you want it.",[70,129,131],{"className":72,"code":130,"language":74,"meta":23,"style":23},"from mad_notifications.shorthand import newNotification\n\nreturn newNotification(\n    user = get_user_model(id=SOME_ID), # django user object\n    title = \"Welcome to my website\u002Fapp\", # string\n    content = \"Thanks for join my website\u002Fapp\", # string\n)\n",[62,132,133,138,143,148,153,159,165],{"__ignoreMap":23},[78,134,135],{"class":80,"line":81},[78,136,137],{},"from mad_notifications.shorthand import newNotification\n",[78,139,140],{"class":80,"line":24},[78,141,142],{"emptyLinePlaceholder":35},"\n",[78,144,145],{"class":80,"line":92},[78,146,147],{},"return newNotification(\n",[78,149,150],{"class":80,"line":98},[78,151,152],{},"    user = get_user_model(id=SOME_ID), # django user object\n",[78,154,156],{"class":80,"line":155},5,[78,157,158],{},"    title = \"Welcome to my website\u002Fapp\", # string\n",[78,160,162],{"class":80,"line":161},6,[78,163,164],{},"    content = \"Thanks for join my website\u002Fapp\", # string\n",[78,166,168],{"class":80,"line":167},7,[78,169,170],{},")\n",[11,172,173,174,177,178,181],{},"this will send an email to the user, where the ",[62,175,176],{},"title"," will be the subject and ",[62,179,180],{},"content"," will be the content.",[54,183,185],{"id":184},"push-notification","Push Notification",[11,187,188],{},"So you want to send them a push notification now? Okay I got you.",[11,190,191],{},[192,193,194],"strong",{},"Important: Make sure you have firebase already setup in your project.",[11,196,197,198,201],{},"From your mobile app, generate firebase device token, and post it to ",[62,199,200],{},"\u002Fnotifications\u002Fdevices\u002F"," this will automatically associate the device token with the user, based on the authorization headers.",[11,203,204],{},"Now when you send the notification, it will also send the push notification to that device.",[206,207,208],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":23,"searchDepth":24,"depth":24,"links":210},[211,212,213],{"id":56,"depth":92,"text":57},{"id":123,"depth":92,"text":124},{"id":184,"depth":92,"text":185},[215],"Development","2022-08-30T00:00:00.000Z","The article helps implementing notification sending to django >=3.2 user(s).",{},"\u002Fposts\u002Fsending-notifications-to-django-users",{"title":43,"description":217},"posts\u002Fsending-notifications-to-django-users",[223,224,225,74,226,227,228],"ux","django","cookiecutter","Mad Notifications","notifications","skim it","Yo9VDSndJJBxYaWnE_IpZAPYcGWrJ_2jPBwPLPr3w5w",{"id":231,"title":232,"body":233,"categories":426,"date":427,"description":428,"extension":31,"meta":429,"navigation":35,"path":430,"seo":431,"stem":432,"tags":433,"__hash__":439},"posts\u002Fposts\u002Fcookiecutter-django-with-amazon-rds.md","Cookiecutter Django With Amazon RDS",{"type":8,"value":234,"toc":421},[235,238,241,245,255,259,266,298,302,309,316,412,415,418],[47,236,232],{"id":237},"cookiecutter-django-with-amazon-rds",[11,239,240],{},"So, we need to connect our docker based django app to our RDS instance, here are the steps to do so.",[15,242,244],{"id":243},"step-1","Step 1",[11,246,247,248,251,252],{},"Remove ",[62,249,250],{},"DATABASE_URL=postgres:\u002F\u002Fpostgres"," from ",[62,253,254],{},".envs\u002F.production\u002F.django",[15,256,258],{"id":257},"step-2","Step 2",[11,260,261,262,265],{},"Update ",[62,263,264],{},".envs\u002F.production\u002F.postgres"," and setup your database credentials.",[70,267,271],{"className":268,"code":269,"language":270,"meta":23,"style":23},"language-env shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","POSTGRES_HOST=              # db host\nPOSTGRES_PORT=              # db port\nPOSTGRES_DB=                # db name\nPOSTGRES_USER=              # db user\nPOSTGRES_PASSWORD=          # db pass\n","env",[62,272,273,278,283,288,293],{"__ignoreMap":23},[78,274,275],{"class":80,"line":81},[78,276,277],{},"POSTGRES_HOST=              # db host\n",[78,279,280],{"class":80,"line":24},[78,281,282],{},"POSTGRES_PORT=              # db port\n",[78,284,285],{"class":80,"line":92},[78,286,287],{},"POSTGRES_DB=                # db name\n",[78,289,290],{"class":80,"line":98},[78,291,292],{},"POSTGRES_USER=              # db user\n",[78,294,295],{"class":80,"line":155},[78,296,297],{},"POSTGRES_PASSWORD=          # db pass\n",[15,299,301],{"id":300},"step-3","Step 3",[11,303,304,305,308],{},"Comment or remove Postgres volumes and services from ",[62,306,307],{},"production.yml"," file.",[11,310,311,312,315],{},"You will have to remove the complete ",[62,313,314],{},"postgres"," service.",[70,317,321],{"className":318,"code":319,"language":320,"meta":23,"style":23},"language-yml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Filename: \u002Fproduction.yml`\n\nvolumes:\n    # production_postgres_data: {} ## Remove or comment this\n    # production_postgres_data_backups: {} ## Remove or comment this\n...\nservices:\n  django: &django\n    depends_on:\n      # - postgres ## Remove or comment this\n\n# postgres: ## Remove or comment this whole block\n    ...\n","yml",[62,322,323,329,333,343,348,353,359,366,382,390,396,401,406],{"__ignoreMap":23},[78,324,325],{"class":80,"line":81},[78,326,328],{"class":327},"sHwdD","# Filename: \u002Fproduction.yml`\n",[78,330,331],{"class":80,"line":24},[78,332,142],{"emptyLinePlaceholder":35},[78,334,335,339],{"class":80,"line":92},[78,336,338],{"class":337},"swJcz","volumes",[78,340,342],{"class":341},"sMK4o",":\n",[78,344,345],{"class":80,"line":98},[78,346,347],{"class":327},"    # production_postgres_data: {} ## Remove or comment this\n",[78,349,350],{"class":80,"line":155},[78,351,352],{"class":327},"    # production_postgres_data_backups: {} ## Remove or comment this\n",[78,354,355],{"class":80,"line":161},[78,356,358],{"class":357},"sBMFI","...\n",[78,360,361,364],{"class":80,"line":167},[78,362,363],{"class":337},"services",[78,365,342],{"class":341},[78,367,369,372,375,379],{"class":80,"line":368},8,[78,370,371],{"class":337},"  django",[78,373,374],{"class":341},":",[78,376,378],{"class":377},"s7zQu"," &",[78,380,381],{"class":357},"django\n",[78,383,385,388],{"class":80,"line":384},9,[78,386,387],{"class":337},"    depends_on",[78,389,342],{"class":341},[78,391,393],{"class":80,"line":392},10,[78,394,395],{"class":327},"      # - postgres ## Remove or comment this\n",[78,397,399],{"class":80,"line":398},11,[78,400,142],{"emptyLinePlaceholder":35},[78,402,403],{"class":80,"line":33},[78,404,405],{"class":327},"# postgres: ## Remove or comment this whole block\n",[78,407,409],{"class":80,"line":408},13,[78,410,89],{"class":411},"sbssI",[11,413,414],{},"Your Django app should now connect to your RDS database in production.",[11,416,417],{},"Feel free to leave any feedback or queries.",[206,419,420],{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":23,"searchDepth":24,"depth":24,"links":422},[423,424,425],{"id":243,"depth":24,"text":244},{"id":257,"depth":24,"text":258},{"id":300,"depth":24,"text":301},[215],"2021-04-02T00:00:00.000Z","This article will assist you in setting up your docker based Django cookiecutter app with a Postgres database on Amazon RDS, also works with other hosted databases.",{},"\u002Fposts\u002Fcookiecutter-django-with-amazon-rds",{"title":232,"description":428},"posts\u002Fcookiecutter-django-with-amazon-rds",[434,435,436,224,225,74,437,438],"Amazon","AWS","RDS","Postgres","docker","hbrZZx_hIjntkKCa0KVFlBhrfmZgfKoFge5tmAmqyNw",1775372012245]