{"id":21653792,"url":"https://github.com/epranka/descent-app","last_synced_at":"2025-09-10T12:37:58.168Z","repository":{"id":41679498,"uuid":"252983104","full_name":"epranka/descent-app","owner":"epranka","description":"Top of descent path calculator. Let's calculate your descent!","archived":false,"fork":false,"pushed_at":"2024-11-13T05:56:26.000Z","size":473,"stargazers_count":38,"open_issues_count":21,"forks_count":2,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-04-11T21:02:53.807Z","etag":null,"topics":["aircraft","aviation","calculator","create-react-app","css","descent","javascript","open-source","react","simulation","top-of-descent","util"],"latest_commit_sha":null,"homepage":"https://descent.now.sh","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/epranka.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2020-04-04T11:50:11.000Z","updated_at":"2025-03-03T19:43:46.000Z","dependencies_parsed_at":"2024-11-25T08:22:12.324Z","dependency_job_id":"9251a016-2535-413c-bbd1-7f7c07d3286c","html_url":"https://github.com/epranka/descent-app","commit_stats":{"total_commits":13,"total_committers":3,"mean_commits":4.333333333333333,"dds":0.5384615384615384,"last_synced_commit":"8b691f4e6d1cb3bf3bfd18ee7b0b2cdfa7f0065b"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/epranka/descent-app","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/epranka%2Fdescent-app","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/epranka%2Fdescent-app/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/epranka%2Fdescent-app/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/epranka%2Fdescent-app/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/epranka","download_url":"https://codeload.github.com/epranka/descent-app/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/epranka%2Fdescent-app/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":274463404,"owners_count":25290113,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-10T02:00:12.551Z","response_time":83,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aircraft","aviation","calculator","create-react-app","css","descent","javascript","open-source","react","simulation","top-of-descent","util"],"created_at":"2024-11-25T08:20:41.960Z","updated_at":"2025-09-10T12:37:58.144Z","avatar_url":"https://github.com/epranka.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\" style=\"border-bottom: none;\"\u003e✈️ Top of descent calculator\u003c/h1\u003e\n\n\u003ch3 align=\"center\"\u003eCalculate your descent\u003c/h3\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://twitter.com/epranka\" title=\"follow on twitter\"\u003e\n    \u003cimg alt=\"twitter badge\" src=\"https://badgen.net/badge/icon/twitter/00acee?icon=twitter\u0026label\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://linkedin.com/in/epranka\" title=\"connect on linkedin\"\u003e\n      \u003cimg alt=\"linkedin badge\" src=\"https://badgen.net/badge/icon/linkedin/2867B2?label\u0026icon=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8%2BCjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgaWQ9InN2ZzQiCiAgIHZlcnNpb249IjEuMSIKICAgdmlld0JveD0iMCAwIDI0IDI0IgogICBoZWlnaHQ9IjI0IgogICB3aWR0aD0iMjQiPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTEwIj4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI%2BCiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ%2BCiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms%2BCiAgICA8L3JkZjpSREY%2BCiAgPC9tZXRhZGF0YT4KICA8ZGVmcwogICAgIGlkPSJkZWZzOCIgLz4KICA8cGF0aAogICAgIHN0eWxlPSJmaWxsOiNmZmZmZmYiCiAgICAgaWQ9InBhdGg4MjEiCiAgICAgZD0iTSA4LDE5IEggNSBWIDggaCAzIHoiIC8%2BCiAgPHBhdGgKICAgICBzdHlsZT0iZmlsbDojZmZmZmZmIgogICAgIGlkPSJwYXRoODE5IgogICAgIGQ9Im0gNi41LDYuNzMyIGMgLTAuOTY2LDAgLTEuNzUsLTAuNzkgLTEuNzUsLTEuNzY0IDAsLTAuOTc0IDAuNzg0LC0xLjc2NCAxLjc1LC0xLjc2NCAwLjk2NiwwIDEuNzUsMC43OSAxLjc1LDEuNzY0IDAsMC45NzQgLTAuNzgzLDEuNzY0IC0xLjc1LDEuNzY0IHoiIC8%2BCiAgPHBhdGgKICAgICBzdHlsZT0iZmlsbDojZmZmZmZmIgogICAgIGlkPSJwYXRoMiIKICAgICBkPSJtIDIwLDE5IGggLTMgdiAtNS42MDQgYyAwLC0zLjM2OCAtNCwtMy4xMTMgLTQsMCBWIDE5IEggMTAgViA4IGggMyB2IDEuNzY1IGMgMS4zOTYsLTIuNTg2IDcsLTIuNzc3IDcsMi40NzYgeiIgLz4KPC9zdmc%2BCg%3D%3D\" /\u003e\u003c/a\u003e \n  \u003ca href=\"https://dev.to/epranka\" title=\"follow on dev.to\"\u003e\n    \u003cimg alt=\"dev.to badge\" src=\"https://badgen.net/badge/icon/dev.to/232221?label\u0026icon=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8%2BCjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgaWQ9InN2ZzQiCiAgIHZlcnNpb249IjEuMSIKICAgaGVpZ2h0PSIyMzIxIgogICB3aWR0aD0iMjUwMCIKICAgdmlld0JveD0iMCAzMiA0NDcuOTk5OTk5OTk5OTk5OTQgNDQ4Ij4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGExMCI%2BCiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ%2BaW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU%2BPC9kYzp0aXRsZT4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE%2BCiAgPGRlZnMKICAgICBpZD0iZGVmczgiIC8%2BCiAgPHBhdGgKICAgICBkPSJNIDcxLjgxNTI4MiwxOTguNDUwNDUgSCA5MS4xNjI1MiBjIDQuMzA0NDAzLDAgOC42MjAxMjMsMS42MDg3MyAxMi45MjQ1MSw0LjgyNTkzIDQuMjkzMzEsMy4yMTcyMSA2LjQ1NjM5LDguMDUzODYgNi40Njc0OSwxNC40ODgyNyB2IDc3LjI2ODUxIGMgMCw2LjQ0NTUxIC0yLjE1MjIyLDExLjI3MTQ5IC02LjQ1NjYxLDE0LjQ4ODY5IC00LjMwNDM5NywzLjIxNzIyIC04LjYxOTY5Nyw0LjgyNTUyIC0xMi45MjQwOSw0LjgyNTUyIEggNzEuODE1MjgyIFogTSAzNi43Njk4MzksMTY0LjEwNDI4IFYgMzQ3LjY2MjE5IEggODguMjQ0OTYgYyA0MC43Njk3NCwwLjA2NjYgNTMuNjQ5OTIsLTMxLjU1MDc5IDUzLjY0OTkyLC01Mi40MTgyMyBsIC0wLjAxMTMsLTc4LjY4ODQxIGMgLTAuMDExMSwtMjAuODc4NTQgLTEzLjIzNDc5LC01Mi40NTEyNyAtNTIuNTUxMjMsLTUyLjQ1MTI3IHogbSAyMzYuNDE5ODYxLDAuMDQ0MyA0Mi43NDQ2MSwxNjAuNjM4MTUgYyAxMS43NDgzNCwyNy4zMjQwNCAzNy45ODUyMSwzNC4xMTM0NyA1Mi42MjkwMywwIEwgNDExLjIzMDE2LDE2NC4xNDg2MSBIIDM3NS4wODY0NSBMIDM0Mi4yODE4NywyOTAuMzA3MTkgMzA5LjMyMjU1LDE2NC4xNDg2MSBaIG0gLTg5LjY5MzIzLC0wLjAxMTMgYyAtMTIuMzY5NiwwLjMxMDYzIC0yMi4xNjUzNSwxMC41ODM2MiAtMjEuODY1ODIsMjIuOTUzMjEgdiAxMzguNzk0NSBjIDAuMzEwNjMsMTIuMzgwNjkgMTAuNjA1NTYsMjIuMTY1MzYgMjIuOTg2MjUsMjEuODQzNjUgaCA2OC45ODEzMyB2IC0zMi44MDQxNSBoIC01OS4xMTkwOSB2IC00Mi42MTE2MiBoIDM2LjEzMjg1IHYgLTMyLjgwNDE2IGggLTM2LjEzMjg1IHYgLTQyLjYyMjQ5IGggNTkuMTA3NzkgbCAwLjAxMTMsLTMyLjc0ODk1IHoiCiAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtzdHJva2Utd2lkdGg6MS4xMDkzODA2IgogICAgIGlkPSJwYXRoMiIgLz4KPC9zdmc%2BCg%3D%3D\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://medium.com/@epranka\" title=\"follow on medium\"\u003e\n      \u003cimg alt=\"medium badge\" src=\"https://badgen.net/badge/icon/medium/black?label\u0026icon=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8%2BCjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgaWQ9InN2ZzQiCiAgIHZlcnNpb249IjEuMSIKICAgY2xpcC1ydWxlPSJldmVub2RkIgogICBmaWxsLXJ1bGU9ImV2ZW5vZGQiCiAgIGhlaWdodD0iMjQiCiAgIHdpZHRoPSIyNCI%2BCiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhMTAiPgogICAgPHJkZjpSREY%2BCiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8%2BCiAgICAgICAgPGRjOnRpdGxlPjwvZGM6dGl0bGU%2BCiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM4IiAvPgogIDxwYXRoCiAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZiIKICAgICBpZD0icGF0aDIiCiAgICAgZD0iTTIuODQ2IDYuODg3Yy4wMy0uMjk1LS4wODMtLjU4Ni0uMzAzLS43ODRsLTIuMjQtMi43di0uNDAzaDYuOTU4bDUuMzc4IDExLjc5NSA0LjcyOC0xMS43OTVoNi42MzN2LjQwM2wtMS45MTYgMS44MzdjLS4xNjUuMTI2LS4yNDcuMzMzLS4yMTMuNTM4djEzLjQ5OGMtLjAzNC4yMDQuMDQ4LjQxMS4yMTMuNTM3bDEuODcxIDEuODM3di40MDNoLTkuNDEydi0uNDAzbDEuOTM5LTEuODgyYy4xOS0uMTkuMTktLjI0Ni4xOS0uNTM3di0xMC45MWwtNS4zODkgMTMuNjg4aC0uNzI4bC02LjI3NS0xMy42ODh2OS4xNzRjLS4wNTIuMzg1LjA3Ni43NzQuMzQ3IDEuMDUybDIuNTIxIDMuMDU4di40MDRoLTcuMTQ4di0uNDA0bDIuNTIxLTMuMDU4Yy4yNy0uMjc5LjM5LS42Ny4zMjUtMS4wNTJ2LTEwLjYwOHoiIC8%2BCjwvc3ZnPgo%3D\" /\u003e  \n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cbr /\u003e\n\nIn my free time, I often flying with the X Plane 11 simulator and recently I thought to create the Top of descent (TOD) calculator, to calculate descent path. TOD is the point when the aircraft should start to descent to approach or any other target altitude. The calculator which I created is not strictly accurate, because it just depends on aviation rules of thumb and simply trigonometry. But it is sufficient for the initial decision.\n\n\u003cbr /\u003e\n\n\u003e Calculate your descent here: [descent.now.sh](https://descent.now.sh/)\n\nHave ideas on how to improve it or found a bug? Feel free to share it on the [GitHub Issues](https://github.com/epranka/descent-app/issues).\n\n\u003cp align=\"center\"\u003e\n  \u003cimg alt=\"sound code gif\" src=\"https://descent.now.sh/descent-app.gif\" /\u003e\n\u003c/p\u003e\n\n\u003ch3\u003eHow it works\u003c/h3\u003e\n\nTOD point is just a distance, how much nautical miles (or other units) take the descent procedure from altitude A to B.\n\nThe main parameters we should have are origin altitude, destination altitude, and glideslope:\n\n\u003cp align=\"center\"\u003e\n  \u003cimg alt=\"\" src=\"https://res.cloudinary.com/practicaldev/image/fetch/s--2mMSBZFk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0dn6uu8ioufxua1n9k4g.png\" /\u003e\n\u003c/p\u003e\n\nBy simple trigonometry formula, we can calculate the distance:\n\n\u003cp align=\"center\"\u003e\n  \u003cimg alt=\"\" src=\"https://res.cloudinary.com/practicaldev/image/fetch/s--PVvn-LwY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://math.tools/equation/get_equaimages%3Fequation%3Dd%2520%253D%2520%257BDelta%2520h%257D%252F%257Btan%2520alpha%257D%26fontsize%3D36\" /\u003e\n\u003c/p\u003e\n\nUsually, when aircraft descending, it not only decreases altitude but reduces speed too. By the rule of thumb, 1 nautical mile for a speed reduction of 10 knots is a good value to start with. So we include it to the distance calculation:\n\n\u003cp align=\"center\"\u003e\n  \u003cimg alt=\"\" src=\"https://res.cloudinary.com/practicaldev/image/fetch/s--IdbQ0O-s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://math.tools/equation/get_equaimages%3Fequation%3Dd%2520%253D%2520%257BDelta%2520h%257D%252F%257Btan%2520alpha%257D%2520%252B%2520%257BDelta%2520v%257D%252F%257B10%257D%26fontsize%3D36\" /\u003e\n\u003c/p\u003e\n\nThe same rule of thumb is used to add the wind impact on distance. 1 nautical mile for 10 knots of head or tailwind.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg alt=\"\" src=\"https://res.cloudinary.com/practicaldev/image/fetch/s--g2W44mSX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/vb8al1wiiemcfls7tnmd.png\" /\u003e\n\u003c/p\u003e\n\nNow we know how much distance takes the aircraft descent. But we need to calculate how fast we should descent to maintain the glideslope profile. The descent speed is called vertical speed (feet per minute) and is calculated by the following formula:\n\n\u003cp align=\"center\"\u003e\n  \u003cimg alt=\"\" src=\"https://res.cloudinary.com/practicaldev/image/fetch/s--KbMNGQix--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0e4kcoiov6lniaw9jary.png\" /\u003e\n\u003c/p\u003e\n\n\u003chr /\u003e\n\nIf you have any questions, feel free to ask. Feedback and questions are very appreciated.\n\nFollow on [Twitter](https://twitter.com/epranka), [GitHub](https://github.com/epranka), and let’s connect on [LinkedIn](https://linkedin.com/in/epranka).\n\nAlso check my personal website: [epranka.com](https://epranka.com)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fepranka%2Fdescent-app","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fepranka%2Fdescent-app","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fepranka%2Fdescent-app/lists"}