[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"navigation":3,"url-settings":86,"blog-\u002Fblog\u002Fusing-encryption-and-hashing-to-increase-security-in-nestjs":663,"blog-author-\u002Fblog\u002Fusing-encryption-and-hashing-to-increase-security-in-nestjs":1128,"i-material-symbols:arrow-back-rounded":1143},{"id":4,"extension":5,"footer":6,"header":73,"meta":83,"stem":84,"__hash__":85},"navigation\u002Fdata\u002Fshared\u002Fnavigation.yml","yml",{"brand":7,"columns":13,"legal":63},{"name":8,"tagline":9,"downloadCta":10},"Pieces","The memory layer for modern work.",{"label":11,"href":12},"All downloads","\u002Fdownloads",[14,26,39,51],{"title":15,"links":16},"Product",[17,20,23],{"label":18,"href":19},"Pieces Desktop","\u002F",{"label":21,"href":22},"Pieces Enterprise","\u002Fenterprise",{"label":24,"href":25},"Pieces MCP","\u002Fmcp",{"title":27,"links":28},"Resources",[29,33,36],{"label":30,"href":31,"external":32},"Documentation","url:docs.home",true,{"label":34,"href":35},"Blog","\u002Fblog",{"label":37,"href":38,"external":32},"GitHub","url:github.org",{"title":40,"links":41},"Community",[42,45,48],{"label":43,"href":44,"external":32},"Discord","url:social.discord",{"label":46,"href":47,"external":32},"X \u002F Twitter","url:social.x",{"label":49,"href":50,"external":32},"LinkedIn","url:social.linkedin",{"title":52,"links":53},"Company",[54,57,60],{"label":55,"href":56},"About","\u002Fabout",{"label":58,"href":59},"Updates","\u002Fupdates",{"label":61,"href":62},"Contact","\u002Fcontact",[64,67,70],{"label":65,"href":66},"Privacy Policy","\u002Flegal\u002Fprivacy",{"label":68,"href":69},"Refund Policy","\u002Flegal\u002Frefund",{"label":71,"href":72},"Terms of Service","\u002Flegal\u002Fterms",{"links":74,"signIn":75,"contact":78,"cta":80},[],{"label":76,"href":77},"Sign in","url:portal.home",{"label":79,"href":62},"Get in touch",{"label":81,"href":82},"Download","url:routes.downloads",{},"data\u002Fshared\u002Fnavigation","VdirGIa8cUm6xLprbBeTKcw914JfyJjWfF-9hSVOX5Y",{"id":87,"extension":5,"links":88,"meta":660,"stem":661,"__hash__":662},"urlSettings\u002Fdata\u002Fshared\u002Furls.yml",[89,93,97,101,105,109,113,117,121,125,129,133,137,141,145,149,153,157,161,165,169,173,177,181,185,189,192,196,200,204,208,212,216,220,224,228,232,236,240,244,248,252,256,260,264,268,272,276,280,284,288,292,295,299,303,306,310,314,318,322,326,330,334,338,342,346,350,354,358,362,366,370,374,378,382,386,390,394,398,402,406,410,414,418,422,426,430,434,438,442,446,450,453,457,461,465,469,473,477,480,483,486,489,493,497,500,504,508,512,516,520,524,528,532,536,540,544,548,551,555,559,563,567,571,574,577,580,584,587,591,595,599,603,606,610,614,617,620,623,627,631,635,638,641,644,648,652,656],{"key":90,"label":91,"href":92},"downloads.desktop","Desktop download page","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Fdownload",{"key":94,"label":95,"href":96},"downloads.macOS.dmgArm64","macOS DMG Apple Silicon","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fpieces_for_x\u002Fdmg-arm64\u002Fdownload",{"key":98,"label":99,"href":100},"downloads.macOS.dmgIntel","macOS DMG Intel","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fpieces_for_x\u002Fdmg\u002Fdownload",{"key":102,"label":103,"href":104},"downloads.macOS.pkg","macOS PKG","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fmacos_packaging\u002Fpkg\u002Fdownload",{"key":106,"label":107,"href":108},"downloads.macOS.universal","Desktop macOS Universal","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fpieces_for_x\u002Fmacos-universal\u002Fdownload",{"key":110,"label":111,"href":112},"downloads.macOS.pkgArm64","Desktop macOS PKG Apple Silicon","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fmacos_packaging\u002Fpkg-pfd-arm64\u002Fdownload",{"key":114,"label":115,"href":116},"downloads.macOS.pkgIntel","Desktop macOS PKG Intel","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fmacos_packaging\u002Fpkg-pfd\u002Fdownload",{"key":118,"label":119,"href":120},"downloads.windows.appinstaller","Windows App Installer","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fappinstaller\u002Fpieces_for_x.appinstaller",{"key":122,"label":123,"href":124},"downloads.windows.exe","Windows EXE","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fpieces_for_x\u002Fwindows-exe\u002Fdownload",{"key":126,"label":127,"href":128},"downloads.windows.msix","Windows MSIX","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fpieces_for_x\u002Fwindows-msix\u002Fdownload",{"key":130,"label":131,"href":132},"downloads.windows.suiteManager","Windows Suite Manager","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fpieces_suite_windows\u002Fappinstaller\u002Fdownload",{"key":134,"label":135,"href":136},"downloads.linux.flatpakRepo","Linux Flatpak repository","https:\u002F\u002Fbuilds.pieces.app\u002Fpieces-flatpak-repo\u002Fpieces-flatpak.flatpakrepo",{"key":138,"label":139,"href":140},"downloads.linux.snapDesktop","Linux Snap Desktop","https:\u002F\u002Fsnapcraft.io\u002Fpieces-for-developers",{"key":142,"label":143,"href":144},"downloads.linux.snapPiecesOS","Linux Snap PiecesOS","https:\u002F\u002Fsnapcraft.io\u002Fpieces-os",{"key":146,"label":147,"href":148},"downloads.linux.snap","Desktop Linux Snap package","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fpieces_for_x\u002Fsnap\u002Fdownload",{"key":150,"label":151,"href":152},"downloads.piecesOS.macOS.dmgArm64","PiecesOS macOS DMG Apple Silicon","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fos_server\u002Fdmg-arm64\u002Fdownload",{"key":154,"label":155,"href":156},"downloads.piecesOS.macOS.dmgIntel","PiecesOS macOS DMG Intel","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fos_server\u002Fdmg\u002Fdownload",{"key":158,"label":159,"href":160},"downloads.piecesOS.macOS.universal","PiecesOS macOS Universal","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fos_server\u002Fmacos-universal\u002Fdownload",{"key":162,"label":163,"href":164},"downloads.piecesOS.macOS.pkgArm64","PiecesOS macOS PKG Apple Silicon","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fmacos_packaging\u002Fpkg-pos-launch-only-arm64\u002Fdownload",{"key":166,"label":167,"href":168},"downloads.piecesOS.macOS.pkgIntel","PiecesOS macOS PKG Intel","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fmacos_packaging\u002Fpkg-pos-launch-only\u002Fdownload",{"key":170,"label":171,"href":172},"downloads.piecesOS.windows.appinstaller","PiecesOS Windows App Installer","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fappinstaller\u002Fos_server.appinstaller",{"key":174,"label":175,"href":176},"downloads.piecesOS.windows.exe","PiecesOS Windows EXE","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fos_server\u002Fwindows-exe\u002Fdownload",{"key":178,"label":179,"href":180},"downloads.piecesOS.windows.msix","PiecesOS Windows MSIX","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fos_server\u002Fwindows-msix\u002Fdownload",{"key":182,"label":183,"href":184},"downloads.piecesOS.linux.snap","PiecesOS Linux Snap package","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fos_server\u002Fsnap\u002Fdownload",{"key":186,"label":187,"href":188},"downloads.combined.macOS.appleSilicon","Combined macOS installer Apple Silicon","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fmacos_packaging\u002Fpkg-arm64\u002Fdownload",{"key":190,"label":191,"href":104},"downloads.combined.macOS.intel","Combined macOS installer Intel",{"key":193,"label":194,"href":195},"downloads.guides.macOS","macOS installation guide","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Fmacos-installation-guide",{"key":197,"label":198,"href":199},"downloads.guides.windows","Windows installation guide","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Fwindows-installation-guide",{"key":201,"label":202,"href":203},"downloads.guides.linux","Linux installation guide","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Flinux-installation-guide",{"key":205,"label":206,"href":207},"downloads.guides.piecesOS","PiecesOS manual installation","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fcore-dependencies\u002Fpieces-os\u002Fmanual-installation",{"key":209,"label":210,"href":211},"extensions.chrome","Chrome extension","https:\u002F\u002Fchrome.google.com\u002Fwebstore\u002Fdetail\u002Fpieces-save-code-snippets\u002Figbgibhbfonhmjlechmeefimncpekepm",{"key":213,"label":214,"href":215},"extensions.firefox","Firefox add-on","https:\u002F\u002Faddons.mozilla.org\u002Fen-US\u002Ffirefox\u002Faddon\u002Fpieces-save-code-from-the-web\u002F",{"key":217,"label":218,"href":219},"extensions.edge","Edge add-on","https:\u002F\u002Fmicrosoftedge.microsoft.com\u002Faddons\u002Fdetail\u002Fpieces-save-code-snippet\u002Fhglfimcdgonaeeobjckfdabcldfidmim",{"key":221,"label":222,"href":223},"extensions.vscode","VS Code extension","https:\u002F\u002Fmarketplace.visualstudio.com\u002Fitems?itemName=MeshIntelligentTechnologiesInc.pieces-vscode",{"key":225,"label":226,"href":227},"extensions.visualStudio","Visual Studio extension","https:\u002F\u002Fmarketplace.visualstudio.com\u002Fitems?itemName=MeshIntelligentTechnologiesInc.PiecesVisualStudio",{"key":229,"label":230,"href":231},"extensions.jetbrains","JetBrains plugin","https:\u002F\u002Fplugins.jetbrains.com\u002Fplugin\u002F17328-pieces--save-search-share--reuse-code-snippets",{"key":233,"label":234,"href":235},"extensions.obsidian","Obsidian plugin","https:\u002F\u002Fobsidian.md\u002Fplugins?id=pieces-for-developers",{"key":237,"label":238,"href":239},"extensions.sublime","Sublime package","https:\u002F\u002Fpackagecontrol.io\u002Fpackages\u002FPieces",{"key":241,"label":242,"href":243},"extensions.neovim","Neovim plugin","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fplugin_neo_vim",{"key":245,"label":246,"href":247},"extensions.jupyterlab","JupyterLab plugin","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fjupyterlab-pieces",{"key":249,"label":250,"href":251},"extensions.cli","Pieces CLI","https:\u002F\u002Fpypi.org\u002Fproject\u002Fpieces-cli\u002F",{"key":253,"label":254,"href":255},"docs.home","Documentation home","https:\u002F\u002Fdocs.pieces.app",{"key":257,"label":258,"href":259},"docs.getStarted","Get started docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces",{"key":261,"label":262,"href":263},"docs.api","API docs","https:\u002F\u002Fdocs.pieces.app\u002Fapi",{"key":265,"label":266,"href":267},"docs.desktop.overview","Desktop overview","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop",{"key":269,"label":270,"href":271},"docs.desktop.onboarding","Desktop onboarding","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Fonboarding",{"key":273,"label":274,"href":275},"docs.desktop.timeline","Desktop timeline docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Ftimeline",{"key":277,"label":278,"href":279},"docs.desktop.summaries","Desktop summaries docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Fsingle-click-summaries",{"key":281,"label":282,"href":283},"docs.desktop.search","Desktop conversational search docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Fconversational-search",{"key":285,"label":286,"href":287},"docs.desktop.drive","Desktop drive docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Fdrive",{"key":289,"label":290,"href":291},"docs.desktop.account","Desktop account settings docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Fconfiguration\u002Faccount",{"key":293,"label":294,"href":92},"docs.desktop.download","Desktop download docs",{"key":296,"label":297,"href":298},"docs.piecesOS.overview","PiecesOS overview docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fcore-dependencies",{"key":300,"label":301,"href":302},"docs.piecesOS.details","PiecesOS details docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fcore-dependencies\u002Fpieces-os",{"key":304,"label":305,"href":207},"docs.piecesOS.install","PiecesOS install docs",{"key":307,"label":308,"href":309},"docs.piecesOS.quickMenu","PiecesOS quick menu docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fcore-dependencies\u002Fpieces-os\u002Fquick-menu",{"key":311,"label":312,"href":313},"docs.piecesOS.storage","On-device storage docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fcore-dependencies\u002Fon-device-storage",{"key":315,"label":316,"href":317},"docs.piecesOS.troubleshooting","PiecesOS troubleshooting docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fcore-dependencies\u002Fpieces-os\u002Ftroubleshooting",{"key":319,"label":320,"href":321},"docs.mcp.overview","MCP overview docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp",{"key":323,"label":324,"href":325},"docs.mcp.cursor","MCP Cursor docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fcursor",{"key":327,"label":328,"href":329},"docs.mcp.vscode","MCP VS Code docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fvs-code",{"key":331,"label":332,"href":333},"docs.mcp.claudeDesktop","MCP Claude Desktop docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fclaude-desktop",{"key":335,"label":336,"href":337},"docs.mcp.claudeCode","MCP Claude Code docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fclaude-code",{"key":339,"label":340,"href":341},"docs.mcp.claudeCowork","MCP Claude Cowork docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fclaude-cowork",{"key":343,"label":344,"href":345},"docs.mcp.githubCopilot","MCP GitHub Copilot docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fgithub-copilot",{"key":347,"label":348,"href":349},"docs.mcp.goose","MCP Goose docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fgoose",{"key":351,"label":352,"href":353},"docs.mcp.windsurf","MCP Windsurf docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fwindsurf",{"key":355,"label":356,"href":357},"docs.mcp.zed","MCP Zed docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fzed",{"key":359,"label":360,"href":361},"docs.mcp.jetbrains","MCP JetBrains docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fjetbrains-ides",{"key":363,"label":364,"href":365},"docs.mcp.continueDev","MCP Continue docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fcontinue-dev",{"key":367,"label":368,"href":369},"docs.mcp.cline","MCP Cline docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fcline",{"key":371,"label":372,"href":373},"docs.mcp.raycast","MCP Raycast docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fraycast",{"key":375,"label":376,"href":377},"docs.mcp.rovoDevCli","MCP Rovo Dev CLI docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Frovo-dev-cli",{"key":379,"label":380,"href":381},"docs.mcp.openaiCodexCli","MCP OpenAI Codex CLI docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fopenai-codex-cli",{"key":383,"label":384,"href":385},"docs.mcp.googleGeminiCli","MCP Google Gemini CLI docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fgoogle-gemini-cli",{"key":387,"label":388,"href":389},"docs.mcp.amazonQ","MCP Amazon Q docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Famazon-q-developer",{"key":391,"label":392,"href":393},"docs.mcp.chatgptDev","MCP ChatGPT Developer Mode docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fchatgpt-developer-mode",{"key":395,"label":396,"href":397},"docs.mcp.openclaw","MCP OpenClaw docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fopenclaw",{"key":399,"label":400,"href":401},"docs.mcp.mcpRemote","MCP Remote docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fmcp-remote",{"key":403,"label":404,"href":405},"docs.mcp.ngrok","MCP ngrok docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fngrok-setup",{"key":407,"label":408,"href":409},"docs.troubleshooting.macOS","macOS troubleshooting docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Ftroubleshooting\u002Fmacos",{"key":411,"label":412,"href":413},"docs.troubleshooting.windows","Windows troubleshooting docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Ftroubleshooting\u002Fwindows",{"key":415,"label":416,"href":417},"docs.troubleshooting.linux","Linux troubleshooting docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Ftroubleshooting\u002Flinux",{"key":419,"label":420,"href":421},"docs.privacy","Privacy and security docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fprivacy-security-your-data",{"key":423,"label":424,"href":425},"docs.support","Support docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fsupport",{"key":427,"label":428,"href":429},"portal.home","Pieces portal","https:\u002F\u002Fportal.pieces.app",{"key":431,"label":432,"href":433},"site.home","Website home","https:\u002F\u002Fpieces.app",{"key":435,"label":436,"href":437},"site.about","About page","https:\u002F\u002Fpieces.app\u002Fabout",{"key":439,"label":440,"href":441},"site.features","Features page","https:\u002F\u002Fpieces.app\u002Ffeatures",{"key":443,"label":444,"href":445},"site.plugins","Plugins page","https:\u002F\u002Fpieces.app\u002Fplugins",{"key":447,"label":448,"href":449},"site.contact","Contact page","https:\u002F\u002Fpieces.app\u002Fcontact",{"key":451,"label":58,"href":452},"site.updates","https:\u002F\u002Fpieces.app\u002Fupdates",{"key":454,"label":455,"href":456},"site.news","News","https:\u002F\u002Fpieces.app\u002Fnews",{"key":458,"label":459,"href":460},"site.events","Community events","https:\u002F\u002Fpieces.app\u002Fcommunity\u002Fevents",{"key":462,"label":463,"href":464},"site.userStories","User stories","https:\u002F\u002Fpieces.app\u002Fuser-stories",{"key":466,"label":467,"href":468},"site.academy","Academy","https:\u002F\u002Fpieces.app\u002Flearn\u002Facademy",{"key":470,"label":471,"href":472},"site.support","Website support","https:\u002F\u002Fpieces.app\u002Fsupport",{"key":474,"label":475,"href":476},"site.standup","Standup","https:\u002F\u002Fpieces.app\u002Fstandup",{"key":478,"label":34,"href":479},"site.blog","https:\u002F\u002Fcode.pieces.app\u002Fblog",{"key":481,"label":43,"href":482},"social.discord","https:\u002F\u002Fdiscord.gg\u002Fgetpieces",{"key":484,"label":46,"href":485},"social.x","https:\u002F\u002Fx.com\u002Fgetpieces",{"key":487,"label":488,"href":485},"social.twitter","Twitter",{"key":490,"label":491,"href":492},"social.instagram","Instagram","https:\u002F\u002Fwww.instagram.com\u002Fgetpieces\u002F",{"key":494,"label":495,"href":496},"social.tiktok","TikTok","https:\u002F\u002Fwww.tiktok.com\u002F@getpieces",{"key":498,"label":49,"href":499},"social.linkedin","https:\u002F\u002Fwww.linkedin.com\u002Fcompany\u002Fgetpieces\u002F",{"key":501,"label":502,"href":503},"social.youtube","YouTube","https:\u002F\u002Fyoutube.com\u002F@getpieces",{"key":505,"label":506,"href":507},"github.org","GitHub organization","https:\u002F\u002Fgithub.com\u002Fpieces-app",{"key":509,"label":510,"href":511},"github.support","GitHub support","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fsupport",{"key":513,"label":514,"href":515},"github.issues","GitHub issues","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fsupport\u002Fissues",{"key":517,"label":518,"href":519},"github.discussions","GitHub discussions","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fsupport\u002Fdiscussions",{"key":521,"label":522,"href":523},"github.documentation","GitHub documentation","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fdocumentation",{"key":525,"label":526,"href":527},"github.opensource","GitHub open source","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fopensource",{"key":529,"label":530,"href":531},"github.sdks.python","Python SDK","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fpieces-os-client-sdk-for-python",{"key":533,"label":534,"href":535},"github.sdks.typescript","TypeScript SDK","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fpieces-os-client-sdk-for-typescript",{"key":537,"label":538,"href":539},"github.sdks.dart","Dart SDK","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fpieces-os-client-sdk-for-dart",{"key":541,"label":542,"href":543},"github.sdks.kotlin","Kotlin SDK","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fpieces-os-client-sdk-for-kotlin",{"key":545,"label":546,"href":547},"github.plugins.obsidian","Obsidian plugin repository","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fobsidian-pieces",{"key":549,"label":550,"href":247},"github.plugins.jupyterlab","JupyterLab plugin repository",{"key":552,"label":553,"href":554},"github.plugins.sublime","Sublime plugin repository","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fplugin_sublime",{"key":556,"label":557,"href":558},"github.plugins.neovim","Neovim plugin repository","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fplugin_neovim",{"key":560,"label":561,"href":562},"github.cliAgent","CLI agent repository","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fcli-agent",{"key":564,"label":565,"href":566},"github.mcpDart","MCP Dart repository","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fmcp_dart",{"key":568,"label":569,"href":570},"github.awesomePieces","Awesome Pieces repository","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fawesome-pieces",{"key":572,"label":573,"href":66},"legal.privacyPolicy","Privacy policy",{"key":575,"label":576,"href":69},"legal.refundPolicy","Refund policy",{"key":578,"label":579,"href":72},"legal.terms","Terms",{"key":581,"label":582,"href":583},"legal.security","Legal security","https:\u002F\u002Fpieces.app\u002Flegal\u002Fsecurity",{"key":585,"label":586,"href":503},"videos.youtubeChannel","YouTube channel",{"key":588,"label":589,"href":590},"videos.gettingStartedDesktop","Getting started desktop video","https:\u002F\u002Fyoutu.be\u002FdUr1lRM_TYk",{"key":592,"label":593,"href":594},"videos.snippetDiscoveryxR","Snippet discovery video","https:\u002F\u002Fyoutu.be\u002FG6vb1USw-30",{"key":596,"label":597,"href":598},"sales.bookACall","Book a sales call","https:\u002F\u002Fcalendar.app.google\u002FWVUDtUfNy5Vst3sH7",{"key":600,"label":601,"href":602},"sales.enterprise","Enterprise form","https:\u002F\u002Fgetpieces.typeform.com\u002Fto\u002FaVQFTvpE",{"key":604,"label":605,"href":519},"sales.feedback","Feedback discussions",{"key":607,"label":608,"href":609},"sales.earlyAccess","Early access form","https:\u002F\u002Fgetpieces.typeform.com\u002Fearlyaccess",{"key":611,"label":612,"href":613},"sales.supportEmail","Support email","mailto:support@pieces.app",{"key":615,"label":616,"href":19},"routes.home","Home route",{"key":618,"label":619,"href":56},"routes.about","About route",{"key":621,"label":622,"href":12},"routes.downloads","Downloads route",{"key":624,"label":625,"href":626},"routes.thanks","Post-install thanks route","\u002Finstall\u002Fthanks",{"key":628,"label":629,"href":630},"routes.pricing","Pricing route","\u002Fpricing",{"key":632,"label":633,"href":634},"cta.freeTrial","Start free trial CTA (Pieces Pro) — used by \u002Fcampaigns\u002F* landing pages","https:\u002F\u002Fcampaigns.pieces.app\u002F",{"key":636,"label":637,"href":22},"routes.enterprise","Enterprise route",{"key":639,"label":640,"href":62},"routes.contact","Contact route",{"key":642,"label":643,"href":59},"routes.updates","Updates route",{"key":645,"label":646,"href":647},"routes.migrationError","Migration error route","\u002Fmigration\u002Ferror",{"key":649,"label":650,"href":651},"routes.authenticated","Post-login authenticated route","\u002Fauth\u002Fsigned-in",{"key":653,"label":654,"href":655},"routes.signed-out","Signed out route","\u002Fauth\u002Fsigned-out",{"key":657,"label":658,"href":659},"routes.authentication-error","Authentication error route","\u002Fauth\u002Ferror",{},"data\u002Fshared\u002Furls","NLkVE1lIUws518K-1QsSB6T-GvlXYIzcRL1HDhqarGQ",{"id":664,"title":665,"author":666,"authorPhoto":667,"authorPhotoAlt":668,"authorSlug":669,"body":670,"buttonText":668,"buttonUrl":668,"category":1115,"date":1116,"description":1117,"draft":1118,"editorsPick":1118,"extension":1119,"featured":1118,"image":1120,"imageAlt":668,"meta":1121,"navigation":32,"ogImage":668,"ogImageAlt":668,"path":1122,"seo":1123,"stem":1124,"tags":1125,"__hash__":1127},"blog\u002Fblog\u002Fusing-encryption-and-hashing-to-increase-security-in-nestjs.md","Increase Security Using NestJS Encryption","Ekekenta Clinton","https:\u002F\u002Fstorage.googleapis.com\u002Fpieces-marketing-website\u002Fimages\u002Fblog\u002Fremult-typescript-react-fullstack-app\u002Fauthor.png",null,"ekekenta-clinton",{"type":671,"value":672,"toc":1097},"minimark",[673,677,682,692,695,699,702,706,709,714,717,727,731,734,745,748,754,761,765,783,789,792,796,799,805,812,818,837,841,856,862,881,887,893,900,904,907,916,923,929,949,952,958,969,973,976,993,999,1006,1009,1015,1021,1027,1033,1043,1049,1055,1059,1062,1068,1076,1080,1089],[674,675,676],"p",{},"We will be exploring NestJS and its use for developing TypeScript-based server-side applications that are fast, testable, scalable, and loosely coupled. We will learn about data encryption and hashing and how they can be implemented in a NestJS application to store secret data in a database securely. The tutorial will guide you through setting up the project and dependencies, connecting the application to a MongoDB database, creating a model, and implementing data hashing. By the end of the tutorial, you will have a good understanding of how to use NestJS Encryption to build secure web applications.",[678,679,681],"h2",{"id":680},"what-is-nestjs","What Is NestJS?",[674,683,684,691],{},[685,686,690],"a",{"href":687,"rel":688},"https:\u002F\u002Fnestjs.com\u002F",[689],"nofollow","NestJS"," is a Node.js framework for developing TypeScript-based server-side applications that are fast, testable, scalable, and loosely coupled. It makes use of powerful HTTP server frameworks like Express and Fastify. Nest abstracts Node.js frameworks and makes their APIs available to developers.",[674,693,694],{},"The NestJS framework is compatible with database management systems such as PostgreSQL and MySQL. It provides dependency injections, Websockets, and APIGetaways as well.",[678,696,698],{"id":697},"what-is-data-encryption","What is Data Encryption?",[674,700,701],{},"Data encryption encodes information by converting its original representation, plaintext, into an alternate form known as cipher text. With cipher text, only authorized users can access and decrypt the original data. Data encryption prevents interception while denying potential interceptors intelligible content. Encryption is a two-way function, meaning encrypted information can only be decrypted with the correct key.",[678,703,705],{"id":704},"what-is-hashing-data","What is Hashing Data?",[674,707,708],{},"Hashing converts a given key into another value that generates a new value using a mathematical algorithm. It should be impossible to go from the output to the input once hashing is complete.",[710,711,713],"h3",{"id":712},"prerequisites","Prerequisites",[674,715,716],{},"This tutorial is a hands-on demonstration. To follow along, ensure you have the following installed:",[718,719,720,724],"ul",{},[721,722,723],"li",{},"Node.js version 14 or later",[721,725,726],{},"MongoDB database",[678,728,730],{"id":729},"step-by-step-project-setup-and-connection","Step By Step Project Setup and Connection",[674,732,733],{},"With the above requirements met, let’s install the NestJS CLI tool by running the command below:",[735,736,741],"pre",{"className":737,"code":739,"language":740},[738],"language-text","npm install -g nest\u002Fcli\n","text",[742,743,739],"code",{"__ignoreMap":744},"",[674,746,747],{},"Once the installation is completed, create a new NestJS project by running this command:",[735,749,752],{"className":750,"code":751,"language":740},[738],"nest new encryption\n",[742,753,751],{"__ignoreMap":744},[674,755,756,757,760],{},"The above command will prompt you to choose your preferred npm package manager. For this tutorial, we'll use ",[742,758,759],{},"npm"," and wait for the necessary packages to be installed.",[710,762,764],{"id":763},"install-dependencies","Install Dependencies",[674,766,767,768,773,774,779,780,782],{},"We’ll use the default ",[685,769,772],{"href":770,"rel":771},"https:\u002F\u002Fnodejs.org\u002Fapi\u002Fcrypto.html",[689],"crypto module"," provided by Node.js to handle our data encryption. For data hashing, we’ll use the ",[685,775,778],{"href":776,"rel":777},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fbcrypt",[689],"bcrypt"," NodeJS third-party module. To install the ",[742,781,778],{}," module, run the command below:",[735,784,787],{"className":785,"code":786,"language":740},[738],"npm i -D @types\u002Fbcryptnpm i bcrypt\n",[742,788,786],{"__ignoreMap":744},[674,790,791],{},"Wait for the installation to complete and then connect the application to a MongoDB database.",[710,793,795],{"id":794},"connect-a-database","Connect a Database",[674,797,798],{},"To demonstrate how to store secret data in a database securely, we’ll connect the application to a MongoDB database. To do that, we need to install the Mongoose module with the command below:",[735,800,803],{"className":801,"code":802,"language":740},[738],"npm i @nestjs\u002Fmongoose mongoose\n",[742,804,802],{"__ignoreMap":744},[674,806,807,808,811],{},"Next, let’s update the code in the ",[742,809,810],{},"app.module.ts"," file with the code snippet below:",[735,813,816],{"className":814,"code":815,"language":740},[738],"import { Module } from '@nestjs\u002Fcommon';\nimport { AppController } from '.\u002Fapp.controller';\nimport { AppService } from '.\u002Fapp.service';\nimport { MongooseModule } from '@nestjs\u002Fmongoose';\n@Module({\n  imports: [\n    MongooseModule.forRoot('mongodb:\u002F\u002Flocalhost\u002Fnest'),\n  ],\n  controllers: [AppController],\n  providers: [AppService],\n})\nexport class AppModule {}\n",[742,817,815],{"__ignoreMap":744},[674,819,820,821,824,825,828,829,832,833,836],{},"In the above code snippet, we imported the ",[742,822,823],{},"MongooseModule",", which allows us to connect to the database using the ",[742,826,827],{},"forRoot"," method. The ",[742,830,831],{},"forRoot()","method takes in the connection URI similar to the ",[742,834,835],{},"mongoose.connect()","method.",[710,838,840],{"id":839},"creating-a-model-for-a-database","Creating a Model for a Database",[674,842,843,844,847,848,851,852,855],{},"Now, let’s define the schema to create a model for our database. To get started, create a ",[742,845,846],{},"model","folder in the ",[742,849,850],{},"src"," directory. Then create a ",[742,853,854],{},"users.ts"," file and define a User Schema class with the code snippet below:",[735,857,860],{"className":858,"code":859,"language":740},[738],"import { Prop, Schema, SchemaFactory } from '@nestjs\u002Fmongoose';\nimport { Document } from 'mongoose';\nexport type UserDocument = User & Document;\n@Schema()\nexport class User {\n  @Prop()\n  name: string;\n  @Prop()\n  email: string;\n  @Prop()\n  password: string;\n}\nexport const UserSchema = SchemaFactory.createForClass(User);\n",[742,861,859],{"__ignoreMap":744},[674,863,864,865,868,869,872,873,876,877,880],{},"In the code snippet above, we imported the following: the ",[742,866,867],{},"Prop"," decorator to define the properties of the schema, the ",[742,870,871],{},"Schema"," decorator, which will map our ",[742,874,875],{},"User"," class to a MongoDB collection, and the ",[742,878,879],{},"SchemaFactory","decorator to compile the schema and prepare the schema for validation.",[674,882,883,884,886],{},"Next, we need to register the schema in our root ",[742,885,810],{}," file to allow our application to use it.",[735,888,891],{"className":889,"code":890,"language":740},[738],"...\n@Module({\n  imports: [\n    ...\n    MongooseModule.forFeature([{ name: 'user', schema: UserSchema }]),\n  ],\n   ...\n})\nexport class AppModule {}\n",[742,892,890],{"__ignoreMap":744},[674,894,895,896,899],{},"In the above code, we used the ",[742,897,898],{},"MongoseModule.forFeature()"," method to configure the module, specifying the models we want to register for the current scope.",[710,901,903],{"id":902},"hash-data-structure-implementation","Hash Data Structure Implementation",[674,905,906],{},"With our database model created, let's look at the actual hash implementation. First, we'll create a signup API to allow users to sign up with their name, email, and password. Then we'll hash the user's password before saving it to our database. This way, even if a hacker gains access to the records in our database, they won't be able to access our user accounts because they will only see the hashed version of the password.",[674,908,909,910,915],{},"You can skip this step if you ",[685,911,914],{"href":912,"rel":913},"https:\u002F\u002Fpieces.app\u002Fblog\u002Fauto-generate-api-clients-from-openapi",[689],"auto-generate the API clients from OpenAPI",".",[674,917,918,919,922],{},"Let’s go ahead and see the implementation. In the ",[742,920,921],{},"app.service.ts","file, update the code with the snippets below:",[735,924,927],{"className":925,"code":926,"language":740},[738],"import { Injectable } from '@nestjs\u002Fcommon';\nimport { Model } from 'mongoose';\nimport { InjectModel } from '@nestjs\u002Fmongoose';\nimport { User, UserDocument } from '.\u002Fmodels\u002Fusers';\nimport * as bcrypt from 'bcrypt';\n@Injectable()\nexport class AppService {\n  constructor(@InjectModel('user') private userModel: Model) {}  async createUser(user: User): Promise {\n    const salt = await bcrypt.genSalt();\n    const hashPassword = await bcrypt.hash(user.password, salt);\n    user.password = hashPassword;\n    const newUser = new this.userModel(user);\n    return newUser.save();\n  }\n  }\n",[742,928,926],{"__ignoreMap":744},[674,930,820,931,933,934,936,937,940,941,944,945,948],{},[742,932,778],{}," module, the ",[742,935,875],{}," class, and the ",[742,938,939],{},"UserDocumet"," type. Then, we created a createUser method in which we created a ",[742,942,943],{},"salt"," to generate random text for our password hash. Then, we hashed the user’s password using the ",[742,946,947],{},"bcrypt.hash()"," function, which takes in the user's password and salt value. Finally, we modified the user object to change the password value to the hashed password and save it to the database.",[674,950,951],{},"Now, we’ll create another method to check if the password a user enters is the same as the plain-text equivalent of the hashed password. To do this, let’s add the method below to the AppService class:",[735,953,956],{"className":954,"code":955,"language":740},[738],"...async loginUser(email: string, password: string): Promise {\n    const user = await this.userModel.findOne({ email });\n    if (user) {\n      const match = await bcrypt.compare(password, user.password);\n      if (match) return 'Credentials are correct!';\n      return 'Invalid Credentials!';\n    }\n    return 'Invalid Invalid!';\n  }\n…\n",[742,957,955],{"__ignoreMap":744},[674,959,960,961,964,965,968],{},"In the above code snippet, we used the ",[742,962,963],{},"userModel.findOne()"," method to check if the email provided by the user exists in our database. Then, we used ",[742,966,967],{},"bcrypt.compare()"," to compare the plain password supplied with the database's hashed version of the password. Here, you can decide to grant a user access to services in your application if the credentials provided are correct.",[710,970,972],{"id":971},"how-to-implement-data-encryption","How to Implement Data Encryption",[674,974,975],{},"We’ve seen how to increase the security of our application by hashing the sensitive data in a user’s record. Now, let’s look at how we can secure user data with encryption. Let's say we’re building a chatting or social networking application where many users' secrets (confidential to them and the person they’re communicating with) are shared online. If such data is not encrypted, hackers can gain unauthorized access to the user's private information.",[674,977,978,979,982,983,985,986,988,989,992],{},"Let’s get started implementing data encryption in our application. First, create a ",[742,980,981],{},"utils","folder in the",[742,984,850],{},"directory. In the ",[742,987,981],{},"folder, create an ",[742,990,991],{},"encrypt.ts"," file and add the code snippets below:",[735,994,997],{"className":995,"code":996,"language":740},[738],"import {\n  createCipheriv,\n  randomBytes,\n  createDecipheriv,\n  createHash,\n} from 'crypto';\nconst alg = 'aes-256-ctr';\nlet key = 'The Encryption Key';\nkey = createHash('sha256').update(String(key)).digest('base64').substr(0, 32);\nexport const encryptData = (data) => {\n  const iv = randomBytes(16);\n  const cipher = createCipheriv(alg, key, iv);\n  const result = Buffer.concat([iv, cipher.update(data), cipher.final()]);\n  return result;\n};\n",[742,998,996],{"__ignoreMap":744},[674,1000,1001,1002,1005],{},"We imported all the functions we needed from the crypto module in the above code snippet. We’re using the AES (Advanced Encryption System) algorithm because it’s easy to implement. You can use any algorithm of your choosing. In our code, we created an initializer vector and built a new cipher using the algorithm, key, and iv with the ",[742,1003,1004],{},"createCipher()"," method. Finally, we made an encrypted buffer from the data supplied.",[674,1007,1008],{},"Now, let’s create another function to decrypt the data when an authorized user wants to access it. To do this, we’ll use the code snippet below:",[735,1010,1013],{"className":1011,"code":1012,"language":740},[738],"export const decryptData = (data) => {\n  const iv = data.slice(0, 16);\n  data = data.slice(16);\n  const decipher = createDecipheriv(algorithm, key, iv);\n  const result = Buffer.concat([decipher.update(data), decipher.final()]);\n  return result;\n};\n",[742,1014,1012],{"__ignoreMap":744},[674,1016,960,1017,1020],{},[742,1018,1019],{},"slice()"," method to get the first 16 bytes of the encrypted buffer and then the rest of the data. We also modified the value. Then, we created a decipher and decrypted the encrypted buffer.",[674,1022,1023,1024,1026],{},"Now, open the ",[742,1025,921],{}," file, and create another method to encrypt and decrypt users' messages with the code snippet below:",[735,1028,1031],{"className":1029,"code":1030,"language":740},[738],"...import { encryptData, decryptData } from '.\u002Futils\u002Fencrypt-file';...async sendMessage(message: string): Promise\u003Cobject> {  const encryptedMessage = encrypt(message);  const decrytedMessage = decrypt(encryptedMessage);  return {'Encryted Message': encryptedMessage.toString(),'Decryted Message': decrytedMessage.toString(),  };}...\n",[742,1032,1030],{"__ignoreMap":744},[674,1034,820,1035,1038,1039,1042],{},[742,1036,1037],{},"encryptData"," and ",[742,1040,1041],{},"decryptData","functions we created. Then we encrypted and decrypted the user-provided message and returned both versions of the message. This was done to show what the encrypted message looks like. However, you can proceed and save the encrypted data in your database.",[674,1044,1045,1046,811],{},"Finally, create the route controllers for the AppService class methods in the ",[742,1047,1048],{},"app.controller.ts",[735,1050,1053],{"className":1051,"code":1052,"language":740},[738],"import { Controller, Get, Post, Body, Param } from '@nestjs\u002Fcommon';import { AppService } from '.\u002Fapp.service';import { User } from '.\u002Fmodels\u002Fusers';@Controller()export class AppController {constructor(private readonly appService: AppService) {}@Post('create')async createUser(@Body() user: User): Promise\u003CUser> {return await this.appService.createUser(user);}@Post('\u002Flogin')async getMessage(@Body() user: User): Promise\u003Cany> {const { email, password } = user;return this.appService.loginUser(email, password);}@Post('message')async sendMessage(@Body() user) {const { message } = user;return await this.appService.sendMessage(message);}}\n",[742,1054,1052],{"__ignoreMap":744},[710,1056,1058],{"id":1057},"test-application","Test Application",[674,1060,1061],{},"Now, start the application by running the command below:",[735,1063,1066],{"className":1064,"code":1065,"language":740},[738],"Npm run start:dev\n",[742,1067,1065],{"__ignoreMap":744},[674,1069,1070,1071,915],{},"Then, use any API testing tool like Postman or Insomnia to test the application at ",[685,1072,1075],{"href":1073,"rel":1074},"http:\u002F\u002Flocalhost:3000\u002F",[689],"http:\u002F\u002Flocalhost:3000",[678,1077,1079],{"id":1078},"conclusion","Conclusion",[674,1081,1082,1083,1088],{},"This tutorial demonstrated how to increase security using NestJS encryption and hashing. Now, you should have an understanding of what encryption, hashing, and NestJS are. You also learned how to create a NestJS allocation, connect to a database, create a model, service, and controller, and implement data encryption and hashing. Now that you have this knowledge, how would you increase the security of your next project? Perhaps you can check out the ",[685,1084,1087],{"href":1085,"rel":1086},"https:\u002F\u002Fdocs.nestjs.com\u002F",[689],"NestJS official documentation"," to learn more.",[674,1090,1091,1092,915],{},"Security is important - if you’re working with video, learn how to ",[685,1093,1096],{"href":1094,"rel":1095},"https:\u002F\u002Fpieces.app\u002Fblog\u002Fthe-encrypted-media-extension-api-and-watching-protected-video-content-on-the-web",[689],"encrypt media to ensure video content is protected",{"title":744,"searchDepth":1098,"depth":1098,"links":1099},2,[1100,1101,1102,1106,1114],{"id":680,"depth":1098,"text":681},{"id":697,"depth":1098,"text":698},{"id":704,"depth":1098,"text":705,"children":1103},[1104],{"id":712,"depth":1105,"text":713},3,{"id":729,"depth":1098,"text":730,"children":1107},[1108,1109,1110,1111,1112,1113],{"id":763,"depth":1105,"text":764},{"id":794,"depth":1105,"text":795},{"id":839,"depth":1105,"text":840},{"id":902,"depth":1105,"text":903},{"id":971,"depth":1105,"text":972},{"id":1057,"depth":1105,"text":1058},{"id":1078,"depth":1098,"text":1079},"Software Development","2023-01-03T00:00:00.000Z","To guarantee the integrity of users' data in an online application, you'll need to adopt a secure method for handling and storing your users' data.",false,"md","https:\u002F\u002Fstorage.googleapis.com\u002Fpieces-marketing-website\u002Fimages\u002Fblog\u002Fusing-encryption-and-hashing-to-increase-security-in-nestjs\u002Fhero.jpeg",{},"\u002Fblog\u002Fusing-encryption-and-hashing-to-increase-security-in-nestjs",{"title":665,"description":1117},"blog\u002Fusing-encryption-and-hashing-to-increase-security-in-nestjs",[1126],"cybersecurity","V3rqED14SNSKYrTBSBbP0PuaUFWHeLdG4DSWQDncX18",{"id":1129,"title":666,"body":1130,"description":1134,"draft":1118,"extension":1119,"meta":1137,"navigation":32,"path":1138,"photo":1139,"photoAlt":668,"seo":1140,"stem":1141,"__hash__":1142},"authors\u002Fauthors\u002Fekekenta-clinton.md",{"type":671,"value":1131,"toc":1135},[1132],[674,1133,1134],{},"Senior Technical Writer and Backend Developer with a strong foundation in computer science. Starting their journey as a computer science student eager to build a versatile skill set, Ekekenta has grown into a professional who excels at translating complex technical concepts into clear, user-friendly documentation. With expertise in backend development, they bridge the gap between development and communication, delivering impactful solutions for both technical and non-technical audiences.",{"title":744,"searchDepth":1098,"depth":1098,"links":1136},[],{},"\u002Fauthors\u002Fekekenta-clinton","https:\u002F\u002Fstorage.googleapis.com\u002Fpieces-marketing-website\u002Fimages\u002Fauthors\u002Fekekenta-clinton.jpg",{"title":666,"description":1134},"authors\u002Fekekenta-clinton","-gpDwcPlkHwUst78xTY5YerTysqc4Ri6XR_k1NnO5ec",{"left":1144,"top":1144,"width":1145,"height":1145,"rotate":1144,"vFlip":1118,"hFlip":1118,"body":1146},0,24,"\u003Cpath fill=\"currentColor\" d=\"m7.825 13l4.9 4.9q.3.3.288.7t-.313.7q-.3.275-.7.288t-.7-.288l-6.6-6.6q-.15-.15-.213-.325T4.426 12t.063-.375t.212-.325l6.6-6.6q.275-.275.688-.275t.712.275q.3.3.3.713t-.3.712L7.825 11H19q.425 0 .713.288T20 12t-.288.713T19 13z\"\u002F>"]