<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Marian Ignev - SashiDo.io | API Development, Deployment and Scaling made simple.]]></title><description><![CDATA[SashiDo.io is a serverless API development platform with scalable json rest and graphql apis, headless cms, built with nodejs, mongodb, parse server, kubernetes and docker.]]></description><link>https://blog.sashido.io/</link><image><url>https://blog.sashido.io/favicon.png</url><title>Marian Ignev - SashiDo.io | API Development, Deployment and Scaling made simple.</title><link>https://blog.sashido.io/</link></image><generator>Ghost 1.20</generator><lastBuildDate>Tue, 26 May 2026 05:00:44 GMT</lastBuildDate><atom:link href="https://blog.sashido.io/author/mignev/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[The Myth Is Dead: You Can Now Build Fast, Cheap, and Good]]></title><description><![CDATA[The “pick two” era is over. Learn how Vibe Coding and platforms like SashiDo are letting devs build faster, better, and cheaper - all at once.]]></description><link>https://blog.sashido.io/the-lie-we-all-believed-cheap-fast-quality-software-vibe-coding/</link><guid isPermaLink="false">68f1153a6d54a00020696f89</guid><category><![CDATA[Vibe Coding]]></category><category><![CDATA[ChatGPT]]></category><category><![CDATA[Cursor]]></category><category><![CDATA[AI]]></category><category><![CDATA[engineering]]></category><dc:creator><![CDATA[Marian Ignev]]></dc:creator><pubDate>Tue, 25 Nov 2025 15:36:23 GMT</pubDate><media:content url="https://media-blog.sashido.io/content/images/2025/11/Join-SashiDo-s-Referral-Program--4-.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><img src="https://media-blog.sashido.io/content/images/2025/11/Join-SashiDo-s-Referral-Program--4-.png" alt="The Myth Is Dead: You Can Now Build Fast, Cheap, and Good"><p>Yeah, it might sound clickbaity, but think about it for a second. For as long as most of us can remember, developers have been haunted by an age-old constraint: fast, cheap, or good. Pick two.</p>
<p>We repeated it like gospel. We built project timelines around it. We gave it to stakeholders as the excuse for late nights and budget overruns.</p>
<p>But something’s changed. The game has shifted.</p>
<p>And that myth? It’s officially dead.</p>
<p>Let me show you why.</p>
<h1 id="thepicktworulethatruledusall">The &quot;Pick Two&quot; Rule That Ruled Us All</h1>
<p>You’ve heard it a thousand times:</p>
<blockquote>
<p>Want it fast and cheap? It won't be good.<br>
Want it good and fast? Open your wallet.<br>
Want it good and cheap? See you in a year.</p>
</blockquote>
<p>For decades, this wasn't just a saying. It was reality. A law of nature in software development.<br>
<img src="https://media-blog.sashido.io/content/images/2025/11/pexels-karola-g-7681099.jpg" alt="The Myth Is Dead: You Can Now Build Fast, Cheap, and Good"></p>
<h6 id="photobykarolag"><a href="https://www.pexels.com/photo/woman-in-black-shirt-tearing-a-paper-7681099/">Photo by Karola G</a></h6>
<p>But like all laws, it only lasts until someone rewrites the rules.</p>
<p>Enter: <strong>Vibe Coding</strong>.</p>
<h1 id="rewindto2015buildingwasabattle">Rewind to 2015: Building Was a Battle</h1>
<p>Imagine you're a solo founder in 2015. You've got a spark of an idea - a collaborative app, maybe a slick dashboard, maybe a tool to bring people together.</p>
<p>You're dreaming big. But to make it real? That dream has to pass through a minefield of core points you need to fiugre out, design, configure and execute:</p>
<ul>
<li>Backend logic</li>
<li>Authentication</li>
<li>iOS and Android frontends</li>
<li>Admin panels</li>
<li>Payments</li>
<li>Real-time sync</li>
</ul>
<p>You hit Upwork. You hire freelancers in different time zones. You chase deadlines, quality slips, and you lose sleep over merge conflicts.</p>
<p>After weeks,sometimes months, you've spent thousands of dollars. And the result? A barely functional MVP that kind of works... until it doesn't.</p>
<p>You didn’t fail because your idea wasn’t good. You failed because building good software was just that hard and the <strong>system was broken.</strong></p>
<h1 id="fastforwardtonowwelcometovibecoding">Fast-forward to Now: Welcome to Vibe Coding</h1>
<p>It’s the end of 2025. Same idea. Same ambition. But this time, you open your LLM interface and:</p>
<ul>
<li>Instead of managing people, you’re managing <strong>agents</strong>.</li>
<li>Instead of writing boilerplate, you’re designing <strong>workflows</strong>.</li>
<li>Instead of chaos, you’ve got <strong>orchestration</strong>.<br>
<img src="https://media-blog.sashido.io/content/images/2025/11/pexels-darlene-alderson-4385997.jpg" alt="The Myth Is Dead: You Can Now Build Fast, Cheap, and Good"></li>
</ul>
<h6 id="photobydarlenealderson"><a href="https://www.pexels.com/photo/a-woman-typing-on-her-laptop-4385997/">Photo by Darlene Alderson</a></h6>
<p>Then you just say something like:</p>
<blockquote>
<p>&quot;I want to build a collaborative note-taking app. Split it into phases. Backend on <a href="https://sashido.io/">SashiDo</a>, frontend in React, mobile via Capacitor. Postgres for data. Auth, tests, SDKs, and a CLI tool, too.&quot;</p>
</blockquote>
<p>No cold emails. No flaky devs. No boilerplate from scratch. Just like that, your software pipeline activates.</p>
<p>Not just code. A process.</p>
<p>It doesn’t feel like you’re building an app. It feels like you’re assembling a machine that builds apps.</p>
<h1 id="whatactuallychanged">What Actually Changed?</h1>
<p>Let’s get real: this isn’t just about AI writing code faster.</p>
<p>This is about <strong>how you build</strong>.</p>
<p>Old-school development was linear. You moved from PM to dev to QA to deploy like parts on a conveyor belt. And every handoff came with friction.</p>
<p>With Vibe Coding, you build <strong>workflows</strong> instead of writing tickets. You split your app into smart, orchestrated pieces. Each one is executed by a specialized agent, designed to work autonomously but in sync.</p>
<p>Suddenly, you're not managing chaos. You're designing harmony.</p>
<h1 id="yournewworkflowmightlooklikethis">Your New Workflow Might Look Like This:</h1>
<p>Let’s say you’re building that same note-taking app. Here’s how your workflow might run:</p>
<h3 id="1planthearchitecture">1. Plan the Architecture</h3>
<p>Not just “build a feature” - you split it into micro-projects:</p>
<ul>
<li>Backend logic</li>
<li>Frontend rendering</li>
<li>SDKs</li>
<li>CLI tools</li>
<li>API docs</li>
</ul>
<p>Each is treated as its own mini-project, with clear boundaries and expectations.</p>
<h3 id="2usespecializedagents">2. Use Specialized Agents</h3>
<p>Assign <strong>Different Specialized Agents</strong> to handle seprately:</p>
<ul>
<li>A planning agent to scope work</li>
<li>Implementation agents to code it</li>
<li>Testing agents to validate it</li>
<li>Review agents to sanity check it(in <em>fresh context</em>, to avoid bias)</li>
</ul>
<p>Each one works in parallel— no waiting for the next.<br>
<img src="https://media-blog.sashido.io/content/images/2025/11/eric-krull-Ejcuhcdfwrs-unsplash.jpg" alt="The Myth Is Dead: You Can Now Build Fast, Cheap, and Good"><br>
Photo by <a href="https://unsplash.com/@ekrull?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Eric Krull</a> on <a href="https://unsplash.com/photos/blue-and-purple-robot-toy-Ejcuhcdfwrs?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a></p>
<h3 id="3runasync">3. Run Async</h3>
<p>Your frontend and backend are built in parallel. At the same time - test agent runs separately and docs are auto-generated while code is reviewed.</p>
<h3 id="4reviewlikealeadengineer">4. Review Like a Lead Engineer</h3>
<p>You're not just hoping it works. You verify:</p>
<ul>
<li>Test coverage?</li>
<li>Edge cases?</li>
<li>Compliance with best practices?**</li>
</ul>
<p>You ask agents to simulate load. To suggest improvements. To raise flags.</p>
<p>And just like that, you’re not coding at hyperspeed. You’re designing systems at scale.</p>
<h1 id="whythisisntjustbetterprompting">Why This Isn’t Just “Better Prompting”</h1>
<p>Let’s be clear: this isn’t about writing better prompts. This is about building intelligent workflows.</p>
<p>Because once you do, the cost drops. The speed jumps. And yes, the quality increases.</p>
<p>Your value as a developer isn’t how fast you type anymore. It’s how well you:</p>
<ul>
<li>Architect workflows</li>
<li>Embed best practices</li>
<li>Run everything asynchronously</li>
<li>Decoupling tasks</li>
<li>Testing in isolation</li>
<li>Running async</li>
<li>Iterate intelligently</li>
</ul>
<p>You’re not cutting corners. You’re cutting friction.<br>
<img src="https://media-blog.sashido.io/content/images/2025/11/pexels-cottonbro-9665381.jpg" alt="The Myth Is Dead: You Can Now Build Fast, Cheap, and Good"><br>
<a href="https://www.pexels.com/photo/flashing-sparks-coming-from-the-angle-grinder-9665381/">Photo by cottonbro studio</a></p>
<h1 id="fromcomplexitytoclarity">From Complexity to Clarity</h1>
<p>In the old world, planning meant whiteboards, spreadsheets, and days of meetings. Now? One well-structured request to a planning agent.</p>
<p>Dev used to mean line-by-line implementation. Now? Your intent is scaffolded in seconds.</p>
<p>Testing? Used to be late-stage and error-prone. Now it’s continuous and AI-driven.</p>
<p>Thousands of dollars in dev hours turnes into $5–$50 per workflow cycle.</p>
<p>Speed of development turns from weeks or months to hours or days.</p>
<p>And all that rework? Gone.</p>
<p>Everything flows in sync. Reviewers check code without context bias. Documentation is generated in real time. Deployments happen on demand.<br>
<img src="https://media-blog.sashido.io/content/images/2025/11/joylynn-goh-3n0eLNWwWrU-unsplash.jpg" alt="The Myth Is Dead: You Can Now Build Fast, Cheap, and Good"><br>
Photo by <a href="https://unsplash.com/@joylynn_goh?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Joylynn Goh</a> on <a href="https://unsplash.com/photos/a-pair-of-sunglasses-on-a-city-street-3n0eLNWwWrU?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a></p>
<h1 id="butwaitisthecodeactuallygood">But Wait - Is the Code Actually <em>Good</em>?</h1>
<p>Not always. But guess what?</p>
<blockquote>
<p>Most human-written code isn't that good either.</p>
</blockquote>
<p>What matters is that Vibe Coding gives you the framework to:</p>
<ul>
<li><strong>Bake in quality</strong> from the start</li>
<li><strong>Enforce structure</strong> and conventions</li>
<li><strong>Test continuously</strong>, not just at the end</li>
<li><strong>Version and rollback</strong> with clear checkpoints</li>
</ul>
<p>Yes, you still need understadning of how things works. You need to know what “good” looks like.<br>
But with the right workflow, you can enforce good even if you’re not a senior engineer (yet).</p>
<h1 id="whythisisthegoldeneraforindiebuilders">Why This Is the Golden Era for Indie Builders</h1>
<p>Let’s be brutally honest. The real bottleneck in shipping ideas has never been the idea itself. It’s the process.</p>
<p>Most indie projects die in the gap between version 0.1 and version 1.0.</p>
<p>Vibe Coding closes that gap. You no longer need a full dev team. You don’t need $50K in pre-seed funding. You don’t need six months of sleepless dev nights.</p>
<p>You need:</p>
<ul>
<li>A clear idea</li>
<li>A smart workflow</li>
<li>A hosting environment like <strong><a href="https://www.sashido.io/en/">SashiDo</a></strong> to deploy &amp; host it all</li>
</ul>
<p>That’s it.</p>
<p>You can launch. You can scale. You can build a business in fraction of the time and costs compared to old times.<br>
<img src="https://media-blog.sashido.io/content/images/2025/11/pexels-tima-miroshnichenko-5380677.jpg" alt="The Myth Is Dead: You Can Now Build Fast, Cheap, and Good"><br>
<a href="https://www.pexels.com/photo/people-in-black-hoodie-celebrating-their-success-5380677/">Photo by Tima Miroshnichenko</a></p>
<h1 id="onelastthought">One Last Thought</h1>
<p>You don’t need to be the most senior engineer in the room anymore. But you <strong>do</strong> need to be the one with the <strong>best workflow</strong>. Because in this new era - <strong>workflow eats code for breakfast</strong>.</p>
<h1 id="readytobuildsmarter">Ready to Build Smarter?</h1>
<p>Launch your next idea with Vibe Coding workflows and deploy it on SashiDo.</p>
<ul>
<li>Fully managed backend</li>
<li>Static hosting for your frontend</li>
<li>API-ready out of the box</li>
<li>Scales with your business</li>
</ul>
<p>🚀 <strong>Deploy your app with SashiDo in minutes.</strong><br>
Start your <a href="http://dashboard.sashido.io/register">Free Trial Now</a>.<br>
And here is a quick <a href="https://blog.sashido.io/sashidos-getting-started-guide/">Getting Started Guide</a> for a smooth take off.</p>
<p>Happy Coding!</p>
</div>]]></content:encoded></item><item><title><![CDATA[How to Set Up Cursor to Self-Improve Its Rules and Supercharge Your Codebase Automatically]]></title><description><![CDATA[Learn how to set up a feedback loop in Cursor that helps your AI assistant evolve its rules automatically based on real patterns in your SashiDo-powered codebase. Less manual work, more intelligent automation.]]></description><link>https://blog.sashido.io/cursor-self-improving-rules/</link><guid isPermaLink="false">68eeba896d54a00020696f71</guid><category><![CDATA[Tutorial]]></category><category><![CDATA[Cloud Code]]></category><category><![CDATA[Vibe Coding]]></category><category><![CDATA[ChatGPT]]></category><category><![CDATA[AI]]></category><category><![CDATA[Cursor]]></category><category><![CDATA[engineering]]></category><dc:creator><![CDATA[Marian Ignev]]></dc:creator><pubDate>Thu, 16 Oct 2025 16:05:13 GMT</pubDate><media:content url="https://media-blog.sashido.io/content/images/2025/10/Join-SashiDo-s-Referral-Program--2-.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><img src="https://media-blog.sashido.io/content/images/2025/10/Join-SashiDo-s-Referral-Program--2-.png" alt="How to Set Up Cursor to Self-Improve Its Rules and Supercharge Your Codebase Automatically"><p>Let’s be real, writing rules manually for your AI assistant in 2025 is starting to feel a lot like coding without version control in 2010.</p>
<p>Still doing it? You’re not alone.<br>
Still doing it manually? There's a better way.</p>
<p>If you're working with Cursor(or planning to) and your SashiDo-powered backend or fullstack app, this guide will walk you through how to make your Cursor rules evolve automatically based on how your codebase grows.</p>
<p>Yes, you read that right - <strong>your codebase can start teaching itself</strong>! And it only takes one file to unlock that capability. Let me show you how.</p>
<h1 id="buildaselfimprovingaicodebasewithcursor">Build a Self-Improving AI Codebase with Cursor</h1>
<p>You might already know Cursor lets you define <code>.mdc</code> rules—markdown-based config files that guide your AI assistant. But one rule takes things to another level: the <strong>self-improvement rule</strong>.</p>
<p><img src="https://media-blog.sashido.io/content/images/2025/10/pexels-tara-winstead-8386440.jpg" alt="How to Set Up Cursor to Self-Improve Its Rules and Supercharge Your Codebase Automatically"></p>
<h6 id="photobytarawinstead"><a href="https://www.pexels.com/photo/robot-pointing-on-a-wall-8386440/">Photo by Tara Winstead</a></h6>
<p>This is how you create a feedback loop that:</p>
<ul>
<li>Helps Cursor <em>learn from your patterns</em></li>
<li>Prevents repeating the same prompts</li>
<li>Boosts your dev velocity on autopilot</li>
</ul>
<p>Let’s walk through the steps together.</p>
<h1 id="step1definethefoundationalrules">Step 1:Define the Foundational Rules</h1>
<p>Create <code>cursor-rules.mdc</code> file to teach Cursor <em>how to process, format, and locate other rules</em> in your project. Without it, Cursor is essentially guessing. With it, you're giving it a playbook of your structure and training it to follow it exactly.</p>
<p>File: <code>.cursor/rules/cursor-rules.mdc</code></p>
<script src="https://gist.github.com/mignev/b7de3fc1a1543c8bb345dd35f18ec6aa.js"></script>
<blockquote>
<p>Tip: Keep examples relevant and up to date.</p>
</blockquote>
<h1 id="step2createtheselfevolvingbrain">Step 2: Create the Self-Evolving Brain</h1>
<p>Once the foundational rules are in place, it’s time to add a <code>self-improvement.mdc</code> file to set up the feedback loop. These rules tells Cursor to analyze your codebase over time, learn from recurring patterns, and recommend or evolve new rules.<br>
<img src="https://media-blog.sashido.io/content/images/2025/10/pexels-thisisengineering-3861970.jpg" alt="How to Set Up Cursor to Self-Improve Its Rules and Supercharge Your Codebase Automatically"><br>
<a href="https://www.pexels.com/photo/woman-in-black-sleeveless-top-writing-on-whiteboard-3861970/">Photo by ThisIsEngineering</a></p>
<p>File: <code>.cursor/rules/self-improvement.mdc</code></p>
<script src="https://gist.github.com/mignev/6fe7d7f03cdbcb68a303bb594e2de788.js"></script>
<h1 id="makerulemaintenanceahabit">Make Rule Maintenance a Habit</h1>
<p>Rules are not a set-and-forget operation. Like your codebase, your rule system should evolve with your team, your tech stack, and your workflows. Treat your rules as part of your product.</p>
<p>Here’s how to build a culture of ongoing refinement:</p>
<h3 id="monitoranditerate">Monitor and Iterate</h3>
<ul>
<li>Watch PR comments - If reviewers keep pointing out the same issue, that’s a rule waiting to be created.</li>
<li>Track onboarding questions - When new devs get stuck or ask for clarification, your rules (or docs) probably need an update. Keep track of onboarding questions from new developers</li>
<li>Update rules after large-scale refactors - Big refactors change structure and logic. Make sure the rules reflect those shifts.</li>
<li>Cross-reference related rules to improve discoverability - Rules are more useful when they connect to deeper references, examples, or related context.<br>
<img src="https://media-blog.sashido.io/content/images/2025/10/pexels-mikhail-nilov-6963098.jpg" alt="How to Set Up Cursor to Self-Improve Its Rules and Supercharge Your Codebase Automatically"><br>
<a href="https://www.pexels.com/photo/man-in-blue-crew-neck-shirt-wearing-black-framed-eyeglasses-6963098/">Photo by Mikhail Nilov</a></li>
</ul>
<h3 id="handleruledeprecation">Handle Rule Deprecation</h3>
<p>Not all rules age well. And as we all know tech evolves fast so best practices shift as well. Clean out the stale stuff and do it regularly.</p>
<ul>
<li>Mark outdated practices - Add a deprecated notice at the top.</li>
<li>Update deprecated rules - Modernize where possible.</li>
<li>Document migration paths - If rules are being retired, explain what to do instead and where it’s documented.</li>
</ul>
<p>Rules should never be a liability. Make them an asset—living documentation that grows smarter and improves with your team and projects.</p>
<p>Follow <code>cursor-rules.mdc</code> for proper structure and consistency.</p>
<h1 id="wrapup">Wrap-Up</h1>
<p>The smartest developers don’t just ship code. They build systems that teach the next dev, the AI assistant, and their future selves how to think.</p>
<p>By connecting <code>cursor-rules.mdc</code> with <code>self-improvement.mdc</code>, you're not just writing rules, you’re building a <strong>feedback-powered rule engine</strong> that teaches itself, helping your team stay consistent, efficient, and forward-moving.</p>
<p>No more repetitive code reviews. No more retraining your AI every time you switch context. Just structured, automated, and evolving workflows that scale.</p>
<p>Start building smarter today. Let your codebase grow its own brain.</p>
<blockquote>
<p>🚀 Deploy your app with SashiDo in minutes. Start your <a href="http://dashboard.sashido.io/register">Free Trial Now</a>. And here is a quick <a href="https://blog.sashido.io/sashidos-getting-started-guide/">Getting Started Guide</a> for a smooth take off.</p>
</blockquote>
<p>Happy Coding!</p>
<h6 id="thisselfimprovingrulessetupwasinspiredbyrealworldexamplesfromdanmindrupageuiopensourcerepo">This self-improving rules setup was inspired by real-world examples from <a href="https://github.com/danmindru/page-ui">danmindru/page-ui</a> open-source repo.</h6>
<h6 id="ifyoulikedthispostyoumightwanttoalsocheckout">If you liked this post, you might want to also check out:</h6>
<p><em><a href="https://blog.sashido.io/10-pro-tips-to-master-cursor-agent/">10 Pro Tips to Master Cursor Agent (and Boost Your Coding Flow)</a><br>
<a href="https://blog.sashido.io/vibe-coding-with-cursors-tutorial-and-best-practices/">Vibe Coding with AI Agents: Best Practices for Using Cursor with Node.js and SashiDo - Part 1</a><br>
<a href="https://blog.sashido.io/vibe-coding-with-ai-agents-a-non-developers-journey-to-shipping-an-mvp-on-sashido-part-2/">Vibe Coding with AI Agents: A Non-Developer’s Journey to Shipping an MVP on SashiDo - Part 2</a><br>
<a href="https://blog.sashido.io/how-to-master-vibe-coding-best-practices-and-useful-ai-tool/">How to Master Vibe Coding: Best Practices and Useful AI Tool</a></em></p>
</div>]]></content:encoded></item><item><title><![CDATA[10 Pro Tips to Master Cursor Agent (and Boost Your Coding Flow)]]></title><description><![CDATA[Boost productivity with these 10 expert Cursor Agent tips. Learn how to plan, automate, and prototype faster. Code smarter, not harder!]]></description><link>https://blog.sashido.io/10-pro-tips-to-master-cursor-agent/</link><guid isPermaLink="false">68ed2ec96d54a00020696f66</guid><category><![CDATA[Tutorial]]></category><category><![CDATA[Vibe Coding]]></category><category><![CDATA[ChatGPT]]></category><category><![CDATA[GPTs]]></category><category><![CDATA[AI]]></category><dc:creator><![CDATA[Marian Ignev]]></dc:creator><pubDate>Tue, 14 Oct 2025 10:22:48 GMT</pubDate><media:content url="https://media-blog.sashido.io/content/images/2025/10/cursor-pro-tips-cover.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><img src="https://media-blog.sashido.io/content/images/2025/10/cursor-pro-tips-cover.png" alt="10 Pro Tips to Master Cursor Agent (and Boost Your Coding Flow)"><p>If you're using Cursor as your AI code assistant, you're already ahead of the game. Gone are the days of coding solo in the dark. With Cursor AI, your editor becomes your smartest teammate - one that can read your codebase, suggest improvements, and help you ship features faster and cleaner.</p>
<p>Whether you're a developer working solo, an indie hacker, a startup founder, or a team sprinting on a platform like SashiDo, these tips will help you go from using Cursor to mastering it. Let’s dive into the techniques that will optimize your workflow and enhance your coding rhythm.</p>
<h1 id="1useplanmodeasyouraiarchitect">1. Use Plan Mode as Your AI Architect</h1>
<p><img src="https://media-blog.sashido.io/content/images/2025/10/cursor-agent-plan-mode.png" alt="10 Pro Tips to Master Cursor Agent (and Boost Your Coding Flow)"></p>
<p>One of the most underused features in Cursor is Plan Mode. It’s designed to take the heavy lifting off your shoulders by generating clear and actionable implementation strategies.</p>
<p>Hit <code>Cmd + N</code> for a new chat, then <code>Shift + Tab</code> to switch into Plan Mode. The agent will:</p>
<ol>
<li>Read and analyze your codebase</li>
<li>Understand your app's structure</li>
<li>Propose a clean, actionable implementation plan</li>
</ol>
<p>This is your secret weapon for shipping new pages, integrations, or UI flows without overprompting.</p>
<blockquote>
<p>💡 Pro Tip: The best results come when you let the agent take the lead initially. You can always tweak the plan later, but avoid micromanaging the AI from the start.</p>
</blockquote>
<h1 id="2masterthecontextmenu">2. Master the Context Menu</h1>
<p>Type <code>@</code> in the chat to summon a context menu with <strong>files</strong>, <strong>folders</strong>, <strong>branches</strong>, <strong>past chats</strong>, and <strong>docs</strong>.</p>
<p>This lets you direct the agent’s attention precisely and avoids context overload.</p>
<p>Whether you're reviewing a specific branch, referencing past conversations, or pulling in errors from a linter, the context menu keeps your development focused and efficient.</p>
<p><img src="https://media-blog.sashido.io/content/images/2025/10/tip-2.png" alt="10 Pro Tips to Master Cursor Agent (and Boost Your Coding Flow)"></p>
<h1 id="3createcustomslashcommands">3. Create Custom Slash Commands</h1>
<p>Define your own workflows with <code>/commands</code> and lets cursor to automate repetitive work.</p>
<p>Create a folder of markdown-based commands like <code>/pr</code> for auto-generating PRs. This is a great way to maintain team standards while freeing up your time to focus on logic and implementation</p>
<p>Automate away the boring stuff so you can focus on the hard stuff!</p>
<p><img src="https://media-blog.sashido.io/content/images/2025/10/cursor-commands.png" alt="10 Pro Tips to Master Cursor Agent (and Boost Your Coding Flow)"></p>
<h1 id="4pasteimagesforuihelp">4. Paste Images for UI Help</h1>
<p>Trying to clone a design or get visual inspiration? Paste a UI screenshot directly into the chat and ask Cursor to replicate the layout.</p>
<p>For example, you might say:</p>
<p>*&quot;Make my Top Artists page look like this.&quot; *</p>
<p>Cursor will then generate a matching layout, adjusting components and configs as needed. This feature is particularly useful for frontend developers working with SashiDo to quickly prototype screens.</p>
<p>Go from Design inspiration to functional UI, instantly!</p>
<blockquote>
<p>💡 Pro Tip: Sometimes, if the LLM doesn’t quite get what you’re trying to explain, it’s much more effective to attach a visual example instead.</p>
</blockquote>
<h1 id="5duplicatechatsstrategically">5. Duplicate Chats Strategically</h1>
<p>Instead of cluttering your main thread with multiple directions, use the duplicate chat feature to experiment. It works like forking your development process - giving you space to test, iterate, and compare results without losing your main conversation.</p>
<p>This strategy is especially useful when exploring alternative solutions to complex UI or backend logic.</p>
<p><img src="https://media-blog.sashido.io/content/images/2025/10/duplicate-chat.gif" alt="10 Pro Tips to Master Cursor Agent (and Boost Your Coding Flow)"></p>
<h1 id="6watchthecontextwindow">6. Watch the Context Window</h1>
<p>Your context window is like memory bandwidth - keep it lean for best results when it gets full, quality drops.</p>
<p>To keep the conversation sharp, use /summarize to condense earlier parts of the chat or simply start fresh threads for new features.</p>
<p>Fresh contexts yield clearer, more actionable responses.</p>
<h1 id="7monitorusagelimits">7. Monitor Usage Limits</h1>
<p>If you're on a metered plan, toggle Usage Summary to track percentage, reset time, and model usage.</p>
<p>Perfect for cost-conscious startups and indie devs scaling efficiently.<br>
Helpful for teams and budget-conscious devs.</p>
<p><img src="https://media-blog.sashido.io/content/images/2025/10/usage.png" alt="10 Pro Tips to Master Cursor Agent (and Boost Your Coding Flow)"></p>
<h1 id="8learntheshortcuts">8. Learn the Shortcuts</h1>
<p>Speed is life. Here are a few favs:</p>
<p><code>Cmd + I</code> -&gt; Open agent<br>
<code>Cmd + /</code> -&gt; Switch model (GPT-5, Claude, etc.)<br>
<code>Cmd + N</code> -&gt; New chat</p>
<blockquote>
<p>💡 Pro Tip: Customize in settings to better fit your flow.</p>
</blockquote>
<h1 id="9startfreshoften">9. Start Fresh Often</h1>
<p>Long chats = overloaded context = bad answers.</p>
<p>The best Cursor users treat each chat like a mini sprint: start fresh for each feature or bugfix. This keeps your context clean, responses sharp, and productivity high.</p>
<p>Make it a habit: new feature, new chat. Bugfix? Start another one.</p>
<h1 id="10timetravelwithcheckpoints">10. Time Travel with Checkpoints</h1>
<p>Made a bad change? Roll back effortlessly with Cursor's Checkpoints.</p>
<p>It's like Git for your conversations - perfect for UI tweaks or logic reversions, A/B tests, or quick fixes.</p>
<p><img src="https://media-blog.sashido.io/content/images/2025/10/checkpoints.png" alt="10 Pro Tips to Master Cursor Agent (and Boost Your Coding Flow)"></p>
<p>This safety net gives you confidence to explore without fear of losing progress.</p>
<h1 id="11bonushiddengems">11. Bonus Hidden Gems</h1>
<p>Here are a few lesser-known features worth exploring:</p>
<ul>
<li>Completion Sounds: Audible feedback when the agent finishes responding. Get a &quot;ding&quot; when the agent finishes!</li>
<li>Mermaid Diagrams: Visualize complex app logic with just a prompt.</li>
<li>New Layout Beta: Test a new layout with agents on the left, code in the center, and diffs on the right</li>
</ul>
<h1 id="fin">Fin</h1>
<p>Cursor isn't just another AI assistant. It's your coding co-pilot that understands your code, proposes implementation plans, and helps you ship clean, production-ready features faster.</p>
<p>The most effective Cursor users aren’t the ones who type the most prompts. They’re the ones who guide the agent smartly - using structure, context, and the right tools at the right moment.</p>
<p>So whether you're hacking together a new MVP, improving UX, spinning an MCP server or scaling a SaaS on SashiDo, these Cursor strategies will help you focus on what really matters - building great products!</p>
<p>🚀 Ready to take your AI-assisted development even further? Deploy your app with <a href="https://www.sashido.io/en/">SashiDo</a> in minutes. Start your <a href="https://dashboard.sashido.io/register">Free Trial Now</a>. And here is a quick <a href="https://blog.sashido.io/sashidos-getting-started-guide/">Getting Started Guide</a> for a smooth take off.</p>
<h6 id="ifyoulikedthispostyoumightwanttoalsocheckout">If you liked this post, you might want to also check out:</h6>
<p><em><a href="https://blog.sashido.io/vibe-coding-with-cursors-tutorial-and-best-practices/">Vibe Coding with AI Agents: Best Practices for Using Cursor with Node.js and SashiDo - Part 1</a><br>
<a href="https://blog.sashido.io/vibe-coding-with-ai-agents-a-non-developers-journey-to-shipping-an-mvp-on-sashido-part-2/">Vibe Coding with AI Agents: A Non-Developer’s Journey to Shipping an MVP on SashiDo - Part 2</a><br>
<a href="https://blog.sashido.io/openais-new-apps-sdk/">OpenAI’s New Apps SDK (Preview): What It Means and How to Experiment</a><br>
<a href="https://blog.sashido.io/how-to-master-vibe-coding-best-practices-and-useful-ai-tool/">How to Master Vibe Coding: Best Practices and Useful AI Tool</a></em></p>
</div>]]></content:encoded></item><item><title><![CDATA[Announcing Multilingual Email Templates and User-Facing pages]]></title><description><![CDATA[<div class="kg-card-markdown"><p>Multilingual communication is a social phenomenon. It does not develop because of technical prerequisites. It develops because there is a need, a desire in people to have it.</p>
<p>It is super easy to get “lost in translation” when you are trying to understand a movie, novel or even just a</p></div>]]></description><link>https://blog.sashido.io/announcing-multilingual-email-templates-and-user-facing-pages/</link><guid isPermaLink="false">5b92f73fff04020015d193c4</guid><category><![CDATA[announcements]]></category><dc:creator><![CDATA[Marian Ignev]]></dc:creator><pubDate>Mon, 08 Oct 2018 12:00:00 GMT</pubDate><media:content url="https://media-blog.sashido.io/content/images/2018/09/announcing-multilingualemails-and-user-facing-pages-cover.jpg" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><img src="https://media-blog.sashido.io/content/images/2018/09/announcing-multilingualemails-and-user-facing-pages-cover.jpg" alt="Announcing Multilingual Email Templates and User-Facing pages"><p>Multilingual communication is a social phenomenon. It does not develop because of technical prerequisites. It develops because there is a need, a desire in people to have it.</p>
<p>It is super easy to get “lost in translation” when you are trying to understand a movie, novel or even just a story told by a friend without knowing the nuances of the language used in the original content.</p>
<p>In business, it’s not enough to just rely on “Business English,” as some of the world’s biggest markets like China and Brazil do most of their operations in their local language.</p>
<p>Consumers all over the world prefer products and trust companies that provide localized content and services. Therefore to successfully speak to the world without losing the true meaning behind your message, it is essential to do it in the languages most familiar to your global audience.</p>
<h3 id="multilingualinparseserverwithsashido">Multilingual in Parse Server with SashiDo</h3>
<p>Today SashiDo is the only provider that brings multilingual experience for the Parse Server app makers like you.</p>
<p>Since our customers are in more than 88 countries around the globe, we are confident that this feature will give them a tool to deliver more value to their customers. That's why we make it from scratch.</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/09/sashido-multilingual-emails-example-1.jpg" alt="Announcing Multilingual Email Templates and User-Facing pages"></p>
<p>The new Multilingual Email templates and User-Facing pages are straightforward to use and require almost no coding at all. In SashiDo there are no limits on how many languages your applications will communicate with your customers.</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/09/sashido-customize-multilingual-user-facing-pages.png" alt="Announcing Multilingual Email Templates and User-Facing pages"></p>
<h2 id="fin">Fin</h2>
<p>To get started with the multilingual communication you need only to set up your locale preferences, and set up your templates in the SashiDo's Dashboard and to commit your custom pages into your application's repo.</p>
<p>We wrote this step by step <a href="https://blog.sashido.io/multilingual-email-templates-and-user-facing-pages/">tutorial</a> that will guide you from start to the end in <a href="https://blog.sashido.io/multilingual-email-templates-and-user-facing-pages/">Configuring your Multilingual Email templates and User-Facing pages</a></p>
<p>Thanks, Благодаря, Merci, ¡Gracias!, Σας ευχαριστώ, Grazie, ありがとう, Děkuji, Hvala ti, धन्यवाद, Kiitos, Köszönöm, Благодарю вас!</p>
<p>Your SashiDo friends!</p>
</div>]]></content:encoded></item><item><title><![CDATA[Simplify Parse Server Cloud Code with Environment Variables in SashiDo]]></title><description><![CDATA[<div class="kg-card-markdown"><p>We are thrilled by all of the excitement that we see around Parse Server and Cloud Code development. We have seen many Cloud Code success stories, and at the same time challenges, for the Parse and SashiDo developers.</p>
<p>Today I would like to tell you about one significant addition to</p></div>]]></description><link>https://blog.sashido.io/announcing-environment-variables/</link><guid isPermaLink="false">5b92f59fff04020015d193bb</guid><category><![CDATA[announcements]]></category><category><![CDATA[Environment Variables]]></category><category><![CDATA[Cloud Code]]></category><dc:creator><![CDATA[Marian Ignev]]></dc:creator><pubDate>Tue, 02 Oct 2018 12:00:00 GMT</pubDate><media:content url="https://media-blog.sashido.io/content/images/2018/09/environment-variables-cover.jpg" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><img src="https://media-blog.sashido.io/content/images/2018/09/environment-variables-cover.jpg" alt="Simplify Parse Server Cloud Code with Environment Variables in SashiDo"><p>We are thrilled by all of the excitement that we see around Parse Server and Cloud Code development. We have seen many Cloud Code success stories, and at the same time challenges, for the Parse and SashiDo developers.</p>
<p>Today I would like to tell you about one significant addition to the SashiDo Platform,  the <strong>Environment Variables</strong>, and the new Cloud Code Development Model.</p>
<h2 id="environmentvariables">Environment Variables</h2>
<p>Every developer desires to build code that can be used in more than one environment. To do this in a clean and reusable fashion, the code should be able to accept configuration values at runtime. The configuration values customize the environment for the code: service credentials, custom URLs, file paths, and so forth. For example, many projects have distinct configurations for their development, test, and production environments.</p>
<p>In brief, using the Environment Variables is the best approach to design your code to work like an appliance.</p>
<p>Check out the <a href="https://12factor.net/config">12factor config</a> if you're interested in this field.</p>
<h2 id="parseconfigvsenvironmentvariables">Parse.Config vs Environment Variables</h2>
<p>Many of you who have some experience with Parse would say: <strong>&quot;We have the <code>Parse.Config</code>, why we need another way to configure our apps?&quot;</strong></p>
<p>Yes, this is almost correct, but not really. <code>Parse.Config</code> was built mainly for configuring the <strong>Front-end</strong> side of your applications, for things like feature flagging, changing the look and feel settings or managing some contact information.</p>
<p><code>Parse.Config</code> is a fantastic way to configure your application on the fly, but there few issues that make the <code>Parse.Config</code> inappropriate for every case. For example, every setting in the <code>Parse.Config</code> is public readable, in other words, any sensitive data should not be stored there!</p>
<p>All of this means that you need some secure way to store your credentials for <code>Twilio</code>, <code>Stripe</code>, <code>Mailgun</code> or any of the services you use in the Cloud Code.</p>
<p>In brief, the Environment Variables are the <code>Parse.Config</code> alternative for configuring the <strong>Back-end</strong> part of your application <strong>securely</strong>.</p>
<h2 id="howtousetheenvironmentvariablesintheappscloudcode">How to use the Environment Variables in the app's Cloud Code</h2>
<p>Well, since the Environment Variables are very popular and they are used almost everywhere, NodeJS supports them as well. Let me give you an example of how the Environment Variables change your code.</p>
<p>Configuring Mailgun <code>without Environment Variables</code></p>
<pre><code class="language-js">var mg = mailgun.client({
  username: 'api',
  key: &quot;some_hardcoded_Key&quot;,
  public_key: &quot;some_hardcoded_Public_Key&quot;
});
</code></pre>
<p>And here is how the code will look like <code>with Environment Variables</code>.</p>
<pre><code class="language-js">var mg = mailgun.client({
  username: 'api',
  key: process.env.MAILGUN_API_KEY,
  public_key: process.env.MAILGUN_PUBLIC_KEY
});
</code></pre>
<p>As you can see in the first example, the code has the hardcoded credentials which make it not portable and insecure.</p>
<h2 id="setupyourenvironmentvariablesinthesashidosdashboard">Setup your Environment Variables in the SashiDo's Dashboard</h2>
<p>From the example above you already know how to use the Environment Variables in your application's Cloud Code. Adding them to the app environment is straightforward too. You only need to go to: <code>Application</code> -&gt; <code>Runtime</code> -&gt; <code>Environment Variables</code></p>
<p><img src="https://media-blog.sashido.io/content/images/2018/09/environment-variables-in-sashido-dashboard.png" alt="Simplify Parse Server Cloud Code with Environment Variables in SashiDo"></p>
<p>When you're done click on the <strong>Save &amp; Deploy</strong> button, and that's it! :)</p>
<h2 id="fin">Fin</h2>
<p>Environment Variables bring a new level of simplicity to work with the Parse Server Cloud Code. I hope you'll enjoy it.</p>
<p>Happy Cloud Coding!</p>
</div>]]></content:encoded></item><item><title><![CDATA[Announcing SashiDo Metrics]]></title><description><![CDATA[<div class="kg-card-markdown"><p>Our team is very grateful for your ongoing and colossal support to SashiDo platform. We are pleased to announce the first beta version of the <strong>SashiDo Applications Metrics</strong> (in next couple of months we'll continue improving your experience with SashiDo by adding new data and insights piece by piece).</p>
<h2 id="exploreyourusage">Explore</h2></div>]]></description><link>https://blog.sashido.io/announcing-sashido-metrics/</link><guid isPermaLink="false">5b8ea865212a6000158b0292</guid><category><![CDATA[announcements]]></category><category><![CDATA[metrics]]></category><category><![CDATA[analytics]]></category><dc:creator><![CDATA[Marian Ignev]]></dc:creator><pubDate>Wed, 05 Sep 2018 12:00:00 GMT</pubDate><media:content url="https://media-blog.sashido.io/content/images/2018/09/metrics-intro-cover.jpg" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><img src="https://media-blog.sashido.io/content/images/2018/09/metrics-intro-cover.jpg" alt="Announcing SashiDo Metrics"><p>Our team is very grateful for your ongoing and colossal support to SashiDo platform. We are pleased to announce the first beta version of the <strong>SashiDo Applications Metrics</strong> (in next couple of months we'll continue improving your experience with SashiDo by adding new data and insights piece by piece).</p>
<h2 id="exploreyourusage">Explore your Usage</h2>
<p>Get into details with your applications requests, storage, files, database, and traffic. We have a daily overview of all this data for 30 days and monthly insights for the last 12 months.</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/09/Screen-Shot-2018-08-07-at-19.57.05.png" alt="Announcing SashiDo Metrics"></p>
<h2 id="findthepatternsinyourapp">Find the patterns in your App</h2>
<p>With the heat map metrics overview is much easier to discover the customer and application usage patterns. Which day of a week is essential for my business for example.</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/09/sashido-metrics-heatmap.png" alt="Announcing SashiDo Metrics"></p>
<h2 id="understandbetteryourdata">Understand better your Data</h2>
<p>In every stage of the business lifecycle seeing the whole picture is one of the most important things. Knowing your data helping you to make the tough decisions with confidence!</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/09/understand-better-your-data-with-sashido-metrics.png" alt="Announcing SashiDo Metrics"></p>
<h2 id="exploreyourappsglobalpicture">Explore your app's Global Picture</h2>
<p>Doing a global business online today is just in a click away. Every one of us wants to change the world and make it the better place! The SashiDo Metrics are here to show you the impact you made on the people all around the globe!</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/09/global-maps-sashido-metrics.png" alt="Announcing SashiDo Metrics"></p>
<h3 id="wearenotdoneyet">We are not done yet!</h3>
<p>We won't stop here! A lot of cool new stuff is coming ... so keep up and stay tuned!</p>
<p><br><br></p>
<div class="btn-group" style="text-align: center;">
<a href="https://dashboard.sashido.io/products/apps" class="btn blue big" target="_blank">Go to your Apps and start exploring your Metrics</a>
</div>
</div>]]></content:encoded></item><item><title><![CDATA[Getting Started with Email Templates and Custom User-Facing pages]]></title><description><![CDATA[<div class="kg-card-markdown"><p>Parse Server and SashiDo users love the password reset and email verification features, but some of you have asked for better control over these experiences. Perhaps your customers don't speak English, or you have a well defined brand that you want these experiences to adhere to. Or maybe you just</p></div>]]></description><link>https://blog.sashido.io/emails-and-custom-user-facing-pages/</link><guid isPermaLink="false">5ae98d58f4ff6500154aa0c3</guid><category><![CDATA[Web Hosting]]></category><category><![CDATA[Tutorial]]></category><category><![CDATA[Getting Started]]></category><category><![CDATA[Email Templates]]></category><category><![CDATA[User-Facing Pages]]></category><dc:creator><![CDATA[Marian Ignev]]></dc:creator><pubDate>Wed, 02 May 2018 15:00:27 GMT</pubDate><media:content url="https://media-blog.sashido.io/content/images/2018/05/cover-3-1.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><img src="https://media-blog.sashido.io/content/images/2018/05/cover-3-1.png" alt="Getting Started with Email Templates and Custom User-Facing pages"><p>Parse Server and SashiDo users love the password reset and email verification features, but some of you have asked for better control over these experiences. Perhaps your customers don't speak English, or you have a well defined brand that you want these experiences to adhere to. Or maybe you just don't like your users knowing that you use SashiDo.io as your backend. Today we'll share with you an unparalleled control over your branding with Parse Server and SashiDo. The following features are accessible from your app settings page:</p>
<h2 id="emailtemplates">Email Templates</h2>
<p><img src="https://media-blog.sashido.io/content/images/2018/05/Screen-Shot-2018-05-02-at-13.19.18.png" alt="Getting Started with Email Templates and Custom User-Facing pages"></p>
<p>Password resets and email verifications require us to email links to your users. With Parse Server and SashiDo you have the ability to customize the email text very easy. Email templates use a simple markup language that replaces <code>%username%</code>, <code>%email%</code>, <code>%appname%</code>, and <code>%link%</code> with their appropriate values.</p>
<p>For example, the body:</p>
<pre><code>Thank you for joining %appname%. We're excited to have you onboard. 
To access our premium features, please verify your email address by clicking this link: %link%.
</code></pre>
<p>Would send the following email to your users:</p>
<blockquote>
<p>Thank you for joining AnyWall. We're excited to have you onboard.<br>
To access our premium features, please verify your email address by clicking on this link: <strong>some link</strong></p>
</blockquote>
<h2 id="customuserfacingpages">Custom User-Facing Pages</h2>
<p>Another good feautre in SashiDo with the Parse Server are the User-Facing pages. The Parse Server's password reset and email verification features are implemented with the Model-View-Controller design pattern. The Parse Server is the &quot;controller&quot; for your app and provides default views. Developers who wish to control the design of these pages can tell SashiDo to use modified versions of these pages instead. Each view is a simple and clearly written HTML/CSS/JavaScript page. Download any user-facing page and modify it as you wish. Put your modified version online and give us its address to replace that view in your app.</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/05/password-reset-mvc.png" alt="Getting Started with Email Templates and Custom User-Facing pages"></p>
<p>Consider the Password Reset workflow:</p>
<ol>
<li>A user is mailed a link with which he or she can choose a new<br>
password</li>
<li>The user clicks the link and is forwarded to choose_password.html to select a new password.</li>
<li>The user submits his or her new password and he will receive a confirmation that the new password has been successfully changed by password_reset_success.html</li>
<li>If malicious users attempt to reverse engineer the password reset link, they are sent to invalid_link.html</li>
</ol>
<p>Each of these three pages can be replaced in the app settings page in SashiDo Dashboard. You could add a corporate logo or stylesheets to each page. SashiDo will use your pages as a replacement for Parse Server defaults.</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/05/user-facing-pages-sashido-dashboard.png" alt="Getting Started with Email Templates and Custom User-Facing pages"></p>
<p>When you change the links in the app settings page you need somehow to deploy your custom pages to the application itself. Let me give you 2 simple ways to do this.</p>
<p>If you are not familiar with SashiDo yet, I want to share with you that we are creating a FREE Private GitHub repo for every application deployed in our platform in order to give you the best experience to collaborate with your colleagues, customize and deploy your Cloud Code with just a <code>git push</code> command. If you want to learn more about this feature you can take a look at our <a href="https://blog.sashido.io/tag/cloud-code/">Cloud Code Tutorials Section</a>.</p>
<p>For demo purposes, we have a <a href="https://github.com/parsegroundapps/pg-app-tynwrjdecdmr69ke5d8fec6ixljzx5">public GitHub repo</a> that demonstrates the basics of the integration. The demo repo is available at the following link:</p>
<ul>
<li><a href="https://github.com/parsegroundapps/pg-app-tynwrjdecdmr69ke5d8fec6ixljzx5">https://github.com/parsegroundapps/pg-app-tynwrjdecdmr69ke5d8fec6ixljzx5</a></li>
</ul>
<h3 id="cloudcodepublicstaticpages">CloudCode Public Static Pages</h3>
<p>This is the easiest best way if you want just to customize these pages with your logos, stylesheets or some JavaScript.</p>
<p>Opening the repo mentioned above you can see in its structure the <code>public</code> directory. This is the directory where you can add all of your static assets, <code>css</code>, <code>js</code>, <code>images</code> including your <code>HTML</code> files.</p>
<p>When you open the <code>public</code> directory you can see another directory called <code>pages</code> and this is the directory where we suggest you to store your custom user-facing pages if you decide to follow this approach.</p>
<p>For your comfort we have uploaded all the user-facing pages that can be customized:</p>
<h4 id="1choose_passwordhtml">1. choose_password.html</h4>
<p>This page is displayed when someone clicks a valid 'reset password' link. You should feel free to add to this page (i.e. branding or security widgets) but should be sure not to delete any of the form inputs or the JavaScript from the template file.</p>
<p>This JavaScript is what adds the necessary values to authenticate this session with the Parse Server.</p>
<p>The query params 'username' and 'app' hold the friendly names for your current user and your app. You should feel free to incorporate their values to make the page more personal.</p>
<p>If you are missing form parameters in your POST, the Parse Server will navigate back to this page and add an 'error' query parameter.</p>
<h4 id="2password_reset_successhtml">2. password_reset_success.html</h4>
<p>This page is displayed whenever someone has successfully reset their password. This page will be called with the query param 'username'</p>
<h4 id="3verify_email_successhtml">3. verify_email_success.html</h4>
<p>This page is displayed whenever someone has successfully verify their email address. This page will be called with the query param 'username'</p>
<h4 id="4invalid_linkhtml">4. invalid_link.html</h4>
<p>This page is displayed when someone navigates to a verify email or reset password link but their security token is wrong. This can either mean the user has clicked on a stale link (i.e. re-click on a password reset link after resetting their password) or (rarely) this could be a sign of a malicious user trying to tamper with your app.</p>
<h4 id="thecustomuserfacingpagesurls">The custom user-facing pages URLs</h4>
<p>If you follow this approach and you put your custom pages in <code>&lt;your-repo&gt;/public/pages/&lt;page&gt;.html</code> so your pages will be available after you deploy them to the repo on the following addresses:</p>
<ul>
<li>https://<code>&lt;your-sashido-app-address&gt;</code>.scalabl.cloud/pages/choose_password.html</li>
<li>https://<code>&lt;your-sashido-app-address&gt;</code>.scalabl.cloud/pages/password_reset_success.html</li>
<li>https://<code>&lt;your-sashido-app-address&gt;</code>.scalabl.cloud/pages/verify_email_success.html</li>
<li>https://<code>&lt;your-sashido-app-address&gt;</code>.scalabl.cloud/pages/invalid_link.html</li>
</ul>
<p>The final step after you're sure that your custom user-facing pages are live is to tell the Parse Server to use them.</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/09/Screen-Shot-2018-09-04-at-13.15.20.png" alt="Getting Started with Email Templates and Custom User-Facing pages"></p>
<p>And Yes ... it's that easy :)</p>
<h3 id="advancedcloudcode">Advanced Cloud Code</h3>
<p>Following the same principles as the section above, this is the way when you need some dynamic or advanced behavior on that pages.</p>
<p>Sometimes you need to do some things behind the scenes when an error appears or the customer visits some of these pages. Here the Advanced Cloud Code is your friend.</p>
<p>SashiDo's Advanced Cloud Code functionality is actually an ExpressJS application with the ability to use custom NPM modules.</p>
<script src="https://gist.github.com/mignev/86a4f753bec4cbb3051c0c9d900edf81.js"></script>
<p>Here is what you need to know when you decide to follow this approach. What we are doing behind the scenes is to mount that ExpressJS application to the Parse Server Router. As you can see in the example we have defined a custom <code>get</code> routes:</p>
<ul>
<li><code>/advanced_choose_password</code></li>
<li><code>/advanced_password_reset_success</code></li>
<li><code>/advanced_verify_email_success</code></li>
<li><code>/advanced_invalid_link</code></li>
</ul>
<p>p.s: More information about how to use ExpressJS <code>res</code> you can find here:</p>
<ul>
<li><a href="https://expressjs.com/en/api.html#res">https://expressjs.com/en/api.html#res</a></li>
</ul>
<p>If you want to access these routes you just need to do a GET request to the following URL:</p>
<ul>
<li>https://<code>&lt;your-sashido-app-address&gt;</code>.scalabl.cloud/advanced_choose_password</li>
<li>https://<code>&lt;your-sashido-app-address&gt;</code>.scalabl.cloud/advanced_password_reset_success</li>
<li>https://<code>&lt;your-sashido-app-address&gt;</code>.scalabl.cloud/advanced_verify_email_success</li>
<li>https://<code>&lt;your-sashido-app-address&gt;</code>.scalabl.cloud/advanced_invalid_link</li>
</ul>
<p>The final step after you're sure that your custom advanced user-facing pages are live is to tell the Parse Server to use them.</p>
<p><img src="https://media-blog.sashido.io/content/images/2018/09/Screen-Shot-2018-09-04-at-13.24.56.png" alt="Getting Started with Email Templates and Custom User-Facing pages"></p>
<p>p.s: If you don't know what your handlers should return as a response take a look at the static user facing pages for ideas here:</p>
<ul>
<li><a href="https://github.com/parsegroundapps/pg-app-tynwrjdecdmr69ke5d8fec6ixljzx5/tree/master/public/pages">https://github.com/parsegroundapps/pg-app-tynwrjdecdmr69ke5d8fec6ixljzx5/tree/master/public/pages</a></li>
</ul>
<p>Yes, it's that simple :)</p>
<p>SashiDo's Advanced Cloud Code approach will be the best option if you need to put some server-side logic on your user-facing pages.</p>
<p><strong>The Advanced Cloud Code links:</strong></p>
<ul>
<li><a href="https://github.com/parsegroundapps/pg-app-tynwrjdecdmr69ke5d8fec6ixljzx5/blob/master/cloud/app.js">app.js</a></li>
<li><a href="https://github.com/parsegroundapps/pg-app-tynwrjdecdmr69ke5d8fec6ixljzx5/blob/master/package.json">package.json</a></li>
</ul>
<p>If you want to learn more about the SashiDo's Cloud Code functionality and the Static WebSite Hosting you can take a look at the following sections:</p>
<ul>
<li><a href="https://blog.sashido.io/tag/cloud-code/">https://blog.sashido.io/tag/cloud-code/</a></li>
<li><a href="https://blog.sashido.io/tag/web-hosting/">https://blog.sashido.io/tag/web-hosting/</a></li>
</ul>
<h2 id="fin">Fin</h2>
<p>I think this is all you need! You're GURU now! :)</p>
<p>Do not forget! If you have any questions you can always contact our support for further assistance.</p>
<p>Happy Coding!</p>
</div>]]></content:encoded></item><item><title><![CDATA[Hosting of naked domains with SashiDo]]></title><description><![CDATA[<div class="kg-card-markdown"><p>If you build a website and map it to a custom address such as <code>www.yourdomain.com</code>, you can make it even easier for people to reach your site by typing simply <code>yourdomain.com</code> That web address without the www is called naked domain.</p>
<p>These days in the cloud era</p></div>]]></description><link>https://blog.sashido.io/hosting-of-naked-domains-with-sashido/</link><guid isPermaLink="false">5a5dc99c34405f92e87fbd6e</guid><category><![CDATA[domains]]></category><category><![CDATA[custom domains]]></category><category><![CDATA[Web Hosting]]></category><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Marian Ignev]]></dc:creator><pubDate>Thu, 30 Nov 2017 17:17:29 GMT</pubDate><media:content url="https://media-blog.sashido.io/content/images/2017/11/cover.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><img src="https://media-blog.sashido.io/content/images/2017/11/cover.png" alt="Hosting of naked domains with SashiDo"><p>If you build a website and map it to a custom address such as <code>www.yourdomain.com</code>, you can make it even easier for people to reach your site by typing simply <code>yourdomain.com</code> That web address without the www is called naked domain.</p>
<p>These days in the cloud era hosting of Naked domains with providers like SashiDo, Heroku, OpenShift and others it is a bit tricky, but not impossible.</p>
<p>You can simply do this by redirecting your naked domain address to the www.yourdomain.com</p>
<h3 id="howtodoit">How to do it?</h3>
<p>There are few easy ways to do it:</p>
<ul>
<li>Check out whether your DNS provider supports naked domains redirection.</li>
<li>Buy a cheap VPS, install a webserver with redirection rule and add an A record to your DNS with the IP of the VPS.</li>
<li>Use any other service that can do the things above. I'll suggest you one :)</li>
</ul>
<h3 id="meetgowwwioredirectservicefornakeddomains">Meet gowww.io redirect service for naked domains</h3>
<p>Today I would like to show you the easiest way to handle the challenge with the naked domains <a href="https://www.gowww.io">www.gowww.io</a></p>
<p><img src="https://media-blog.sashido.io/content/images/2017/11/Screen-Shot-2017-11-30-at-17-14-56.png" alt="Hosting of naked domains with SashiDo"></p>
<p>The only thing you should do is go to your DNS provider and add the gowww.io IP address (the current IP address is <strong>144.217.225.221</strong>) as an A record to your naked domain. See how the operation will look like if your domain is <code>mydomain.com</code> and you are using AWS Route53 DNS Service.</p>
<p><img src="https://media-blog.sashido.io/content/images/2017/11/Screen-Shot-2017-11-30-at-17-19-40.png" alt="Hosting of naked domains with SashiDo"></p>
<p>After filling in the IP address you just click on save and you are done. <strong>That's it!</strong></p>
<h3 id="howtotestwhetheritisworking">How to test whether it is working?</h3>
<p>The change you have made can take some time, because it depends on your TTL DNS settings. If you are using MacOS or Linux you can simply use <code>nslookup</code> or <code>dig</code> commands.</p>
<p>See how:</p>
<pre><code>$ dig gowww.io
; &lt;&lt;&gt;&gt; DiG 9.8.3-P1 &lt;&lt;&gt;&gt; gowww.io
;; global options: +cmd
;; Got answer:
;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 29329
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;gowww.io.			IN	A

;; ANSWER SECTION:
gowww.io.		59	IN	A	144.217.225.221

;; Query time: 69 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Nov 30 17:29:15 2017
;; MSG SIZE  rcvd: 42
</code></pre>
<p>Depending on your domain name if you see a line similar to this one, it means that you're in the game!</p>
<pre><code>gowww.io.		59	IN	A	144.217.225.221
</code></pre>
<p>If you don't like the black screen of the terminal you can always use some web service to check this out:</p>
<ul>
<li><a href="http://www.dnsqueries.com/en/dns_lookup.php">http://www.dnsqueries.com/en/dns_lookup.php</a></li>
<li><a href="http://ping.eu/nslookup/">http://ping.eu/nslookup/</a></li>
</ul>
<h4 id="featuresofgowww">Features of gowww</h4>
<p>Just in brief see what gowww will do for you.</p>
<ul>
<li>When you open your naked-domain.com it will redirect to www.naked-domain.com</li>
<li>When you open your naked-domain.com but with <strong>https</strong> gowww will automatically issue a SSL certificate with Let's Encrypt and will redirect to <a href="https://www.naked-domain.com">https://www.naked-domain.com</a></li>
</ul>
<p>Yes, I know. This is boring stuff and yes, gowww saves us a lot of time.</p>
<h3 id="fin">Fin</h3>
<p>That's it, guys. I hope that this article has saved you a lot of time in digging and searching for a solution or doing stuff you don't like :)</p>
<p>If you are a SashiDo customer and you want to host your website or <strong>www.domain.com</strong> take a look at this tutorial:</p>
<ul>
<li><a href="https://blog.sashido.io/static-web-hosting-with-sashido/">Static web hosting with SashiDo</a></li>
</ul>
</div>]]></content:encoded></item><item><title><![CDATA[Crash course with Parse Server for Telerik Platform developers by SashiDo]]></title><description><![CDATA[<div class="kg-card-markdown"><p>This blog post is aimed at showing you how to navigate your data in the SashiDo Dashboard and use the JavaScript SDK to perform the most commonly used operations while building a mobile application.</p>
<p>For this purpose we will be using an already existing set of example data - the</p></div>]]></description><link>https://blog.sashido.io/crash-course-with-parse-server-for-telerik-platform-developers-by-sashido/</link><guid isPermaLink="false">5a5dc99c34405f92e87fbd6d</guid><category><![CDATA[Tutorial]]></category><category><![CDATA[migration]]></category><category><![CDATA[telerik platform]]></category><category><![CDATA[Parse Server]]></category><dc:creator><![CDATA[Marian Ignev]]></dc:creator><pubDate>Sat, 25 Nov 2017 00:40:36 GMT</pubDate><media:content url="https://media-blog.sashido.io/content/images/2017/11/telerik-platform-crash-course.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><img src="https://media-blog.sashido.io/content/images/2017/11/telerik-platform-crash-course.png" alt="Crash course with Parse Server for Telerik Platform developers by SashiDo"><p>This blog post is aimed at showing you how to navigate your data in the SashiDo Dashboard and use the JavaScript SDK to perform the most commonly used operations while building a mobile application.</p>
<p>For this purpose we will be using an already existing set of example data - the Telerik Friends Sample App. If you are not familiar, such an example app can be created by navigating to a new application in Telerik Platform -&gt; Data and clicking the <strong>Enable and use sample data</strong> button. The respective frontend code is available <a href="https://github.com/telerik/platform-friends-web">on GitHub</a>. For simplicity's sake the examples below will be simplified to include only the most relevant bits and pieces of the process.</p>
<h2 id="vocabulary">Vocabulary</h2>
<p>Before proceeding, you should know how some of the most common terms, fields and features of Telerik Platform Backend Services translate to Parse Server.</p>
<h5 id="fields">Fields</h5>
<script src="https://gist.github.com/gngeorgiev/7e65419c9ff6e992d7e6481ed901b5ca.js"></script>
<p>Additionally all fields casing is transformed from pascal case to lower camel case to conform with the Parse Server and JavaScript conventions. E.g. the field <strong>CommentsCount</strong> is transformed to <strong>commentsCount</strong>.</p>
<h5 id="features">Features</h5>
<script src="https://gist.github.com/gngeorgiev/b820c6ac25a3462e57f4bc327928c973.js"></script>
<h5 id="cloudcode">Cloud Code</h5>
<script src="https://gist.github.com/gngeorgiev/61cf0a368c15ee947f9268516f9b3c8c.js"></script>
<h2 id="dashboardnavigation101">Dashboard navigation 101</h2>
<p>This is how our test application's structure looks like in Telerik Platform:</p>
<p><img src="https://pg-app-1-eu-rcq2oghprb7q6ys6qev81p5ccp7sj2.s3.amazonaws.com/6c897a855cc403cc215273dd30e364eb_platform-dashboard.png" alt="Crash course with Parse Server for Telerik Platform developers by SashiDo"></p>
<p>After migrating it to SashiDo we are presented with the following information in the SashiDo Dashboard:</p>
<p><img src="https://pg-app-1-eu-rcq2oghprb7q6ys6qev81p5ccp7sj2.s3.amazonaws.com/710f71a1553a4a2e85dd9b87d1012a54_sashido-dashboard.png" alt="Crash course with Parse Server for Telerik Platform developers by SashiDo"></p>
<p>On the left, you can see your classes and on the right the respective objects, with their relations, images and fields translated to their respective Parse Server alternatives. If you are curious in more details what and how is migrated, and what you would have to do manually, refer to the blog post <a href="https://blog.sashido.io/checklist-for-successful-telerik-platform-migration">Checklist for successful migration</a>.</p>
<h2 id="firststeps">First steps</h2>
<p>Alrighty, we have migrated the data, but our web application is still using Telerik Platform. Let's get through the hurdles and differences you might experience while first switching from Everlive's JS SDK to Parse's JS SDK. Each example will build up on top of the previous ones, so keep that in mind.</p>
<p>You can always refer to the <a href="http://docs.parseplatform.org/js/guide/">Parse Docs</a> where every functionality is explained in details.</p>
<h4 id="initialization">Initialization</h4>
<p>With Everlive you need to supply your AppID.</p>
<pre><code class="language-js">const Everlive = require('everlive-sdk');
const everlive = new Everlive('c9o5u3p9j4h9o5bx');
</code></pre>
<p>SashiDo requires your AppID, JavaScriptKey and ServerURL. Both can be found in <strong>AppSettings -&gt; Security &amp; Keys</strong>.</p>
<pre><code class="language-js">const Parse = require('parse');
Parse.initialize('17joQ7Azu9O1mTKdntp8h3IndS6h4VUDKFbNN5W3');
Parse.javaScriptKey = 'CsgJs1v0Dhw3cpeKmtVZL2PRKUI6dUbDbRQS5U4W';
Parse.serverURL = 'https://pg-app-r1q3oghvrb1q6ys6qev81p5ccp3sj2.scalabl.cloud/1/';
</code></pre>
<h4 id="authentication">Authentication</h4>
<p>The gateway to every application is its login/registration. In our <em>Friends</em> app, only registered users can create new <em>Activities</em>.</p>
<p><em>Telerik Platform:</em></p>
<pre><code class="language-js">const username = 'my_username';
const password = 'super_secret_password';

//register
everlive.users
    .register(username, password, {
        Email: 'my_email@sashido.io'
    })
    .then(() =&gt; console.log('registered!'));

//login
everlive.authentication
    .login(username, password)
    .then(() =&gt; console.log('logged in!'));
</code></pre>
<p><em>Parse:</em></p>
<pre><code class="language-js">const username = 'my_username';
const password = 'super_secret_password';

//register
const user = new Parse.User();
user.set('username', username);
user.set('password', password);
user.set('email', 'my_email@sashido.io');
user.signUp().then(() =&gt; console.log('registered!'));

//login
Parse.User.logIn(username, password).then(() =&gt; console.log('logged in!'));
</code></pre>
<h4 id="readingactivities">Reading Activities</h4>
<p>After we are logged into our application it's only natural to read some activities. The activities are something like the posts in your Facebook feed.</p>
<p><em>Telerik Platform:</em></p>
<pre><code class="language-js">const Activities = everlive.data('Activities');

Activities.get()
    .then(activities =&gt;
        activities.result.map(activity =&gt; ({
            id: activity.Id,
            text: activity.Text
        }))
    )
    .then(activities =&gt; console.log(activities));
</code></pre>
<p><em>Parse:</em></p>
<pre><code class="language-js">const Activities = Parse.Object.extend('Activities');
const activitiesQuery = new Parse.Query(Activities);
activitiesQuery
    .find()
    .then(activities =&gt;
        activities.map(activity =&gt; ({
            id: activity.id,
            text: activity.get('text')
        }))
    )
    .then(activities =&gt; console.log(activities));
</code></pre>
<p>Both will print the following:</p>
<pre><code class="language-json">[
    {
        id: &quot;334cda51-b336-11e7-b6af-eddd2fe7d355&quot;,
        text:
            &quot;It is finally time for graduation! Good job everyone, we made it.&quot;
    },
    {
        id: &quot;334cda52-b336-11e7-b6af-eddd2fe7d355&quot;,
        text: &quot;The most amazing sunset I have ever seen at Phuket, Thailand&quot;
    }
]
</code></pre>
<h4 id="readingthecommentsforanactivity">Reading the comments for an Activity</h4>
<p>In both platforms the comments have a relation. To their respective parent activity.</p>
<p>Here's how we can find the comments for the first activity in Telerik Platform:</p>
<pre><code class="language-js">const oneQuery = new Everlive.Query();
oneQuery.take(1);

Activities.get(oneQuery)
    .then(result =&gt; result.result[0])
    .then(firstActivity =&gt; {
        const query = new Everlive.Query();
        query.where().eq('ActivityId', firstActivity.Id);

        const Comments = everlive.data('Comments');
        Comments.get(query)
            .then(comments =&gt;
                comments.result.map(comment =&gt; ({
                    comment: comment.Comment
                }))
            )
            .then(comments =&gt; console.log(comments));
    });
</code></pre>
<p>And in Parse:</p>
<pre><code class="language-js">const activitiesQuery = new Parse.Query(Activities);
activitiesQuery.first().then(firstActivity =&gt; {
    const Comments = Parse.Object.extend('Comments');
    const query = new Parse.Query(Comments);
    query.equalTo('activityId', firstActivity);

    query
        .find()
        .then(comments =&gt;
            comments.map(comment =&gt; ({
                comment: comment.get('comment')
            }))
        )
        .then(comments =&gt; console.log(comments));
});
</code></pre>
<p>The result would be:</p>
<pre><code class="language-json">[
    {
        id: &quot;3810cb01-b336-11e7-b6af-eddd2fe7d355&quot;,
        comment: &quot;Thanks :)&quot;
    },
    {
        id: &quot;3810cb00-b336-11e7-b6af-eddd2fe7d355&quot;,
        comment: &quot;Congratulations!&quot;
    }
]
</code></pre>
<h4 id="creatinganactivity">Creating an activity</h4>
<p>Let's close the cycle by creating an activity. When creating an activity we need a <strong>Picture</strong>, <strong>Text</strong> and <strong>UserId</strong> of the creator.</p>
<p>For simplicity's sake we will skip the boilerplate code of getting a <strong>base64</strong> of the picture we will be uploading. More on the topic you can find in the <a href="http://docs.parseplatform.org/js/guide/#files">Parse Docs about files</a>.</p>
<p><em>Telerik Platform:</em></p>
<pre><code class="language-js">const file = {
    Filename: 'picture.png',
    ContentType: 'image/png',
    base64: 'some-base-64'
};

everlive.users.currentUser().then(user =&gt; {
    return everlive.files
        .create(file)
        .then(response =&gt; {
            return Activities.create({
                Text: 'new activity!',
                UserId: user.Id,
                Picture: response.result.Id
            });
        })
        .then(() =&gt; console.log('activity saved!'));
});
</code></pre>
<p>The difference with Parse is that we have to set the acl so that only our user can edit the activity and anybody, including unregistered users, can read it.</p>
<pre><code class="language-js">const picture = new Parse.File(
    'picture.png',
    { base64: 'some-base-64' },
    'image/png'
);
picture
    .save()
    .then(() =&gt; {
        const currentUser = Parse.User.current();

        const activityACL = new Parse.ACL(currentUser);
        activityACL.setPublicReadAccess(true);

        const newActivity = new Activities();
        newActivity.set('text', 'new activity!');
        newActivity.set('picture', picture);
        newActivity.set('userId', currentUser);
        newActivity.setACL(activityACL);

        return newActivity.save();
    })
    .then(() =&gt; console.log('activity saved!'));
</code></pre>
<h2 id="fin">Fin</h2>
<p>After going through these basic steps, you now know what your data will look like when it is migrated to <strong>SashiDo</strong>, where to find it, how to query it and how to create more data.</p>
<p>Make sure not to miss on our other blog posts, such as:</p>
<ul>
<li><a href="https://blog.sashido.io/checklist-for-successful-telerik-platform-migration/">Checklist for successful migration?</a></li>
<li><a href="https://blog.sashido.io/best-practices-in-structuring-sashido-accounts/">Best practices in structuring SashiDo accounts</a></li>
<li><a href="https://blog.sashido.io/how-to-start-using-github-with-sashido-for-beginners/">How to start using GitHub with SashiDo</a></li>
<li><a href="https://blog.sashido.io/how-to-set-up-ios-push-notifications-in-sashido/">How to set up iOS push notifications in SashiDo</a></li>
<li><a href="https://blog.sashido.io/android-push-notifications-how-to-start-using-fcm/">Android Push Notifications: How to start using FCM</a></li>
<li><a href="https://blog.sashido.io/static-web-hosting-with-sashido/">Static web hosting with SashiDo</a></li>
<li><a href="https://blog.sashido.io/github-integration-of-advanced-cloud-code-part-1/">GitHub integration of Advanced Cloud Code </a></li>
<li><a href="https://blog.sashido.io/getting-started-with-background-jobs-on-sashido/">Getting started with Background Jobs</a></li>
<li><a href="https://blog.sashido.io/how-to-set-up-webhooks-on-sashido/">How to set up WebHooks on SashiDo</a></li>
<li><a href="https://blog.sashido.io/sashido-goes-realtime-with-parse-server-live-queries/">Realtime with Parse Server Live Queries</a></li>
</ul>
<p>Happy Migration!</p>
</div>]]></content:encoded></item><item><title><![CDATA[Checklist for successful Telerik Platform migration by SashiDo]]></title><description><![CDATA[<div class="kg-card-markdown"><p>We know migration to another MBaaS is not an easy business. With more than 4k successful migrations for the last year, we'd like to share with you the most appropriate order of steps to do your migration to SashiDo, along with few tricky moments you need to know.</p>
<p>Use them</p></div>]]></description><link>https://blog.sashido.io/checklist-for-successful-telerik-platform-migration/</link><guid isPermaLink="false">5a5dc99b34405f92e87fbd6c</guid><category><![CDATA[migration]]></category><dc:creator><![CDATA[Marian Ignev]]></dc:creator><pubDate>Sat, 25 Nov 2017 00:38:03 GMT</pubDate><media:content url="https://media-blog.sashido.io/content/images/2017/11/telerik-platform-migration.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><img src="https://media-blog.sashido.io/content/images/2017/11/telerik-platform-migration.png" alt="Checklist for successful Telerik Platform migration by SashiDo"><p>We know migration to another MBaaS is not an easy business. With more than 4k successful migrations for the last year, we'd like to share with you the most appropriate order of steps to do your migration to SashiDo, along with few tricky moments you need to know.</p>
<p>Use them as a reference to smoothen your migration and to ensure you won’t forget any aspect of the process.</p>
<p>Here’s the short list of the recommended migration steps:</p>
<ol>
<li>Database Migration</li>
<li>Files and Responsive Images</li>
<li>SDKs</li>
<li>Cloud code</li>
<li>Scheduled Jobs</li>
<li>Push Notifications certificates</li>
<li>Email templates</li>
<li>Set up your Host Name (CNAME)</li>
</ol>
<h2 id="databasemigration">Database Migration</h2>
<p>As you already know, the Database schema of Telerik Platform is vastly different from the one of Parse Server (and any other backend for that matter). Furthermore, there’s no straightforward way to export your Telerik Platform database, this makes any kind of migration to another service a tad bit tedious.</p>
<p>Fear not, SashiDo has your back. We have developed an automated process that will export the data from your Telerik Platform application, transform it to the respective Parse Server format and import it into your SashiDo application’s MongoDB. All you have to do is click here and there{or contact us?}. You can see in details how each Telerik Platform field and/or feature maps to Parse here:</p>
<p><a href="https://blog.sashido.io/crash-course-with-parse-server-for-telerik-platform-developers-by-sashido#vocabulary">Crash course with Parse Server for Telerik Platform developers by SashiDo</a>.</p>
<p>After the migration is complete, you can head straight to the Parse Docs and start using your data right the way.</p>
<h2 id="filesandresponsiveimages">Files and Responsive Images</h2>
<p>As part of the migration automation we will also make sure to upload all used images from your Telerik Platform application to the respective S3 Bucket in SashiDo and replace all fields in the database accordingly. If you have to do it manually it may take 1-2 days, depending on the number of your files and for sure will raise your migration expenses.</p>
<p>To save you even more development time, we, at SashiDo also made sure to set-up a Responsive Images service compatible with the one at Telerik Platform. The service has the same API as the service you have used up until this point. E.g. <a href="https://res.sashido.io/1/your-app-id/resize=w:250,h:250,fill:cover/https://your-app.s3.amazonaws.com/large_image.png">https://res.sashido.io/1/your-app-id/resize=w:250,h:250,fill:cover/https://your-app.s3.amazonaws.com/large_image.png</a></p>
<p>If you have used the HTML helpers to resize your images, then we have more good news - we created a small library to assist you further in the transition to the new service. It’s a drop-in replacement of the current <strong>everlive.helpers.htmlHelper</strong> and can be used as follows:</p>
<pre><code class="language-js">var sashidoResponsive = new SashidoResponsive({ appId: 'your-app-id' });
sashidoResponsive.processAll();
</code></pre>
<h2 id="sdks">SDKs</h2>
<p>Parse Server has a wide range of open source SDKs at your disposal:</p>
<ul>
<li><a href="https://github.com/parse-community/Parse-SDK-iOS-OSX">For iOS &amp; OSX</a></li>
<li><a href="https://github.com/parse-community/Parse-SDK-Android">For Android</a></li>
<li><a href="https://github.com/ParsePlatform/Parse-SDK-JS">For JavaScript</a></li>
<li><a href="https://github.com/parse-community/Parse-SDK-dotNET">For .NET + Xamarin</a></li>
<li><a href="https://github.com/parse-community/Parse-SDK-dotNET">For Unity</a></li>
<li><a href="https://github.com/parse-community/parse-php-sdk">Parse PHP SDK</a></li>
<li><a href="https://github.com/parse-community/Parse-SDK-Arduino">For Arduino</a></li>
<li><a href="https://github.com/parse-community/parse-embedded-sdks">Embedded C</a></li>
<li><a href="https://github.com/parse-community/parse-cli">Cloud Code (Parse CLI)</a></li>
</ul>
<p>All you have to do is pick the right one for you. And rewrite a significant part of your application by replacing the Telerik Platform bits with the new, Parse Server ones. Head to the <a href="https://blog.sashido.io/crash-course-with-parse-server-for-telerik-platform-developers-by-sashido">Crash course</a> article to learn how to make the transition as seamless as possible for yourself.</p>
<h2 id="cloudcode">Cloud Code</h2>
<p>In the table below you can see how each Telerik Platform Cloud Code term maps to Parse Server.</p>
<p>The Cloud Code (Business Logic in Telerik Platform) being as different from any other backend as its database schema, you will be forced to rewrite it. This is a process we can’t automate, but we will do everything in our power to help you in this transition. As a starting point you can refer to the <a href="https://blog.sashido.io/crash-course-with-parse-server-for-telerik-platform-developers-by-sashido">Crash course with Parse Server for Telerik Platform developers</a> blog post and the Parse Docs - <a href="http://docs.parseplatform.org/cloudcode/guide">http://docs.parseplatform.org/cloudcode/guide</a>.</p>
<h2 id="scheduledjobs">Scheduled Jobs</h2>
<p>Scheduled jobs, also known as Cloud or Background Jobs in Parse Server, will also have to be manually rewritten and scheduled. Make sure to watch out for collisions with the already running ones in Telerik Platform before their closing date.</p>
<h2 id="pushnotificationscertificatesandcredentials">Push Notifications certificates and credentials</h2>
<p>There’s just one difference with the iOS certificates in Telerik Platform - in Parse Server you need to export them without a password before uploading them.<br>
For Android, just set your SenderID and ServerKey. For more details, you can read our blog posts on the topics:</p>
<ul>
<li><a href="https://blog.sashido.io/how-to-set-up-ios-push-notifications-in-sashido/">https://blog.sashido.io/how-to-set-up-ios-push-notifications-in-sashido/</a></li>
<li><a href="https://blog.sashido.io/android-push-notifications-how-to-start-using-fcm/">https://blog.sashido.io/android-push-notifications-how-to-start-using-fcm/</a></li>
</ul>
<h2 id="emailtemplates">Email templates</h2>
<p>If Emails are a vital part of your application, then make sure not to leave them behind. There are two ways to manage email templates. First, go to AppSettings -&gt; Emails &amp; Hosting, where you can edit the templates for verification and password reset. Another way is to directly use mailgun in your cloud code, since any npm module is allowed, there are no limits.</p>
<h2 id="setupyourhostnamecname">Set up your Host Name (CNAME)</h2>
<p>You can use static web hosting with SashiDo, you just need to set up your custom domain and CNAME in the Dashboard. You will also get free SSL encryption, courtesy of Let’s Encrypt. Here's an article explaining how to use hosting on SashiDo.</p>
<h2 id="dontwaittoomuch">Don’t wait too much</h2>
<p>We will not sugarcoat this for you. No matter if you choose SashiDo for your next MBaaS provider or not, you have a lot of work to do, and very short time to do it. We can only save you so much time, by providing automatic data migration and support assistance, but you have to do the heavy-lifting of completely rewrite your codebase by yourself. And don’t fool yourself, the sooner you start, the better.</p>
</div>]]></content:encoded></item><item><title><![CDATA[Hot News: Background Jobs + WebHooks + LiveQueries are now here!]]></title><description><![CDATA[<div class="kg-card-markdown"><p>Even before our early access, we had the vision to make SashiDo <strong>The Real Parse alternative</strong>.<br>As we promised you, step by step we include more and more features to our service so you wouldn’t miss anything.<br>And that’s just the beginning of our journey :)</p>
<h2 id="wereveryexcitedtosharethelatestnewssashidonowsupports">We’re very</h2></div>]]></description><link>https://blog.sashido.io/hot-news-background-jobs-webhooks-livequeries-are-now-here/</link><guid isPermaLink="false">5a5dc99534405f92e87fbd51</guid><category><![CDATA[announcements]]></category><category><![CDATA[background jobs]]></category><category><![CDATA[webhooks]]></category><category><![CDATA[livequeries]]></category><category><![CDATA[logs]]></category><dc:creator><![CDATA[Marian Ignev]]></dc:creator><pubDate>Mon, 19 Sep 2016 00:24:19 GMT</pubDate><media:content url="https://media-blog.sashido.io/content/images/2016/09/cover.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><img src="https://media-blog.sashido.io/content/images/2016/09/cover.png" alt="Hot News: Background Jobs + WebHooks + LiveQueries are now here!"><p>Even before our early access, we had the vision to make SashiDo <strong>The Real Parse alternative</strong>.<br>As we promised you, step by step we include more and more features to our service so you wouldn’t miss anything.<br>And that’s just the beginning of our journey :)</p>
<h2 id="wereveryexcitedtosharethelatestnewssashidonowsupports">We’re very excited to share the latest news - SashiDo now supports:</h2>
<br>
<div class="headings-with-icon first"><img src="https://media-blog.sashido.io/content/images/2016/09/cloud_jobs.png" alt="Hot News: Background Jobs + WebHooks + LiveQueries are now here!" width="60"><h4>Background Jobs</h4></div>
<p>Give you the option to write long running tasks, include them in your Cloud Code and set up how often you want to run them. Now you don’t have to worry how to implement functions which need to repeat frequently.</p>
<p><a href="https://blog.sashido.io/getting-started-with-background-jobs-on-sashido-2/" class="btn blue small" target="_blank">Read the tutorial</a></p>
<br>
<div class="headings-with-icon"><img src="https://media-blog.sashido.io/content/images/2016/09/webhooks.png" alt="Hot News: Background Jobs + WebHooks + LiveQueries are now here!" width="60"><h4>WebHooks</h4></div>
<p>You want to code on a language other than JavaScript and integrate frameworks and technologies not supported by the Cloud Code? It’s now possible with Webhooks: it’s simple and easy but gives countless opportunities to expand the functionality of your applications.</p>
<p><a href="https://blog.sashido.io/how-to-set-up-webhooks-on-sashido/" class="btn blue small" target="_blank">Read the tutorial</a></p>
<br>
<div class="headings-with-icon"><img src="https://media-blog.sashido.io/content/images/2016/09/livequeries.png" alt="Hot News: Background Jobs + WebHooks + LiveQueries are now here!" width="60"><h4>LiveQueries</h4></div>
<p>One of the key concepts behind Parse Server is the Query, which allows you to tell the Parse Server which object you need. This means that every time an object matching this query is changed, the server will see this immediately and push the new object data to you real-time. Want your app also to go real-time? It’s easier that ever!</p>
<p><a href="https://blog.sashido.io/sashido-goes-realtime-with-parse-server-live-queries/" class="btn blue small" target="_blank">Read the tutorial</a></p>
<br>
<div class="headings-with-icon"><img src="https://media-blog.sashido.io/content/images/2016/06/2.png" alt="Hot News: Background Jobs + WebHooks + LiveQueries are now here!" width="60"><h4>Enhanced Logs</h4></div>
<p>Logs now are improved, look beautiful now :) and more importantly: they are persistent and with the next updates of the Parse Server on SashiDo you’ll see much more useful debug information.</p>
<h3 id="sowhatsnext">So ... What's next?</h3>
<p>You’re probably wondering what’s coming next? Here’s a sneak peek of our road map:</p>
<ul>
<li>Two new regions: <strong>US</strong> and <strong>Australia</strong></li>
<li>Advanced Push Notifications</li>
<li>MongoDB Automated Backups</li>
<li>Documentation</li>
</ul>
<p>We can’t wait for you to share your experience with the new features and  show us what you’ve built with them.<br>Your feedback is important to us and helps us continue improving SashiDo.</p>
<p>We believe that you have to always push and improve yourself, we don’t think limits exist when you create something with passion and excitement.</p>
<p>Stay tuned with us, the best is yet to code :)</p>
</div>]]></content:encoded></item></channel></rss>