



  

<!DOCTYPE html>
<html
  lang="en"
  
  data-color-mode="auto" data-light-theme="light" data-dark-theme="dark"
  data-a11y-animated-images="system" data-a11y-link-underlines="true"
  
  >




  <head>
    <meta charset="utf-8">
  <link rel="dns-prefetch" href="https://github.githubassets.com">
  <link rel="dns-prefetch" href="https://avatars.githubusercontent.com">
  <link rel="dns-prefetch" href="https://github-cloud.s3.amazonaws.com">
  <link rel="dns-prefetch" href="https://user-images.githubusercontent.com/">
  <link rel="preconnect" href="https://github.githubassets.com" crossorigin>
  <link rel="preconnect" href="https://avatars.githubusercontent.com">

<script type="importmap">{"imports":{"react":"https://github.githubassets.com/assets/react-e27d1b3e03961e68.js","react-dom":"https://github.githubassets.com/assets/react-dom-e5fd46a22d5c4058.js","react-dom/client":"https://github.githubassets.com/assets/react-dom-client-1b4a3ee065998cea.js","react-is":"https://github.githubassets.com/assets/react-is-e0b593954b4706d8.js","react-reconciler":"https://github.githubassets.com/assets/react-reconciler-8e99e505c4429605.js","react/compiler-runtime":"https://github.githubassets.com/assets/react-compiler-runtime-4610bd6d3de9c049.js","react/jsx-dev-runtime":"https://github.githubassets.com/assets/react-jsx-dev-runtime-ea55d68667d559e5.js","react/jsx-runtime":"https://github.githubassets.com/assets/react-jsx-runtime-4915cb0f5b3aff04.js","scheduler":"https://github.githubassets.com/assets/scheduler-58b860b049ca307c.js"}}</script>
<meta name="react-profiling" content="0" data-turbo-transient="true" />
<meta name="react-import-map" content="react,react-dom,react-dom/client,react-dom/profiling,react-is,react-reconciler,react/compiler-runtime,react/jsx-dev-runtime,react/jsx-runtime,scheduler@777f63f87cd0" data-turbo-track="reload" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-e27d1b3e03961e68.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-compiler-runtime-4610bd6d3de9c049.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/scheduler-58b860b049ca307c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-dom-e5fd46a22d5c4058.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-dom-client-1b4a3ee065998cea.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-is-e0b593954b4706d8.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-jsx-runtime-4915cb0f5b3aff04.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-reconciler-8e99e505c4429605.js" />

  


  <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light-5c4e9fc574bf49f3.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light_high_contrast-fb37c309e0603a69.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark-afff6c53aef9b9d1.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark_high_contrast-c409873d7987dffa.css" /><link data-color-theme="light" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light-5c4e9fc574bf49f3.css" /><link data-color-theme="light_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_high_contrast-fb37c309e0603a69.css" /><link data-color-theme="light_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind-0f910d8806d5761b.css" /><link data-color-theme="light_colorblind_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind_high_contrast-a7abd4d4c49ac593.css" /><link data-color-theme="light_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia-5fc4c4a9cb41e596.css" /><link data-color-theme="light_tritanopia_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia_high_contrast-ed0cee9214dedabd.css" /><link data-color-theme="dark" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark-afff6c53aef9b9d1.css" /><link data-color-theme="dark_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_high_contrast-c409873d7987dffa.css" /><link data-color-theme="dark_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind-78a2491d538dab5a.css" /><link data-color-theme="dark_colorblind_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind_high_contrast-c26b63d7c532d0a2.css" /><link data-color-theme="dark_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia-a6f60cea68c08405.css" /><link data-color-theme="dark_tritanopia_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia_high_contrast-f66faf28b2ea18b6.css" /><link data-color-theme="dark_dimmed" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed-6701f6218c53cf5b.css" /><link data-color-theme="dark_dimmed_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed_high_contrast-7037fa46ae124d97.css" />

  <style type="text/css">
    :root {
      --tab-size-preference: 4;
    }

    pre, code {
      tab-size: var(--tab-size-preference);
    }
  </style>

    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-primitives-97df7784617ce1ea.css" />
    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-9be9fe6313f476af.css" />
    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-62747e27e61258dc.css" />
    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/github-7a418ea859d1654d.css" />
  <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/repository-72bd7d974b5ac1cc.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/code-4c5c0895f723f870.css" />

  

  <script type="application/json" id="client-env">{"locale":"en","featureFlags":["actions_caches_react_shell","actions_enable_background_steps","actions_new_hosted_runner_image_select_sizes_and_versions","actions_runners_react_shell","activity_diff_file_tree","activity_repos_file_tree","activity_repos_overview_header","activity_repos_overview_sidebar","agent_author_search_expansion","agent_author_search_expansion_ui_pulls","alternate_user_config_repo","async_conversion_coverage_enabled","billing_billable_licenses_cost_center_bucket_fix","billing_budget_expiration","billing_cost_center_list_assigned_resources","billing_discount_threshold_notification","code_quality_enablement_banner_targeting","code_quality_remove_preview","code_view_raf_sticky_lines","codespaces_prebuild_region_target_update","coding_agent_third_party_model_ui","copilot_agent_snippy","copilot_api_agentic_issue_marshal_yaml","copilot_automation_repo_mcp_servers","copilot_automations_pagination","copilot_base_model_policy_row","copilot_chat_auto_mode_v2","copilot_chat_clear_model_selection_for_default_change","copilot_chat_early_task_provisioning","copilot_chat_persist_session_drafts","copilot_chat_vision_dotcom_chat_ga_gate","copilot_css_textarea_autosize","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_duplicate_thread","copilot_extensions_removal_on_marketplace","copilot_fix_failed_workflows_all_skus","copilot_hide_hovercard","copilot_immersive_task_hyperlinking","copilot_mc_cli_resume_any_users_task","copilot_mission_control_agent_merge_fix_ci","copilot_mission_control_agent_merge_resolve_conflicts","copilot_mission_control_awps_batching","copilot_mission_control_early_stop","copilot_mission_control_managed_sandbox_environments","copilot_mission_control_needs_attention","copilot_mission_control_reasoning_effort","copilot_mission_control_sandbox_remote_bypass","copilot_mission_control_task_alive_updates","copilot_mission_control_task_sharing","copilot_org_policy_page_focus_mode","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_swe_agent_authorization_status_ui","copilot_swe_agent_automation_resource_scoped_writes","copilot_swe_agent_discussion_comment_trigger","copilot_swe_agent_discussion_opened_trigger","copilot_swe_agent_discussion_updated_trigger","copilot_swe_agent_hide_model_picker_if_only_auto","copilot_swe_agent_issue_assigned_trigger","copilot_swe_agent_issue_comment_trigger","copilot_swe_agent_issue_labeled_trigger","copilot_swe_agent_pr_comment_model_picker","copilot_swe_agent_pull_request_assigned_trigger","copilot_swe_agent_pull_request_comment_trigger","copilot_swe_agent_pull_request_labeled_trigger","copilot_swe_agent_pull_request_merged_trigger","copilot_swe_agent_pull_request_opened_trigger","copilot_swe_agent_pull_request_ready_for_review_trigger","copilot_swe_agent_pull_request_review_requested_trigger","copilot_swe_agent_pull_request_review_submitted_trigger","copilot_swe_agent_pull_request_synchronize_trigger","copilot_swe_agent_sub_issue_added_trigger","copilot_swe_agent_use_subagents","copilot_task_api_github_rest_style","copilot_task_scoped_alive_channel","copilot_token_based_billing","copilot_unconfigured_is_inherited","copilot_user_can_upgrade_plan_field","copilot_workbench_sunset_redirect","dashboard_agents_module_auth_token_check","dashboard_indexeddb_caching","dashboard_lists_max_age_filter","fgpat_permissions_selector_redesign","glc_code_quality_repo_settings_workflow_config","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","hyperspace_2025_logged_out_batch_3","in_product_messaging_datadog_monitoring","ipm_ubb_individual_budget_banner","issue_fields_multi_select","issue_inline_avatars","issue_pinned_views","issue_pinned_views_team_vs_personal","issue_relative_time_micro","issues_dashboard_sso_structured_errors","issues_expanded_file_types","issues_hide_closed_sub_issues","issues_index_data_router","issues_lazy_load_comment_box_suggestions","issues_react_chrome_container_query_fix","labels_archiving","labels_archiving_info","landing_pages_ninetailed","lifecycle_label_name_updates","marketing_cookie_consent_banner","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","memex_remove_deprecated_type_issue","merge_queue_restricted_pushers_warning","merge_status_header_feedback","milestone_closed_issues_prioritization","milestone_show_data_router","octocaptcha_origin_optimization","primer_react_css_anchor_positioning","primer_react_merged_forwarded_refs","prs_copilot_app_open_action","prs_css_anchor_positioning","pull_request_copilot_attribution_header","pull_request_overview_merge_control","pull_request_overview_panel_edit_description","pull_request_persister","pull_request_stacks_navigation_shortcuts","pull_request_virtualization_image_estimate","pull_request_virtualization_loader_batching","pull_request_virtualization_scroll_compensation","pull_request_virtualization_scroll_intent","quick_search_lazy_suggestions","react_blob_isolate_code_lines","react_blob_ssr_content_visibility","react_data_router_tanstack_allowed","react_logged_out_repository_header","react_query_props_with_key","react_sandbox_future_tanstack","repo_app_turbo","repo_issues_sidebar_layout","repo_pulls_dashboard_declutter","repo_pulls_dashboard_ga","repo_pulls_dashboard_persistence","repo_pulls_dashboard_sidebar_links","repos_contributors_limited_default_range","review_involves_filter","rule_ignored_file_paths","rulesets_actor_list_editor","sample_network_conn_type","security_center_artifact_filters_popover","see_who_reacted","semantic_similarity_duplicate_issue_detection","session_logs_ungroup_reasoning_text","set_sha256_on_repo_creation_form","site_banner_desktop_copilot_app","site_ghca_pixel_mona","site_github_app_ga_page","site_github_app_ga_page_highlight","site_github_app_mobile_native_share","site_global_banner_dev_days_attendee","site_global_nav_spark_models_removed","speculation_rules_ui_service","suggest_custom_property_values_copilot","suppress_automated_browser_vitals","swp_forms_disable_octocaptcha","thread_resolution_reason","update_issue_suggestions","viewscreen_sandbox","warn_inaccessible_attachments","webp_support","workstream_plugin_bootstrap"],"githubDomain":"https://github.com","copilotApiOverrideUrl":"https://api.githubcopilot.com","cmcApiUrl":"https://api.github.com/cmc_internal/api"}</script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/high-contrast-cookie-b752d992928a526c.js"></script>
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/wp-runtime-9f688730c8670bcd.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/app-foundation-2f08c823163591a8.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/app-runtime-633ad94fa06c334b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fetch-utilities-0fb4c544a797ec0d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ser-7c872b58ac9f1b39.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/tp-7e9817cf5c068979.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/environment-d5ac5c6c0ff82dad.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/app-runtime.bef03fb24bb03be8.module.css" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/catalyst-52ed81112a548e10.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/selector-observer-e8810f64c443fb9b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/relative-time-element-0417f617ad744a0d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/by-9da36843ba9d191d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ja9-9a1160b939f2cd52.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/3h-55903cf2303047ad.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/hk-f1498fec45311acd.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/jz5-7aa1ff0a0e750f41.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/hj-1d800d09e9a8720a.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/j0-9697c1c8f5cbf523.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/github-elements-82cb199fd0cf6516.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/element-registry-9bf553744fe18335.js" defer="defer"></script>
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/runtime-helpers-5e0b3ae3c4036207.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/aria-live-524a06aa946df6fc.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/hotkey-b1ee53c2200b172a.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-core-7bf7b9d689fe3d10.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/a9-ca3bc10b816bcc1f.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ur-21ec1e439ee2d87c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/4t-4c39f7195fc42cc8.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/pb-53cfff089eaac51b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/6n-afcf86ccabc4cad2.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/zj-4d9cf83cf08e1643.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/wo-6991af5b3829ffe8.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/nfv-a6c14301d3ea6d67.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/b5-a2fde30ce0c692b9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/sw-9d0489dbf9a9c942.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ttf-7d5abe1b447ced2c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/sj-c7a44023ee90d468.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/0pd-c46d8dfae89c2b64.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/behaviors-2198390a7f5cea63.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/react-core.255cab819a92f7e1.module.css" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/code-menu-cea7728cfd2f3d62.js" defer="defer"></script>
  
  <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/primer-react-8503588299651923.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ncx-66e64888bc4615bb.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/qmp-c7cfba40cf5a93b0.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/j6-148a74299e5a01ab.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/t7l-a9404625ec30bbc7.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/4u-8f9f1d6be01d6a22.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/s0-68d09e5e8a80cb94.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/y5-0cb3f75cec297941.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/n4u-cd9039ad946274ad.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/j8s-00bd469c4017a543.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/la-27679061f16e1495.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/iu-2d03f5e6d4fdd54d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/gru-2b0fac8887ff8c57.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/a0-234e967e7c6d22ce.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/gz3-5bdfbfceac967bb6.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/15m-64f3034430471048.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/1e-c15441bdb94d54ae.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/gzu-6ad9a0527a5d7afd.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/bi-3a42b8714e06c4d0.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/tu1-37e16844272ddefa.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/b1-ac66ededed061993.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/gmn-1e5497c041b66231.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/0l5-d1b2a63015b5eb6d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/c2-e85522be441acf73.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/f9-baf0a4193779952e.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/sp-87dce99c82a27004.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/zkm-116b01b8485bbe3f.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/og-518d12c9e011601d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/b9-947db365ea875cfa.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/14-8c7b4ad3c845664c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/dsj-2e7d883cb843e9e6.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ec-38012819307fd539.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/du-6607da3b8b579202.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/20-f43eb09c2be69457.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ql0-107312645ac2b72d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/wp-fa7cdc0f7656d876.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/p0l-fe491d943adf7508.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/v1e-d099d9fd21ad25e5.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fn-7b298a45c55fb6fb.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/7cw-6e493a20eaaa04b5.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ok-290e4b9465ba9c5b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/6d-ca6d584a0fd6368c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/y8-e2f18f5a24733f3b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/xc-3fd4a2e7dcbad8e2.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/vjg-2874f95f389c4d3f.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/code-view-2743729837dcb46b.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.e4334163c54cccf5.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/ql0.501e99879e15a48e.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/xc.de2b1dde0494f261.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/code-view.11c24ad1d0aa48bd.module.css" />


  <title>jcode/README.md at master · adminwat/jcode · GitHub</title>



  <meta name="route-pattern" content="/:user_id/:repository/blob/*name(/*path)" data-turbo-transient>
  <meta name="route-controller" content="blob" data-turbo-transient>
  <meta name="route-action" content="show" data-turbo-transient>
  <meta name="fetch-nonce" content="v2:ad58a80d-80f7-4f09-aecc-41edd6fe1a1a">

    
  <meta name="current-catalog-service-hash" content="f3abb0cc802f3d7b95fc8762b94bdcb13bf39634c40c357301c4aa1d67a256fb">


  <meta name="request-id" content="CAAE:3859E4:B236B1:A9A05A:6AC775C1" data-pjax-transient="true"/><meta name="html-safe-nonce" content="b1f704a222d68a5b010ef4e31d7ff942348802da05f1885a1e253eb646bd52ca" data-pjax-transient="true"/><meta name="visitor-payload" content="eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDQUFFOjM4NTlFNDpCMjM2QjE6QTlBMDVBOjZBQzc3NUMxIiwidmlzaXRvcl9pZCI6IjU0MzM5Nzc2MjIzNjk4OTE3NzciLCJyZWdpb25fZWRnZSI6ImZyYSIsInJlZ2lvbl9yZW5kZXIiOiJmcmEifQ==" data-pjax-transient="true"/><meta name="visitor-hmac" content="60b58ac9c356ef3edad82ff12fd3d3de5ac58887d137049f470cd2ce5d96fb4c" data-pjax-transient="true"/>


    <meta name="hovercard-subject-tag" content="repository:1342775849" data-turbo-transient>


  <meta name="github-keyboard-shortcuts" content="repository,source-code,file-tree,copilot" data-turbo-transient="true" />
  

  <meta name="selected-link" value="repo_source" data-turbo-transient>
  <link rel="assets" href="https://github.githubassets.com/">

    <meta name="google-site-verification" content="Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I">

<meta name="octolytics-url" content="https://collector.github.com/github/collect" />





  <meta name="analytics-location" content="/&lt;user-name&gt;/&lt;repo-name&gt;/blob/show" data-turbo-transient="true" />

  




    <meta name="user-login" content="">

  

    <meta name="viewport" content="width=device-width">

    

      <meta name="description" content="The most RAM efficient harness. Contribute to adminwat/jcode development by creating an account on GitHub.">

      <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="GitHub">

    <link rel="fluid-icon" href="https://github.com/fluidicon.png" title="GitHub">
    <meta property="fb:app_id" content="1401488693436528">
    <meta name="apple-itunes-app" content="app-id=1477376905, app-argument=https://github.com/adminwat/jcode/blob/master/README.md" />

      <meta name="twitter:image" content="https://opengraph.githubassets.com/e465b884eff3b24133f355f88b93abc03df215ae14307620ed7657717b08d45d/adminwat/jcode" /><meta name="twitter:site" content="@github" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:title" content="jcode/README.md at master · adminwat/jcode" /><meta name="twitter:description" content="The most RAM efficient harness. Contribute to adminwat/jcode development by creating an account on GitHub." />
  <meta property="og:image" content="https://opengraph.githubassets.com/e465b884eff3b24133f355f88b93abc03df215ae14307620ed7657717b08d45d/adminwat/jcode" /><meta property="og:image:alt" content="The most RAM efficient harness. Contribute to adminwat/jcode development by creating an account on GitHub." /><meta property="og:image:width" content="1200" /><meta property="og:image:height" content="600" /><meta property="og:site_name" content="GitHub" /><meta property="og:type" content="object" /><meta property="og:title" content="jcode/README.md at master · adminwat/jcode" /><meta property="og:url" content="https://github.com/adminwat/jcode/blob/master/README.md" /><meta property="og:description" content="The most RAM efficient harness. Contribute to adminwat/jcode development by creating an account on GitHub." />
  




      <meta name="hostname" content="github.com">



        <meta name="expected-hostname" content="github.com">


  <meta http-equiv="x-pjax-version" content="e522098cd81ce3951f93d525f1bab680d96d458ceaa79f4334f1a1acbd31325a" data-turbo-track="reload">
  <meta http-equiv="x-pjax-csp-version" content="c4a65e47b0c850e1157ae8e66298070851d7e3b558038de5a3b4ff7a93e630ed" data-turbo-track="reload">
  <meta http-equiv="x-pjax-css-version" content="1ff3f1d4e1abd61f6f135b47d3b815e2f7169f8dd418f0118c6b1cf4de6cbc86" data-turbo-track="reload">
  <meta http-equiv="x-pjax-js-version" content="df1876f47a5ef2fa7fbfc80778d9090e7c16f6a2e8185c3ff473153a18e2b7c0" data-turbo-track="reload">

  <meta name="turbo-cache-control" content="no-preview" data-turbo-transient="">

      <meta name="turbo-cache-control" content="no-cache" data-turbo-transient>

    <meta data-hydrostats="publish">

  <meta name="go-import" content="github.com/adminwat/jcode git https://github.com/adminwat/jcode.git">

  <meta name="octolytics-dimension-user_id" content="171701189" /><meta name="octolytics-dimension-user_login" content="adminwat" /><meta name="octolytics-dimension-repository_id" content="1342775849" /><meta name="octolytics-dimension-repository_nwo" content="adminwat/jcode" /><meta name="octolytics-dimension-repository_public" content="true" /><meta name="octolytics-dimension-repository_is_fork" content="true" /><meta name="octolytics-dimension-repository_parent_id" content="1128204614" /><meta name="octolytics-dimension-repository_parent_nwo" content="1jehuang/jcode" /><meta name="octolytics-dimension-repository_network_root_id" content="1128204614" /><meta name="octolytics-dimension-repository_network_root_nwo" content="1jehuang/jcode" />
  



    

    <meta name="turbo-body-classes" content="logged-out env-production page-responsive">
  <meta name="disable-turbo" content="false">


  <meta name="browser-stats-url" content="https://api.github.com/_private/browser/stats">


  <meta name="browser-errors-url" content="https://api.github.com/_private/browser/errors">

  <meta name="release" content="1d3d325175b005a7dd92cb845d32b422a23095f3" data-turbo-track="reload">
  <meta name="ui-target" content="full">

  <link rel="mask-icon" href="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" color="#000000">
  <link rel="alternate icon" class="js-site-favicon" type="image/png" href="https://github.githubassets.com/favicons/favicon.png">
  <link rel="icon" class="js-site-favicon" type="image/svg+xml" href="https://github.githubassets.com/favicons/favicon.svg" data-base-href="https://github.githubassets.com/favicons/favicon">

<meta name="theme-color" content="#1e2327">
<meta name="color-scheme" content="light dark" />


  <link rel="manifest" href="/manifest.json" crossOrigin="use-credentials">

  </head>

  <body class="logged-out env-production page-responsive" style="word-wrap: break-word;" >
    <div data-turbo-body class="logged-out env-production page-responsive" style="word-wrap: break-word;" >
      <div id="__primerPortalRoot__" style="z-index: 1000; position: absolute; width: 100%;" data-turbo-permanent></div>
      

    <div class="position-relative header-wrapper js-header-wrapper ">
      <a href="#start-of-content" data-skip-target-assigned="false" class="px-2 tmp-py-4 color-bg-accent-emphasis color-fg-on-emphasis show-on-focus js-skip-to-content">Skip to content</a>

      <span data-view-component="true" class="progress-pjax-loader Progress position-fixed width-full">
    <span style="width: 0%;" data-view-component="true" class="Progress-item progress-pjax-loader-bar left-0 top-0 color-bg-accent-emphasis"></span>
</span>      
      <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/qc-1bbbe8787ea1cd4b.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/keyboard-shortcuts-dialog-f8c407e82ebe6fc9.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.e4334163c54cccf5.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/keyboard-shortcuts-dialog.81950090fc5b508a.module.css" />

<react-partial
  partial-name="keyboard-shortcuts-dialog"
  data-ssr="false"
  data-attempted-ssr="false"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-partial.embeddedData">{"props":{"docsUrl":"https://docs.github.com/get-started/accessibility/keyboard-shortcuts"}}</script>
  <div data-target="react-partial.reactRoot"></div>
</react-partial>





      

          <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/app-install-banner-partial-1dd5a92ada6adeee.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.e4334163c54cccf5.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/app-install-banner-partial.2ba9251ec6f3a018.module.css" />

<react-partial
  partial-name="app-install-banner-partial"
  data-ssr="false"
  data-attempted-ssr="false"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-partial.embeddedData">{"props":{}}</script>
  <div data-target="react-partial.reactRoot"></div>
</react-partial>


          

                <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/2l-e468179ba7123a2e.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/rwd-069fc3d9814ff9fe.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fz-e662bc3745e171e7.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/jag-3559ee48016881a2.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/3d-7f22b36f29a9dd94.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/tua-4998592d21eb16f7.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/8i-756d611a52e5f265.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/marketing-header-fa45fa8444a09065.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.e4334163c54cccf5.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-brand-css.05b219cdb8e80c43.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/8i.779dd52a6bc5b0b6.module.css" />

<react-partial
  partial-name="marketing-header"
  data-ssr="true"
  data-attempted-ssr="true"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-partial.embeddedData">{"props":{"color_mode":"dark","logged_in":false,"marketing_page":false,"home_path":"/","login_path":"/login?return_to=https%3A%2F%2Fgithub.com%2Fadminwat%2Fjcode%2Fblob%2Fmaster%2FREADME.md","signup_path":"/signup?ref_cta=Sign+up\u0026ref_loc=header+logged+out\u0026ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fblob%2Fshow\u0026source=header-repo\u0026source_repo=adminwat%2Fjcode","signup_enabled":true,"is_signup_controller":false,"show_search_and_nav":true,"hide_search":false,"private_mode_enabled":false,"should_use_dotcom_links":true,"auth_hydro_click":"{\"event_type\":\"authentication.click\",\"payload\":{\"location_in_page\":\"site header menu\",\"repository_id\":null,\"auth_type\":\"SIGN_UP\",\"originating_url\":\"https://github.com/adminwat/jcode/blob/master/README.md\",\"user_id\":null}}","auth_hydro_click_hmac":"c9280b93c1a0d8fffde08f81b697489156022d484d826cd5cca5619e33452fce","overlay":false,"fixed":false}}</script>
  <div data-target="react-partial.reactRoot"><div data-color-mode="dark" data-light-theme="light" data-dark-theme="dark"><header class="MarketingHeader-module__root__Tk7n3 HeaderMktg header-logged-out" role="banner" data-marketing-header="true" data-color-mode="dark" data-light-theme="light" data-dark-theme="dark" data-is-top="true"><h2 class="MarketingHeader-module__visuallyHidden__sqKsl">Navigation Menu</h2><button type="button" class="MarketingHeader-module__backdrop__sw4RU" aria-label="Close navigation menu"></button><div class="MarketingHeader-module__bar__mBSyE"><div class="MarketingHeader-module__topRow__yeury"><div class="MarketingHeader-module__toggleSlot__hDxbh"><button type="button" class="HeaderMenuToggle-module__toggle__i8EiC" aria-label="Toggle navigation" aria-expanded="false"><span class="HeaderMenuToggle-module__toggleBar__jVN0H"></span><span class="HeaderMenuToggle-module__toggleBar__jVN0H"></span><span class="HeaderMenuToggle-module__toggleBar__jVN0H"></span></button></div><a href="/" aria-label="Homepage" class="HeaderLogo-module__logo__UFyHI" data-analytics-event="{&quot;action&quot;:&quot;homepage&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;logo&quot;,&quot;location&quot;:&quot;header&quot;,&quot;label&quot;:&quot;homepage_link_logo_header&quot;}"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-mark-github" viewBox="0 0 24 24" width="32" height="32" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.226 17.284c-2.965-.36-5.054-2.493-5.054-5.256 0-1.123.404-2.336 1.078-3.144-.292-.741-.247-2.314.09-2.965.898-.112 2.111.36 2.83 1.01.853-.269 1.752-.404 2.853-.404 1.1 0 1.999.135 2.807.382.696-.629 1.932-1.1 2.83-.988.315.606.36 2.179.067 2.942.72.854 1.101 2 1.101 3.167 0 2.763-2.089 4.852-5.098 5.234.763.494 1.28 1.572 1.28 2.807v2.336c0 .674.561 1.056 1.235.786 4.066-1.55 7.255-5.615 7.255-10.646C23.5 6.188 18.334 1 11.978 1 5.62 1 .5 6.188.5 12.545c0 4.986 3.167 9.12 7.435 10.669.606.225 1.19-.18 1.19-.786V20.63a2.9 2.9 0 0 1-1.078.224c-1.483 0-2.359-.808-2.987-2.313-.247-.607-.517-.966-1.034-1.033-.27-.023-.359-.135-.359-.27 0-.27.45-.471.898-.471.652 0 1.213.404 1.797 1.235.45.651.921.943 1.483.943.561 0 .92-.202 1.437-.719.382-.381.674-.718.944-.943"></path></svg></a><div class="AuthCTAs-module__mobileActions__NNzeV"><a class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--subtle___F7pEE Primer_Brand__Button-module__Button--size-small___zQrEw AuthCTAs-module__cta__WpwQq" href="/login?return_to=https%3A%2F%2Fgithub.com%2Fadminwat%2Fjcode%2Fblob%2Fmaster%2FREADME.md" data-analytics-event="{&quot;action&quot;:&quot;sign_in&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;auth_cta&quot;,&quot;location&quot;:&quot;header&quot;,&quot;label&quot;:&quot;sign_in_link_auth_cta_header&quot;}" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;originating_url&quot;:&quot;https://github.com/adminwat/jcode/blob/master/README.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="c9280b93c1a0d8fffde08f81b697489156022d484d826cd5cca5619e33452fce"><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-subtle___8ndWH">Sign in</span></span></a><button class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--subtle___F7pEE Primer_Brand__Button-module__Button--size-small___zQrEw HeaderAppearanceSettings-module__trigger__hUheK" type="button" aria-haspopup="dialog" aria-labelledby="_R_3dd_"><span class="Primer_Brand__Button-module__Button__leading-visual___jjtTe" data-testid="Button-leading-visual"><svg data-component="Octicon" focusable="false" aria-hidden="true" class="octicon octicon-sliders Primer_Brand__Button-module__Button__icon-visual____qybb" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M15 2.75a.75.75 0 0 1-.75.75h-4a.75.75 0 0 1 0-1.5h4a.75.75 0 0 1 .75.75Zm-8.5.75v1.25a.75.75 0 0 0 1.5 0v-4a.75.75 0 0 0-1.5 0V2H1.75a.75.75 0 0 0 0 1.5H6.5Zm1.25 5.25a.75.75 0 0 0 0-1.5h-6a.75.75 0 0 0 0 1.5h6ZM15 8a.75.75 0 0 1-.75.75H11.5V10a.75.75 0 1 1-1.5 0V6a.75.75 0 0 1 1.5 0v1.25h2.75A.75.75 0 0 1 15 8Zm-9 5.25v-2a.75.75 0 0 0-1.5 0v1.25H1.75a.75.75 0 0 0 0 1.5H4.5v1.25a.75.75 0 0 0 1.5 0v-2Zm9 0a.75.75 0 0 1-.75.75h-6a.75.75 0 0 1 0-1.5h6a.75.75 0 0 1 .75.75Z"></path></svg></span><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-subtle___8ndWH"></span></span></button><div class="Primer_Brand__Tooltip-module__Tooltip___0Eipx" data-direction="s" aria-hidden="true" id="_R_3dd_">Appearance settings</div></div></div><div class="MarketingHeader-module__menu__GIy3y"><div class="MarketingHeader-module__menuWrapper__owstH"><nav class="MarketingNavigation-module__nav__W0KYY" aria-label="Global"><ul class="MarketingNavigation-module__list__tFbMb"><li><div class="NavDropdown-module__container__l2YeI"><button type="button" class="NavDropdown-module__button__PEHWX" aria-expanded="false" aria-controls="_R_nd_">Platform<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m6.427 4.427 3.396 3.396a.25.25 0 0 1 0 .354l-3.396 3.396A.25.25 0 0 1 6 11.396V4.604a.25.25 0 0 1 .427-.177Z"></path></svg></button><div id="_R_nd_" class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_5knd_">AI CODE CREATION</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5knd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/copilot" data-analytics-event="{&quot;action&quot;:&quot;github_copilot&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_copilot_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copilot NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.998 15.035c-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.201-.508-.254-1.084-.254-1.656 0-.87.128-1.769.693-2.484.579-.733 1.494-1.124 2.724-1.261 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095v1.872c0 .766-3.351 3.795-8.002 3.795Zm0-1.485c2.28 0 4.584-1.11 5.002-1.433V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-1.146 0-2.059-.327-2.71-.991A3.222 3.222 0 0 1 8 6.303a3.24 3.24 0 0 1-.544.743c-.65.664-1.563.991-2.71.991-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433ZM6.762 2.83c-.193-.206-.637-.413-1.682-.297-1.019.113-1.479.404-1.713.7-.247.312-.369.789-.369 1.554 0 .793.129 1.171.308 1.371.162.181.519.379 1.442.379.853 0 1.339-.235 1.638-.54.315-.322.527-.827.617-1.553.117-.935-.037-1.395-.241-1.614Zm4.155-.297c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Z"></path><path d="M6.25 9.037a.75.75 0 0 1 .75.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 .75-.75Zm4.25.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 1.5 0Z"></path></svg>GitHub Copilot</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Write better code with AI</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/ai/github-app" data-analytics-event="{&quot;action&quot;:&quot;github_copilot_app&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_copilot_app_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-mark-github NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.766 11.328c-2.063-.25-3.516-1.734-3.516-3.656 0-.781.281-1.625.75-2.188-.203-.515-.172-1.609.063-2.062.625-.078 1.468.25 1.968.703.594-.187 1.219-.281 1.985-.281.765 0 1.39.094 1.953.265.484-.437 1.344-.765 1.969-.687.218.422.25 1.515.046 2.047.5.593.766 1.39.766 2.203 0 1.922-1.453 3.375-3.547 3.64.531.344.89 1.094.89 1.954v1.625c0 .468.391.734.86.547C13.781 14.359 16 11.53 16 8.03 16 3.61 12.406 0 7.984 0 3.563 0 0 3.61 0 8.031a7.88 7.88 0 0 0 5.172 7.422c.422.156.828-.125.828-.547v-1.25c-.219.094-.5.156-.75.156-1.031 0-1.64-.562-2.078-1.609-.172-.422-.36-.672-.719-.719-.187-.015-.25-.093-.25-.187 0-.188.313-.328.625-.328.453 0 .844.281 1.25.86.313.452.64.655 1.031.655s.641-.14 1-.5c.266-.265.47-.5.657-.656"></path></svg>GitHub Copilot app</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Direct agents from issue to merge</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/mcp" data-analytics-event="{&quot;action&quot;:&quot;mcp_registry&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;mcp_registry_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-mcp NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M5.52 1.12a3.578 3.578 0 0 1 6.078 2.98 3.578 3.578 0 0 1 2.982 6.08l-3.292 3.293a.252.252 0 0 0 0 .354l.843.843a.749.749 0 1 1-1.06 1.06l-.844-.843a1.75 1.75 0 0 1 0-2.474L13.52 9.12a2.08 2.08 0 0 0 0-2.94 2.08 2.08 0 0 0-2.94 0L7.731 9.03A.75.75 0 0 1 6.67 7.97l2.85-2.85a2.08 2.08 0 0 0 0-2.94 2.08 2.08 0 0 0-2.94 0l-4.799 4.8A.75.75 0 0 1 .72 5.92Z"></path><path d="M7.52 3.12a.749.749 0 1 1 1.06 1.06L5.731 7.03A2.079 2.079 0 0 0 8.67 9.97l2.85-2.85a.749.749 0 1 1 1.06 1.06l-2.849 2.85A3.578 3.578 0 0 1 4.67 5.97Z"></path></svg>MCP Registry</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Integrate external tools</span></span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_9knd_">DEVELOPER WORKFLOWS</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9knd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/actions" data-analytics-event="{&quot;action&quot;:&quot;actions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;actions_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-workflow NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 1.75C0 .784.784 0 1.75 0h3.5C6.216 0 7 .784 7 1.75v3.5A1.75 1.75 0 0 1 5.25 7H4v4a1 1 0 0 0 1 1h4v-1.25C9 9.784 9.784 9 10.75 9h3.5c.966 0 1.75.784 1.75 1.75v3.5A1.75 1.75 0 0 1 14.25 16h-3.5A1.75 1.75 0 0 1 9 14.25v-.75H5A2.5 2.5 0 0 1 2.5 11V7h-.75A1.75 1.75 0 0 1 0 5.25Zm1.75-.25a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Zm9 9a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Z"></path></svg>Actions</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Automate any workflow</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/codespaces" data-analytics-event="{&quot;action&quot;:&quot;codespaces&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;codespaces_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-codespaces NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 11.25c0-.966.784-1.75 1.75-1.75h12.5c.966 0 1.75.784 1.75 1.75v3A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm2-9.5C2 .784 2.784 0 3.75 0h8.5C13.216 0 14 .784 14 1.75v5a1.75 1.75 0 0 1-1.75 1.75h-8.5A1.75 1.75 0 0 1 2 6.75Zm1.75-.25a.25.25 0 0 0-.25.25v5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-5a.25.25 0 0 0-.25-.25Zm-2 9.5a.25.25 0 0 0-.25.25v3c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-3a.25.25 0 0 0-.25-.25Z"></path><path d="M7 12.75a.75.75 0 0 1 .75-.75h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1-.75-.75Zm-4 0a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1-.75-.75Z"></path></svg>Codespaces</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Instant dev environments</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/issues" data-analytics-event="{&quot;action&quot;:&quot;issues&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;issues_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-issue-opened NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path></svg>Issues</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Plan and track work</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/code-review" data-analytics-event="{&quot;action&quot;:&quot;code_review&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;code_review_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-code NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path></svg>Code Review</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Manage code changes</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/code-quality" data-analytics-event="{&quot;action&quot;:&quot;code_quality&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;code_quality_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-codescan-checkmark NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.28 6.28a.75.75 0 1 0-1.06-1.06L6.25 8.19l-.97-.97a.75.75 0 0 0-1.06 1.06l1.5 1.5a.75.75 0 0 0 1.06 0l3.5-3.5Z"></path><path d="M7.5 15a7.5 7.5 0 1 1 5.807-2.754l2.473 2.474a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-2.474-2.473A7.472 7.472 0 0 1 7.5 15Zm0-13.5a6 6 0 1 0 4.094 10.386.748.748 0 0 1 .293-.292 6.002 6.002 0 0 0 1.117-6.486A6.002 6.002 0 0 0 7.5 1.5Z"></path></svg>Code Quality</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Enforce quality at merge</span></span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_dknd_">APPLICATION SECURITY</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_dknd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/security/advanced-security" data-analytics-event="{&quot;action&quot;:&quot;github_advanced_security&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_advanced_security_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-shield-check NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m8.533.133 5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667l5.25-1.68a1.748 1.748 0 0 1 1.066 0Zm-.61 1.429.001.001-5.25 1.68a.251.251 0 0 0-.174.237V7c0 1.36.275 2.666 1.057 3.859.784 1.194 2.121 2.342 4.366 3.298a.196.196 0 0 0 .154 0c2.245-.957 3.582-2.103 4.366-3.297C13.225 9.666 13.5 8.358 13.5 7V3.48a.25.25 0 0 0-.174-.238l-5.25-1.68a.25.25 0 0 0-.153 0ZM11.28 6.28l-3.5 3.5a.75.75 0 0 1-1.06 0l-1.5-1.5a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l.97.97 2.97-2.97a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path></svg>GitHub Advanced Security</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Find and fix vulnerabilities</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/security/advanced-security/code-security" data-analytics-event="{&quot;action&quot;:&quot;code_security&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;code_security_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-code-square NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25Zm7.47 3.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L10.69 8 9.22 6.53a.75.75 0 0 1 0-1.06ZM6.78 6.53 5.31 8l1.47 1.47a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path></svg>Code security</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Secure your code as you build</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/security/advanced-security/secret-protection" data-analytics-event="{&quot;action&quot;:&quot;secret_protection&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;secret_protection_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-lock NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M4 4a4 4 0 0 1 8 0v2h.25c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 12.25 15h-8.5A1.75 1.75 0 0 1 2 13.25v-5.5C2 6.784 2.784 6 3.75 6H4Zm8.25 3.5h-8.5a.25.25 0 0 0-.25.25v5.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-5.5a.25.25 0 0 0-.25-.25ZM10.5 6V4a2.5 2.5 0 1 0-5 0v2Z"></path></svg>Secret protection</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Stop leaks before they start</span></span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ NavGroup-module__hasSeparator__FnMrN"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_hknd_">EXPLORE</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_hknd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/why-github" data-analytics-event="{&quot;action&quot;:&quot;why_github&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;why_github_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Why GitHub</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://docs.github.com" data-analytics-event="{&quot;action&quot;:&quot;documentation&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;documentation_link_platform_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Documentation</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://github.blog" data-analytics-event="{&quot;action&quot;:&quot;blog&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;blog_link_platform_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Blog</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://github.blog/changelog" data-analytics-event="{&quot;action&quot;:&quot;changelog&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;changelog_link_platform_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Changelog</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/marketplace" data-analytics-event="{&quot;action&quot;:&quot;marketplace&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;marketplace_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Marketplace</span></a></li></ul></div></li></ul><div class="NavDropdown-module__trailingLinkContainer__VgJGL"><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/features" data-analytics-event="{&quot;action&quot;:&quot;view_all_features&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_features_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all features</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></div></div></div></li><li><div class="NavDropdown-module__container__l2YeI"><button type="button" class="NavDropdown-module__button__PEHWX" aria-expanded="false" aria-controls="_R_17d_">Solutions<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m6.427 4.427 3.396 3.396a.25.25 0 0 1 0 .354l-3.396 3.396A.25.25 0 0 1 6 11.396V4.604a.25.25 0 0 1 .427-.177Z"></path></svg></button><div id="_R_17d_" class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_5l7d_">BY COMPANY SIZE</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5l7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/enterprise" data-analytics-event="{&quot;action&quot;:&quot;enterprises&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;enterprises_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Enterprises</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/team" data-analytics-event="{&quot;action&quot;:&quot;small_and_medium_teams&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;small_and_medium_teams_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Small and medium teams</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/enterprise/startups" data-analytics-event="{&quot;action&quot;:&quot;startups&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;startups_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Startups</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/industry/nonprofits" data-analytics-event="{&quot;action&quot;:&quot;nonprofits&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;nonprofits_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Nonprofits</span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_9l7d_">BY USE CASE</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9l7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/use-case/app-modernization" data-analytics-event="{&quot;action&quot;:&quot;app_modernization&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;app_modernization_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">App Modernization</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/use-case/devsecops" data-analytics-event="{&quot;action&quot;:&quot;devsecops&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;devsecops_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">DevSecOps</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/use-case/devops" data-analytics-event="{&quot;action&quot;:&quot;devops&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;devops_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">DevOps</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/use-case/ci-cd" data-analytics-event="{&quot;action&quot;:&quot;ci/cd&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;ci/cd_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">CI/CD</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/solutions/use-case" data-analytics-event="{&quot;action&quot;:&quot;view_all_use_cases&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_use_cases_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all use cases</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_dl7d_">BY INDUSTRY</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_dl7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/industry/healthcare" data-analytics-event="{&quot;action&quot;:&quot;healthcare&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;healthcare_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Healthcare</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/industry/financial-services" data-analytics-event="{&quot;action&quot;:&quot;financial_services&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;financial_services_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Financial services</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/industry/manufacturing" data-analytics-event="{&quot;action&quot;:&quot;manufacturing&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;manufacturing_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Manufacturing</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/industry/government" data-analytics-event="{&quot;action&quot;:&quot;government&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;government_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Government</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/solutions/industry" data-analytics-event="{&quot;action&quot;:&quot;view_all_industries&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_industries_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all industries</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></li></ul></div></li></ul><div class="NavDropdown-module__trailingLinkContainer__VgJGL"><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/solutions" data-analytics-event="{&quot;action&quot;:&quot;view_all_solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_solutions_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all solutions</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></div></div></div></li><li><div class="NavDropdown-module__container__l2YeI"><button type="button" class="NavDropdown-module__button__PEHWX" aria-expanded="false" aria-controls="_R_1nd_">Resources<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m6.427 4.427 3.396 3.396a.25.25 0 0 1 0 .354l-3.396 3.396A.25.25 0 0 1 6 11.396V4.604a.25.25 0 0 1 .427-.177Z"></path></svg></button><div id="_R_1nd_" class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_5lnd_">EXPLORE BY TOPIC</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5lnd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/articles?topic=ai" data-analytics-event="{&quot;action&quot;:&quot;ai&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;ai_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">AI</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/articles?topic=software-development" data-analytics-event="{&quot;action&quot;:&quot;software_development&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;software_development_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Software Development</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/articles?topic=devops" data-analytics-event="{&quot;action&quot;:&quot;devops&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;devops_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">DevOps</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/articles?topic=security" data-analytics-event="{&quot;action&quot;:&quot;security&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;security_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Security</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/resources/articles" data-analytics-event="{&quot;action&quot;:&quot;view_all_topics&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_topics_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all topics</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_9lnd_">EXPLORE BY TYPE</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9lnd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/customer-stories" data-analytics-event="{&quot;action&quot;:&quot;customer_stories&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;customer_stories_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Customer stories</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/events" data-analytics-event="{&quot;action&quot;:&quot;events__webinars&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;events__webinars_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Events &amp; webinars</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/whitepapers" data-analytics-event="{&quot;action&quot;:&quot;ebooks__reports&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;ebooks__reports_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Ebooks &amp; reports</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/executive-insights" data-analytics-event="{&quot;action&quot;:&quot;business_insights&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;business_insights_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Business insights</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://skills.github.com" data-analytics-event="{&quot;action&quot;:&quot;github_skills&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_skills_link_resources_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">GitHub Skills</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_dlnd_">SUPPORT &amp; SERVICES</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_dlnd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://docs.github.com" data-analytics-event="{&quot;action&quot;:&quot;documentation&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;documentation_link_resources_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Documentation</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://support.github.com" data-analytics-event="{&quot;action&quot;:&quot;customer_support&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;customer_support_link_resources_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Customer support</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/orgs/community/discussions" data-analytics-event="{&quot;action&quot;:&quot;community_forum&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;community_forum_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Community forum</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/trust-center" data-analytics-event="{&quot;action&quot;:&quot;trust_center&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;trust_center_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Trust center</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/partners" data-analytics-event="{&quot;action&quot;:&quot;partners&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;partners_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Partners</span></a></li></ul></div></li></ul><div class="NavDropdown-module__trailingLinkContainer__VgJGL"><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/resources" data-analytics-event="{&quot;action&quot;:&quot;view_all_resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_resources_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all resources</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></div></div></div></li><li><div class="NavDropdown-module__container__l2YeI"><button type="button" class="NavDropdown-module__button__PEHWX" aria-expanded="false" aria-controls="_R_27d_">Open Source<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m6.427 4.427 3.396 3.396a.25.25 0 0 1 0 .354l-3.396 3.396A.25.25 0 0 1 6 11.396V4.604a.25.25 0 0 1 .427-.177Z"></path></svg></button><div id="_R_27d_" class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_5m7d_">COMMUNITY</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5m7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/open-source/sponsors" data-analytics-event="{&quot;action&quot;:&quot;github_sponsors&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_sponsors_link_open_source_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-sponsor-tiers NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.586 1C12.268 1 13.5 2.37 13.5 4.25c0 1.745-.996 3.359-2.622 4.831-.166.15-.336.297-.509.438l1.116 5.584a.75.75 0 0 1-.991.852l-2.409-.876a.25.25 0 0 0-.17 0l-2.409.876a.75.75 0 0 1-.991-.852L5.63 9.519a13.78 13.78 0 0 1-.51-.438C3.497 7.609 2.5 5.995 2.5 4.25 2.5 2.37 3.732 1 5.414 1c.963 0 1.843.403 2.474 1.073L8 2.198l.112-.125a3.385 3.385 0 0 1 2.283-1.068L10.586 1Zm-3.621 9.495-.718 3.594 1.155-.42a1.75 1.75 0 0 1 1.028-.051l.168.051 1.154.42-.718-3.592c-.199.13-.37.235-.505.314l-.169.097a.75.75 0 0 1-.72 0 9.54 9.54 0 0 1-.515-.308l-.16-.105ZM10.586 2.5c-.863 0-1.611.58-1.866 1.459-.209.721-1.231.721-1.44 0C7.025 3.08 6.277 2.5 5.414 2.5 4.598 2.5 4 3.165 4 4.25c0 1.23.786 2.504 2.128 3.719.49.443 1.018.846 1.546 1.198l.325.21.076-.047.251-.163a13.341 13.341 0 0 0 1.546-1.198C11.214 6.754 12 5.479 12 4.25c0-1.085-.598-1.75-1.414-1.75Z"></path></svg>GitHub Sponsors</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Fund open source developers</span></span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_9m7d_">PROGRAMS</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9m7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://securitylab.github.com" data-analytics-event="{&quot;action&quot;:&quot;security_lab&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;security_lab_link_open_source_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Security Lab</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://maintainers.github.com" data-analytics-event="{&quot;action&quot;:&quot;maintainer_community&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;maintainer_community_link_open_source_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Maintainer Community</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://stars.github.com" data-analytics-event="{&quot;action&quot;:&quot;github_stars&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_stars_link_open_source_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">GitHub Stars</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://archiveprogram.github.com" data-analytics-event="{&quot;action&quot;:&quot;archive_program&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;archive_program_link_open_source_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Archive Program</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_dm7d_">REPOSITORIES</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_dm7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/topics" data-analytics-event="{&quot;action&quot;:&quot;topics&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;topics_link_open_source_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Topics</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/trending" data-analytics-event="{&quot;action&quot;:&quot;trending&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;trending_link_open_source_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Trending</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/collections" data-analytics-event="{&quot;action&quot;:&quot;collections&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;collections_link_open_source_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Collections</span></a></li></ul></div></li></ul></div></div></li><li><div class="NavDropdown-module__container__l2YeI"><button type="button" class="NavDropdown-module__button__PEHWX" aria-expanded="false" aria-controls="_R_2nd_">Enterprise<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m6.427 4.427 3.396 3.396a.25.25 0 0 1 0 .354l-3.396 3.396A.25.25 0 0 1 6 11.396V4.604a.25.25 0 0 1 .427-.177Z"></path></svg></button><div id="_R_2nd_" class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_5mnd_">ENTERPRISE SOLUTIONS</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5mnd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/enterprise" data-analytics-event="{&quot;action&quot;:&quot;enterprise_platform&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;enterprise_platform_link_enterprise_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-stack NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.122.392a1.75 1.75 0 0 1 1.756 0l5.003 2.902c.83.481.83 1.68 0 2.162L8.878 8.358a1.75 1.75 0 0 1-1.756 0L2.119 5.456a1.251 1.251 0 0 1 0-2.162ZM8.125 1.69a.248.248 0 0 0-.25 0l-4.63 2.685 4.63 2.685a.248.248 0 0 0 .25 0l4.63-2.685ZM1.601 7.789a.75.75 0 0 1 1.025-.273l5.249 3.044a.248.248 0 0 0 .25 0l5.249-3.044a.75.75 0 0 1 .752 1.298l-5.248 3.044a1.75 1.75 0 0 1-1.756 0L1.874 8.814A.75.75 0 0 1 1.6 7.789Zm0 3.5a.75.75 0 0 1 1.025-.273l5.249 3.044a.248.248 0 0 0 .25 0l5.249-3.044a.75.75 0 0 1 .752 1.298l-5.248 3.044a1.75 1.75 0 0 1-1.756 0l-5.248-3.044a.75.75 0 0 1-.273-1.025Z"></path></svg>Enterprise platform</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">AI-powered developer platform</span></span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_9mnd_">AVAILABLE ADD-ONS</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9mnd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/security/advanced-security" data-analytics-event="{&quot;action&quot;:&quot;github_advanced_security&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_advanced_security_link_enterprise_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-shield-check NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m8.533.133 5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667l5.25-1.68a1.748 1.748 0 0 1 1.066 0Zm-.61 1.429.001.001-5.25 1.68a.251.251 0 0 0-.174.237V7c0 1.36.275 2.666 1.057 3.859.784 1.194 2.121 2.342 4.366 3.298a.196.196 0 0 0 .154 0c2.245-.957 3.582-2.103 4.366-3.297C13.225 9.666 13.5 8.358 13.5 7V3.48a.25.25 0 0 0-.174-.238l-5.25-1.68a.25.25 0 0 0-.153 0ZM11.28 6.28l-3.5 3.5a.75.75 0 0 1-1.06 0l-1.5-1.5a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l.97.97 2.97-2.97a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path></svg>GitHub Advanced Security</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Enterprise-grade security features</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/copilot/copilot-business" data-analytics-event="{&quot;action&quot;:&quot;copilot_for_business&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;copilot_for_business_link_enterprise_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copilot NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.998 15.035c-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.201-.508-.254-1.084-.254-1.656 0-.87.128-1.769.693-2.484.579-.733 1.494-1.124 2.724-1.261 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095v1.872c0 .766-3.351 3.795-8.002 3.795Zm0-1.485c2.28 0 4.584-1.11 5.002-1.433V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-1.146 0-2.059-.327-2.71-.991A3.222 3.222 0 0 1 8 6.303a3.24 3.24 0 0 1-.544.743c-.65.664-1.563.991-2.71.991-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433ZM6.762 2.83c-.193-.206-.637-.413-1.682-.297-1.019.113-1.479.404-1.713.7-.247.312-.369.789-.369 1.554 0 .793.129 1.171.308 1.371.162.181.519.379 1.442.379.853 0 1.339-.235 1.638-.54.315-.322.527-.827.617-1.553.117-.935-.037-1.395-.241-1.614Zm4.155-.297c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Z"></path><path d="M6.25 9.037a.75.75 0 0 1 .75.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 .75-.75Zm4.25.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 1.5 0Z"></path></svg>Copilot for Business</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Enterprise-grade AI features</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/enterprise/premium-support" data-analytics-event="{&quot;action&quot;:&quot;premium_support&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;premium_support_link_enterprise_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-comment-discussion NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1h8.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 10.25 10H7.061l-2.574 2.573A1.458 1.458 0 0 1 2 11.543V10h-.25A1.75 1.75 0 0 1 0 8.25v-5.5C0 1.784.784 1 1.75 1ZM1.5 2.75v5.5c0 .138.112.25.25.25h1a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h3.5a.25.25 0 0 0 .25-.25v-5.5a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25Zm13 2a.25.25 0 0 0-.25-.25h-.5a.75.75 0 0 1 0-1.5h.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 14.25 12H14v1.543a1.458 1.458 0 0 1-2.487 1.03L9.22 12.28a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l2.22 2.22v-2.19a.75.75 0 0 1 .75-.75h1a.25.25 0 0 0 .25-.25Z"></path></svg>Premium Support</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Enterprise-grade 24/7 support</span></span></a></li></ul></div></li></ul></div></div></li><li><a href="https://github.com/pricing" data-analytics-event="{&quot;action&quot;:&quot;pricing&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;pricing&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;pricing_link_pricing_navbar&quot;}" class="MarketingNavigation-module__navLink__hUomM">Pricing</a></li></ul></nav><div class="MarketingHeader-module__ctaContainer__tBmPz"><div class="HeaderSearch-module__searchSlot__oVOUS"><button class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--subtle___F7pEE Primer_Brand__Button-module__Button--size-small___zQrEw HeaderSearch-module__trigger__zsF9q" type="button" aria-haspopup="dialog" aria-expanded="false" aria-label="Search or jump to, type / to search" data-analytics-event="{&quot;action&quot;:&quot;searchbar&quot;,&quot;tag&quot;:&quot;input&quot;,&quot;context&quot;:&quot;global&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;searchbar_input_global_navbar&quot;}"><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-subtle___8ndWH"><span class="HeaderSearch-module__content__kMpxU"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-search HeaderSearch-module__icon__wcrHX" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path></svg><span class="HeaderSearch-module__label__d1iWG">Search</span><kbd class="HeaderSearch-module__kbd__HNG0o" aria-hidden="true">/</kbd></span></span></span></button><div class="d-none"></div></div><div class="AuthCTAs-module__signInWrap__q2P60"><a class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--subtle___F7pEE Primer_Brand__Button-module__Button--size-small___zQrEw AuthCTAs-module__cta__WpwQq AuthCTAs-module__desktopActionGap__UZuXT AuthCTAs-module__hiddenBelowLg__BfKBw" href="/login?return_to=https%3A%2F%2Fgithub.com%2Fadminwat%2Fjcode%2Fblob%2Fmaster%2FREADME.md" data-analytics-event="{&quot;action&quot;:&quot;sign_in&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;auth_cta&quot;,&quot;location&quot;:&quot;header&quot;,&quot;label&quot;:&quot;sign_in_link_auth_cta_header&quot;}" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;originating_url&quot;:&quot;https://github.com/adminwat/jcode/blob/master/README.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="c9280b93c1a0d8fffde08f81b697489156022d484d826cd5cca5619e33452fce"><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-subtle___8ndWH">Sign in</span></span></a></div><a class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--secondary___gHnw_ Primer_Brand__Button-module__Button--size-small___zQrEw AuthCTAs-module__cta__WpwQq" href="/signup?ref_cta=Sign+up&amp;ref_loc=header+logged+out&amp;ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fblob%2Fshow&amp;source=header-repo&amp;source_repo=adminwat%2Fjcode" data-analytics-event="{&quot;action&quot;:&quot;sign_up&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;auth_cta&quot;,&quot;location&quot;:&quot;header&quot;,&quot;label&quot;:&quot;sign_up_link_auth_cta_header&quot;}" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;originating_url&quot;:&quot;https://github.com/adminwat/jcode/blob/master/README.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="c9280b93c1a0d8fffde08f81b697489156022d484d826cd5cca5619e33452fce"><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-secondary___eJ0_a">Sign up</span></span></a><button class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--subtle___F7pEE Primer_Brand__Button-module__Button--size-small___zQrEw HeaderAppearanceSettings-module__trigger__hUheK" type="button" aria-haspopup="dialog" aria-labelledby="_R_fbd_"><span class="Primer_Brand__Button-module__Button__leading-visual___jjtTe" data-testid="Button-leading-visual"><svg data-component="Octicon" focusable="false" aria-hidden="true" class="octicon octicon-sliders Primer_Brand__Button-module__Button__icon-visual____qybb" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M15 2.75a.75.75 0 0 1-.75.75h-4a.75.75 0 0 1 0-1.5h4a.75.75 0 0 1 .75.75Zm-8.5.75v1.25a.75.75 0 0 0 1.5 0v-4a.75.75 0 0 0-1.5 0V2H1.75a.75.75 0 0 0 0 1.5H6.5Zm1.25 5.25a.75.75 0 0 0 0-1.5h-6a.75.75 0 0 0 0 1.5h6ZM15 8a.75.75 0 0 1-.75.75H11.5V10a.75.75 0 1 1-1.5 0V6a.75.75 0 0 1 1.5 0v1.25h2.75A.75.75 0 0 1 15 8Zm-9 5.25v-2a.75.75 0 0 0-1.5 0v1.25H1.75a.75.75 0 0 0 0 1.5H4.5v1.25a.75.75 0 0 0 1.5 0v-2Zm9 0a.75.75 0 0 1-.75.75h-6a.75.75 0 0 1 0-1.5h6a.75.75 0 0 1 .75.75Z"></path></svg></span><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-subtle___8ndWH"></span></span></button><div class="Primer_Brand__Tooltip-module__Tooltip___0Eipx" data-direction="s" aria-hidden="true" id="_R_fbd_">Appearance settings</div></div></div></div></div><div class="MarketingHeader-module__bottomBorder__uZT38" aria-hidden="true"></div></header></div></div>
</react-partial>



      <div hidden="hidden" data-view-component="true" class="js-stale-session-flash stale-session-flash flash flash-warn flash-full">
  
        <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
    <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
        <span class="js-stale-session-flash-signed-in" hidden>You signed in with another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span>
        <span class="js-stale-session-flash-signed-out" hidden>You signed out in another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span>
        <span class="js-stale-session-flash-switched" hidden>You switched accounts on another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span>

    <button id="icon-button-46539dee-fb3d-494b-ae70-270fcd91b9c4" aria-labelledby="tooltip-dc45d78b-8f3f-4afc-94cf-885ab9b8373b" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium flash-close js-flash-close">  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x Button-visual">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
</button><tool-tip id="tooltip-dc45d78b-8f3f-4afc-94cf-885ab9b8373b" for="icon-button-46539dee-fb3d-494b-ae70-270fcd91b9c4" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Dismiss alert</tool-tip>


  
</div>
    </div>

  <div id="start-of-content" class="show-on-focus"></div>








    <div id="js-flash-container" class="flash-container" data-turbo-replace>






  <template class="js-flash-template">
    
<div class="flash flash-full   {{ className }}">
  <div >
    <button autofocus class="flash-close js-flash-close" type="button" aria-label="Dismiss this message">
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
    </button>
    <div aria-atomic="true" role="alert" class="js-flash-alert">
      
      <div>{{ message }}</div>

    </div>
  </div>
</div>
  </template>
</div>


    






  <div
    class="application-main "
    data-commit-hovercards-enabled
    data-discussion-hovercards-enabled
    data-issue-and-pr-hovercards-enabled
    data-project-hovercards-enabled
  >
        <div itemscope itemtype="http://schema.org/SoftwareSourceCode" class="">
    <main id="js-repo-pjax-container" >
      
      








  

    <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ym-1a7ce813a378e1f7.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/mn-bb458474353a279e.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/t5-26d19272bbf73ca3.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/2d5-9abb2f6ba5c935d0.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/24-b11e1c4108322883.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/mrn-12afac2ecd2be980.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/dgq-bbf7670f9cdba2e0.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/7w-740b4e942974ccba.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/we-c9f93392098ad6c9.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/775-5adcc74216a7c5ae.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/bn-fcef0645a47703fc.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/xgw-6c6cb7b2ed77f52e.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ge-ca1c0ba8656f9680.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/9f-e543bc691db8262e.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/global-nav-bar-ce0c7963290f892b.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.e4334163c54cccf5.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/ql0.501e99879e15a48e.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-nav-bar.f20205647191e018.module.css" />

<react-partial
  partial-name="global-nav-bar"
  data-ssr="true"
  data-attempted-ssr="true"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-partial.embeddedData">{"props":{"contextRegion":{"crumbs":[{"crumb_type":"user","label":"adminwat","is_root":false,"href":"/adminwat"},{"crumb_type":"repository","label":"jcode","is_root":false,"octicon":"repo-forked","href":"/adminwat/jcode"}],"localNavigation":[{"id":"code","icon":"code","label":"Code","href":"/adminwat/jcode","selectedLinks":["repo_source","repo_downloads","repo_commits","repo_releases","repo_tags","repo_branches","repo_packages","repo_deployments","repo_attestations"],"popoverTarget":false,"commandId":"repositories:go-to-code","reactNav":{"appTarget":"code-view","anchor":"code-view-repo-link"},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"issues","icon":"issue-opened","label":"Issues","href":"/adminwat/jcode/issues","selectedLinks":["repo_issues","repo_labels","repo_milestones"],"count":1,"popoverTarget":false,"commandId":"repositories:go-to-issues","reactNav":{"appTarget":"repo","anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"pull-requests","icon":"git-pull-request","label":"Pull requests","href":"/adminwat/jcode/pulls","selectedLinks":["repo_pulls","checks"],"count":1,"popoverTarget":false,"commandId":"repositories:go-to-pull-requests","reactNav":{"appTarget":null,"anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"actions","icon":"play","label":"Actions","href":"/adminwat/jcode/actions","selectedLinks":["repo_actions"],"popoverTarget":false,"commandId":"repositories:go-to-actions","reactNav":{"appTarget":"actions-workflows","anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"projects","icon":"table","label":"Projects","href":"/adminwat/jcode/projects","selectedLinks":["repo_projects","new_repo_project","repo_project"],"popoverTarget":false,"commandId":"repositories:go-to-projects","reactNav":{"appTarget":"repo","anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"security-and-quality","icon":"shield","label":"Security and quality","href":"/adminwat/jcode/security","selectedLinks":["security","overview","alerts","policy","token_scanning","code_scanning"],"count":0,"popoverTarget":false,"commandId":"repositories:go-to-security","reactNav":{"appTarget":null,"anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"insights","icon":"graph","label":"Insights","href":"/adminwat/jcode/pulse","selectedLinks":["repo_graphs","repo_contributors","dependency_graph","dependabot_updates","pulse","people","community"],"popoverTarget":false,"commandId":"repositories:go-to-insights","reactNav":{"appTarget":null,"anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}}],"localNavigationUpdateChannel":null,"selectedLink":"repo_source"},"owner":null,"headerLogo":{"href":"/","aria-label":"Homepage "},"notifications":{"indicatorMode":"disabled","websocketChannel":null,"fetchIndicatorSrc":"/notifications/indicator","fetchIndicatorEnabled":false},"issues":{"href":"/issues"},"pulls":{"href":"/pulls"},"contributedRepos":{"href":"/repos"},"copilot":{"show":false,"showAgentsButton":false,"showRelaunchAnnouncement":false,"copilotChatUrl":null,"copilotApiUrl":"https://api.githubcopilot.com"},"search":{"show":true,"showCommandPalette":false,"isSearchPage":false,"isJumpToSearch":false,"searchContext":{"scope":"repo:adminwat/jcode","current_repo_name":"jcode","current_repo_nwo":"adminwat/jcode","user_id":"adminwat"}},"commandPalette":null,"enterpriseBar":{"show":false},"globalTransactionalMessage":[],"payloadsUrl":"/_global-navigation/payloads.json?can_toggle_site_admin_and_employee_status=0\u0026is_admin_mode_on=0\u0026is_ui_opted_out=0\u0026show_ui_opt_out=0\u0026v=6","contextRegionUrl":"/_global-navigation/context-region.json"}}</script>
  <div data-target="react-partial.reactRoot"><header aria-label="Global navigation menu" data-component="Stack" class="GlobalNav styles-module__appHeader__YzYWk prc-Stack-Stack-UQ9k6" data-gap="none" data-direction="vertical" data-align="stretch" data-wrap="nowrap" data-justify="start" data-padding="none"><div data-component="Stack" class="prc-Stack-Stack-UQ9k6" data-direction="horizontal" data-align="center" data-wrap="nowrap" data-justify="center" data-padding="none"><div data-testid="top-nav-center" data-component="Stack" class="styles-module__center__R3QRv styles-module__withLocalNavigation__rjTJ_ GlobalNavBar-module__loggedOut__Jv1rk prc-Stack-Stack-UQ9k6" data-gap="condensed" data-direction="horizontal" data-align="stretch" data-wrap="nowrap" data-justify="start" data-padding="normal"><nav class="styles-module__contextRegion__VbSp2 prc-Breadcrumbs-BreadcrumbsBase-3Gb-B" aria-label="Breadcrumbs" data-overflow="menu" data-variant="normal" data-component="Breadcrumbs"><ol class="prc-Breadcrumbs-BreadcrumbsList-BKjpe"><li class="prc-Breadcrumbs-ItemWrapper-k0NLn"><a class="styles-module__contextCrumb__IzGIq prc-Breadcrumbs-Item-jcraJ" data-component="Breadcrumbs.Item" href="/adminwat" data-discover="true"><span class="">adminwat</span></a></li><li class="prc-Breadcrumbs-ItemWrapper-k0NLn"><a class="styles-module__contextCrumb__IzGIq prc-Breadcrumbs-Item-jcraJ" data-component="Breadcrumbs.Item" href="/adminwat/jcode" data-discover="true"><span class="styles-module__contextCrumbLast__tI2e3">jcode</span><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-repo-forked styles-module__trailingIcon__sCKDh" viewBox="0 0 16 16" width="12" height="12" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path></svg></a></li></ol></nav></div><div data-testid="top-nav-right" data-component="Stack" class="styles-module__right__mlBQg styles-module__withLocalNavigation__rjTJ_ styles-module__rightWithResponsiveCreateButton__SKn2W prc-Stack-Stack-UQ9k6" data-gap="condensed" data-direction="horizontal" data-align="center" data-wrap="nowrap" data-justify="start" data-padding="normal"></div></div><h2 class="prc-src-InternalVisuallyHidden-2YaI6">Repository navigation</h2><nav class="prc-components-UnderlineWrapper-eT-Yj prc-UnderlineNav-UnderlineWrapper-GWONT LocalNavigation-module__LocalNavigation__b0Xc0" aria-label="Repository" data-variant="inset" data-overflow-mode="wrap" data-hide-icons-breakpoint="medium"><ul class="prc-UnderlineNav-ItemsList-oj8gN prc-components-UnderlineItemList-xKlKC" role="list"><li role="presentation" aria-hidden="true" class="prc-UnderlineNav-WrapSpacer--aLgz"></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a aria-current="page" data-tab-item="code" data-react-nav="code-view" data-react-nav-anchor="code-view-repo-link" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/adminwat/jcode" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-code" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path></svg></span><span data-component="text" data-content="Code">Code</span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a data-tab-item="issues" data-react-nav="repo" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/adminwat/jcode/issues" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-issue-opened" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path></svg></span><span data-component="text" data-content="Issues">Issues</span><span data-component="counter"><span aria-hidden="true" data-variant="secondary" data-component="CounterLabel" class="prc-CounterLabel-CounterLabel-X-kRU">1</span><span class="prc-VisuallyHidden-VisuallyHidden-Q0qSB"> (<!-- -->1<!-- -->)</span></span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a data-tab-item="pull-requests" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/adminwat/jcode/pulls" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-git-pull-request" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"></path></svg></span><span data-component="text" data-content="Pull requests">Pull requests</span><span data-component="counter"><span aria-hidden="true" data-variant="secondary" data-component="CounterLabel" class="prc-CounterLabel-CounterLabel-X-kRU">1</span><span class="prc-VisuallyHidden-VisuallyHidden-Q0qSB"> (<!-- -->1<!-- -->)</span></span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a data-tab-item="actions" data-react-nav="actions-workflows" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/adminwat/jcode/actions" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-play" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path></svg></span><span data-component="text" data-content="Actions">Actions</span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a data-tab-item="projects" data-react-nav="repo" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/adminwat/jcode/projects" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-table" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25ZM6.5 6.5v8h7.75a.25.25 0 0 0 .25-.25V6.5Zm8-1.5V1.75a.25.25 0 0 0-.25-.25H6.5V5Zm-13 1.5v7.75c0 .138.112.25.25.25H5v-8ZM5 5V1.5H1.75a.25.25 0 0 0-.25.25V5Z"></path></svg></span><span data-component="text" data-content="Projects">Projects</span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a data-tab-item="security-and-quality" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/adminwat/jcode/security" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-shield" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.467.133a1.748 1.748 0 0 1 1.066 0l5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667Zm.61 1.429a.25.25 0 0 0-.153 0l-5.25 1.68a.25.25 0 0 0-.174.238V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297a.196.196 0 0 0 .154 0c2.245-.956 3.582-2.104 4.366-3.298C13.225 9.666 13.5 8.36 13.5 7V3.48a.251.251 0 0 0-.174-.237l-5.25-1.68ZM8.75 4.75v3a.75.75 0 0 1-1.5 0v-3a.75.75 0 0 1 1.5 0ZM9 10.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path></svg></span><span data-component="text" data-content="Security and quality">Security and quality</span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a data-tab-item="insights" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/adminwat/jcode/pulse" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-graph" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.5 1.75V13.5h13.75a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75V1.75a.75.75 0 0 1 1.5 0Zm14.28 2.53-5.25 5.25a.75.75 0 0 1-1.06 0L7 7.06 4.28 9.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.25-3.25a.75.75 0 0 1 1.06 0L10 7.94l4.72-4.72a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path></svg></span><span data-component="text" data-content="Insights">Insights</span></a></li></ul><div class="prc-UnderlineNav-MoreButtonContainer-Dnrq6"><div class="prc-UnderlineNav-MoreButtonDivider-dN0a-"></div><button data-component="overflow-menu-button" type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk prc-UnderlineNav-MoreButton-Y8soj" data-loading="false" data-size="medium" data-variant="invisible" id="_R_2ktl_"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3"><span>More<span class="prc-src-InternalVisuallyHidden-2YaI6"> items</span></span></span></span><span data-component="trailingAction" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></button></div></nav><div class="d-none"></div></header></div>
</react-partial>


  



<turbo-frame id="repo-content-turbo-frame" target="_top" data-turbo-action="advance" class="">
    <div id="repo-content-pjax-container" class="repository-content " >
    



    
      
    








<react-app
  app-name="code-view"
  initial-path="/adminwat/jcode/blob/master/README.md"
  style="display: block; min-height: calc(100vh - 64px);"
  data-attempted-ssr="true"
  data-ssr="true"
  data-lazy="false"
  data-alternate="false"
  data-data-router-enabled="true"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-app.embeddedData">{"payload":{"codeViewBlobRoute":{"csv":null,"csvError":null,"headerInfo":{"toc":[{"level":1,"text":"jcode","anchor":"jcode","htmlText":"jcode"},{"level":2,"text":"Installation","anchor":"installation","htmlText":"Installation"},{"level":2,"text":"Performance \u0026 Resource Efficiency","anchor":"performance--resource-efficiency","htmlText":"Performance \u0026amp; Resource Efficiency"},{"level":3,"text":"RAM comparison","anchor":"ram-comparison","htmlText":"RAM comparison"},{"level":3,"text":"Time to first frame","anchor":"time-to-first-frame","htmlText":"Time to first frame"},{"level":3,"text":"Time to first input","anchor":"time-to-first-input","htmlText":"Time to first input"},{"level":3,"text":"Additional clients / memory scaling","anchor":"additional-clients--memory-scaling","htmlText":"Additional clients / memory scaling"},{"level":2,"text":"Memory (Agent memory)","anchor":"memory-agent-memory","htmlText":"Memory (Agent memory)"},{"level":2,"text":"UI: Side panels, Diagrams, Info Widgets, rendering, scrolling, alignment","anchor":"ui-side-panels-diagrams-info-widgets-rendering-scrolling-alignment","htmlText":"UI: Side panels, Diagrams, Info Widgets, rendering, scrolling, alignment"},{"level":2,"text":"Swarm","anchor":"swarm","htmlText":"Swarm"},{"level":2,"text":"OAuth and Providers","anchor":"oauth-and-providers","htmlText":"OAuth and Providers"},{"level":3,"text":"Supported built-in login flows","anchor":"supported-built-in-login-flows","htmlText":"Supported built-in login flows"},{"level":3,"text":"Config-file setup for self-hosted endpoints and MCP","anchor":"config-file-setup-for-self-hosted-endpoints-and-mcp","htmlText":"Config-file setup for self-hosted endpoints and MCP"},{"level":4,"text":"OpenAI-compatible providers","anchor":"openai-compatible-providers","htmlText":"OpenAI-compatible providers"},{"level":4,"text":"Self-hosted OpenAI-compatible endpoints, including vLLM","anchor":"self-hosted-openai-compatible-endpoints-including-vllm","htmlText":"Self-hosted OpenAI-compatible endpoints, including vLLM"},{"level":5,"text":"Extra request-body fields (extra_body)","anchor":"extra-request-body-fields-extra_body","htmlText":"Extra request-body fields (extra_body)"},{"level":4,"text":"MCP config files","anchor":"mcp-config-files","htmlText":"MCP config files"},{"level":3,"text":"Supported provider","anchor":"supported-provider","htmlText":"Supported provider"},{"level":2,"text":"Customizability / Self-Dev","anchor":"customizability--self-dev","htmlText":"Customizability / Self-Dev"},{"level":2,"text":"Misc.","anchor":"misc","htmlText":"Misc."},{"level":2,"text":"iOS Application / Native OpenClaw","anchor":"ios-application--native-openclaw","htmlText":"iOS Application / Native OpenClaw"},{"level":2,"text":"Other planned features","anchor":"other-planned-features","htmlText":"Other planned features"},{"level":2,"text":"Quick Start","anchor":"quick-start","htmlText":"Quick Start"},{"level":2,"text":"Browser Automation","anchor":"browser-automation","htmlText":"Browser Automation"},{"level":2,"text":"Further Reading","anchor":"further-reading","htmlText":"Further Reading"},{"level":2,"text":"Detailed Installation","anchor":"detailed-installation","htmlText":"Detailed Installation"},{"level":3,"text":"Setup","anchor":"setup","htmlText":"Setup"},{"level":3,"text":"Quick Install","anchor":"quick-install","htmlText":"Quick Install"},{"level":3,"text":"macOS via Homebrew","anchor":"macos-via-homebrew","htmlText":"macOS via Homebrew"},{"level":3,"text":"From Source (all platforms)","anchor":"from-source-all-platforms","htmlText":"From Source (all platforms)"},{"level":3,"text":"Uninstall","anchor":"uninstall","htmlText":"Uninstall"},{"level":3,"text":"Platform Support","anchor":"platform-support","htmlText":"Platform Support"}]},"issueTemplate":null,"discussionTemplate":null,"richText":"\u003carticle class=\"markdown-body entry-content container-lg\" itemprop=\"text\"\u003e\u003cdiv align=\"center\" dir=\"auto\"\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ejcode\u003c/h1\u003e\u003ca id=\"user-content-jcode\" class=\"anchor\" aria-label=\"Permalink: jcode\" href=\"#jcode\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://github.com/1jehuang/jcode/releases\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/81e8711b3ae8d6756daa390ea9dd71b3adb8c7e8b578db66923afbd9cd0e0b82/68747470733a2f2f62616467656e2e6e65742f6769746875622f72656c656173652f316a656875616e672f6a636f64653f69636f6e3d676974687562\" alt=\"Latest Release\" data-canonical-src=\"https://badgen.net/github/release/1jehuang/jcode?icon=github\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"/adminwat/jcode/blob/master/LICENSE\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/ac049ef4e7a0b7196b09add6ac2d4f180e544c0ac779c2b2ac2fd2723a209579/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75653f7374796c653d666c61742d737175617265\" alt=\"License: MIT\" data-canonical-src=\"https://img.shields.io/badge/license-MIT-blue?style=flat-square\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/1jehuang/jcode/releases\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/bc7221598118259fb48a26a2437a3100daf77b5a49d0a56bfeb6411b2d11a252/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f706c6174666f726d732d4c696e75782532302537432532306d61634f5325323025374325323057696e646f77732d626c75653f7374796c653d666c61742d737175617265\" alt=\"Platforms\" data-canonical-src=\"https://img.shields.io/badge/platforms-Linux%20%7C%20macOS%20%7C%20Windows-blue?style=flat-square\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/1jehuang/jcode/commits/master\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/19a5f4b3ac3b0a6248f1cb4632b1ac035bb4d9063fce698b2c26f9125122b655/68747470733a2f2f62616467656e2e6e65742f6769746875622f6c6173742d636f6d6d69742f316a656875616e672f6a636f64652f6d61737465723f69636f6e3d676974687562\" alt=\"Last Commit\" data-canonical-src=\"https://badgen.net/github/last-commit/1jehuang/jcode/master?icon=github\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/1jehuang/jcode/stargazers\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/beb7702ef0f030e02e5df0560b08d3cb2f9db61dcbb947b114e8d057519dda05/68747470733a2f2f62616467656e2e6e65742f6769746875622f73746172732f316a656875616e672f6a636f64653f69636f6e3d676974687562\" alt=\"GitHub Stars\" data-canonical-src=\"https://badgen.net/github/stars/1jehuang/jcode?icon=github\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"https://discord.gg/nBe9vGyK9a\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/60250c1b6ce82e771da309c4fbb7f53e9c6dc39da677882a0342e88edf155096/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446973636f72642d4a6f696e253230436f6d6d756e6974792d3538363546323f7374796c653d666c61742d737175617265266c6f676f3d646973636f7264266c6f676f436f6c6f723d7768697465\" alt=\"Discord\" data-canonical-src=\"https://img.shields.io/badge/Discord-Join%20Community-5865F2?style=flat-square\u0026amp;logo=discord\u0026amp;logoColor=white\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe most RAM efficient harness \u003cbr\u003e\nThe most intelligent harness\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://trendshift.io/repositories/25042?utm_source=repository-badge\u0026amp;utm_medium=badge\u0026amp;utm_campaign=badge-repository-25042\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/14344e459e91492bf25512a9352022a69fcd9ab4feab8578faa475221e4ceeb2/68747470733a2f2f7472656e6473686966742e696f2f6170692f62616467652f7265706f7369746f726965732f3235303432\" alt=\"1jehuang/jcode | Trendshift\" width=\"250\" height=\"55\" data-canonical-src=\"https://trendshift.io/api/badge/repositories/25042\" style=\"max-width: 100%; height: auto; max-height: 55px;; aspect-ratio: 250 / 55; background-color: var(--bgColor-muted); border-radius: 6px\" class=\"js-gh-image-fallback\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://github.com/1jehuang/jcode/stargazers\"\u003e\u003cimg src=\"/adminwat/jcode/raw/master/docs/images/star-history.svg\" alt=\"jcode cumulative GitHub stars over time, sampled weekly\" width=\"700\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ca href=\"https://github.com/1jehuang/jcode/releases/download/readme-assets/jcode-yc-launch.mp4\"\u003e\n  \u003cimg src=\"https://github.com/1jehuang/jcode/releases/download/readme-assets/jcode-yc-launch.webp\" alt=\"jcode YC launch video\" width=\"800\" style=\"max-width: 100%;\"\u003e\n\u003c/a\u003e\n\u003cbr\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://jcode.sh\" rel=\"nofollow\"\u003eWebsite\u003c/a\u003e · \u003ca href=\"https://jcode.sh/docs\" rel=\"nofollow\"\u003eDocs\u003c/a\u003e · \u003ca href=\"https://jcode.sh/sdk\" rel=\"nofollow\"\u003eSDK\u003c/a\u003e · \u003ca href=\"https://jcode.sh/bench\" rel=\"nofollow\"\u003eBenchmarks\u003c/a\u003e · \u003ca href=\"#features\"\u003eFeatures\u003c/a\u003e · \u003ca href=\"#installation\"\u003eInstall\u003c/a\u003e · \u003ca href=\"#quick-start\"\u003eQuick Start\u003c/a\u003e · \u003ca href=\"#further-reading\"\u003eFurther Reading\u003c/a\u003e · \u003ca href=\"/adminwat/jcode/blob/master/CONTRIBUTING.md\"\u003eContributing\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003chr\u003e\n\u003cdiv align=\"center\" dir=\"auto\"\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eInstallation\u003c/h2\u003e\u003ca id=\"user-content-installation\" class=\"anchor\" aria-label=\"Permalink: Installation\" href=\"#installation\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# macOS \u0026amp; Linux\ncurl -fsSL https://jcode.sh/install | bash\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e macOS \u0026amp; Linux\u003c/span\u003e\ncurl -fsSL https://jcode.sh/install \u003cspan class=\"pl-k\"\u003e|\u003c/span\u003e bash\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-powershell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# Windows 11 (PowerShell 5.1+)\nirm https://jcode.sh/install.ps1 | iex\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Windows 11 (PowerShell 5.1+)\u003c/span\u003e\nirm https:\u003cspan class=\"pl-k\"\u003e//\u003c/span\u003ejcode.sh\u003cspan class=\"pl-k\"\u003e/\u003c/span\u003einstall.ps1 \u003cspan class=\"pl-k\"\u003e|\u003c/span\u003e iex\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eNeed Homebrew, source builds, provider setup, or want an agent to set it up for you?\n\u003ca href=\"#detailed-installation\"\u003eJump to detailed installation\u003c/a\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv align=\"center\" dir=\"auto\"\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ePerformance \u0026amp; Resource Efficiency\u003c/h2\u003e\u003ca id=\"user-content-performance--resource-efficiency\" class=\"anchor\" aria-label=\"Permalink: Performance \u0026amp; Resource Efficiency\" href=\"#performance--resource-efficiency\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003cp dir=\"auto\"\u003ejcode is built to be as performant and resource efficient as possible. Every metric is optimized to the bone, which is important for scaling multi-session workflows. Here we sample a few metrics to show the difference: RAM usage and boot up.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eRAM comparison\u003c/h3\u003e\u003ca id=\"user-content-ram-comparison\" class=\"anchor\" aria-label=\"Permalink: RAM comparison\" href=\"#ram-comparison\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv align=\"center\" dir=\"auto\"\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n  \u003ctbody\u003e\u003ctr\u003e\n    \u003ctd valign=\"top\" align=\"center\" width=\"50%\"\u003e\n      \u003cstrong\u003e1 active session\u003c/strong\u003e\n      \u003ctable\u003e\n        \u003cthead\u003e\n          \u003ctr\u003e\n            \u003cth\u003eTool\u003c/th\u003e\n            \u003cth\u003ePSS\u003c/th\u003e\n            \u003cth\u003eComparison\u003c/th\u003e\n          \u003c/tr\u003e\n        \u003c/thead\u003e\n        \u003ctbody\u003e\n          \u003ctr\u003e\n            \u003ctd\u003e\u003cstrong\u003ejcode (local embedding off)\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e27.8 MB\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003ebaseline\u003c/td\u003e\n          \u003c/tr\u003e\n          \u003ctr\u003e\n            \u003ctd\u003e\u003cstrong\u003ejcode\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e167.1 MB\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e6.0× more RAM\u003c/strong\u003e\u003c/td\u003e\n          \u003c/tr\u003e\n          \u003ctr\u003e\n            \u003ctd\u003e\u003cstrong\u003epi\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e144.4 MB\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e5.2× more RAM\u003c/strong\u003e\u003c/td\u003e\n          \u003c/tr\u003e\n          \u003ctr\u003e\n            \u003ctd\u003e\u003cstrong\u003eCodex CLI\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e140.0 MB\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e5.0× more RAM\u003c/strong\u003e\u003c/td\u003e\n          \u003c/tr\u003e\n          \u003ctr\u003e\n            \u003ctd\u003e\u003cstrong\u003eOpenCode\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e371.5 MB\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e13.4× more RAM\u003c/strong\u003e\u003c/td\u003e\n          \u003c/tr\u003e\n          \u003ctr\u003e\n            \u003ctd\u003e\u003cstrong\u003eGitHub Copilot CLI\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e333.3 MB\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e12.0× more RAM\u003c/strong\u003e\u003c/td\u003e\n          \u003c/tr\u003e\n          \u003ctr\u003e\n            \u003ctd\u003e\u003cstrong\u003eCursor Agent\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e214.9 MB\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e7.7× more RAM\u003c/strong\u003e\u003c/td\u003e\n          \u003c/tr\u003e\n          \u003ctr\u003e\n            \u003ctd\u003e\u003cstrong\u003eClaude Code\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e386.6 MB\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e13.9× more RAM\u003c/strong\u003e\u003c/td\u003e\n          \u003c/tr\u003e\n          \u003ctr\u003e\n            \u003ctd\u003e\u003cstrong\u003eAntigravity CLI\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e243.7 MB\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e8.8× more RAM\u003c/strong\u003e\u003c/td\u003e\n          \u003c/tr\u003e\n        \u003c/tbody\u003e\n      \u003c/table\u003e\n    \u003c/td\u003e\n    \u003ctd width=\"24\"\u003e\u003c/td\u003e\n    \u003ctd valign=\"top\" align=\"center\" width=\"50%\"\u003e\n      \u003cstrong\u003e10 active sessions\u003c/strong\u003e\n      \u003ctable\u003e\n        \u003cthead\u003e\n          \u003ctr\u003e\n            \u003cth\u003eTool\u003c/th\u003e\n            \u003cth\u003ePSS\u003c/th\u003e\n            \u003cth\u003eComparison\u003c/th\u003e\n          \u003c/tr\u003e\n        \u003c/thead\u003e\n        \u003ctbody\u003e\n          \u003ctr\u003e\n            \u003ctd\u003e\u003cstrong\u003ejcode (local embedding off)\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e117.0 MB\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003ebaseline\u003c/td\u003e\n          \u003c/tr\u003e\n          \u003ctr\u003e\n            \u003ctd\u003e\u003cstrong\u003ejcode\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e260.8 MB\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e2.2× more RAM\u003c/strong\u003e\u003c/td\u003e\n          \u003c/tr\u003e\n          \u003ctr\u003e\n            \u003ctd\u003e\u003cstrong\u003epi\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e833.0 MB\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e7.1× more RAM\u003c/strong\u003e\u003c/td\u003e\n          \u003c/tr\u003e\n          \u003ctr\u003e\n            \u003ctd\u003e\u003cstrong\u003eCodex CLI\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e334.8 MB\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e2.9× more RAM\u003c/strong\u003e\u003c/td\u003e\n          \u003c/tr\u003e\n          \u003ctr\u003e\n            \u003ctd\u003e\u003cstrong\u003eOpenCode\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e3237.2 MB\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e27.7× more RAM\u003c/strong\u003e\u003c/td\u003e\n          \u003c/tr\u003e\n          \u003ctr\u003e\n            \u003ctd\u003e\u003cstrong\u003eGitHub Copilot CLI\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e1756.5 MB\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e15.0× more RAM\u003c/strong\u003e\u003c/td\u003e\n          \u003c/tr\u003e\n          \u003ctr\u003e\n            \u003ctd\u003e\u003cstrong\u003eCursor Agent\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e1632.4 MB\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e14.0× more RAM\u003c/strong\u003e\u003c/td\u003e\n          \u003c/tr\u003e\n          \u003ctr\u003e\n            \u003ctd\u003e\u003cstrong\u003eClaude Code\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e2300.6 MB\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e19.7× more RAM\u003c/strong\u003e\u003c/td\u003e\n          \u003c/tr\u003e\n          \u003ctr\u003e\n            \u003ctd\u003e\u003cstrong\u003eAntigravity CLI\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e1021.2 MB\u003c/strong\u003e\u003c/td\u003e\n            \u003ctd align=\"right\"\u003e\u003cstrong\u003e8.7× more RAM\u003c/strong\u003e\u003c/td\u003e\n          \u003c/tr\u003e\n        \u003c/tbody\u003e\n      \u003c/table\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eTime to first frame\u003c/h3\u003e\u003ca id=\"user-content-time-to-first-frame\" class=\"anchor\" aria-label=\"Permalink: Time to first frame\" href=\"#time-to-first-frame\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv align=\"center\" dir=\"auto\"\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eTool\u003c/th\u003e\n\u003cth align=\"right\"\u003eTime to first frame\u003c/th\u003e\n\u003cth align=\"right\"\u003eRange\u003c/th\u003e\n\u003cth align=\"right\"\u003eComparison\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003ejcode\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e14.0 ms\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e10.1–19.3 ms\u003c/td\u003e\n\u003ctd align=\"right\"\u003ebaseline\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eAntigravity CLI\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e383.5 ms\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e363.1–415.4 ms\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e27.4× slower\u003c/strong\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003epi\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e590.7 ms\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e369.6–934.8 ms\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e42.2× slower\u003c/strong\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eCodex CLI\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e882.8 ms\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e742.3–1640.9 ms\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e63.1× slower\u003c/strong\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eOpenCode\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e1035.9 ms\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e922.5–1104.4 ms\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e74.0× slower\u003c/strong\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eGitHub Copilot CLI\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e1518.6 ms\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e1357.4–1826.8 ms\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e108.5× slower\u003c/strong\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eCursor Agent\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e1949.7 ms\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e1711.0–2104.8 ms\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e139.3× slower\u003c/strong\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eClaude Code\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e3436.9 ms\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e2032.7–8927.2 ms\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e245.5× slower\u003c/strong\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eMeasured on this Linux machine across 10 interactive PTY launches.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eTime to first input\u003c/h3\u003e\u003ca id=\"user-content-time-to-first-input\" class=\"anchor\" aria-label=\"Permalink: Time to first input\" href=\"#time-to-first-input\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e(time until typed probe text appears on the rendered screen; Antigravity uses its internal input-ready log marker because the sign-in screen suppresses probe echo.)\u003c/p\u003e\n\u003cdiv align=\"center\" dir=\"auto\"\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eTool\u003c/th\u003e\n\u003cth align=\"right\"\u003eTime to first input\u003c/th\u003e\n\u003cth align=\"right\"\u003eRange\u003c/th\u003e\n\u003cth align=\"right\"\u003eComparison\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003ejcode\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e48.7 ms\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e30.3–62.7 ms\u003c/td\u003e\n\u003ctd align=\"right\"\u003ebaseline\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eAntigravity CLI\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e383.7 ms\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e363.4–415.7 ms\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e7.9× slower\u003c/strong\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003epi\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e596.4 ms\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e373.9–955.2 ms\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e12.2× slower\u003c/strong\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eCodex CLI\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e905.8 ms\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e760.1–1675.7 ms\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e18.6× slower\u003c/strong\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eOpenCode\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e1047.9 ms\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e931.1–1116.9 ms\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e21.5× slower\u003c/strong\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eGitHub Copilot CLI\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e1583.4 ms\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e1422.8–1880.0 ms\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e32.5× slower\u003c/strong\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eCursor Agent\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e1978.7 ms\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e1727.3–2130.0 ms\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e40.6× slower\u003c/strong\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eClaude Code\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e3512.8 ms\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e2137.4–9002.0 ms\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e72.2× slower\u003c/strong\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eMeasured on this Linux machine across 10 interactive PTY launches. Antigravity CLI was unauthenticated for this run; its sign-in screen rendered normally and emitted an internal \u003ccode\u003eCLI ready for user input\u003c/code\u003e marker, but did not echo the typed probe.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAdditional clients / memory scaling\u003c/h3\u003e\u003ca id=\"user-content-additional-clients--memory-scaling\" class=\"anchor\" aria-label=\"Permalink: Additional clients / memory scaling\" href=\"#additional-clients--memory-scaling\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv align=\"center\" dir=\"auto\"\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eTool\u003c/th\u003e\n\u003cth align=\"right\"\u003eExtra PSS per added session\u003c/th\u003e\n\u003cth align=\"right\"\u003eComparison\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003ejcode (local embedding off)\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e~9.9 MB\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003ebaseline\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003ejcode\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e~10.4 MB\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e1.1× more RAM\u003c/strong\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003epi\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e~76.5 MB\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e7.7× more RAM\u003c/strong\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eCodex CLI\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e~21.6 MB\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e2.2× more RAM\u003c/strong\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eOpenCode\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e~318.4 MB\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e32.2× more RAM\u003c/strong\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eGitHub Copilot CLI\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e~158.1 MB\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e16.0× more RAM\u003c/strong\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eCursor Agent\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e~157.5 MB\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e15.9× more RAM\u003c/strong\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eClaude Code\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e~212.7 MB\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e21.5× more RAM\u003c/strong\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eAntigravity CLI\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e~86.4 MB\u003c/strong\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cstrong\u003e8.7× more RAM\u003c/strong\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003c/div\u003e\nversions tested for this corrected memory rerun:\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003ejcode v0.9.1888-dev (be386f2)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epi 0.62.0\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecodex-cli 0.120.0\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopencode 1.0.203\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eGitHub Copilot CLI 1.0.24\u003c/code\u003e for the 1-session rerun, \u003ccode\u003eGitHub Copilot CLI 1.0.27\u003c/code\u003e for the 10-session rerun\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eCursor Agent 2026.04.08-a41fba1\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eClaude Code 2.1.86 (Claude Code)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eAntigravity CLI 1.0.0\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv align=\"center\" dir=\"auto\"\u003e\n  \u003ca href=\"https://github.com/1jehuang/jcode/releases/download/readme-assets/jcode-performance-demo.mp4\"\u003e\n    \u003cimg src=\"https://github.com/1jehuang/jcode/releases/download/readme-assets/jcode-performance-demo.webp\" alt=\"jcode performance demonstration\" width=\"900\" style=\"max-width: 100%;\"\u003e\n  \u003c/a\u003e\n  \u003cp dir=\"auto\"\u003e\u003cem\u003ejcode performance demonstration\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eMemory (Agent memory)\u003c/h2\u003e\u003ca id=\"user-content-memory-agent-memory\" class=\"anchor\" aria-label=\"Permalink: Memory (Agent memory)\" href=\"#memory-agent-memory\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eJcode embeds each turn/response as a semantic vector. Every turn does queries a graph of memories to efficiently find related memory entries via a cosine similarity check. The embedding hits are fed into the conversation, or optionally uses a memory sideagent which verifies the memories are relevant, and potentially does more work for information retreival before injecting into the conversation. This results in a human like memory system which allows the agent to automatically recall relevant information to the conversation without actively calling memory tools or being a token burner.\not\nTo have memories which are retrieved, they must also be extracted and stored. Every so often (semantic drift, K turns since last extraction, session end, etc), memories are extracted via a memory sideagent, and put into the memory graph.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe harness also provides explicit memory tools to allow the agent to actively search or store the memory without relying on a passive background process. The harness also provides session search for traditional RAG on previous sessions.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eMemories are automatically consolidated every so often via the ambient mode. This reorganizes, checks for staleness and conflicts, etc\u003c/p\u003e\n\u003cdiv align=\"center\" dir=\"auto\"\u003e\n  \u003ca href=\"https://github.com/1jehuang/jcode/releases/download/readme-assets/jcode-memory-demo.mp4\"\u003e\n    \u003cimg src=\"https://github.com/1jehuang/jcode/releases/download/readme-assets/jcode-memory-demo.webp\" alt=\"jcode memory demonstration\" width=\"900\" style=\"max-width: 100%;\"\u003e\n  \u003c/a\u003e\n  \u003cp dir=\"auto\"\u003e\u003cem\u003ejcode memory demonstration\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eUI: Side panels, Diagrams, Info Widgets, rendering, scrolling, alignment\u003c/h2\u003e\u003ca id=\"user-content-ui-side-panels-diagrams-info-widgets-rendering-scrolling-alignment\" class=\"anchor\" aria-label=\"Permalink: UI: Side panels, Diagrams, Info Widgets, rendering, scrolling, alignment\" href=\"#ui-side-panels-diagrams-info-widgets-rendering-scrolling-alignment\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe side panel is a place for auxiliary information. Tell your jcode agent to load a file into the side panel and see it update in real time, or tell your agent to write directly to the side panel, or use it as a diff viewer. The side panel (and chat) is able to render mermaid diagrams inline.\n\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://private-user-images.githubusercontent.com/94247773/571793349-6c7bec81-ef3f-434d-8a7b-d55f8a54e5cf.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3OTE0NTcwMDYsIm5iZiI6MTc5MTQ1NjcwNiwicGF0aCI6Ii85NDI0Nzc3My81NzE3OTMzNDktNmM3YmVjODEtZWYzZi00MzRkLThhN2ItZDU1ZjhhNTRlNWNmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjEwMDglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYxMDA4VDEwNTE0NlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTY3ODhjYTliYWEwMzg2OWMwMTVjMDk4MzhmN2I2MmRlNDU1N2JjNzhkYWQ4NzZkYzA2NWFmNzE2MjgyYmRjYjQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRnBuZyJ9.C5vJtZnrg5b450oBtZ2gpXkL2QX3r-YI7uaBlga1RAY\"\u003e\u003cimg width=\"2000\" height=\"1225\" alt=\"image\" src=\"https://private-user-images.githubusercontent.com/94247773/571793349-6c7bec81-ef3f-434d-8a7b-d55f8a54e5cf.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3OTE0NTcwMDYsIm5iZiI6MTc5MTQ1NjcwNiwicGF0aCI6Ii85NDI0Nzc3My81NzE3OTMzNDktNmM3YmVjODEtZWYzZi00MzRkLThhN2ItZDU1ZjhhNTRlNWNmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjEwMDglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYxMDA4VDEwNTE0NlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTY3ODhjYTliYWEwMzg2OWMwMTVjMDk4MzhmN2I2MmRlNDU1N2JjNzhkYWQ4NzZkYzA2NWFmNzE2MjgyYmRjYjQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRnBuZyJ9.C5vJtZnrg5b450oBtZ2gpXkL2QX3r-YI7uaBlga1RAY\" style=\"max-width: 100%; height: auto; max-height: 1225px;; aspect-ratio: 2000 / 1225; background-color: var(--bgColor-muted); border-radius: 6px\" class=\"js-gh-image-fallback\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eTo make this possible, I created a new mermaid rendering library to render diagrams 1800x faster. It has no browser or Typescript dependency. See \u003ca href=\"https://github.com/1jehuang/mermaid-rs-renderer\"\u003ehttps://github.com/1jehuang/mermaid-rs-renderer\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eTo show you important information without taking space away from the screen that could be used for responses, I developed info widgets. Info widgets will only ever take up the negative space on the screen to show you information, and will get out of the way if there isn't any.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eJcode can render at over a thousand fps. Your monitor will not have the refresh rate to show you, but this means you will not have silly flicker problems.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe custom scrollback implementation of jcode allows it to do much more than a native scrollback. However, it is a terminal-level limitation that I cannot have smooth, partial line scrolling with a custom scrollback. To fix this, I made my own terminal. Handterm \u003ca href=\"https://github.com/1jehuang/handterm\"\u003ehttps://github.com/1jehuang/handterm\u003c/a\u003e implements a native scroll api, and also happens to be very efficient. This is a work in progress. Scrolling is still well implemented for normal terminals.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eJcode is left-aligned by default. You can switch to centered mode with the \u003ccode\u003eAlt+C\u003c/code\u003e hotkey, with the \u003ccode\u003e/alignment\u003c/code\u003e command, or in the config.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eTo disable emoji globally in TUI and CLI output, set \u003ccode\u003eemoji = false\u003c/code\u003e under \u003ccode\u003e[display]\u003c/code\u003e in \u003ccode\u003e~/.jcode/config.toml\u003c/code\u003e, or launch with \u003ccode\u003eJCODE_NO_EMOJI=1\u003c/code\u003e. Jcode replaces emoji with compact ASCII markers while preserving other Unicode text.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSwarm\u003c/h2\u003e\u003ca id=\"user-content-swarm\" class=\"anchor\" aria-label=\"Permalink: Swarm\" href=\"#swarm\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSpawn two or more agents in the same repo, and they will automatically be managed by the server to allow native collaboration. When agent A edits a file that agent B has read (code shifting under its feet), the server notifies agent B. Agent B can ignore it if it is not relevant, or it can check the diff to make sure that it doesn't conflict. Each agent has messaging abilities, capable of DMing just one agent, broadcasting to all other agents hosted by the server, or just agents working in that repo. This allows you to spawn multiple sessions in the same repo, and have all conflicts automatically resolved.\u003c/p\u003e\n\u003cdiv align=\"center\" dir=\"auto\"\u003e\n  \u003ca href=\"https://github.com/1jehuang/jcode/releases/download/readme-assets/swarm-demo.mp4\"\u003e\n    \u003cimg src=\"https://github.com/1jehuang/jcode/releases/download/readme-assets/jcode-swarm-demonstration.webp\" alt=\"jcode swarm demonstration\" width=\"900\" style=\"max-width: 100%;\"\u003e\n  \u003c/a\u003e\n  \u003cp dir=\"auto\"\u003e\u003cem\u003ejcode swarm demonstration\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAgents are also able to spawn their own swarms autonomously. They have a swarm tool which allows them to spawn in their own teamates to accomplish tasks in parallel. Doing so turns the main agent into a coordinator and the spawned agents into workers. Groups of agents, their messaging channels, their completion statuses, etc are all automatically managed. This can be done headlessly or headed.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eOAuth and Providers\u003c/h2\u003e\u003ca id=\"user-content-oauth-and-providers\" class=\"anchor\" aria-label=\"Permalink: OAuth and Providers\" href=\"#oauth-and-providers\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003ejcode works with subscription-backed OAuth flows and many provider integrations, so you can use the models you already pay for and still fall back to direct API providers when needed.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSupported built-in login flows\u003c/h3\u003e\u003ca id=\"user-content-supported-built-in-login-flows\" class=\"anchor\" aria-label=\"Permalink: Supported built-in login flows\" href=\"#supported-built-in-login-flows\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cstrong\u003eClaude\u003c/strong\u003e (\u003ccode\u003ejcode login --provider claude\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eOpenAI / ChatGPT / Codex\u003c/strong\u003e (\u003ccode\u003ejcode login --provider openai\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGoogle Gemini\u003c/strong\u003e (\u003ccode\u003ejcode login --provider gemini\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGitHub Copilot\u003c/strong\u003e (\u003ccode\u003ejcode login --provider copilot\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAzure OpenAI\u003c/strong\u003e (\u003ccode\u003ejcode login --provider azure\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAlibaba Cloud Coding Plan\u003c/strong\u003e (\u003ccode\u003ejcode login --provider alibaba-coding-plan\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eFireworks\u003c/strong\u003e (\u003ccode\u003ejcode login --provider fireworks\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eMiniMax\u003c/strong\u003e (\u003ccode\u003ejcode login --provider minimax\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eMeta Model API / Muse\u003c/strong\u003e (\u003ccode\u003ejcode login --provider meta-muse\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eLM Studio\u003c/strong\u003e (\u003ccode\u003ejcode login --provider lmstudio\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eOllama\u003c/strong\u003e (\u003ccode\u003ejcode login --provider ollama\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCustom OpenAI-compatible endpoint\u003c/strong\u003e (\u003ccode\u003ejcode login --provider openai-compatible\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eFor custom OpenAI-compatible endpoints, jcode now prompts for the API base and supports local localhost servers without requiring an API key.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eConfig-file setup for self-hosted endpoints and MCP\u003c/h3\u003e\u003ca id=\"user-content-config-file-setup-for-self-hosted-endpoints-and-mcp\" class=\"anchor\" aria-label=\"Permalink: Config-file setup for self-hosted endpoints and MCP\" href=\"#config-file-setup-for-self-hosted-endpoints-and-mcp\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIf you prefer to configure things by editing files instead of using the login UI, jcode supports both a custom OpenAI-compatible endpoint config and MCP config files.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eOpenAI-compatible providers\u003c/h4\u003e\u003ca id=\"user-content-openai-compatible-providers\" class=\"anchor\" aria-label=\"Permalink: OpenAI-compatible providers\" href=\"#openai-compatible-providers\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eMany hosted services speak the standard OpenAI \u003ccode\u003e/v1/chat/completions\u003c/code\u003e API. jcode talks to them through one shared OpenAI-compatible provider, so you can use almost any such endpoint without waiting for a dedicated integration.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThere are two ways to set one up:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eBuilt-in named profiles\u003c/strong\u003e — jcode ships ready-made profiles for several popular OpenAI-compatible services. Log in by id and jcode fills in the base URL and key environment variable for you:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"jcode login --provider \u0026lt;profile-id\u0026gt;\n# for example:\njcode login --provider openrouter\njcode login --provider orcarouter\njcode login --provider deepseek\njcode login --provider opencode      # OpenCode Zen\njcode login --provider moonshotai\njcode login --provider meta-muse     # Meta Model API / Muse Spark\"\u003e\u003cpre\u003ejcode login --provider \u003cspan class=\"pl-k\"\u003e\u0026lt;\u003c/span\u003eprofile-id\u003cspan class=\"pl-k\"\u003e\u0026gt;\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e for example:\u003c/span\u003e\njcode login --provider openrouter\njcode login --provider orcarouter\njcode login --provider deepseek\njcode login --provider opencode      \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e OpenCode Zen\u003c/span\u003e\njcode login --provider moonshotai\njcode login --provider meta-muse     \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Meta Model API / Muse Spark\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eBuilt-in OpenAI-compatible profile ids include: \u003ccode\u003eopenrouter\u003c/code\u003e, \u003ccode\u003eorcarouter\u003c/code\u003e, \u003ccode\u003edeepseek\u003c/code\u003e, \u003ccode\u003ezai\u003c/code\u003e, \u003ccode\u003ekimi\u003c/code\u003e, \u003ccode\u003emoonshotai\u003c/code\u003e, \u003ccode\u003emeta-muse\u003c/code\u003e (Meta Model API / Muse Spark), \u003ccode\u003eopencode\u003c/code\u003e (OpenCode Zen), \u003ccode\u003eopencode-go\u003c/code\u003e, \u003ccode\u003e302ai\u003c/code\u003e, \u003ccode\u003ebaseten\u003c/code\u003e, \u003ccode\u003ecortecs\u003c/code\u003e, \u003ccode\u003ehuggingface\u003c/code\u003e, \u003ccode\u003enebius\u003c/code\u003e, \u003ccode\u003escaleway\u003c/code\u003e, \u003ccode\u003estackit\u003c/code\u003e, and \u003ccode\u003efirmware\u003c/code\u003e. Each profile only sets the endpoint and key variable; you still pick the model with \u003ccode\u003e/model\u003c/code\u003e (or \u003ccode\u003e--model\u003c/code\u003e). Run \u003ccode\u003ejcode login\u003c/code\u003e with no provider to see the interactive list.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eAny other endpoint\u003c/strong\u003e — point jcode at an arbitrary OpenAI-compatible API (hosted or local) with \u003ccode\u003ejcode login --provider openai-compatible\u003c/code\u003e or the scriptable \u003ccode\u003ejcode provider add\u003c/code\u003e command described below.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eUseful environment overrides for these endpoints:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eJCODE_STREAM_IDLE_TIMEOUT_SECS\u003c/code\u003e — raise the base streaming idle timeout (default 180s) for slow reasoning models that think silently before emitting tokens. High reasoning efforts scale this automatically (high 2x, xhigh 3x, max 4x). Also settable as \u003ccode\u003e[provider] stream_idle_timeout_secs\u003c/code\u003e in \u003ccode\u003econfig.toml\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003ePer-model \u003ccode\u003econtext_window\u003c/code\u003e (alias \u003ccode\u003econtext_limit\u003c/code\u003e) in a \u003ccode\u003e[[providers.\u0026lt;name\u0026gt;.models]]\u003c/code\u003e entry — set the context window when the endpoint has no usable \u003ccode\u003e/v1/models\u003c/code\u003e response, so jcode does not fall back to the generic 200k default.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eextra_body\u003c/code\u003e — inject non-standard top-level fields into every chat/completions request body for backends that require them. See \u003ca href=\"#extra-request-body-fields-extra_body\"\u003eExtra request-body fields\u003c/a\u003e below.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eFor details on self-hosting, local runtimes, and the exact config file shape, see below.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSelf-hosted OpenAI-compatible endpoints, including vLLM\u003c/h4\u003e\u003ca id=\"user-content-self-hosted-openai-compatible-endpoints-including-vllm\" class=\"anchor\" aria-label=\"Permalink: Self-hosted OpenAI-compatible endpoints, including vLLM\" href=\"#self-hosted-openai-compatible-endpoints-including-vllm\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFor agents and scripts, the preferred path is the one-shot provider profile command. It writes a named profile to \u003ccode\u003e~/.jcode/config.toml\u003c/code\u003e, stores secrets in jcode's private app config directory when requested, and prints exact run/validation commands:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# Secret-safe setup for a hosted OpenAI-compatible API.\nprintf '%s' \u0026quot;$MY_API_KEY\u0026quot; | jcode provider add my-api \\\n  --base-url https://llm.example.com/v1 \\\n  --model my-model-id \\\n  --api-key-stdin \\\n  --set-default \\\n  --json\n\n# Smoke test the profile.\njcode --provider-profile my-api auth-test --prompt 'Reply exactly JCODE_PROVIDER_SETUP_OK'\n\n# Use it directly.\njcode --provider-profile my-api run 'hello'\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Secret-safe setup for a hosted OpenAI-compatible API.\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003eprintf\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e%s\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003e$MY_API_KEY\u003c/span\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e|\u003c/span\u003e jcode provider add my-api \\\n  --base-url https://llm.example.com/v1 \\\n  --model my-model-id \\\n  --api-key-stdin \\\n  --set-default \\\n  --json\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Smoke test the profile.\u003c/span\u003e\njcode --provider-profile my-api auth-test --prompt \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003eReply exactly JCODE_PROVIDER_SETUP_OK\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Use it directly.\u003c/span\u003e\njcode --provider-profile my-api run \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003ehello\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFor local servers that do not require auth:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"jcode provider add local-vllm \\\n  --base-url http://localhost:8000/v1 \\\n  --model Qwen/Qwen3-Coder-30B-A3B-Instruct \\\n  --no-api-key \\\n  --set-default\"\u003e\u003cpre\u003ejcode provider add local-vllm \\\n  --base-url http://localhost:8000/v1 \\\n  --model Qwen/Qwen3-Coder-30B-A3B-Instruct \\\n  --no-api-key \\\n  --set-default\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eBuilt-in local profiles are available for the common desktop/local runtimes:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# Ollama: start the local server and install a model first.\nollama pull llama3.2\njcode login --provider ollama\njcode --provider ollama --model llama3.2 run 'hello'\n\n# LM Studio: start the Local Server, load a chat model, then use the exact\n# model identifier shown by LM Studio or by curl http://localhost:1234/v1/models.\njcode login --provider lmstudio\njcode --provider lmstudio --model '\u0026lt;model-id\u0026gt;' run 'hello'\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Ollama: start the local server and install a model first.\u003c/span\u003e\nollama pull llama3.2\njcode login --provider ollama\njcode --provider ollama --model llama3.2 run \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003ehello\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e LM Studio: start the Local Server, load a chat model, then use the exact\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e model identifier shown by LM Studio or by curl http://localhost:1234/v1/models.\u003c/span\u003e\njcode login --provider lmstudio\njcode --provider lmstudio --model \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u0026lt;model-id\u0026gt;\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e run \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003ehello\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOllama and LM Studio both expose OpenAI-compatible \u003ccode\u003e/v1/models\u003c/code\u003e and \u003ccode\u003e/v1/chat/completions\u003c/code\u003e endpoints. jcode uses streaming chat completions, function/tool calling, and OpenAI-style image content for vision-capable local models. If a local server requires a token, enter it during \u003ccode\u003ejcode login\u003c/code\u003e or create a named profile with \u003ccode\u003e--api-key-stdin\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUseful flags:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003e--api-key-env NAME\u003c/code\u003e: reference an existing environment variable instead of storing a key.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--api-key-stdin\u003c/code\u003e: read and store a key without putting it in shell history.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--context-window TOKENS\u003c/code\u003e: persist the model context window for model selection and routing.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--overwrite\u003c/code\u003e: replace an existing profile of the same name.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--model-catalog\u003c/code\u003e: use the endpoint's \u003ccode\u003e/models\u003c/code\u003e response in addition to configured models.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eThe generated profile can also be edited manually in \u003ccode\u003e~/.jcode/config.toml\u003c/code\u003e:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-toml notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"[provider]\ndefault_provider = \u0026quot;my-api\u0026quot;\ndefault_model = \u0026quot;my-model-id\u0026quot;\n\n[providers.my-api]\ntype = \u0026quot;openai-compatible\u0026quot;\nbase_url = \u0026quot;https://llm.example.com/v1\u0026quot;\napi_key_env = \u0026quot;JCODE_PROVIDER_MY_API_API_KEY\u0026quot;\nenv_file = \u0026quot;provider-my-api.env\u0026quot;\ndefault_model = \u0026quot;my-model-id\u0026quot;\n\n[[providers.my-api.models]]\nid = \u0026quot;my-model-id\u0026quot;\ncontext_window = 128000\"\u003e\u003cpre\u003e[\u003cspan class=\"pl-en\"\u003eprovider\u003c/span\u003e]\n\u003cspan class=\"pl-smi\"\u003edefault_provider\u003c/span\u003e = \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003emy-api\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003edefault_model\u003c/span\u003e = \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003emy-model-id\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\n[\u003cspan class=\"pl-en\"\u003eproviders\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003emy-api\u003c/span\u003e]\n\u003cspan class=\"pl-smi\"\u003etype\u003c/span\u003e = \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eopenai-compatible\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003ebase_url\u003c/span\u003e = \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003ehttps://llm.example.com/v1\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eapi_key_env\u003c/span\u003e = \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eJCODE_PROVIDER_MY_API_API_KEY\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eenv_file\u003c/span\u003e = \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eprovider-my-api.env\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003edefault_model\u003c/span\u003e = \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003emy-model-id\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\n[[\u003cspan class=\"pl-en\"\u003eproviders\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003emy-api\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003emodels\u003c/span\u003e]]\n\u003cspan class=\"pl-smi\"\u003eid\u003c/span\u003e = \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003emy-model-id\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003econtext_window\u003c/span\u003e = \u003cspan class=\"pl-c1\"\u003e128000\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAnthropic Messages-compatible gateways use the same named-profile surface with\n\u003ccode\u003etype = \"anthropic-compatible\"\u003c/code\u003e. The profile can select bearer, custom-header,\nor no authentication and attach gateway-specific headers to every request:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-toml notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"[provider]\ndefault_provider = \u0026quot;corp-claude\u0026quot;\ndefault_model = \u0026quot;claude-sonnet-4-6\u0026quot;\n\n[providers.corp-claude]\ntype = \u0026quot;anthropic-compatible\u0026quot;\nbase_url = \u0026quot;https://gateway.example.com/anthropic/v1\u0026quot;\nauth = \u0026quot;bearer\u0026quot;\napi_key_env = \u0026quot;CORP_CLAUDE_TOKEN\u0026quot;\ndefault_model = \u0026quot;claude-sonnet-4-6\u0026quot;\n\n[providers.corp-claude.headers]\nx-tenant-id = \u0026quot;tenant-42\u0026quot;\n\n[[providers.corp-claude.models]]\nid = \u0026quot;claude-sonnet-4-6\u0026quot;\ncontext_window = 200000\"\u003e\u003cpre\u003e[\u003cspan class=\"pl-en\"\u003eprovider\u003c/span\u003e]\n\u003cspan class=\"pl-smi\"\u003edefault_provider\u003c/span\u003e = \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003ecorp-claude\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003edefault_model\u003c/span\u003e = \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eclaude-sonnet-4-6\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\n[\u003cspan class=\"pl-en\"\u003eproviders\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003ecorp-claude\u003c/span\u003e]\n\u003cspan class=\"pl-smi\"\u003etype\u003c/span\u003e = \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eanthropic-compatible\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003ebase_url\u003c/span\u003e = \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003ehttps://gateway.example.com/anthropic/v1\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eauth\u003c/span\u003e = \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003ebearer\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eapi_key_env\u003c/span\u003e = \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eCORP_CLAUDE_TOKEN\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003edefault_model\u003c/span\u003e = \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eclaude-sonnet-4-6\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\n[\u003cspan class=\"pl-en\"\u003eproviders\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003ecorp-claude\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003eheaders\u003c/span\u003e]\n\u003cspan class=\"pl-smi\"\u003ex-tenant-id\u003c/span\u003e = \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003etenant-42\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\n[[\u003cspan class=\"pl-en\"\u003eproviders\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003ecorp-claude\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003emodels\u003c/span\u003e]]\n\u003cspan class=\"pl-smi\"\u003eid\u003c/span\u003e = \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eclaude-sonnet-4-6\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003econtext_window\u003c/span\u003e = \u003cspan class=\"pl-c1\"\u003e200000\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFor direct environment-based configuration, \u003ccode\u003eANTHROPIC_BASE_URL\u003c/code\u003e overrides the\nnon-OAuth Messages endpoint and \u003ccode\u003eANTHROPIC_AUTH_TOKEN\u003c/code\u003e is sent as a bearer token.\nClaude OAuth traffic always continues to use Anthropic's official endpoints.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eExtra request-body fields (\u003ccode\u003eextra_body\u003c/code\u003e)\u003c/h5\u003e\u003ca id=\"user-content-extra-request-body-fields-extra_body\" class=\"anchor\" aria-label=\"Permalink: Extra request-body fields (extra_body)\" href=\"#extra-request-body-fields-extra_body\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSome OpenAI-compatible backends require non-standard top-level request fields. For example, NVIDIA NIM DeepSeek-V4 reasoning models (\u003ccode\u003edeepseek-ai/deepseek-v4-flash\u003c/code\u003e, \u003ccode\u003edeepseek-ai/deepseek-v4-pro\u003c/code\u003e) only enable thinking when the request includes \u003ccode\u003echat_template_kwargs\u003c/code\u003e; without it they reply without reasoning (or, for some deployments, hang). jcode lets you inject arbitrary top-level fields two ways.\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003ePer named profile, via \u003ccode\u003eextra_body\u003c/code\u003e in \u003ccode\u003econfig.toml\u003c/code\u003e (a TOML table merged verbatim into the JSON body):\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-toml notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"[providers.my-nim]\ntype = \u0026quot;openai-compatible\u0026quot;\nbase_url = \u0026quot;https://integrate.api.nvidia.com/v1\u0026quot;\napi_key_env = \u0026quot;NVIDIA_API_KEY\u0026quot;\ndefault_model = \u0026quot;deepseek-ai/deepseek-v4-flash\u0026quot;\n\n[providers.my-nim.extra_body.chat_template_kwargs]\nthinking = true\nreasoning_effort = \u0026quot;high\u0026quot;\"\u003e\u003cpre\u003e[\u003cspan class=\"pl-en\"\u003eproviders\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003emy-nim\u003c/span\u003e]\n\u003cspan class=\"pl-smi\"\u003etype\u003c/span\u003e = \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eopenai-compatible\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003ebase_url\u003c/span\u003e = \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003ehttps://integrate.api.nvidia.com/v1\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003eapi_key_env\u003c/span\u003e = \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eNVIDIA_API_KEY\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003edefault_model\u003c/span\u003e = \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003edeepseek-ai/deepseek-v4-flash\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\n[\u003cspan class=\"pl-en\"\u003eproviders\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003emy-nim\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003eextra_body\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003echat_template_kwargs\u003c/span\u003e]\n\u003cspan class=\"pl-smi\"\u003ethinking\u003c/span\u003e = \u003cspan class=\"pl-c1\"\u003etrue\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003ereasoning_effort\u003c/span\u003e = \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003ehigh\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eFor built-in profiles (e.g. \u003ccode\u003envidia-nim\u003c/code\u003e) or any endpoint, via the \u003ccode\u003eJCODE_OPENAI_EXTRA_BODY\u003c/code\u003e environment variable (a JSON object string). It can live in the provider's env file (\u003ccode\u003e~/.config/jcode/nvidia-nim.env\u003c/code\u003e) next to the API key:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"JCODE_OPENAI_EXTRA_BODY={\u0026quot;chat_template_kwargs\u0026quot;:{\u0026quot;thinking\u0026quot;:true,\u0026quot;reasoning_effort\u0026quot;:\u0026quot;high\u0026quot;}}\"\u003e\u003cpre\u003eJCODE_OPENAI_EXTRA_BODY={\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003echat_template_kwargs\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e:{\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003ethinking\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e:true,\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003ereasoning_effort\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e:\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003ehigh\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e}}\u003c/pre\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp dir=\"auto\"\u003eKeys from \u003ccode\u003eextra_body\u003c/code\u003e are merged last and override any jcode-generated body field with the same name (\u003ccode\u003eJCODE_OPENAI_EXTRA_BODY\u003c/code\u003e wins over the config \u003ccode\u003eextra_body\u003c/code\u003e on key collisions). Invalid values are logged and ignored rather than failing the request.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe custom OpenAI-compatible provider reads overrides from environment variables or from an env file in jcode's app config directory. On Linux this is usually \u003ccode\u003e~/.config/jcode/\u003c/code\u003e, so the default file is usually:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"~/.config/jcode/openai-compatible.env\"\u003e\u003cpre lang=\"text\" class=\"notranslate\"\u003e\u003ccode\u003e~/.config/jcode/openai-compatible.env\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eExample for a local or LAN vLLM server:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"JCODE_OPENAI_COMPAT_API_BASE=http://192.168.1.50:8000/v1\nJCODE_OPENAI_COMPAT_DEFAULT_MODEL=Qwen/Qwen3-Coder-30B-A3B-Instruct\n# Optional if your server expects auth\nOPENAI_COMPAT_API_KEY=your-token-here\"\u003e\u003cpre\u003eJCODE_OPENAI_COMPAT_API_BASE=http://192.168.1.50:8000/v1\nJCODE_OPENAI_COMPAT_DEFAULT_MODEL=Qwen/Qwen3-Coder-30B-A3B-Instruct\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Optional if your server expects auth\u003c/span\u003e\nOPENAI_COMPAT_API_KEY=your-token-here\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eNotes:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003ejcode login --provider openai-compatible\u003c/code\u003e can create or update this for you.\u003c/li\u003e\n\u003cli\u003ePlain \u003ccode\u003ehttp://\u003c/code\u003e is accepted for \u003ccode\u003elocalhost\u003c/code\u003e and private LAN IPs. Public remote HTTP is still rejected.\u003c/li\u003e\n\u003cli\u003eHTTPS endpoints work as usual.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eMCP config files\u003c/h4\u003e\u003ca id=\"user-content-mcp-config-files\" class=\"anchor\" aria-label=\"Permalink: MCP config files\" href=\"#mcp-config-files\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eMCP config is separate from \u003ccode\u003econfig.toml\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003ePrimary config files:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003e~/.jcode/mcp.json\u003c/code\u003e for global MCP servers\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e.jcode/mcp.json\u003c/code\u003e for project-local MCP servers\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eClaude Code compatibility:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003e~/.claude.json\u003c/code\u003e (Claude Code's user config): top-level \u003ccode\u003emcpServers\u003c/code\u003e, plus per-project servers under \u003ccode\u003eprojects.\u0026lt;abs_path\u0026gt;.mcpServers\u003c/code\u003e for the current directory\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e.mcp.json\u003c/code\u003e at the repo root (Claude Code's project config)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e.claude/mcp.json\u003c/code\u003e (legacy fallback)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eClaude Code config is read live on every load rather than copied into jcode's\nglobal config. Additions, edits, and deletions therefore take effect without\nleaving a stale snapshot (and inline environment values are not duplicated).\nFor migration from Codex CLI, jcode still performs a one-time import from\n\u003ccode\u003e~/.codex/config.toml\u003c/code\u003e into \u003ccode\u003e~/.jcode/mcp.json\u003c/code\u003e when the latter does not exist.\nThat imported file is then jcode-owned; later Codex changes are not synced\nautomatically. Imported environment values are copied too and may contain\nsecrets.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eBoth the canonical \u003ccode\u003emcpServers\u003c/code\u003e key and jcode's historical \u003ccode\u003eservers\u003c/code\u003e key are accepted. jcode currently supports stdio (command-based) servers only; HTTP/SSE entries (\u003ccode\u003e\"type\": \"http\"\u003c/code\u003e/\u003ccode\u003e\"sse\"\u003c/code\u003e) are recognized and skipped with a log line.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eExample MCP config:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-json notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"{\n  \u0026quot;mcpServers\u0026quot;: {\n    \u0026quot;filesystem\u0026quot;: {\n      \u0026quot;command\u0026quot;: \u0026quot;/path/to/mcp-server\u0026quot;,\n      \u0026quot;args\u0026quot;: [\u0026quot;--root\u0026quot;, \u0026quot;/workspace\u0026quot;],\n      \u0026quot;env\u0026quot;: {},\n      \u0026quot;shared\u0026quot;: true\n    }\n  }\n}\"\u003e\u003cpre\u003e{\n  \u003cspan class=\"pl-ent\"\u003e\"mcpServers\"\u003c/span\u003e: {\n    \u003cspan class=\"pl-ent\"\u003e\"filesystem\"\u003c/span\u003e: {\n      \u003cspan class=\"pl-ent\"\u003e\"command\"\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e/path/to/mcp-server\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e,\n      \u003cspan class=\"pl-ent\"\u003e\"args\"\u003c/span\u003e: [\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e--root\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e, \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e/workspace\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e],\n      \u003cspan class=\"pl-ent\"\u003e\"env\"\u003c/span\u003e: {},\n      \u003cspan class=\"pl-ent\"\u003e\"shared\"\u003c/span\u003e: \u003cspan class=\"pl-c1\"\u003etrue\u003c/span\u003e\n    }\n  }\n}\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFor headless or SSH sessions, OAuth-style providers support \u003ccode\u003ejcode login --provider \u0026lt;provider\u0026gt; --no-browser\u003c/code\u003e (alias: \u003ccode\u003e--headless\u003c/code\u003e) so jcode prints the auth URL/QR and falls back to manual code or callback paste instead of trying to launch a local browser.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor more scriptable remote flows, \u003ccode\u003eclaude\u003c/code\u003e, \u003ccode\u003eopenai\u003c/code\u003e, \u003ccode\u003egemini\u003c/code\u003e, and \u003ccode\u003eantigravity\u003c/code\u003e also support a two-step pattern:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# Step 1: print a resumable auth URL\njcode login --provider openai --print-auth-url --json\n\n# Step 2: complete later with the callback URL or auth code\njcode login --provider openai --callback-url 'http://localhost:1455/auth/callback?...'\njcode login --provider gemini --auth-code '...'\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Step 1: print a resumable auth URL\u003c/span\u003e\njcode login --provider openai --print-auth-url --json\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Step 2: complete later with the callback URL or auth code\u003c/span\u003e\njcode login --provider openai --callback-url \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003ehttp://localhost:1455/auth/callback?...\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e\njcode login --provider gemini --auth-code \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e...\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAdditional scriptable cases:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# Copilot device flow: print URL + user code, then complete later\njcode login --provider copilot --print-auth-url --json\njcode login --provider copilot --complete\n\n# Gmail/Google OAuth after credentials are already configured\njcode login --provider google --print-auth-url --google-access-tier readonly\njcode login --provider google --callback-url 'http://127.0.0.1:8456?...'\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Copilot device flow: print URL + user code, then complete later\u003c/span\u003e\njcode login --provider copilot --print-auth-url --json\njcode login --provider copilot --complete\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Gmail/Google OAuth after credentials are already configured\u003c/span\u003e\njcode login --provider google --print-auth-url --google-access-tier \u003cspan class=\"pl-k\"\u003ereadonly\u003c/span\u003e\njcode login --provider google --callback-url \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003ehttp://127.0.0.1:8456?...\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003ePending scriptable login state is stored under \u003ccode\u003e~/.jcode/pending-login/\u003c/code\u003e, automatically expires, and stale entries are cleaned up when new scriptable logins start or resume.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor the built-in OpenAI login flow, jcode opens a local callback on\n\u003ccode\u003ehttp://localhost:1455/auth/callback\u003c/code\u003e by default.\u003c/p\u003e\n\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://private-user-images.githubusercontent.com/94247773/573295480-530684c0-9d12-4363-aa0e-1b39a0d4e1be.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3OTE0NTcwMDYsIm5iZiI6MTc5MTQ1NjcwNiwicGF0aCI6Ii85NDI0Nzc3My81NzMyOTU0ODAtNTMwNjg0YzAtOWQxMi00MzYzLWFhMGUtMWIzOWEwZDRlMWJlLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjEwMDglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYxMDA4VDEwNTE0NlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTI5ODJkY2I4NDlmZDJjYTQ2Yjc2NmUzNzBkZWJlNzFlOGJmYzM1MWQ3Mjk0MGU4M2QzOGQ1ZTNhYWY0YWEyMzMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRnBuZyJ9.JhI0zVVBu10CF7mgnXerYJG-bPwXbjRjTKbcwkzLeD8\"\u003e\u003cimg width=\"2000\" height=\"1225\" alt=\"Screenshot from 2026-04-02 14-28-51\" src=\"https://private-user-images.githubusercontent.com/94247773/573295480-530684c0-9d12-4363-aa0e-1b39a0d4e1be.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3OTE0NTcwMDYsIm5iZiI6MTc5MTQ1NjcwNiwicGF0aCI6Ii85NDI0Nzc3My81NzMyOTU0ODAtNTMwNjg0YzAtOWQxMi00MzYzLWFhMGUtMWIzOWEwZDRlMWJlLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjEwMDglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYxMDA4VDEwNTE0NlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTI5ODJkY2I4NDlmZDJjYTQ2Yjc2NmUzNzBkZWJlNzFlOGJmYzM1MWQ3Mjk0MGU4M2QzOGQ1ZTNhYWY0YWEyMzMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRnBuZyJ9.JhI0zVVBu10CF7mgnXerYJG-bPwXbjRjTKbcwkzLeD8\" style=\"max-width: 100%; height: auto; max-height: 1225px;; aspect-ratio: 2000 / 1225; background-color: var(--bgColor-muted); border-radius: 6px\" class=\"js-gh-image-fallback\"\u003e\u003c/a\u003e\nThe above image is the first page of provider logins\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSupported provider\u003c/h3\u003e\u003ca id=\"user-content-supported-provider\" class=\"anchor\" aria-label=\"Permalink: Supported provider\" href=\"#supported-provider\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cstrong\u003eNative / first-party style providers:\u003c/strong\u003e \u003ccode\u003eclaude\u003c/code\u003e, \u003ccode\u003eopenai\u003c/code\u003e, \u003ccode\u003ecopilot\u003c/code\u003e, \u003ccode\u003egemini\u003c/code\u003e, \u003ccode\u003eazure\u003c/code\u003e, \u003ccode\u003ealibaba-coding-plan\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAggregator / compatibility providers:\u003c/strong\u003e \u003ccode\u003eopenrouter\u003c/code\u003e, \u003ccode\u003eorcarouter\u003c/code\u003e, \u003ccode\u003eopenai-compatible\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAdditional provider integrations:\u003c/strong\u003e \u003ccode\u003eopencode\u003c/code\u003e, \u003ccode\u003eopencode-go\u003c/code\u003e, \u003ccode\u003ezai\u003c/code\u003e / \u003ccode\u003ekimi\u003c/code\u003e, \u003ccode\u003e302ai\u003c/code\u003e, \u003ccode\u003ebaseten\u003c/code\u003e, \u003ccode\u003ecortecs\u003c/code\u003e, \u003ccode\u003edeepseek\u003c/code\u003e, \u003ccode\u003efirmware\u003c/code\u003e, \u003ccode\u003ehuggingface\u003c/code\u003e, \u003ccode\u003emoonshotai\u003c/code\u003e, \u003ccode\u003enebius\u003c/code\u003e, \u003ccode\u003escaleway\u003c/code\u003e, \u003ccode\u003estackit\u003c/code\u003e, \u003ccode\u003egroq\u003c/code\u003e, \u003ccode\u003emistral\u003c/code\u003e, \u003ccode\u003eperplexity\u003c/code\u003e, \u003ccode\u003etogetherai\u003c/code\u003e, \u003ccode\u003edeepinfra\u003c/code\u003e, \u003ccode\u003efireworks\u003c/code\u003e, \u003ccode\u003eminimax\u003c/code\u003e, \u003ccode\u003exai\u003c/code\u003e, \u003ccode\u003elmstudio\u003c/code\u003e, \u003ccode\u003eollama\u003c/code\u003e, \u003ccode\u003echutes\u003c/code\u003e, \u003ccode\u003ecerebras\u003c/code\u003e, \u003ccode\u003ecursor\u003c/code\u003e, \u003ccode\u003eantigravity\u003c/code\u003e, \u003ccode\u003egoogle\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eJcode also supports easy multi-account switching. Ran out of tokens on your first ChatGPT Pro subscription? /account and quickly switch to your second.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCustomizability / Self-Dev\u003c/h2\u003e\u003ca id=\"user-content-customizability--self-dev\" class=\"anchor\" aria-label=\"Permalink: Customizability / Self-Dev\" href=\"#customizability--self-dev\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eJcode is inventing a new form of customizability. One that doesn't limit you to what a plugin or extension can do. Tell your jcode agent to enter self dev mode, and it will start modifying its own source code. Jcode is optimized to iterate on itself. There is significant infrastructure around self developement, which allows it to edit, build, and test its own source code, then reload its own binary and continue work in your (potentially many) sessions, fully automatically.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIt is reccomended that you use a frontier model for this. The jcode codebase is not a simple one, and weaker models can make subtle, breaking changes. GPT 5.5 or the latest available frontier model works well.\u003c/p\u003e\n\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eMisc.\u003c/h2\u003e\u003ca id=\"user-content-misc\" class=\"anchor\" aria-label=\"Permalink: Misc.\" href=\"#misc\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe devil is in the details. There are many undocumented optimizations and niceties that jcode implements. Some examples:\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAnthropic's Claude cache goes cold after 5 minutes. If you initiate Claude after these 5 minutes, you have a cache miss, potentially costing you lots of tokens. The ui warns you when the cache went cold, and notfies you if there was an unexpected cache miss.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003ejcode comes with instructions on how to set up Firefox Agent Bridge. Ask you agent to set it up, and then you will have browser automation in jcode as well.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAgent grep is a grep tool I made for the jcode agent. It adds file strucuture information (ie the list of functions, their displacement, etc) to the grep return, so that the agent can infer more of what the file doesn without actually reading the file. It also implements a harness-level integration that adaptively truncates returns based on what the agent has already seen. This saves on context a lot.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eInputs are by default interleaved with the working agent. It sends the input as soon as it safely can without breaking the KV cache. Submit with shift enter instead, and it will send a queue send, and wait for the agent to fully finish its turn before sending.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eResume sessions from different harnesses. Claude code broke on you? Resume the session from jcode and continue where you left off. Session resume is supported for codex, claude code, opencode, and pi.\u003c/p\u003e\n\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://private-user-images.githubusercontent.com/94247773/577004125-c2b383cf-2531-4217-85ae-6a863354dc97.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3OTE0NTcwMDYsIm5iZiI6MTc5MTQ1NjcwNiwicGF0aCI6Ii85NDI0Nzc3My81NzcwMDQxMjUtYzJiMzgzY2YtMjUzMS00MjE3LTg1YWUtNmE4NjMzNTRkYzk3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjEwMDglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYxMDA4VDEwNTE0NlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTRmMTFmNDljN2RkMWQ3MWYwOWRhMjIyZDlmM2E1OTJiNTFjOGMzNjEzMjI1ZjM0Y2FjYTBmOTZjMjdhZmMzYzYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRnBuZyJ9.wvdYV5W9mAG4ZY0yDYv0-NFx8ajZtojk2aEHqLBe_0E\"\u003e\u003cimg width=\"2000\" height=\"1225\" alt=\"Screenshot from 2026-04-11 16-28-52\" src=\"https://private-user-images.githubusercontent.com/94247773/577004125-c2b383cf-2531-4217-85ae-6a863354dc97.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3OTE0NTcwMDYsIm5iZiI6MTc5MTQ1NjcwNiwicGF0aCI6Ii85NDI0Nzc3My81NzcwMDQxMjUtYzJiMzgzY2YtMjUzMS00MjE3LTg1YWUtNmE4NjMzNTRkYzk3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjEwMDglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYxMDA4VDEwNTE0NlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTRmMTFmNDljN2RkMWQ3MWYwOWRhMjIyZDlmM2E1OTJiNTFjOGMzNjEzMjI1ZjM0Y2FjYTBmOTZjMjdhZmMzYzYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRnBuZyJ9.wvdYV5W9mAG4ZY0yDYv0-NFx8ajZtojk2aEHqLBe_0E\" style=\"max-width: 100%; height: auto; max-height: 1225px;; aspect-ratio: 2000 / 1225; background-color: var(--bgColor-muted); border-radius: 6px\" class=\"js-gh-image-fallback\"\u003e\u003c/a\u003e\nimage of /Resume for codex sessions\n\u003cp dir=\"auto\"\u003eSkills are not all loaded on startup. The conversation is embedded as a semantic vector, and will automatically inject a skill if there is an embedding hit similar to memories. The agent has a skill tool for you to manually activate a skill at anytime. You may also activate via slash commands.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eiOS Application / Native OpenClaw\u003c/h2\u003e\u003ca id=\"user-content-ios-application--native-openclaw\" class=\"anchor\" aria-label=\"Permalink: iOS Application / Native OpenClaw\" href=\"#ios-application--native-openclaw\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eA native iOS application version of jcode is coming soon. This will allow you to work with jcode on your personal machine's environment from your phone, via Tailscale. Openclaw like features will be bundled with this iOS application.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eOther planned features\u003c/h2\u003e\u003ca id=\"user-content-other-planned-features\" class=\"anchor\" aria-label=\"Permalink: Other planned features\" href=\"#other-planned-features\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAgents dont like to commit in dirty git state with active changes. Git was clearly not built for multi-agent workflows, and git worktrees is not a good solution. Given this, I believe that is an opporunity for a new git like primitive to be born.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eBuild speed improvements: An incremental debug cargo build with cache enabled takes about 1 minute on my machine. The goal is 5-20 seconds. Refactors and crates seams should be able to make this happen.\u003c/p\u003e\n\n\u003chr\u003e\n\u003cdiv align=\"center\" dir=\"auto\"\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eQuick Start\u003c/h2\u003e\u003ca id=\"user-content-quick-start\" class=\"anchor\" aria-label=\"Permalink: Quick Start\" href=\"#quick-start\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# Launch the TUI\njcode\n\n# Run a single command non-interactively\njcode run \u0026quot;say hello\u0026quot;\n\n# Resume a previous session by memorable name\njcode --resume fox\n\n# Run as a persistent background server, then attach more clients\njcode serve\njcode connect\n\n# Send voice input from your configured STT command\njcode dictate\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Launch the TUI\u003c/span\u003e\njcode\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Run a single command non-interactively\u003c/span\u003e\njcode run \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003esay hello\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Resume a previous session by memorable name\u003c/span\u003e\njcode --resume fox\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Run as a persistent background server, then attach more clients\u003c/span\u003e\njcode serve\njcode connect\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Send voice input from your configured STT command\u003c/span\u003e\njcode dictate\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003ejcode supports interactive TUI use, non-interactive runs, persistent server/client workflows,\nand hotkey-friendly dictation without requiring a bundled speech-to-text stack.\u003c/p\u003e\n\u003cdiv align=\"center\" dir=\"auto\"\u003e\n  \u003ca href=\"https://github.com/1jehuang/jcode/releases/download/readme-assets/workflow.mp4\"\u003e\n    \u003cimg src=\"https://github.com/1jehuang/jcode/releases/download/readme-assets/jcode-workflow-demonstration.webp\" alt=\"jcode workflow demonstration\" width=\"900\" style=\"max-width: 100%;\"\u003e\n  \u003c/a\u003e\n  \u003cp dir=\"auto\"\u003e\u003cem\u003ejcode workflow demonstration\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eBrowser Automation\u003c/h2\u003e\u003ca id=\"user-content-browser-automation\" class=\"anchor\" aria-label=\"Permalink: Browser Automation\" href=\"#browser-automation\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003ejcode includes a first-class built-in \u003ccode\u003ebrowser\u003c/code\u003e tool for browser control inside agent sessions.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eCurrent built-in backend:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eFirefox via Firefox Agent Bridge\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eCurrent built-in tool actions include:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003estatus\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esetup\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopen\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esnapshot\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eget_content\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einteractables\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eclick\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etype\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efill_form\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eselect\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ewait\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003escreenshot\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eeval\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003escroll\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eupload\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epress\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eQuick setup:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"jcode browser status\njcode browser setup\"\u003e\u003cpre\u003ejcode browser status\njcode browser setup\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOnce setup is complete, the model can use the built-in \u003ccode\u003ebrowser\u003c/code\u003e tool directly. The UI also summarizes browser tool calls compactly, for example opening a URL, clicking a selector, or typing into a field without echoing sensitive typed text.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNotes:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003ethe provider/tool architecture is in place for additional backends\u003c/li\u003e\n\u003cli\u003eFirefox is the wired built-in backend today\u003c/li\u003e\n\u003cli\u003eChrome bridge / remote debugging style providers can be added on top of the same browser tool later\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFurther Reading\u003c/h2\u003e\u003ca id=\"user-content-further-reading\" class=\"anchor\" aria-label=\"Permalink: Further Reading\" href=\"#further-reading\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"https://jcode.sh/docs\" rel=\"nofollow\"\u003ejcode.sh/docs\u003c/a\u003e — install, providers, configuration, keybindings\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://jcode.sh/swarm\" rel=\"nofollow\"\u003ejcode.sh/swarm\u003c/a\u003e — many coding agents in one repository\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://jcode.sh/sdk\" rel=\"nofollow\"\u003ejcode.sh/sdk\u003c/a\u003e — TypeScript SDK: drive jcode sessions from your own program\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://jcode.sh/bench\" rel=\"nofollow\"\u003ejcode.sh/bench\u003c/a\u003e — benchmark methodology and results\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/adminwat/jcode/blob/master/docs/AMBIENT_MODE.md\"\u003eAmbient Mode / OpenClaw\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/adminwat/jcode/blob/master/docs/BROWSER_PROVIDER_PROTOCOL.md\"\u003eBrowser Provider Protocol\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/adminwat/jcode/blob/master/docs/MEMORY_ARCHITECTURE.md\"\u003eMemory Architecture\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/adminwat/jcode/blob/master/docs/SWARM_ARCHITECTURE.md\"\u003eSwarm Architecture\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/adminwat/jcode/blob/master/docs/SERVER_ARCHITECTURE.md\"\u003eServer Architecture\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/adminwat/jcode/blob/master/docs/SAFETY_SYSTEM.md\"\u003eSafety System\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/adminwat/jcode/blob/master/docs/SPONSORED_DISCOVERY_SPONSOR_ONBOARDING.md\"\u003eSponsored Discovery Sponsor Onboarding\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/adminwat/jcode/blob/master/docs/WINDOWS.md\"\u003eWindows Notes\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/adminwat/jcode/blob/master/docs/WRAPPERS.md\"\u003eWrappers and Shell Integration\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/adminwat/jcode/blob/master/docs/REFACTORING.md\"\u003eRefactoring Notes\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDetailed Installation\u003c/h2\u003e\u003ca id=\"user-content-detailed-installation\" class=\"anchor\" aria-label=\"Permalink: Detailed Installation\" href=\"#detailed-installation\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSetup\u003c/h3\u003e\u003ca id=\"user-content-setup\" class=\"anchor\" aria-label=\"Permalink: Setup\" href=\"#setup\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIf you want another agent to set up jcode for you, give it this prompt:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"Set up jcode on this machine for me.\n\n1. Detect the operating system, available package managers, and shell environment, then install jcode using the best matching command below instead of referring me somewhere else:\n\n   - macOS with Homebrew available:\n     brew tap 1jehuang/jcode\n     brew install jcode\n\n   - macOS or Linux via install script:\n     curl -fsSL https://jcode.sh/install | bash\n\n   - Windows PowerShell:\n     irm https://jcode.sh/install.ps1 | iex\n\n   - From source if the above paths are not appropriate:\n     git clone https://github.com/1jehuang/jcode.git\n     cd jcode\n     cargo build --release\n     scripts/install_release.sh\n\n   - For local self-dev / refactor work on Linux x86_64, prefer:\n     scripts/dev_cargo.sh build --release -p jcode --bin jcode\n     scripts/dev_cargo.sh --print-setup\n     scripts/install_release.sh\n\n2. Verify that `jcode` is on my `PATH`.\n3. Launch `jcode` once in a new terminal window/session to confirm it starts successfully.\n4. Before attempting any interactive login flow, assess which providers are already available non-interactively and prefer those first. Check existing local credentials, config files, CLI sessions, and environment variables such as:\n   - Claude: `~/.jcode/auth.json`, `~/.claude/.credentials.json`, `~/.local/share/opencode/auth.json`, `ANTHROPIC_API_KEY`\n   - OpenAI: `~/.jcode/openai-auth.json`, `~/.codex/auth.json`, `OPENAI_API_KEY`\n   - Gemini: `~/.jcode/gemini_oauth.json`, `~/.gemini/oauth_creds.json`\n   - GitHub Copilot: existing auth under `~/.config/github-copilot/`\n   - Azure OpenAI: `~/.config/jcode/azure-openai.env`, `AZURE_OPENAI_*`, or an existing `az login`\n   - OpenRouter: `OPENROUTER_API_KEY`\n   - Fireworks: `~/.config/jcode/fireworks.env`, `FIREWORKS_API_KEY`\n   - MiniMax: `~/.config/jcode/minimax.env`, `MINIMAX_API_KEY`\n   - NVIDIA NIM: `~/.config/jcode/nvidia-nim.env`, `NVIDIA_API_KEY`\n   - Alibaba Cloud Coding Plan: existing jcode config/env if present\n5. Prefer whichever provider is already configured and verify it with `jcode auth-test --all-configured` or a provider-specific auth test when appropriate.\n6. Only if no usable provider is already configured, guide me through the minimal manual step needed:\n   - Claude: `jcode login --provider claude`\n   - GitHub Copilot: `jcode login --provider copilot`\n   - OpenAI: `jcode login --provider openai`\n   - Gemini: `jcode login --provider gemini`\n   - Azure OpenAI: `jcode login --provider azure`\n   - Fireworks: `jcode login --provider fireworks`\n   - MiniMax: `jcode login --provider minimax`\n   - NVIDIA NIM: `jcode login --provider nvidia-nim`\n   - Alibaba Cloud Coding Plan: `jcode login --provider alibaba-coding-plan`\n   - OpenRouter: help me set `OPENROUTER_API_KEY`\n   - Anthropic direct API: help me set `ANTHROPIC_API_KEY`\n7. After setup, run a simple smoke test with `jcode run \u0026quot;say hello\u0026quot;` and confirm it works.\n8. If I want browser automation, also check `jcode browser status`. If browser automation is not ready, run `jcode browser setup`, verify the built-in `browser` tool works, and explain any remaining manual step.\n9. Explain any manual step that still needs me, especially browser OAuth, device login, API key entry, or browser extension approval.\"\u003e\u003cpre lang=\"text\" class=\"notranslate\"\u003e\u003ccode\u003eSet up jcode on this machine for me.\n\n1. Detect the operating system, available package managers, and shell environment, then install jcode using the best matching command below instead of referring me somewhere else:\n\n   - macOS with Homebrew available:\n     brew tap 1jehuang/jcode\n     brew install jcode\n\n   - macOS or Linux via install script:\n     curl -fsSL https://jcode.sh/install | bash\n\n   - Windows PowerShell:\n     irm https://jcode.sh/install.ps1 | iex\n\n   - From source if the above paths are not appropriate:\n     git clone https://github.com/1jehuang/jcode.git\n     cd jcode\n     cargo build --release\n     scripts/install_release.sh\n\n   - For local self-dev / refactor work on Linux x86_64, prefer:\n     scripts/dev_cargo.sh build --release -p jcode --bin jcode\n     scripts/dev_cargo.sh --print-setup\n     scripts/install_release.sh\n\n2. Verify that `jcode` is on my `PATH`.\n3. Launch `jcode` once in a new terminal window/session to confirm it starts successfully.\n4. Before attempting any interactive login flow, assess which providers are already available non-interactively and prefer those first. Check existing local credentials, config files, CLI sessions, and environment variables such as:\n   - Claude: `~/.jcode/auth.json`, `~/.claude/.credentials.json`, `~/.local/share/opencode/auth.json`, `ANTHROPIC_API_KEY`\n   - OpenAI: `~/.jcode/openai-auth.json`, `~/.codex/auth.json`, `OPENAI_API_KEY`\n   - Gemini: `~/.jcode/gemini_oauth.json`, `~/.gemini/oauth_creds.json`\n   - GitHub Copilot: existing auth under `~/.config/github-copilot/`\n   - Azure OpenAI: `~/.config/jcode/azure-openai.env`, `AZURE_OPENAI_*`, or an existing `az login`\n   - OpenRouter: `OPENROUTER_API_KEY`\n   - Fireworks: `~/.config/jcode/fireworks.env`, `FIREWORKS_API_KEY`\n   - MiniMax: `~/.config/jcode/minimax.env`, `MINIMAX_API_KEY`\n   - NVIDIA NIM: `~/.config/jcode/nvidia-nim.env`, `NVIDIA_API_KEY`\n   - Alibaba Cloud Coding Plan: existing jcode config/env if present\n5. Prefer whichever provider is already configured and verify it with `jcode auth-test --all-configured` or a provider-specific auth test when appropriate.\n6. Only if no usable provider is already configured, guide me through the minimal manual step needed:\n   - Claude: `jcode login --provider claude`\n   - GitHub Copilot: `jcode login --provider copilot`\n   - OpenAI: `jcode login --provider openai`\n   - Gemini: `jcode login --provider gemini`\n   - Azure OpenAI: `jcode login --provider azure`\n   - Fireworks: `jcode login --provider fireworks`\n   - MiniMax: `jcode login --provider minimax`\n   - NVIDIA NIM: `jcode login --provider nvidia-nim`\n   - Alibaba Cloud Coding Plan: `jcode login --provider alibaba-coding-plan`\n   - OpenRouter: help me set `OPENROUTER_API_KEY`\n   - Anthropic direct API: help me set `ANTHROPIC_API_KEY`\n7. After setup, run a simple smoke test with `jcode run \"say hello\"` and confirm it works.\n8. If I want browser automation, also check `jcode browser status`. If browser automation is not ready, run `jcode browser setup`, verify the built-in `browser` tool works, and explain any remaining manual step.\n9. Explain any manual step that still needs me, especially browser OAuth, device login, API key entry, or browser extension approval.\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis is intended to be a copy-paste bootstrap prompt for jcode itself or any other coding agent.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eQuick Install\u003c/h3\u003e\u003ca id=\"user-content-quick-install\" class=\"anchor\" aria-label=\"Permalink: Quick Install\" href=\"#quick-install\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# macOS \u0026amp; Linux\ncurl -fsSL https://jcode.sh/install | bash\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e macOS \u0026amp; Linux\u003c/span\u003e\ncurl -fsSL https://jcode.sh/install \u003cspan class=\"pl-k\"\u003e|\u003c/span\u003e bash\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOn Termux, install the glibc runtime and \u003ccode\u003epatchelf\u003c/code\u003e first so the installer can\npatch the downloaded Linux binary to Termux's glibc dynamic linker and create a\nlauncher that avoids Termux's \u003ccode\u003eLD_PRELOAD\u003c/code\u003e shim:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"pkg install glibc patchelf\ncurl -fsSL https://jcode.sh/install | bash\"\u003e\u003cpre\u003epkg install glibc patchelf\ncurl -fsSL https://jcode.sh/install \u003cspan class=\"pl-k\"\u003e|\u003c/span\u003e bash\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-powershell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# Windows 11 x64 or ARM64 (PowerShell 5.1+)\nirm https://jcode.sh/install.ps1 | iex\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Windows 11 x64 or ARM64 (PowerShell 5.1+)\u003c/span\u003e\nirm https:\u003cspan class=\"pl-k\"\u003e//\u003c/span\u003ejcode.sh\u003cspan class=\"pl-k\"\u003e/\u003c/span\u003einstall.ps1 \u003cspan class=\"pl-k\"\u003e|\u003c/span\u003e iex\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe Windows installer selects the correct architecture and verifies the download\nagainst the release's \u003ccode\u003eSHA256SUMS\u003c/code\u003e. Alacritty and the optional global launch\nhotkey require explicit consent and are not installed by default. See\n\u003ca href=\"/adminwat/jcode/blob/master/docs/WINDOWS.md\"\u003eWindows support, security, Defender, and SmartScreen notes\u003c/a\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf a release does not contain a matching Windows asset, the installer stops\ninstead of unexpectedly starting a long compilation. An explicit source build\nis available with \u003ccode\u003e-BuildFromSource\u003c/code\u003e and requires Git, Rust, and Visual Studio\n2022 Build Tools with the \u003cstrong\u003eDesktop development with C++\u003c/strong\u003e workload.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003emacOS via Homebrew\u003c/h3\u003e\u003ca id=\"user-content-macos-via-homebrew\" class=\"anchor\" aria-label=\"Permalink: macOS via Homebrew\" href=\"#macos-via-homebrew\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"brew tap 1jehuang/jcode\nbrew install jcode\"\u003e\u003cpre\u003ebrew tap 1jehuang/jcode\nbrew install jcode\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFrom Source (all platforms)\u003c/h3\u003e\u003ca id=\"user-content-from-source-all-platforms\" class=\"anchor\" aria-label=\"Permalink: From Source (all platforms)\" href=\"#from-source-all-platforms\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"git clone https://github.com/1jehuang/jcode.git\ncd jcode\ncargo build --release\"\u003e\u003cpre\u003egit clone https://github.com/1jehuang/jcode.git\n\u003cspan class=\"pl-c1\"\u003ecd\u003c/span\u003e jcode\ncargo build --release\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFor local self-dev / refactor work on Linux x86_64, prefer:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"scripts/dev_cargo.sh build --release -p jcode --bin jcode\nscripts/dev_cargo.sh --print-setup\"\u003e\u003cpre\u003escripts/dev_cargo.sh build --release -p jcode --bin jcode\nscripts/dev_cargo.sh --print-setup\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThat wrapper automatically uses \u003ccode\u003esccache\u003c/code\u003e when available, prefers a fast\nworking local linker setup (\u003ccode\u003eclang + lld\u003c/code\u003e) instead of assuming every machine's\n\u003ccode\u003emold\u003c/code\u003e configuration is valid, and can print the active linker/cache setup via\n\u003ccode\u003e--print-setup\u003c/code\u003e so slow-path builds are easier to diagnose.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThen symlink to your PATH:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"scripts/install_release.sh\"\u003e\u003cpre\u003escripts/install_release.sh\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eUninstall\u003c/h3\u003e\u003ca id=\"user-content-uninstall\" class=\"anchor\" aria-label=\"Permalink: Uninstall\" href=\"#uninstall\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eRemoves installed binaries and the launcher but keeps your config, auth, and\nsessions so a clean reinstall picks up where you left off:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"curl -fsSL https://raw.githubusercontent.com/1jehuang/jcode/master/scripts/uninstall.sh | bash -s -- --yes\"\u003e\u003cpre\u003ecurl -fsSL https://raw.githubusercontent.com/1jehuang/jcode/master/scripts/uninstall.sh \u003cspan class=\"pl-k\"\u003e|\u003c/span\u003e bash -s -- --yes\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFor a full wipe of everything including config, auth, sessions, logs, and\nmemory (useful for recovering from a broken install):\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"curl -fsSL https://raw.githubusercontent.com/1jehuang/jcode/master/scripts/uninstall.sh | bash -s -- --purge --yes\"\u003e\u003cpre\u003ecurl -fsSL https://raw.githubusercontent.com/1jehuang/jcode/master/scripts/uninstall.sh \u003cspan class=\"pl-k\"\u003e|\u003c/span\u003e bash -s -- --purge --yes\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAdd \u003ccode\u003e--dry-run\u003c/code\u003e to preview what would be removed without deleting anything.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ePlatform Support\u003c/h3\u003e\u003ca id=\"user-content-platform-support\" class=\"anchor\" aria-label=\"Permalink: Platform Support\" href=\"#platform-support\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003ePlatform\u003c/th\u003e\n\u003cth\u003eStatus\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eLinux\u003c/strong\u003e x86_64 / aarch64\u003c/td\u003e\n\u003ctd\u003eFully supported\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003emacOS\u003c/strong\u003e Apple Silicon \u0026amp; Intel\u003c/td\u003e\n\u003ctd\u003eSupported\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eWindows\u003c/strong\u003e x86_64\u003c/td\u003e\n\u003ctd\u003eSupported (native + WSL2)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eTermux\u003c/strong\u003e aarch64 / x86_64\u003c/td\u003e\n\u003ctd\u003eSupported with \u003ccode\u003epkg install glibc patchelf\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\n\u003c/article\u003e","richTextTruncated":false,"renderedFileInfo":null,"symbols":{"timed_out":false,"not_analyzed":false,"symbols":[{"name":"jcode","fully_qualified_name":"jcode","kind":"section_1","ident_start":24,"ident_end":29,"extent_start":22,"extent_end":41161,"ident_utf16":{"start":{"line_number":2,"utf16_col":2},"end":{"line_number":2,"utf16_col":7}},"extent_utf16":{"start":{"line_number":2,"utf16_col":0},"end":{"line_number":922,"utf16_col":0}}},{"name":"Installation","fully_qualified_name":"Installation","kind":"section_2","ident_start":1953,"ident_end":1965,"extent_start":1950,"extent_end":2307,"ident_utf16":{"start":{"line_number":32,"utf16_col":3},"end":{"line_number":32,"utf16_col":15}},"extent_utf16":{"start":{"line_number":32,"utf16_col":0},"end":{"line_number":54,"utf16_col":0}}},{"name":"Performance \u0026 Resource Efficiency","fully_qualified_name":"Performance \u0026 Resource Efficiency","kind":"section_2","ident_start":2310,"ident_end":2343,"extent_start":2307,"extent_end":10331,"ident_utf16":{"start":{"line_number":54,"utf16_col":3},"end":{"line_number":54,"utf16_col":36}},"extent_utf16":{"start":{"line_number":54,"utf16_col":0},"end":{"line_number":269,"utf16_col":0}}},{"name":"RAM comparison","fully_qualified_name":"RAM comparison","kind":"section_3","ident_start":2600,"ident_end":2614,"extent_start":2596,"extent_end":7065,"ident_utf16":{"start":{"line_number":60,"utf16_col":4},"end":{"line_number":60,"utf16_col":18}},"extent_utf16":{"start":{"line_number":60,"utf16_col":0},"end":{"line_number":190,"utf16_col":0}}},{"name":"Time to first frame","fully_qualified_name":"Time to first frame","kind":"section_3","ident_start":7069,"ident_end":7088,"extent_start":7065,"extent_end":7849,"ident_utf16":{"start":{"line_number":190,"utf16_col":4},"end":{"line_number":190,"utf16_col":23}},"extent_utf16":{"start":{"line_number":190,"utf16_col":0},"end":{"line_number":209,"utf16_col":0}}},{"name":"Time to first input","fully_qualified_name":"Time to first input","kind":"section_3","ident_start":7853,"ident_end":7872,"extent_start":7849,"extent_end":8973,"ident_utf16":{"start":{"line_number":209,"utf16_col":4},"end":{"line_number":209,"utf16_col":23}},"extent_utf16":{"start":{"line_number":209,"utf16_col":0},"end":{"line_number":228,"utf16_col":0}}},{"name":"Additional clients / memory scaling","fully_qualified_name":"Additional clients / memory scaling","kind":"section_3","ident_start":8977,"ident_end":9012,"extent_start":8973,"extent_end":10331,"ident_utf16":{"start":{"line_number":228,"utf16_col":4},"end":{"line_number":228,"utf16_col":39}},"extent_utf16":{"start":{"line_number":228,"utf16_col":0},"end":{"line_number":269,"utf16_col":0}}},{"name":"Memory (Agent memory)","fully_qualified_name":"Memory (Agent memory)","kind":"section_2","ident_start":10334,"ident_end":10355,"extent_start":10331,"extent_end":11979,"ident_utf16":{"start":{"line_number":269,"utf16_col":3},"end":{"line_number":269,"utf16_col":24}},"extent_utf16":{"start":{"line_number":269,"utf16_col":0},"end":{"line_number":293,"utf16_col":0}}},{"name":"UI: Side panels, Diagrams, Info Widgets, rendering, scrolling, alignment","fully_qualified_name":"UI: Side panels, Diagrams, Info Widgets, rendering, scrolling, alignment","kind":"section_2","ident_start":11982,"ident_end":12054,"extent_start":11979,"extent_end":13957,"ident_utf16":{"start":{"line_number":293,"utf16_col":3},"end":{"line_number":293,"utf16_col":75}},"extent_utf16":{"start":{"line_number":293,"utf16_col":0},"end":{"line_number":312,"utf16_col":0}}},{"name":"Swarm","fully_qualified_name":"Swarm","kind":"section_2","ident_start":13960,"ident_end":13965,"extent_start":13957,"extent_end":15319,"ident_utf16":{"start":{"line_number":312,"utf16_col":3},"end":{"line_number":312,"utf16_col":8}},"extent_utf16":{"start":{"line_number":312,"utf16_col":0},"end":{"line_number":330,"utf16_col":0}}},{"name":"OAuth and Providers","fully_qualified_name":"OAuth and Providers","kind":"section_2","ident_start":15322,"ident_end":15341,"extent_start":15319,"extent_end":28658,"ident_utf16":{"start":{"line_number":330,"utf16_col":3},"end":{"line_number":330,"utf16_col":22}},"extent_utf16":{"start":{"line_number":330,"utf16_col":0},"end":{"line_number":618,"utf16_col":0}}},{"name":"Supported built-in login flows","fully_qualified_name":"Supported built-in login flows","kind":"section_3","ident_start":15532,"ident_end":15562,"extent_start":15528,"extent_end":16412,"ident_utf16":{"start":{"line_number":334,"utf16_col":4},"end":{"line_number":334,"utf16_col":34}},"extent_utf16":{"start":{"line_number":334,"utf16_col":0},"end":{"line_number":351,"utf16_col":0}}},{"name":"Config-file setup for self-hosted endpoints and MCP","fully_qualified_name":"Config-file setup for self-hosted endpoints and MCP","kind":"section_3","ident_start":16416,"ident_end":16467,"extent_start":16412,"extent_end":27897,"ident_utf16":{"start":{"line_number":351,"utf16_col":4},"end":{"line_number":351,"utf16_col":55}},"extent_utf16":{"start":{"line_number":351,"utf16_col":0},"end":{"line_number":608,"utf16_col":0}}},{"name":"OpenAI-compatible providers","fully_qualified_name":"OpenAI-compatible providers","kind":"section_4","ident_start":16642,"ident_end":16669,"extent_start":16637,"extent_end":19046,"ident_utf16":{"start":{"line_number":355,"utf16_col":5},"end":{"line_number":355,"utf16_col":32}},"extent_utf16":{"start":{"line_number":355,"utf16_col":0},"end":{"line_number":386,"utf16_col":0}}},{"name":"Self-hosted OpenAI-compatible endpoints, including vLLM","fully_qualified_name":"Self-hosted OpenAI-compatible endpoints, including vLLM","kind":"section_4","ident_start":19051,"ident_end":19106,"extent_start":19046,"extent_end":24830,"ident_utf16":{"start":{"line_number":386,"utf16_col":5},"end":{"line_number":386,"utf16_col":60}},"extent_utf16":{"start":{"line_number":386,"utf16_col":0},"end":{"line_number":534,"utf16_col":0}}},{"name":"Extra request-body fields (`extra_body`)","fully_qualified_name":"Extra request-body fields (`extra_body`)","kind":"section_5","ident_start":22614,"ident_end":22654,"extent_start":22608,"extent_end":24830,"ident_utf16":{"start":{"line_number":487,"utf16_col":6},"end":{"line_number":487,"utf16_col":46}},"extent_utf16":{"start":{"line_number":487,"utf16_col":0},"end":{"line_number":534,"utf16_col":0}}},{"name":"MCP config files","fully_qualified_name":"MCP config files","kind":"section_4","ident_start":24835,"ident_end":24851,"extent_start":24830,"extent_end":27897,"ident_utf16":{"start":{"line_number":534,"utf16_col":5},"end":{"line_number":534,"utf16_col":21}},"extent_utf16":{"start":{"line_number":534,"utf16_col":0},"end":{"line_number":608,"utf16_col":0}}},{"name":"Supported provider","fully_qualified_name":"Supported provider","kind":"section_3","ident_start":27901,"ident_end":27919,"extent_start":27897,"extent_end":28658,"ident_utf16":{"start":{"line_number":608,"utf16_col":4},"end":{"line_number":608,"utf16_col":22}},"extent_utf16":{"start":{"line_number":608,"utf16_col":0},"end":{"line_number":618,"utf16_col":0}}},{"name":"Customizability / Self-Dev","fully_qualified_name":"Customizability / Self-Dev","kind":"section_2","ident_start":28661,"ident_end":28687,"extent_start":28658,"extent_end":29454,"ident_utf16":{"start":{"line_number":618,"utf16_col":3},"end":{"line_number":618,"utf16_col":29}},"extent_utf16":{"start":{"line_number":618,"utf16_col":0},"end":{"line_number":628,"utf16_col":0}}},{"name":"Misc.","fully_qualified_name":"Misc.","kind":"section_2","ident_start":29457,"ident_end":29462,"extent_start":29454,"extent_end":31383,"ident_utf16":{"start":{"line_number":628,"utf16_col":3},"end":{"line_number":628,"utf16_col":8}},"extent_utf16":{"start":{"line_number":628,"utf16_col":0},"end":{"line_number":650,"utf16_col":0}}},{"name":"iOS Application / Native OpenClaw","fully_qualified_name":"iOS Application / Native OpenClaw","kind":"section_2","ident_start":31386,"ident_end":31419,"extent_start":31383,"extent_end":31662,"ident_utf16":{"start":{"line_number":650,"utf16_col":3},"end":{"line_number":650,"utf16_col":36}},"extent_utf16":{"start":{"line_number":650,"utf16_col":0},"end":{"line_number":656,"utf16_col":0}}},{"name":"Other planned features","fully_qualified_name":"Other planned features","kind":"section_2","ident_start":31665,"ident_end":31687,"extent_start":31662,"extent_end":32239,"ident_utf16":{"start":{"line_number":656,"utf16_col":3},"end":{"line_number":656,"utf16_col":25}},"extent_utf16":{"start":{"line_number":656,"utf16_col":0},"end":{"line_number":668,"utf16_col":0}}},{"name":"Quick Start","fully_qualified_name":"Quick Start","kind":"section_2","ident_start":32242,"ident_end":32253,"extent_start":32239,"extent_end":33110,"ident_utf16":{"start":{"line_number":668,"utf16_col":3},"end":{"line_number":668,"utf16_col":14}},"extent_utf16":{"start":{"line_number":668,"utf16_col":0},"end":{"line_number":705,"utf16_col":0}}},{"name":"Browser Automation","fully_qualified_name":"Browser Automation","kind":"section_2","ident_start":33113,"ident_end":33131,"extent_start":33110,"extent_end":34059,"ident_utf16":{"start":{"line_number":705,"utf16_col":3},"end":{"line_number":705,"utf16_col":21}},"extent_utf16":{"start":{"line_number":705,"utf16_col":0},"end":{"line_number":746,"utf16_col":0}}},{"name":"Further Reading","fully_qualified_name":"Further Reading","kind":"section_2","ident_start":34062,"ident_end":34077,"extent_start":34059,"extent_end":34979,"ident_utf16":{"start":{"line_number":746,"utf16_col":3},"end":{"line_number":746,"utf16_col":18}},"extent_utf16":{"start":{"line_number":746,"utf16_col":0},"end":{"line_number":765,"utf16_col":0}}},{"name":"Detailed Installation","fully_qualified_name":"Detailed Installation","kind":"section_2","ident_start":34982,"ident_end":35003,"extent_start":34979,"extent_end":41161,"ident_utf16":{"start":{"line_number":765,"utf16_col":3},"end":{"line_number":765,"utf16_col":24}},"extent_utf16":{"start":{"line_number":765,"utf16_col":0},"end":{"line_number":922,"utf16_col":0}}},{"name":"Setup","fully_qualified_name":"Setup","kind":"section_3","ident_start":35009,"ident_end":35014,"extent_start":35005,"extent_end":38439,"ident_utf16":{"start":{"line_number":767,"utf16_col":4},"end":{"line_number":767,"utf16_col":9}},"extent_utf16":{"start":{"line_number":767,"utf16_col":0},"end":{"line_number":830,"utf16_col":0}}},{"name":"Quick Install","fully_qualified_name":"Quick Install","kind":"section_3","ident_start":38443,"ident_end":38456,"extent_start":38439,"extent_end":39535,"ident_utf16":{"start":{"line_number":830,"utf16_col":4},"end":{"line_number":830,"utf16_col":17}},"extent_utf16":{"start":{"line_number":830,"utf16_col":0},"end":{"line_number":861,"utf16_col":0}}},{"name":"macOS via Homebrew","fully_qualified_name":"macOS via Homebrew","kind":"section_3","ident_start":39539,"ident_end":39557,"extent_start":39535,"extent_end":39615,"ident_utf16":{"start":{"line_number":861,"utf16_col":4},"end":{"line_number":861,"utf16_col":22}},"extent_utf16":{"start":{"line_number":861,"utf16_col":0},"end":{"line_number":868,"utf16_col":0}}},{"name":"From Source (all platforms)","fully_qualified_name":"From Source (all platforms)","kind":"section_3","ident_start":39619,"ident_end":39646,"extent_start":39615,"extent_end":40267,"ident_utf16":{"start":{"line_number":868,"utf16_col":4},"end":{"line_number":868,"utf16_col":31}},"extent_utf16":{"start":{"line_number":868,"utf16_col":0},"end":{"line_number":894,"utf16_col":0}}},{"name":"Uninstall","fully_qualified_name":"Uninstall","kind":"section_3","ident_start":40271,"ident_end":40280,"extent_start":40267,"extent_end":40873,"ident_utf16":{"start":{"line_number":894,"utf16_col":4},"end":{"line_number":894,"utf16_col":13}},"extent_utf16":{"start":{"line_number":894,"utf16_col":0},"end":{"line_number":912,"utf16_col":0}}},{"name":"Platform Support","fully_qualified_name":"Platform Support","kind":"section_3","ident_start":40877,"ident_end":40893,"extent_start":40873,"extent_end":41161,"ident_utf16":{"start":{"line_number":912,"utf16_col":4},"end":{"line_number":912,"utf16_col":20}},"extent_utf16":{"start":{"line_number":912,"utf16_col":0},"end":{"line_number":922,"utf16_col":0}}}]}},"codeViewLayoutRoute":{"repo":{"id":1342775849,"defaultBranch":"master","name":"jcode","ownerLogin":"adminwat","currentUserCanPush":false,"isFork":true,"isEmpty":false,"createdAt":"2026-08-22T12:11:30.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/171701189?v=4","public":true,"private":false,"isOrgOwned":false,"isArchived":false},"currentUser":null,"uploadToken":"iWfzXAwhBCiPMq97_jlBWpF-w0M5D5lC1o3ckgGfJH8rKalmcVlIJteNJxIR3wmLZLQW3XzzUcqSyEIaPRz72w","allShortcutsEnabled":false,"treeExpanded":true,"path":"README.md","symbolsExpanded":false,"refInfo":{"name":"master","listCacheKey":"v0:1790956731.0","canEdit":false,"currentOid":"6da6124a30b0157dc9981c2fac5045f9590a6a05"},"helpUrl":"https://docs.github.com","githubDevUrl":null},"codeViewFileTreeLayoutRoute":{"fileTree":{"":{"items":[{"name":".cargo","path":".cargo","contentType":"directory"},{"name":".claude","path":".claude","contentType":"directory"},{"name":".github","path":".github","contentType":"directory"},{"name":".jcode","path":".jcode","contentType":"directory"},{"name":"assets","path":"assets","contentType":"directory"},{"name":"changelog","path":"changelog","contentType":"directory"},{"name":"crates","path":"crates","contentType":"directory"},{"name":"docs","path":"docs","contentType":"directory"},{"name":"ios","path":"ios","contentType":"directory"},{"name":"scripts","path":"scripts","contentType":"directory"},{"name":"sdk","path":"sdk","contentType":"directory"},{"name":"src","path":"src","contentType":"directory"},{"name":"telemetry-worker","path":"telemetry-worker","contentType":"directory"},{"name":"tests","path":"tests","contentType":"directory"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":"AGENTS.md","path":"AGENTS.md","contentType":"file"},{"name":"CONTRIBUTING.md","path":"CONTRIBUTING.md","contentType":"file"},{"name":"Cargo.lock","path":"Cargo.lock","contentType":"file"},{"name":"Cargo.toml","path":"Cargo.toml","contentType":"file"},{"name":"LICENSE","path":"LICENSE","contentType":"file"},{"name":"OAUTH.md","path":"OAUTH.md","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"RELEASING.md","path":"RELEASING.md","contentType":"file"},{"name":"TELEMETRY.md","path":"TELEMETRY.md","contentType":"file"},{"name":"score_shard.py","path":"score_shard.py","contentType":"file"}],"totalCount":25}},"fileTreeProcessingTime":21.970418,"foldersToFetch":[]},"codeViewBlobLayoutRoute":{"codeLineWrapEnabled":false,"refInfo":{"name":"master","listCacheKey":"v0:1790956731.0","canEdit":false,"refType":"branch","currentOid":"6da6124a30b0157dc9981c2fac5045f9590a6a05","canEditOnDefaultBranch":false,"fileExistsOnDefault":true},"path":"README.md","blob":{"copilotSWEAgentEnabled":false,"dependabotInfo":{"showConfigurationBanner":false,"configFilePath":null,"networkDependabotPath":"/adminwat/jcode/network/updates","dismissConfigurationNoticePath":"/settings/dismiss-notice/dependabot_configuration_notice","configurationNoticeDismissed":null},"displayName":"README.md","displayUrl":"https://github.com/adminwat/jcode/blob/master/README.md?raw=true","headerInfo":{"blobSize":"40.2 KB","deleteTooltip":"You must be signed in to make or propose changes","editTooltip":"You must be signed in to make or propose changes","ghDesktopPath":"https://desktop.github.com","isGitLfs":false,"onBranch":true,"shortPath":"8ecd30b","siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Fadminwat%2Fjcode%2Fblob%2Fmaster%2FREADME.md","isCSV":false,"isRichtext":true,"lineInfo":{"truncatedLoc":"922","truncatedSloc":"684"},"mode":"file"},"image":false,"isCodeownersFile":null,"isPlain":false,"isValidLegacyIssueTemplate":false,"isIssueTemplate":false,"isDiscussionTemplate":false,"language":"Markdown","languageID":222,"large":false,"planSupportInfo":{"repoIsFork":null,"repoOwnedByCurrentUser":null,"requestFullPath":"/adminwat/jcode/blob/master/README.md","showFreeOrgGatedFeatureMessage":null,"showPlanSupportBanner":null,"upgradeDataAttributes":null,"upgradePath":null},"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_dockerfile","releasePath":"/adminwat/jcode/releases/new?marketplace=true","showPublishActionBanner":false},"rawBlobUrl":"https://github.com/adminwat/jcode/raw/refs/heads/master/README.md","renderImageOrRaw":false,"shortPath":null,"symbolsEnabled":true,"tabSize":4,"topBannersInfo":{"overridingGlobalFundingFile":false,"globalPreferredFundingPath":null,"showInvalidCitationWarning":false,"citationHelpUrl":"https://docs.github.com/github/creating-cloning-and-archiving-repositories/creating-a-repository-on-github/about-citation-files","actionsOnboardingTip":null},"truncated":false,"viewable":true,"workflowRedirectUrl":null},"copilotInfo":null,"copilotAccessAllowed":false,"copilotSpacesEnabled":false,"modelsAccessAllowed":false,"modelsRepoIntegrationEnabled":false,"isMarketplaceEnabled":true},"codeViewBlobLayoutRoute.StyledBlob":{"rawLines":["\u003cdiv align=\"center\"\u003e","","# jcode","","[![Latest Release](https://badgen.net/github/release/1jehuang/jcode?icon=github)](https://github.com/1jehuang/jcode/releases)","[![License: MIT](https://img.shields.io/badge/license-MIT-blue?style=flat-square)](LICENSE)","[![Platforms](https://img.shields.io/badge/platforms-Linux%20%7C%20macOS%20%7C%20Windows-blue?style=flat-square)](https://github.com/1jehuang/jcode/releases)","[![Last Commit](https://badgen.net/github/last-commit/1jehuang/jcode/master?icon=github)](https://github.com/1jehuang/jcode/commits/master)","[![GitHub Stars](https://badgen.net/github/stars/1jehuang/jcode?icon=github)](https://github.com/1jehuang/jcode/stargazers)","[![Discord](https://img.shields.io/badge/Discord-Join%20Community-5865F2?style=flat-square\u0026logo=discord\u0026logoColor=white)](https://discord.gg/nBe9vGyK9a)","","The most RAM efficient harness \u003cbr\u003e","The most intelligent harness","","\u003ca href=\"https://trendshift.io/repositories/25042?utm_source=repository-badge\u0026amp;utm_medium=badge\u0026amp;utm_campaign=badge-repository-25042\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e\u003cimg src=\"https://trendshift.io/api/badge/repositories/25042\" alt=\"1jehuang/jcode | Trendshift\" width=\"250\" height=\"55\"\u003e\u003c/a\u003e","","\u003ca href=\"https://github.com/1jehuang/jcode/stargazers\"\u003e\u003cimg src=\"docs/images/star-history.svg\" alt=\"jcode cumulative GitHub stars over time, sampled weekly\" width=\"700\"\u003e\u003c/a\u003e","","\u003ca href=\"https://github.com/1jehuang/jcode/releases/download/readme-assets/jcode-yc-launch.mp4\"\u003e","  \u003cimg src=\"https://github.com/1jehuang/jcode/releases/download/readme-assets/jcode-yc-launch.webp\" alt=\"jcode YC launch video\" width=\"800\"\u003e","\u003c/a\u003e","","\u003cbr\u003e","","[Website](https://jcode.sh) · [Docs](https://jcode.sh/docs) · [SDK](https://jcode.sh/sdk) · [Benchmarks](https://jcode.sh/bench) · [Features](#features) · [Install](#installation) · [Quick Start](#quick-start) · [Further Reading](#further-reading) · [Contributing](CONTRIBUTING.md)","","\u003c/div\u003e","","---","","\u003cdiv align=\"center\"\u003e","","## Installation","","\u003c/div\u003e","","```bash","# macOS \u0026 Linux","curl -fsSL https://jcode.sh/install | bash","```","","```powershell","# Windows 11 (PowerShell 5.1+)","irm https://jcode.sh/install.ps1 | iex","```","","Need Homebrew, source builds, provider setup, or want an agent to set it up for you?","[Jump to detailed installation](#detailed-installation).","","---","","","\u003cdiv align=\"center\"\u003e","","## Performance \u0026 Resource Efficiency","","\u003c/div\u003e","","jcode is built to be as performant and resource efficient as possible. Every metric is optimized to the bone, which is important for scaling multi-session workflows. Here we sample a few metrics to show the difference: RAM usage and boot up.","","### RAM comparison","","\u003cdiv align=\"center\"\u003e","","\u003ctable\u003e","  \u003ctr\u003e","    \u003ctd valign=\"top\" align=\"center\" width=\"50%\"\u003e","      \u003cstrong\u003e1 active session\u003c/strong\u003e","      \u003ctable\u003e","        \u003cthead\u003e","          \u003ctr\u003e","            \u003cth\u003eTool\u003c/th\u003e","            \u003cth\u003ePSS\u003c/th\u003e","            \u003cth\u003eComparison\u003c/th\u003e","          \u003c/tr\u003e","        \u003c/thead\u003e","        \u003ctbody\u003e","          \u003ctr\u003e","            \u003ctd\u003e\u003cstrong\u003ejcode (local embedding off)\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e27.8 MB\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003ebaseline\u003c/td\u003e","          \u003c/tr\u003e","          \u003ctr\u003e","            \u003ctd\u003e\u003cstrong\u003ejcode\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e167.1 MB\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e6.0× more RAM\u003c/strong\u003e\u003c/td\u003e","          \u003c/tr\u003e","          \u003ctr\u003e","            \u003ctd\u003e\u003cstrong\u003epi\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e144.4 MB\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e5.2× more RAM\u003c/strong\u003e\u003c/td\u003e","          \u003c/tr\u003e","          \u003ctr\u003e","            \u003ctd\u003e\u003cstrong\u003eCodex CLI\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e140.0 MB\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e5.0× more RAM\u003c/strong\u003e\u003c/td\u003e","          \u003c/tr\u003e","          \u003ctr\u003e","            \u003ctd\u003e\u003cstrong\u003eOpenCode\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e371.5 MB\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e13.4× more RAM\u003c/strong\u003e\u003c/td\u003e","          \u003c/tr\u003e","          \u003ctr\u003e","            \u003ctd\u003e\u003cstrong\u003eGitHub Copilot CLI\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e333.3 MB\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e12.0× more RAM\u003c/strong\u003e\u003c/td\u003e","          \u003c/tr\u003e","          \u003ctr\u003e","            \u003ctd\u003e\u003cstrong\u003eCursor Agent\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e214.9 MB\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e7.7× more RAM\u003c/strong\u003e\u003c/td\u003e","          \u003c/tr\u003e","          \u003ctr\u003e","            \u003ctd\u003e\u003cstrong\u003eClaude Code\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e386.6 MB\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e13.9× more RAM\u003c/strong\u003e\u003c/td\u003e","          \u003c/tr\u003e","          \u003ctr\u003e","            \u003ctd\u003e\u003cstrong\u003eAntigravity CLI\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e243.7 MB\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e8.8× more RAM\u003c/strong\u003e\u003c/td\u003e","          \u003c/tr\u003e","        \u003c/tbody\u003e","      \u003c/table\u003e","    \u003c/td\u003e","    \u003ctd width=\"24\"\u003e\u003c/td\u003e","    \u003ctd valign=\"top\" align=\"center\" width=\"50%\"\u003e","      \u003cstrong\u003e10 active sessions\u003c/strong\u003e","      \u003ctable\u003e","        \u003cthead\u003e","          \u003ctr\u003e","            \u003cth\u003eTool\u003c/th\u003e","            \u003cth\u003ePSS\u003c/th\u003e","            \u003cth\u003eComparison\u003c/th\u003e","          \u003c/tr\u003e","        \u003c/thead\u003e","        \u003ctbody\u003e","          \u003ctr\u003e","            \u003ctd\u003e\u003cstrong\u003ejcode (local embedding off)\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e117.0 MB\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003ebaseline\u003c/td\u003e","          \u003c/tr\u003e","          \u003ctr\u003e","            \u003ctd\u003e\u003cstrong\u003ejcode\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e260.8 MB\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e2.2× more RAM\u003c/strong\u003e\u003c/td\u003e","          \u003c/tr\u003e","          \u003ctr\u003e","            \u003ctd\u003e\u003cstrong\u003epi\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e833.0 MB\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e7.1× more RAM\u003c/strong\u003e\u003c/td\u003e","          \u003c/tr\u003e","          \u003ctr\u003e","            \u003ctd\u003e\u003cstrong\u003eCodex CLI\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e334.8 MB\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e2.9× more RAM\u003c/strong\u003e\u003c/td\u003e","          \u003c/tr\u003e","          \u003ctr\u003e","            \u003ctd\u003e\u003cstrong\u003eOpenCode\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e3237.2 MB\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e27.7× more RAM\u003c/strong\u003e\u003c/td\u003e","          \u003c/tr\u003e","          \u003ctr\u003e","            \u003ctd\u003e\u003cstrong\u003eGitHub Copilot CLI\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e1756.5 MB\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e15.0× more RAM\u003c/strong\u003e\u003c/td\u003e","          \u003c/tr\u003e","          \u003ctr\u003e","            \u003ctd\u003e\u003cstrong\u003eCursor Agent\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e1632.4 MB\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e14.0× more RAM\u003c/strong\u003e\u003c/td\u003e","          \u003c/tr\u003e","          \u003ctr\u003e","            \u003ctd\u003e\u003cstrong\u003eClaude Code\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e2300.6 MB\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e19.7× more RAM\u003c/strong\u003e\u003c/td\u003e","          \u003c/tr\u003e","          \u003ctr\u003e","            \u003ctd\u003e\u003cstrong\u003eAntigravity CLI\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e1021.2 MB\u003c/strong\u003e\u003c/td\u003e","            \u003ctd align=\"right\"\u003e\u003cstrong\u003e8.7× more RAM\u003c/strong\u003e\u003c/td\u003e","          \u003c/tr\u003e","        \u003c/tbody\u003e","      \u003c/table\u003e","    \u003c/td\u003e","  \u003c/tr\u003e","\u003c/table\u003e","","\u003c/div\u003e","","### Time to first frame","","\u003cdiv align=\"center\"\u003e","","| Tool | Time to first frame | Range | Comparison |","|---|---:|---:|---:|","| **jcode** | **14.0 ms** | 10.1–19.3 ms | baseline |","| **Antigravity CLI** | **383.5 ms** | 363.1–415.4 ms | **27.4× slower** |","| **pi** | **590.7 ms** | 369.6–934.8 ms | **42.2× slower** |","| **Codex CLI** | **882.8 ms** | 742.3–1640.9 ms | **63.1× slower** |","| **OpenCode** | **1035.9 ms** | 922.5–1104.4 ms | **74.0× slower** |","| **GitHub Copilot CLI** | **1518.6 ms** | 1357.4–1826.8 ms | **108.5× slower** |","| **Cursor Agent** | **1949.7 ms** | 1711.0–2104.8 ms | **139.3× slower** |","| **Claude Code** | **3436.9 ms** | 2032.7–8927.2 ms | **245.5× slower** |","","\u003c/div\u003e","","Measured on this Linux machine across 10 interactive PTY launches.","","### Time to first input","(time until typed probe text appears on the rendered screen; Antigravity uses its internal input-ready log marker because the sign-in screen suppresses probe echo.)","\u003cdiv align=\"center\"\u003e","","| Tool | Time to first input | Range | Comparison |","|---|---:|---:|---:|","| **jcode** | **48.7 ms** | 30.3–62.7 ms | baseline |","| **Antigravity CLI** | **383.7 ms** | 363.4–415.7 ms | **7.9× slower** |","| **pi** | **596.4 ms** | 373.9–955.2 ms | **12.2× slower** |","| **Codex CLI** | **905.8 ms** | 760.1–1675.7 ms | **18.6× slower** |","| **OpenCode** | **1047.9 ms** | 931.1–1116.9 ms | **21.5× slower** |","| **GitHub Copilot CLI** | **1583.4 ms** | 1422.8–1880.0 ms | **32.5× slower** |","| **Cursor Agent** | **1978.7 ms** | 1727.3–2130.0 ms | **40.6× slower** |","| **Claude Code** | **3512.8 ms** | 2137.4–9002.0 ms | **72.2× slower** |","","\u003c/div\u003e","","Measured on this Linux machine across 10 interactive PTY launches. Antigravity CLI was unauthenticated for this run; its sign-in screen rendered normally and emitted an internal `CLI ready for user input` marker, but did not echo the typed probe.","","### Additional clients / memory scaling","","\u003cdiv align=\"center\"\u003e","","| Tool | Extra PSS per added session | Comparison |","|---|---:|---:|","| **jcode (local embedding off)** | **~9.9 MB** | baseline |","| **jcode** | **~10.4 MB** | **1.1× more RAM** |","| **pi** | **~76.5 MB** | **7.7× more RAM** |","| **Codex CLI** | **~21.6 MB** | **2.2× more RAM** |","| **OpenCode** | **~318.4 MB** | **32.2× more RAM** |","| **GitHub Copilot CLI** | **~158.1 MB** | **16.0× more RAM** |","| **Cursor Agent** | **~157.5 MB** | **15.9× more RAM** |","| **Claude Code** | **~212.7 MB** | **21.5× more RAM** |","| **Antigravity CLI** | **~86.4 MB** | **8.7× more RAM** |","","\u003c/div\u003e","versions tested for this corrected memory rerun:","","- `jcode v0.9.1888-dev (be386f2)`","- `pi 0.62.0`","- `codex-cli 0.120.0`","- `opencode 1.0.203`","- `GitHub Copilot CLI 1.0.24` for the 1-session rerun, `GitHub Copilot CLI 1.0.27` for the 10-session rerun","- `Cursor Agent 2026.04.08-a41fba1`","- `Claude Code 2.1.86 (Claude Code)`","- `Antigravity CLI 1.0.0`","","\u003cdiv align=\"center\"\u003e","","  \u003ca href=\"https://github.com/1jehuang/jcode/releases/download/readme-assets/jcode-performance-demo.mp4\"\u003e","    \u003cimg src=\"https://github.com/1jehuang/jcode/releases/download/readme-assets/jcode-performance-demo.webp\" alt=\"jcode performance demonstration\" width=\"900\"\u003e","  \u003c/a\u003e","","  \u003cp\u003e\u003cem\u003ejcode performance demonstration\u003c/em\u003e\u003c/p\u003e","","\u003c/div\u003e","","","---","","## Memory (Agent memory)","","Jcode embeds each turn/response as a semantic vector. Every turn does queries a graph of memories to efficiently find related memory entries via a cosine similarity check. The embedding hits are fed into the conversation, or optionally uses a memory sideagent which verifies the memories are relevant, and potentially does more work for information retreival before injecting into the conversation. This results in a human like memory system which allows the agent to automatically recall relevant information to the conversation without actively calling memory tools or being a token burner. ","ot ","To have memories which are retrieved, they must also be extracted and stored. Every so often (semantic drift, K turns since last extraction, session end, etc), memories are extracted via a memory sideagent, and put into the memory graph. ","","The harness also provides explicit memory tools to allow the agent to actively search or store the memory without relying on a passive background process. The harness also provides session search for traditional RAG on previous sessions. ","","Memories are automatically consolidated every so often via the ambient mode. This reorganizes, checks for staleness and conflicts, etc","","\u003cdiv align=\"center\"\u003e","","  \u003ca href=\"https://github.com/1jehuang/jcode/releases/download/readme-assets/jcode-memory-demo.mp4\"\u003e","    \u003cimg src=\"https://github.com/1jehuang/jcode/releases/download/readme-assets/jcode-memory-demo.webp\" alt=\"jcode memory demonstration\" width=\"900\"\u003e","  \u003c/a\u003e","","  \u003cp\u003e\u003cem\u003ejcode memory demonstration\u003c/em\u003e\u003c/p\u003e","","\u003c/div\u003e","","\u003c!-- Memory demo media is hosted in the readme-assets release. --\u003e","","---","","## UI: Side panels, Diagrams, Info Widgets, rendering, scrolling, alignment","","The side panel is a place for auxiliary information. Tell your jcode agent to load a file into the side panel and see it update in real time, or tell your agent to write directly to the side panel, or use it as a diff viewer. The side panel (and chat) is able to render mermaid diagrams inline. ","\u003cimg width=\"2877\" height=\"1762\" alt=\"image\" src=\"https://github.com/user-attachments/assets/6c7bec81-ef3f-434d-8a7b-d55f8a54e5cf\" /\u003e","","To make this possible, I created a new mermaid rendering library to render diagrams 1800x faster. It has no browser or Typescript dependency. See https://github.com/1jehuang/mermaid-rs-renderer","","To show you important information without taking space away from the screen that could be used for responses, I developed info widgets. Info widgets will only ever take up the negative space on the screen to show you information, and will get out of the way if there isn't any. ","","Jcode can render at over a thousand fps. Your monitor will not have the refresh rate to show you, but this means you will not have silly flicker problems. ","","The custom scrollback implementation of jcode allows it to do much more than a native scrollback. However, it is a terminal-level limitation that I cannot have smooth, partial line scrolling with a custom scrollback. To fix this, I made my own terminal. Handterm https://github.com/1jehuang/handterm implements a native scroll api, and also happens to be very efficient. This is a work in progress. Scrolling is still well implemented for normal terminals.","","Jcode is left-aligned by default. You can switch to centered mode with the `Alt+C` hotkey, with the `/alignment` command, or in the config.","","To disable emoji globally in TUI and CLI output, set `emoji = false` under `[display]` in `~/.jcode/config.toml`, or launch with `JCODE_NO_EMOJI=1`. Jcode replaces emoji with compact ASCII markers while preserving other Unicode text.","","---","","## Swarm","","Spawn two or more agents in the same repo, and they will automatically be managed by the server to allow native collaboration. When agent A edits a file that agent B has read (code shifting under its feet), the server notifies agent B. Agent B can ignore it if it is not relevant, or it can check the diff to make sure that it doesn't conflict. Each agent has messaging abilities, capable of DMing just one agent, broadcasting to all other agents hosted by the server, or just agents working in that repo. This allows you to spawn multiple sessions in the same repo, and have all conflicts automatically resolved.","","\u003cdiv align=\"center\"\u003e","","  \u003ca href=\"https://github.com/1jehuang/jcode/releases/download/readme-assets/swarm-demo.mp4\"\u003e","    \u003cimg src=\"https://github.com/1jehuang/jcode/releases/download/readme-assets/jcode-swarm-demonstration.webp\" alt=\"jcode swarm demonstration\" width=\"900\"\u003e","  \u003c/a\u003e","","  \u003cp\u003e\u003cem\u003ejcode swarm demonstration\u003c/em\u003e\u003c/p\u003e","","\u003c/div\u003e","","Agents are also able to spawn their own swarms autonomously. They have a swarm tool which allows them to spawn in their own teamates to accomplish tasks in parallel. Doing so turns the main agent into a coordinator and the spawned agents into workers. Groups of agents, their messaging channels, their completion statuses, etc are all automatically managed. This can be done headlessly or headed.","","---","","## OAuth and Providers","","jcode works with subscription-backed OAuth flows and many provider integrations, so you can use the models you already pay for and still fall back to direct API providers when needed.","","### Supported built-in login flows","","- **Claude** (`jcode login --provider claude`)","- **OpenAI / ChatGPT / Codex** (`jcode login --provider openai`)","- **Google Gemini** (`jcode login --provider gemini`)","- **GitHub Copilot** (`jcode login --provider copilot`)","- **Azure OpenAI** (`jcode login --provider azure`)","- **Alibaba Cloud Coding Plan** (`jcode login --provider alibaba-coding-plan`)","- **Fireworks** (`jcode login --provider fireworks`)","- **MiniMax** (`jcode login --provider minimax`)","- **Meta Model API / Muse** (`jcode login --provider meta-muse`)","- **LM Studio** (`jcode login --provider lmstudio`)","- **Ollama** (`jcode login --provider ollama`)","- **Custom OpenAI-compatible endpoint** (`jcode login --provider openai-compatible`)","","For custom OpenAI-compatible endpoints, jcode now prompts for the API base and supports local localhost servers without requiring an API key.","","### Config-file setup for self-hosted endpoints and MCP","","If you prefer to configure things by editing files instead of using the login UI, jcode supports both a custom OpenAI-compatible endpoint config and MCP config files.","","#### OpenAI-compatible providers","","Many hosted services speak the standard OpenAI `/v1/chat/completions` API. jcode talks to them through one shared OpenAI-compatible provider, so you can use almost any such endpoint without waiting for a dedicated integration.","","There are two ways to set one up:","","- **Built-in named profiles** — jcode ships ready-made profiles for several popular OpenAI-compatible services. Log in by id and jcode fills in the base URL and key environment variable for you:","","  ```bash","  jcode login --provider \u003cprofile-id\u003e","  # for example:","  jcode login --provider openrouter","  jcode login --provider orcarouter","  jcode login --provider deepseek","  jcode login --provider opencode      # OpenCode Zen","  jcode login --provider moonshotai","  jcode login --provider meta-muse     # Meta Model API / Muse Spark","  ```","","  Built-in OpenAI-compatible profile ids include: `openrouter`, `orcarouter`, `deepseek`, `zai`, `kimi`, `moonshotai`, `meta-muse` (Meta Model API / Muse Spark), `opencode` (OpenCode Zen), `opencode-go`, `302ai`, `baseten`, `cortecs`, `huggingface`, `nebius`, `scaleway`, `stackit`, and `firmware`. Each profile only sets the endpoint and key variable; you still pick the model with `/model` (or `--model`). Run `jcode login` with no provider to see the interactive list.","","- **Any other endpoint** — point jcode at an arbitrary OpenAI-compatible API (hosted or local) with `jcode login --provider openai-compatible` or the scriptable `jcode provider add` command described below.","","Useful environment overrides for these endpoints:","","- `JCODE_STREAM_IDLE_TIMEOUT_SECS` — raise the base streaming idle timeout (default 180s) for slow reasoning models that think silently before emitting tokens. High reasoning efforts scale this automatically (high 2x, xhigh 3x, max 4x). Also settable as `[provider] stream_idle_timeout_secs` in `config.toml`.","- Per-model `context_window` (alias `context_limit`) in a `[[providers.\u003cname\u003e.models]]` entry — set the context window when the endpoint has no usable `/v1/models` response, so jcode does not fall back to the generic 200k default.","- `extra_body` — inject non-standard top-level fields into every chat/completions request body for backends that require them. See [Extra request-body fields](#extra-request-body-fields-extra_body) below.","","For details on self-hosting, local runtimes, and the exact config file shape, see below.","","#### Self-hosted OpenAI-compatible endpoints, including vLLM","","For agents and scripts, the preferred path is the one-shot provider profile command. It writes a named profile to `~/.jcode/config.toml`, stores secrets in jcode's private app config directory when requested, and prints exact run/validation commands:","","```bash","# Secret-safe setup for a hosted OpenAI-compatible API.","printf '%s' \"$MY_API_KEY\" | jcode provider add my-api \\","  --base-url https://llm.example.com/v1 \\","  --model my-model-id \\","  --api-key-stdin \\","  --set-default \\","  --json","","# Smoke test the profile.","jcode --provider-profile my-api auth-test --prompt 'Reply exactly JCODE_PROVIDER_SETUP_OK'","","# Use it directly.","jcode --provider-profile my-api run 'hello'","```","","For local servers that do not require auth:","","```bash","jcode provider add local-vllm \\","  --base-url http://localhost:8000/v1 \\","  --model Qwen/Qwen3-Coder-30B-A3B-Instruct \\","  --no-api-key \\","  --set-default","```","","Built-in local profiles are available for the common desktop/local runtimes:","","```bash","# Ollama: start the local server and install a model first.","ollama pull llama3.2","jcode login --provider ollama","jcode --provider ollama --model llama3.2 run 'hello'","","# LM Studio: start the Local Server, load a chat model, then use the exact","# model identifier shown by LM Studio or by curl http://localhost:1234/v1/models.","jcode login --provider lmstudio","jcode --provider lmstudio --model '\u003cmodel-id\u003e' run 'hello'","```","","Ollama and LM Studio both expose OpenAI-compatible `/v1/models` and `/v1/chat/completions` endpoints. jcode uses streaming chat completions, function/tool calling, and OpenAI-style image content for vision-capable local models. If a local server requires a token, enter it during `jcode login` or create a named profile with `--api-key-stdin`.","","Useful flags:","","- `--api-key-env NAME`: reference an existing environment variable instead of storing a key.","- `--api-key-stdin`: read and store a key without putting it in shell history.","- `--context-window TOKENS`: persist the model context window for model selection and routing.","- `--overwrite`: replace an existing profile of the same name.","- `--model-catalog`: use the endpoint's `/models` response in addition to configured models.","","The generated profile can also be edited manually in `~/.jcode/config.toml`:","","```toml","[provider]","default_provider = \"my-api\"","default_model = \"my-model-id\"","","[providers.my-api]","type = \"openai-compatible\"","base_url = \"https://llm.example.com/v1\"","api_key_env = \"JCODE_PROVIDER_MY_API_API_KEY\"","env_file = \"provider-my-api.env\"","default_model = \"my-model-id\"","","[[providers.my-api.models]]","id = \"my-model-id\"","context_window = 128000","```","","Anthropic Messages-compatible gateways use the same named-profile surface with","`type = \"anthropic-compatible\"`. The profile can select bearer, custom-header,","or no authentication and attach gateway-specific headers to every request:","","```toml","[provider]","default_provider = \"corp-claude\"","default_model = \"claude-sonnet-4-6\"","","[providers.corp-claude]","type = \"anthropic-compatible\"","base_url = \"https://gateway.example.com/anthropic/v1\"","auth = \"bearer\"","api_key_env = \"CORP_CLAUDE_TOKEN\"","default_model = \"claude-sonnet-4-6\"","","[providers.corp-claude.headers]","x-tenant-id = \"tenant-42\"","","[[providers.corp-claude.models]]","id = \"claude-sonnet-4-6\"","context_window = 200000","```","","For direct environment-based configuration, `ANTHROPIC_BASE_URL` overrides the","non-OAuth Messages endpoint and `ANTHROPIC_AUTH_TOKEN` is sent as a bearer token.","Claude OAuth traffic always continues to use Anthropic's official endpoints.","","##### Extra request-body fields (`extra_body`)","","Some OpenAI-compatible backends require non-standard top-level request fields. For example, NVIDIA NIM DeepSeek-V4 reasoning models (`deepseek-ai/deepseek-v4-flash`, `deepseek-ai/deepseek-v4-pro`) only enable thinking when the request includes `chat_template_kwargs`; without it they reply without reasoning (or, for some deployments, hang). jcode lets you inject arbitrary top-level fields two ways.","","1. Per named profile, via `extra_body` in `config.toml` (a TOML table merged verbatim into the JSON body):","","   ```toml","   [providers.my-nim]","   type = \"openai-compatible\"","   base_url = \"https://integrate.api.nvidia.com/v1\"","   api_key_env = \"NVIDIA_API_KEY\"","   default_model = \"deepseek-ai/deepseek-v4-flash\"","","   [providers.my-nim.extra_body.chat_template_kwargs]","   thinking = true","   reasoning_effort = \"high\"","   ```","","2. For built-in profiles (e.g. `nvidia-nim`) or any endpoint, via the `JCODE_OPENAI_EXTRA_BODY` environment variable (a JSON object string). It can live in the provider's env file (`~/.config/jcode/nvidia-nim.env`) next to the API key:","","   ```bash","   JCODE_OPENAI_EXTRA_BODY={\"chat_template_kwargs\":{\"thinking\":true,\"reasoning_effort\":\"high\"}}","   ```","","Keys from `extra_body` are merged last and override any jcode-generated body field with the same name (`JCODE_OPENAI_EXTRA_BODY` wins over the config `extra_body` on key collisions). Invalid values are logged and ignored rather than failing the request.","","The custom OpenAI-compatible provider reads overrides from environment variables or from an env file in jcode's app config directory. On Linux this is usually `~/.config/jcode/`, so the default file is usually:","","```text","~/.config/jcode/openai-compatible.env","```","","Example for a local or LAN vLLM server:","","```bash","JCODE_OPENAI_COMPAT_API_BASE=http://192.168.1.50:8000/v1","JCODE_OPENAI_COMPAT_DEFAULT_MODEL=Qwen/Qwen3-Coder-30B-A3B-Instruct","# Optional if your server expects auth","OPENAI_COMPAT_API_KEY=your-token-here","```","","Notes:","","- `jcode login --provider openai-compatible` can create or update this for you.","- Plain `http://` is accepted for `localhost` and private LAN IPs. Public remote HTTP is still rejected.","- HTTPS endpoints work as usual.","","#### MCP config files","","MCP config is separate from `config.toml`.","","Primary config files:","","- `~/.jcode/mcp.json` for global MCP servers","- `.jcode/mcp.json` for project-local MCP servers","","Claude Code compatibility:","","- `~/.claude.json` (Claude Code's user config): top-level `mcpServers`, plus per-project servers under `projects.\u003cabs_path\u003e.mcpServers` for the current directory","- `.mcp.json` at the repo root (Claude Code's project config)","- `.claude/mcp.json` (legacy fallback)","","Claude Code config is read live on every load rather than copied into jcode's","global config. Additions, edits, and deletions therefore take effect without","leaving a stale snapshot (and inline environment values are not duplicated).","For migration from Codex CLI, jcode still performs a one-time import from","`~/.codex/config.toml` into `~/.jcode/mcp.json` when the latter does not exist.","That imported file is then jcode-owned; later Codex changes are not synced","automatically. Imported environment values are copied too and may contain","secrets.","","Both the canonical `mcpServers` key and jcode's historical `servers` key are accepted. jcode currently supports stdio (command-based) servers only; HTTP/SSE entries (`\"type\": \"http\"`/`\"sse\"`) are recognized and skipped with a log line.","","Example MCP config:","","```json","{","  \"mcpServers\": {","    \"filesystem\": {","      \"command\": \"/path/to/mcp-server\",","      \"args\": [\"--root\", \"/workspace\"],","      \"env\": {},","      \"shared\": true","    }","  }","}","```","","For headless or SSH sessions, OAuth-style providers support `jcode login --provider \u003cprovider\u003e --no-browser` (alias: `--headless`) so jcode prints the auth URL/QR and falls back to manual code or callback paste instead of trying to launch a local browser.","","For more scriptable remote flows, `claude`, `openai`, `gemini`, and `antigravity` also support a two-step pattern:","","```bash","# Step 1: print a resumable auth URL","jcode login --provider openai --print-auth-url --json","","# Step 2: complete later with the callback URL or auth code","jcode login --provider openai --callback-url 'http://localhost:1455/auth/callback?...'","jcode login --provider gemini --auth-code '...'","```","","Additional scriptable cases:","","```bash","# Copilot device flow: print URL + user code, then complete later","jcode login --provider copilot --print-auth-url --json","jcode login --provider copilot --complete","","# Gmail/Google OAuth after credentials are already configured","jcode login --provider google --print-auth-url --google-access-tier readonly","jcode login --provider google --callback-url 'http://127.0.0.1:8456?...'","```","","Pending scriptable login state is stored under `~/.jcode/pending-login/`, automatically expires, and stale entries are cleaned up when new scriptable logins start or resume.","","For the built-in OpenAI login flow, jcode opens a local callback on","`http://localhost:1455/auth/callback` by default.","","\u003cimg width=\"2877\" height=\"1762\" alt=\"Screenshot from 2026-04-02 14-28-51\" src=\"https://github.com/user-attachments/assets/530684c0-9d12-4363-aa0e-1b39a0d4e1be\" /\u003e","The above image is the first page of provider logins","","### Supported provider","","- **Native / first-party style providers:** `claude`, `openai`, `copilot`, `gemini`, `azure`, `alibaba-coding-plan`","- **Aggregator / compatibility providers:** `openrouter`, `orcarouter`, `openai-compatible`","- **Additional provider integrations:** `opencode`, `opencode-go`, `zai` / `kimi`, `302ai`, `baseten`, `cortecs`, `deepseek`, `firmware`, `huggingface`, `moonshotai`, `nebius`, `scaleway`, `stackit`, `groq`, `mistral`, `perplexity`, `togetherai`, `deepinfra`, `fireworks`, `minimax`, `xai`, `lmstudio`, `ollama`, `chutes`, `cerebras`, `cursor`, `antigravity`, `google`","","Jcode also supports easy multi-account switching. Ran out of tokens on your first ChatGPT Pro subscription? /account and quickly switch to your second. ","","---","","## Customizability / Self-Dev","","Jcode is inventing a new form of customizability. One that doesn't limit you to what a plugin or extension can do. Tell your jcode agent to enter self dev mode, and it will start modifying its own source code. Jcode is optimized to iterate on itself. There is significant infrastructure around self developement, which allows it to edit, build, and test its own source code, then reload its own binary and continue work in your (potentially many) sessions, fully automatically. ","","It is reccomended that you use a frontier model for this. The jcode codebase is not a simple one, and weaker models can make subtle, breaking changes. GPT 5.5 or the latest available frontier model works well.","","\u003c!-- Add self-dev demo thumbnail/video and fuller writeup here. --\u003e","","---","","## Misc.","","The devil is in the details. There are many undocumented optimizations and niceties that jcode implements. Some examples: ","","Anthropic's Claude cache goes cold after 5 minutes. If you initiate Claude after these 5 minutes, you have a cache miss, potentially costing you lots of tokens. The ui warns you when the cache went cold, and notfies you if there was an unexpected cache miss. ","","jcode comes with instructions on how to set up Firefox Agent Bridge. Ask you agent to set it up, and then you will have browser automation in jcode as well. ","","Agent grep is a grep tool I made for the jcode agent. It adds file strucuture information (ie the list of functions, their displacement, etc) to the grep return, so that the agent can infer more of what the file doesn without actually reading the file. It also implements a harness-level integration that adaptively truncates returns based on what the agent has already seen. This saves on context a lot. ","","Inputs are by default interleaved with the working agent. It sends the input as soon as it safely can without breaking the KV cache. Submit with shift enter instead, and it will send a queue send, and wait for the agent to fully finish its turn before sending.","","Resume sessions from different harnesses. Claude code broke on you? Resume the session from jcode and continue where you left off. Session resume is supported for codex, claude code, opencode, and pi. ","","\u003cimg width=\"2877\" height=\"1762\" alt=\"Screenshot from 2026-04-11 16-28-52\" src=\"https://github.com/user-attachments/assets/c2b383cf-2531-4217-85ae-6a863354dc97\" /\u003e","image of /Resume for codex sessions","","","Skills are not all loaded on startup. The conversation is embedded as a semantic vector, and will automatically inject a skill if there is an embedding hit similar to memories. The agent has a skill tool for you to manually activate a skill at anytime. You may also activate via slash commands. ","","---","","## iOS Application / Native OpenClaw","","A native iOS application version of jcode is coming soon. This will allow you to work with jcode on your personal machine's environment from your phone, via Tailscale. Openclaw like features will be bundled with this iOS application. ","","---","","## Other planned features","","Agents dont like to commit in dirty git state with active changes. Git was clearly not built for multi-agent workflows, and git worktrees is not a good solution. Given this, I believe that is an opporunity for a new git like primitive to be born. ","","Build speed improvements: An incremental debug cargo build with cache enabled takes about 1 minute on my machine. The goal is 5-20 seconds. Refactors and crates seams should be able to make this happen. ","","\u003c!-- Add iOS / native OpenClaw preview and fuller writeup here. --\u003e","","---","","\u003cdiv align=\"center\"\u003e","","## Quick Start","","\u003c/div\u003e","","```bash","# Launch the TUI","jcode","","# Run a single command non-interactively","jcode run \"say hello\"","","# Resume a previous session by memorable name","jcode --resume fox","","# Run as a persistent background server, then attach more clients","jcode serve","jcode connect","","# Send voice input from your configured STT command","jcode dictate","```","","jcode supports interactive TUI use, non-interactive runs, persistent server/client workflows,","and hotkey-friendly dictation without requiring a bundled speech-to-text stack.","","\u003cdiv align=\"center\"\u003e","","  \u003ca href=\"https://github.com/1jehuang/jcode/releases/download/readme-assets/workflow.mp4\"\u003e","    \u003cimg src=\"https://github.com/1jehuang/jcode/releases/download/readme-assets/jcode-workflow-demonstration.webp\" alt=\"jcode workflow demonstration\" width=\"900\"\u003e","  \u003c/a\u003e","","  \u003cp\u003e\u003cem\u003ejcode workflow demonstration\u003c/em\u003e\u003c/p\u003e","","\u003c/div\u003e","","---","","## Browser Automation","","jcode includes a first-class built-in `browser` tool for browser control inside agent sessions.","","Current built-in backend:","- Firefox via Firefox Agent Bridge","","Current built-in tool actions include:","- `status`","- `setup`","- `open`","- `snapshot`","- `get_content`","- `interactables`","- `click`","- `type`","- `fill_form`","- `select`","- `wait`","- `screenshot`","- `eval`","- `scroll`","- `upload`","- `press`","","Quick setup:","","```bash","jcode browser status","jcode browser setup","```","","Once setup is complete, the model can use the built-in `browser` tool directly. The UI also summarizes browser tool calls compactly, for example opening a URL, clicking a selector, or typing into a field without echoing sensitive typed text.","","Notes:","- the provider/tool architecture is in place for additional backends","- Firefox is the wired built-in backend today","- Chrome bridge / remote debugging style providers can be added on top of the same browser tool later","","---","","## Further Reading","","- [jcode.sh/docs](https://jcode.sh/docs) — install, providers, configuration, keybindings","- [jcode.sh/swarm](https://jcode.sh/swarm) — many coding agents in one repository","- [jcode.sh/sdk](https://jcode.sh/sdk) — TypeScript SDK: drive jcode sessions from your own program","- [jcode.sh/bench](https://jcode.sh/bench) — benchmark methodology and results","- [Ambient Mode / OpenClaw](docs/AMBIENT_MODE.md)","- [Browser Provider Protocol](docs/BROWSER_PROVIDER_PROTOCOL.md)","- [Memory Architecture](docs/MEMORY_ARCHITECTURE.md)","- [Swarm Architecture](docs/SWARM_ARCHITECTURE.md)","- [Server Architecture](docs/SERVER_ARCHITECTURE.md)","- [Safety System](docs/SAFETY_SYSTEM.md)","- [Sponsored Discovery Sponsor Onboarding](docs/SPONSORED_DISCOVERY_SPONSOR_ONBOARDING.md)","- [Windows Notes](docs/WINDOWS.md)","- [Wrappers and Shell Integration](docs/WRAPPERS.md)","- [Refactoring Notes](docs/REFACTORING.md)","","---","","## Detailed Installation","","### Setup","","If you want another agent to set up jcode for you, give it this prompt:","","```text","Set up jcode on this machine for me.","","1. Detect the operating system, available package managers, and shell environment, then install jcode using the best matching command below instead of referring me somewhere else:","","   - macOS with Homebrew available:","     brew tap 1jehuang/jcode","     brew install jcode","","   - macOS or Linux via install script:","     curl -fsSL https://jcode.sh/install | bash","","   - Windows PowerShell:","     irm https://jcode.sh/install.ps1 | iex","","   - From source if the above paths are not appropriate:","     git clone https://github.com/1jehuang/jcode.git","     cd jcode","     cargo build --release","     scripts/install_release.sh","","   - For local self-dev / refactor work on Linux x86_64, prefer:","     scripts/dev_cargo.sh build --release -p jcode --bin jcode","     scripts/dev_cargo.sh --print-setup","     scripts/install_release.sh","","2. Verify that `jcode` is on my `PATH`.","3. Launch `jcode` once in a new terminal window/session to confirm it starts successfully.","4. Before attempting any interactive login flow, assess which providers are already available non-interactively and prefer those first. Check existing local credentials, config files, CLI sessions, and environment variables such as:","   - Claude: `~/.jcode/auth.json`, `~/.claude/.credentials.json`, `~/.local/share/opencode/auth.json`, `ANTHROPIC_API_KEY`","   - OpenAI: `~/.jcode/openai-auth.json`, `~/.codex/auth.json`, `OPENAI_API_KEY`","   - Gemini: `~/.jcode/gemini_oauth.json`, `~/.gemini/oauth_creds.json`","   - GitHub Copilot: existing auth under `~/.config/github-copilot/`","   - Azure OpenAI: `~/.config/jcode/azure-openai.env`, `AZURE_OPENAI_*`, or an existing `az login`","   - OpenRouter: `OPENROUTER_API_KEY`","   - Fireworks: `~/.config/jcode/fireworks.env`, `FIREWORKS_API_KEY`","   - MiniMax: `~/.config/jcode/minimax.env`, `MINIMAX_API_KEY`","   - NVIDIA NIM: `~/.config/jcode/nvidia-nim.env`, `NVIDIA_API_KEY`","   - Alibaba Cloud Coding Plan: existing jcode config/env if present","5. Prefer whichever provider is already configured and verify it with `jcode auth-test --all-configured` or a provider-specific auth test when appropriate.","6. Only if no usable provider is already configured, guide me through the minimal manual step needed:","   - Claude: `jcode login --provider claude`","   - GitHub Copilot: `jcode login --provider copilot`","   - OpenAI: `jcode login --provider openai`","   - Gemini: `jcode login --provider gemini`","   - Azure OpenAI: `jcode login --provider azure`","   - Fireworks: `jcode login --provider fireworks`","   - MiniMax: `jcode login --provider minimax`","   - NVIDIA NIM: `jcode login --provider nvidia-nim`","   - Alibaba Cloud Coding Plan: `jcode login --provider alibaba-coding-plan`","   - OpenRouter: help me set `OPENROUTER_API_KEY`","   - Anthropic direct API: help me set `ANTHROPIC_API_KEY`","7. After setup, run a simple smoke test with `jcode run \"say hello\"` and confirm it works.","8. If I want browser automation, also check `jcode browser status`. If browser automation is not ready, run `jcode browser setup`, verify the built-in `browser` tool works, and explain any remaining manual step.","9. Explain any manual step that still needs me, especially browser OAuth, device login, API key entry, or browser extension approval.","```","","This is intended to be a copy-paste bootstrap prompt for jcode itself or any other coding agent.","","### Quick Install","","```bash","# macOS \u0026 Linux","curl -fsSL https://jcode.sh/install | bash","```","","On Termux, install the glibc runtime and `patchelf` first so the installer can","patch the downloaded Linux binary to Termux's glibc dynamic linker and create a","launcher that avoids Termux's `LD_PRELOAD` shim:","","```bash","pkg install glibc patchelf","curl -fsSL https://jcode.sh/install | bash","```","","```powershell","# Windows 11 x64 or ARM64 (PowerShell 5.1+)","irm https://jcode.sh/install.ps1 | iex","```","","The Windows installer selects the correct architecture and verifies the download","against the release's `SHA256SUMS`. Alacritty and the optional global launch","hotkey require explicit consent and are not installed by default. See","[Windows support, security, Defender, and SmartScreen notes](docs/WINDOWS.md).","","If a release does not contain a matching Windows asset, the installer stops","instead of unexpectedly starting a long compilation. An explicit source build","is available with `-BuildFromSource` and requires Git, Rust, and Visual Studio","2022 Build Tools with the **Desktop development with C++** workload.","","### macOS via Homebrew","","```bash","brew tap 1jehuang/jcode","brew install jcode","```","","### From Source (all platforms)","","```bash","git clone https://github.com/1jehuang/jcode.git","cd jcode","cargo build --release","```","","For local self-dev / refactor work on Linux x86_64, prefer:","","```bash","scripts/dev_cargo.sh build --release -p jcode --bin jcode","scripts/dev_cargo.sh --print-setup","```","","That wrapper automatically uses `sccache` when available, prefers a fast","working local linker setup (`clang + lld`) instead of assuming every machine's","`mold` configuration is valid, and can print the active linker/cache setup via","`--print-setup` so slow-path builds are easier to diagnose.","","Then symlink to your PATH:","","```bash","scripts/install_release.sh","```","","### Uninstall","","Removes installed binaries and the launcher but keeps your config, auth, and","sessions so a clean reinstall picks up where you left off:","","```bash","curl -fsSL https://raw.githubusercontent.com/1jehuang/jcode/master/scripts/uninstall.sh | bash -s -- --yes","```","","For a full wipe of everything including config, auth, sessions, logs, and","memory (useful for recovering from a broken install):","","```bash","curl -fsSL https://raw.githubusercontent.com/1jehuang/jcode/master/scripts/uninstall.sh | bash -s -- --purge --yes","```","","Add `--dry-run` to preview what would be removed without deleting anything.","","### Platform Support","","| Platform | Status |","|---|---|","| **Linux** x86_64 / aarch64 | Fully supported |","| **macOS** Apple Silicon \u0026 Intel | Supported |","| **Windows** x86_64 | Supported (native + WSL2) |","| **Termux** aarch64 / x86_64 | Supported with `pkg install glibc patchelf` |","","\u003c/div\u003e"],"stylingDirectives":[[[1,4,"pl-ent"],[5,10,"pl-e"],[11,12,"pl-s"],[12,18,"pl-s"],[18,19,"pl-s"]],[],[[0,7,"pl-mh"],[2,7,"pl-en"]],[],[[0,1,"pl-s"],[1,3,"pl-s"],[17,18,"pl-s"],[18,19,"pl-s"],[19,79,"pl-corl"],[79,81,"pl-s"],[81,82,"pl-s"],[82,124,"pl-corl"],[124,125,"pl-s"]],[[0,1,"pl-s"],[1,3,"pl-s"],[15,16,"pl-s"],[16,17,"pl-s"],[17,80,"pl-corl"],[80,82,"pl-s"],[82,83,"pl-s"],[83,90,"pl-corl"],[90,91,"pl-s"]],[[0,1,"pl-s"],[1,3,"pl-s"],[12,13,"pl-s"],[13,14,"pl-s"],[14,111,"pl-corl"],[111,113,"pl-s"],[113,114,"pl-s"],[114,156,"pl-corl"],[156,157,"pl-s"]],[[0,1,"pl-s"],[1,3,"pl-s"],[14,15,"pl-s"],[15,16,"pl-s"],[16,87,"pl-corl"],[87,89,"pl-s"],[89,90,"pl-s"],[90,138,"pl-corl"],[138,139,"pl-s"]],[[0,1,"pl-s"],[1,3,"pl-s"],[15,16,"pl-s"],[16,17,"pl-s"],[17,75,"pl-corl"],[75,77,"pl-s"],[77,78,"pl-s"],[78,122,"pl-corl"],[122,123,"pl-s"]],[[0,1,"pl-s"],[1,3,"pl-s"],[10,11,"pl-s"],[11,12,"pl-s"],[12,119,"pl-corl"],[119,121,"pl-s"],[121,122,"pl-s"],[122,151,"pl-corl"],[151,152,"pl-s"]],[],[[32,34,"pl-ent"]],[],[],[[1,2,"pl-ent"],[3,7,"pl-e"],[8,9,"pl-s"],[9,138,"pl-s"],[77,82,"pl-c1"],[78,81,"pl-k"],[98,103,"pl-c1"],[99,102,"pl-k"],[138,139,"pl-s"],[140,146,"pl-e"],[147,148,"pl-s"],[148,154,"pl-s"],[154,155,"pl-s"],[156,159,"pl-e"],[160,161,"pl-s"],[161,180,"pl-s"],[180,181,"pl-s"],[183,186,"pl-ent"],[187,190,"pl-e"],[191,192,"pl-s"],[192,242,"pl-s"],[242,243,"pl-s"],[244,247,"pl-e"],[248,249,"pl-s"],[249,276,"pl-s"],[276,277,"pl-s"],[278,283,"pl-e"],[284,285,"pl-s"],[285,288,"pl-s"],[288,289,"pl-s"],[290,296,"pl-e"],[297,298,"pl-s"],[298,300,"pl-s"],[300,301,"pl-s"],[304,305,"pl-ent"]],[],[[1,2,"pl-ent"],[3,7,"pl-e"],[8,9,"pl-s"],[9,53,"pl-s"],[53,54,"pl-s"],[56,59,"pl-ent"],[60,63,"pl-e"],[64,65,"pl-s"],[65,93,"pl-s"],[93,94,"pl-s"],[95,98,"pl-e"],[99,100,"pl-s"],[100,155,"pl-s"],[155,156,"pl-s"],[157,162,"pl-e"],[163,164,"pl-s"],[164,167,"pl-s"],[167,168,"pl-s"],[171,172,"pl-ent"]],[],[[1,2,"pl-ent"],[3,7,"pl-e"],[8,9,"pl-s"],[9,94,"pl-s"],[94,95,"pl-s"]],[[3,6,"pl-ent"],[7,10,"pl-e"],[11,12,"pl-s"],[12,98,"pl-s"],[98,99,"pl-s"],[100,103,"pl-e"],[104,105,"pl-s"],[105,126,"pl-s"],[126,127,"pl-s"],[128,133,"pl-e"],[134,135,"pl-s"],[135,138,"pl-s"],[138,139,"pl-s"]],[[2,3,"pl-ent"]],[],[[1,3,"pl-ent"]],[],[[0,1,"pl-s"],[8,9,"pl-s"],[9,10,"pl-s"],[10,26,"pl-corl"],[26,27,"pl-s"],[30,31,"pl-s"],[35,36,"pl-s"],[36,37,"pl-s"],[37,58,"pl-corl"],[58,59,"pl-s"],[62,63,"pl-s"],[66,67,"pl-s"],[67,68,"pl-s"],[68,88,"pl-corl"],[88,89,"pl-s"],[92,93,"pl-s"],[103,104,"pl-s"],[104,105,"pl-s"],[105,127,"pl-corl"],[127,128,"pl-s"],[131,132,"pl-s"],[140,141,"pl-s"],[141,142,"pl-s"],[142,151,"pl-corl"],[151,152,"pl-s"],[155,156,"pl-s"],[163,164,"pl-s"],[164,165,"pl-s"],[165,178,"pl-corl"],[178,179,"pl-s"],[182,183,"pl-s"],[194,195,"pl-s"],[195,196,"pl-s"],[196,208,"pl-corl"],[208,209,"pl-s"],[212,213,"pl-s"],[228,229,"pl-s"],[229,230,"pl-s"],[230,246,"pl-corl"],[246,247,"pl-s"],[250,251,"pl-s"],[263,264,"pl-s"],[264,265,"pl-s"],[265,280,"pl-corl"],[280,281,"pl-s"]],[],[[2,5,"pl-ent"]],[],[[0,3,"pl-ms"]],[],[[1,4,"pl-ent"],[5,10,"pl-e"],[11,12,"pl-s"],[12,18,"pl-s"],[18,19,"pl-s"]],[],[[0,15,"pl-mh"],[3,15,"pl-en"]],[],[[2,5,"pl-ent"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,15,"pl-c"],[0,1,"pl-c"]],[[36,37,"pl-k"]],[[0,3,"pl-s"]],[],[[0,3,"pl-s"],[3,13,"pl-en"],[13,13,"pl-c1"]],[[0,30,"pl-c1"]],[[0,38,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[],[[0,1,"pl-s"],[30,31,"pl-s"],[31,32,"pl-s"],[32,54,"pl-corl"],[54,55,"pl-s"]],[],[[0,3,"pl-ms"]],[],[],[[1,4,"pl-ent"],[5,10,"pl-e"],[11,12,"pl-s"],[12,18,"pl-s"],[18,19,"pl-s"]],[],[[0,36,"pl-mh"],[3,36,"pl-en"]],[],[[2,5,"pl-ent"]],[],[],[],[[0,18,"pl-mh"],[4,18,"pl-en"]],[],[[1,4,"pl-ent"],[5,10,"pl-e"],[11,12,"pl-s"],[12,18,"pl-s"],[18,19,"pl-s"]],[],[[1,6,"pl-ent"]],[[3,5,"pl-ent"]],[[4,48,"pl-c1"]],[[4,39,"pl-c1"]],[[4,13,"pl-c1"]],[[4,15,"pl-c1"]],[[4,14,"pl-c1"]],[[4,25,"pl-c1"]],[[4,24,"pl-c1"]],[[4,31,"pl-c1"]],[[4,15,"pl-c1"]],[[4,16,"pl-c1"]],[[4,15,"pl-c1"]],[[4,14,"pl-c1"]],[[4,65,"pl-c1"]],[[4,59,"pl-c1"]],[[4,43,"pl-c1"]],[[4,15,"pl-c1"]],[[4,14,"pl-c1"]],[[4,43,"pl-c1"]],[[4,60,"pl-c1"]],[[4,65,"pl-c1"]],[[4,15,"pl-c1"]],[[4,14,"pl-c1"]],[[4,40,"pl-c1"]],[[4,60,"pl-c1"]],[[4,65,"pl-c1"]],[[4,15,"pl-c1"]],[[4,14,"pl-c1"]],[[4,47,"pl-c1"]],[[4,60,"pl-c1"]],[[4,65,"pl-c1"]],[[4,15,"pl-c1"]],[[4,14,"pl-c1"]],[[4,46,"pl-c1"]],[[4,60,"pl-c1"]],[[4,66,"pl-c1"]],[[4,15,"pl-c1"]],[[4,14,"pl-c1"]],[[4,56,"pl-c1"]],[[4,60,"pl-c1"]],[[4,66,"pl-c1"]],[[4,15,"pl-c1"]],[[4,14,"pl-c1"]],[[4,50,"pl-c1"]],[[4,60,"pl-c1"]],[[4,65,"pl-c1"]],[[4,15,"pl-c1"]],[[4,14,"pl-c1"]],[[4,49,"pl-c1"]],[[4,60,"pl-c1"]],[[4,66,"pl-c1"]],[[4,15,"pl-c1"]],[[4,14,"pl-c1"]],[[4,53,"pl-c1"]],[[4,60,"pl-c1"]],[[4,65,"pl-c1"]],[[4,15,"pl-c1"]],[[4,16,"pl-c1"]],[[4,14,"pl-c1"]],[[4,9,"pl-c1"]],[[4,24,"pl-c1"]],[[4,48,"pl-c1"]],[[4,41,"pl-c1"]],[[4,13,"pl-c1"]],[[4,15,"pl-c1"]],[[4,14,"pl-c1"]],[[4,25,"pl-c1"]],[[4,24,"pl-c1"]],[[4,31,"pl-c1"]],[[4,15,"pl-c1"]],[[4,16,"pl-c1"]],[[4,15,"pl-c1"]],[[4,14,"pl-c1"]],[[4,65,"pl-c1"]],[[4,60,"pl-c1"]],[[4,43,"pl-c1"]],[[4,15,"pl-c1"]],[[4,14,"pl-c1"]],[[4,43,"pl-c1"]],[[4,60,"pl-c1"]],[[4,65,"pl-c1"]],[[4,15,"pl-c1"]],[[4,14,"pl-c1"]],[[4,40,"pl-c1"]],[[4,60,"pl-c1"]],[[4,65,"pl-c1"]],[[4,15,"pl-c1"]],[[4,14,"pl-c1"]],[[4,47,"pl-c1"]],[[4,60,"pl-c1"]],[[4,65,"pl-c1"]],[[4,15,"pl-c1"]],[[4,14,"pl-c1"]],[[4,46,"pl-c1"]],[[4,61,"pl-c1"]],[[4,66,"pl-c1"]],[[4,15,"pl-c1"]],[[4,14,"pl-c1"]],[[4,56,"pl-c1"]],[[4,61,"pl-c1"]],[[4,66,"pl-c1"]],[[4,15,"pl-c1"]],[[4,14,"pl-c1"]],[[4,50,"pl-c1"]],[[4,61,"pl-c1"]],[[4,66,"pl-c1"]],[[4,15,"pl-c1"]],[[4,14,"pl-c1"]],[[4,49,"pl-c1"]],[[4,61,"pl-c1"]],[[4,66,"pl-c1"]],[[4,15,"pl-c1"]],[[4,14,"pl-c1"]],[[4,53,"pl-c1"]],[[4,61,"pl-c1"]],[[4,65,"pl-c1"]],[[4,15,"pl-c1"]],[[4,16,"pl-c1"]],[[4,14,"pl-c1"]],[[4,9,"pl-c1"]],[[4,6,"pl-ent"]],[[2,7,"pl-ent"]],[],[[2,5,"pl-ent"]],[],[[0,23,"pl-mh"],[4,23,"pl-en"]],[],[[1,4,"pl-ent"],[5,10,"pl-e"],[11,12,"pl-s"],[12,18,"pl-s"],[18,19,"pl-s"]],[],[[0,1,"pl-ml"],[7,8,"pl-ml"],[29,30,"pl-ml"],[37,38,"pl-ml"],[50,51,"pl-ml"]],[[0,1,"pl-ml"],[4,5,"pl-ml"],[9,10,"pl-ml"],[14,15,"pl-ml"],[19,20,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[9,11,"pl-s"],[12,13,"pl-ml"],[14,16,"pl-s"],[23,25,"pl-s"],[26,27,"pl-ml"],[41,42,"pl-ml"],[52,53,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[19,21,"pl-s"],[22,23,"pl-ml"],[24,26,"pl-s"],[34,36,"pl-s"],[37,38,"pl-ml"],[54,55,"pl-ml"],[56,58,"pl-s"],[70,72,"pl-s"],[73,74,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[6,8,"pl-s"],[9,10,"pl-ml"],[11,13,"pl-s"],[21,23,"pl-s"],[24,25,"pl-ml"],[41,42,"pl-ml"],[43,45,"pl-s"],[57,59,"pl-s"],[60,61,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[13,15,"pl-s"],[16,17,"pl-ml"],[18,20,"pl-s"],[28,30,"pl-s"],[31,32,"pl-ml"],[49,50,"pl-ml"],[51,53,"pl-s"],[65,67,"pl-s"],[68,69,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[12,14,"pl-s"],[15,16,"pl-ml"],[17,19,"pl-s"],[28,30,"pl-s"],[31,32,"pl-ml"],[49,50,"pl-ml"],[51,53,"pl-s"],[65,67,"pl-s"],[68,69,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[22,24,"pl-s"],[25,26,"pl-ml"],[27,29,"pl-s"],[38,40,"pl-s"],[41,42,"pl-ml"],[60,61,"pl-ml"],[62,64,"pl-s"],[77,79,"pl-s"],[80,81,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[16,18,"pl-s"],[19,20,"pl-ml"],[21,23,"pl-s"],[32,34,"pl-s"],[35,36,"pl-ml"],[54,55,"pl-ml"],[56,58,"pl-s"],[71,73,"pl-s"],[74,75,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[15,17,"pl-s"],[18,19,"pl-ml"],[20,22,"pl-s"],[31,33,"pl-s"],[34,35,"pl-ml"],[53,54,"pl-ml"],[55,57,"pl-s"],[70,72,"pl-s"],[73,74,"pl-ml"]],[],[[2,5,"pl-ent"]],[],[],[],[[0,23,"pl-mh"],[4,23,"pl-en"]],[],[[1,4,"pl-ent"],[5,10,"pl-e"],[11,12,"pl-s"],[12,18,"pl-s"],[18,19,"pl-s"]],[],[[0,1,"pl-ml"],[7,8,"pl-ml"],[29,30,"pl-ml"],[37,38,"pl-ml"],[50,51,"pl-ml"]],[[0,1,"pl-ml"],[4,5,"pl-ml"],[9,10,"pl-ml"],[14,15,"pl-ml"],[19,20,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[9,11,"pl-s"],[12,13,"pl-ml"],[14,16,"pl-s"],[23,25,"pl-s"],[26,27,"pl-ml"],[41,42,"pl-ml"],[52,53,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[19,21,"pl-s"],[22,23,"pl-ml"],[24,26,"pl-s"],[34,36,"pl-s"],[37,38,"pl-ml"],[54,55,"pl-ml"],[56,58,"pl-s"],[69,71,"pl-s"],[72,73,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[6,8,"pl-s"],[9,10,"pl-ml"],[11,13,"pl-s"],[21,23,"pl-s"],[24,25,"pl-ml"],[41,42,"pl-ml"],[43,45,"pl-s"],[57,59,"pl-s"],[60,61,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[13,15,"pl-s"],[16,17,"pl-ml"],[18,20,"pl-s"],[28,30,"pl-s"],[31,32,"pl-ml"],[49,50,"pl-ml"],[51,53,"pl-s"],[65,67,"pl-s"],[68,69,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[12,14,"pl-s"],[15,16,"pl-ml"],[17,19,"pl-s"],[28,30,"pl-s"],[31,32,"pl-ml"],[49,50,"pl-ml"],[51,53,"pl-s"],[65,67,"pl-s"],[68,69,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[22,24,"pl-s"],[25,26,"pl-ml"],[27,29,"pl-s"],[38,40,"pl-s"],[41,42,"pl-ml"],[60,61,"pl-ml"],[62,64,"pl-s"],[76,78,"pl-s"],[79,80,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[16,18,"pl-s"],[19,20,"pl-ml"],[21,23,"pl-s"],[32,34,"pl-s"],[35,36,"pl-ml"],[54,55,"pl-ml"],[56,58,"pl-s"],[70,72,"pl-s"],[73,74,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[15,17,"pl-s"],[18,19,"pl-ml"],[20,22,"pl-s"],[31,33,"pl-s"],[34,35,"pl-ml"],[53,54,"pl-ml"],[55,57,"pl-s"],[69,71,"pl-s"],[72,73,"pl-ml"]],[],[[2,5,"pl-ent"]],[],[[178,179,"pl-s"],[179,203,"pl-c1"],[203,204,"pl-s"]],[],[[0,39,"pl-mh"],[4,39,"pl-en"]],[],[[1,4,"pl-ent"],[5,10,"pl-e"],[11,12,"pl-s"],[12,18,"pl-s"],[18,19,"pl-s"]],[],[[0,1,"pl-ml"],[7,8,"pl-ml"],[37,38,"pl-ml"],[50,51,"pl-ml"]],[[0,1,"pl-ml"],[4,5,"pl-ml"],[9,10,"pl-ml"],[14,15,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[31,33,"pl-s"],[34,35,"pl-ml"],[36,38,"pl-s"],[38,39,"pl-s"],[45,47,"pl-s"],[48,49,"pl-ml"],[59,60,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[9,11,"pl-s"],[12,13,"pl-ml"],[14,16,"pl-s"],[16,17,"pl-s"],[24,26,"pl-s"],[27,28,"pl-ml"],[29,31,"pl-s"],[44,46,"pl-s"],[47,48,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[6,8,"pl-s"],[9,10,"pl-ml"],[11,13,"pl-s"],[13,14,"pl-s"],[21,23,"pl-s"],[24,25,"pl-ml"],[26,28,"pl-s"],[41,43,"pl-s"],[44,45,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[13,15,"pl-s"],[16,17,"pl-ml"],[18,20,"pl-s"],[20,21,"pl-s"],[28,30,"pl-s"],[31,32,"pl-ml"],[33,35,"pl-s"],[48,50,"pl-s"],[51,52,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[12,14,"pl-s"],[15,16,"pl-ml"],[17,19,"pl-s"],[19,20,"pl-s"],[28,30,"pl-s"],[31,32,"pl-ml"],[33,35,"pl-s"],[49,51,"pl-s"],[52,53,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[22,24,"pl-s"],[25,26,"pl-ml"],[27,29,"pl-s"],[29,30,"pl-s"],[38,40,"pl-s"],[41,42,"pl-ml"],[43,45,"pl-s"],[59,61,"pl-s"],[62,63,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[16,18,"pl-s"],[19,20,"pl-ml"],[21,23,"pl-s"],[23,24,"pl-s"],[32,34,"pl-s"],[35,36,"pl-ml"],[37,39,"pl-s"],[53,55,"pl-s"],[56,57,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[15,17,"pl-s"],[18,19,"pl-ml"],[20,22,"pl-s"],[22,23,"pl-s"],[31,33,"pl-s"],[34,35,"pl-ml"],[36,38,"pl-s"],[52,54,"pl-s"],[55,56,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[19,21,"pl-s"],[22,23,"pl-ml"],[24,26,"pl-s"],[26,27,"pl-s"],[34,36,"pl-s"],[37,38,"pl-ml"],[39,41,"pl-s"],[54,56,"pl-s"],[57,58,"pl-ml"]],[],[[2,5,"pl-ent"]],[],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,32,"pl-c1"],[32,33,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,12,"pl-c1"],[12,13,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,20,"pl-c1"],[20,21,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,19,"pl-c1"],[19,20,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,28,"pl-c1"],[28,29,"pl-s"],[55,56,"pl-s"],[56,81,"pl-c1"],[81,82,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,34,"pl-c1"],[34,35,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,35,"pl-c1"],[35,36,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,24,"pl-c1"],[24,25,"pl-s"]],[],[[1,4,"pl-ent"],[5,10,"pl-e"],[11,12,"pl-s"],[12,18,"pl-s"],[18,19,"pl-s"]],[],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,103,"pl-s"],[103,104,"pl-s"]],[[4,159,"pl-c1"]],[[4,5,"pl-ent"]],[],[[3,4,"pl-ent"],[6,8,"pl-ent"],[42,44,"pl-ent"],[47,48,"pl-ent"]],[],[[2,5,"pl-ent"]],[],[],[[0,3,"pl-ms"]],[],[[0,24,"pl-mh"],[3,24,"pl-en"]],[],[],[],[],[],[],[],[],[],[[1,4,"pl-ent"],[5,10,"pl-e"],[11,12,"pl-s"],[12,18,"pl-s"],[18,19,"pl-s"]],[],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,98,"pl-s"],[98,99,"pl-s"]],[[4,149,"pl-c1"]],[[4,5,"pl-ent"]],[],[[3,4,"pl-ent"],[6,8,"pl-ent"],[37,39,"pl-ent"],[42,43,"pl-ent"]],[],[[2,5,"pl-ent"]],[],[[0,66,"pl-c"],[0,4,"pl-c"],[63,66,"pl-c"]],[],[[0,3,"pl-ms"]],[],[[0,75,"pl-mh"],[3,75,"pl-en"]],[],[],[[1,4,"pl-ent"],[5,10,"pl-e"],[11,12,"pl-s"],[12,16,"pl-s"],[16,17,"pl-s"],[18,24,"pl-e"],[25,26,"pl-s"],[26,30,"pl-s"],[30,31,"pl-s"],[32,35,"pl-e"],[36,37,"pl-s"],[37,42,"pl-s"],[42,43,"pl-s"],[44,47,"pl-e"],[48,49,"pl-s"],[49,128,"pl-s"],[128,129,"pl-s"]],[],[[146,193,"pl-corl"]],[],[],[],[],[],[[263,299,"pl-corl"]],[],[[75,76,"pl-s"],[76,81,"pl-c1"],[81,82,"pl-s"],[100,101,"pl-s"],[101,111,"pl-c1"],[111,112,"pl-s"]],[],[[53,54,"pl-s"],[54,67,"pl-c1"],[67,68,"pl-s"],[75,76,"pl-s"],[76,85,"pl-c1"],[85,86,"pl-s"],[90,91,"pl-s"],[91,111,"pl-c1"],[111,112,"pl-s"],[129,130,"pl-s"],[130,146,"pl-c1"],[146,147,"pl-s"]],[],[[0,3,"pl-ms"]],[],[[0,8,"pl-mh"],[3,8,"pl-en"]],[],[],[],[[1,4,"pl-ent"],[5,10,"pl-e"],[11,12,"pl-s"],[12,18,"pl-s"],[18,19,"pl-s"]],[],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,91,"pl-s"],[91,92,"pl-s"]],[[4,156,"pl-c1"]],[[4,5,"pl-ent"]],[],[[3,4,"pl-ent"],[6,8,"pl-ent"],[36,38,"pl-ent"],[41,42,"pl-ent"]],[],[[2,5,"pl-ent"]],[],[],[],[[0,3,"pl-ms"]],[],[[0,22,"pl-mh"],[3,22,"pl-en"]],[],[],[],[[0,34,"pl-mh"],[4,34,"pl-en"]],[],[[0,1,"pl-v"],[2,4,"pl-s"],[10,12,"pl-s"],[14,15,"pl-s"],[15,44,"pl-c1"],[44,45,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[28,30,"pl-s"],[32,33,"pl-s"],[33,62,"pl-c1"],[62,63,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[17,19,"pl-s"],[21,22,"pl-s"],[22,51,"pl-c1"],[51,52,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[18,20,"pl-s"],[22,23,"pl-s"],[23,53,"pl-c1"],[53,54,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[16,18,"pl-s"],[20,21,"pl-s"],[21,49,"pl-c1"],[49,50,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[29,31,"pl-s"],[33,34,"pl-s"],[34,76,"pl-c1"],[76,77,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[13,15,"pl-s"],[17,18,"pl-s"],[18,50,"pl-c1"],[50,51,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[11,13,"pl-s"],[15,16,"pl-s"],[16,46,"pl-c1"],[46,47,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[25,27,"pl-s"],[29,30,"pl-s"],[30,62,"pl-c1"],[62,63,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[13,15,"pl-s"],[17,18,"pl-s"],[18,49,"pl-c1"],[49,50,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[10,12,"pl-s"],[14,15,"pl-s"],[15,44,"pl-c1"],[44,45,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[37,39,"pl-s"],[41,42,"pl-s"],[42,82,"pl-c1"],[82,83,"pl-s"]],[],[],[],[[0,55,"pl-mh"],[4,55,"pl-en"]],[],[],[],[[0,32,"pl-mh"],[5,32,"pl-en"]],[],[[47,48,"pl-s"],[48,68,"pl-c1"],[68,69,"pl-s"]],[],[],[],[[0,1,"pl-v"],[2,4,"pl-s"],[27,29,"pl-s"]],[],[[2,5,"pl-s"],[5,9,"pl-en"]],[[25,26,"pl-k"],[36,37,"pl-k"]],[[2,16,"pl-c"],[2,3,"pl-c"]],[],[],[],[[39,53,"pl-c"],[39,40,"pl-c"]],[],[[39,68,"pl-c"],[39,40,"pl-c"]],[[2,5,"pl-s"]],[],[[50,51,"pl-s"],[51,61,"pl-c1"],[61,62,"pl-s"],[64,65,"pl-s"],[65,75,"pl-c1"],[75,76,"pl-s"],[78,79,"pl-s"],[79,87,"pl-c1"],[87,88,"pl-s"],[90,91,"pl-s"],[91,94,"pl-c1"],[94,95,"pl-s"],[97,98,"pl-s"],[98,102,"pl-c1"],[102,103,"pl-s"],[105,106,"pl-s"],[106,116,"pl-c1"],[116,117,"pl-s"],[119,120,"pl-s"],[120,129,"pl-c1"],[129,130,"pl-s"],[162,163,"pl-s"],[163,171,"pl-c1"],[171,172,"pl-s"],[189,190,"pl-s"],[190,201,"pl-c1"],[201,202,"pl-s"],[204,205,"pl-s"],[205,210,"pl-c1"],[210,211,"pl-s"],[213,214,"pl-s"],[214,221,"pl-c1"],[221,222,"pl-s"],[224,225,"pl-s"],[225,232,"pl-c1"],[232,233,"pl-s"],[235,236,"pl-s"],[236,247,"pl-c1"],[247,248,"pl-s"],[250,251,"pl-s"],[251,257,"pl-c1"],[257,258,"pl-s"],[260,261,"pl-s"],[261,269,"pl-c1"],[269,270,"pl-s"],[272,273,"pl-s"],[273,280,"pl-c1"],[280,281,"pl-s"],[287,288,"pl-s"],[288,296,"pl-c1"],[296,297,"pl-s"],[383,384,"pl-s"],[384,390,"pl-c1"],[390,391,"pl-s"],[396,397,"pl-s"],[397,404,"pl-c1"],[404,405,"pl-s"],[412,413,"pl-s"],[413,424,"pl-c1"],[424,425,"pl-s"]],[],[[0,1,"pl-v"],[2,4,"pl-s"],[22,24,"pl-s"],[100,101,"pl-s"],[101,141,"pl-c1"],[141,142,"pl-s"],[161,162,"pl-s"],[162,180,"pl-c1"],[180,181,"pl-s"]],[],[],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,33,"pl-c1"],[33,34,"pl-s"],[254,255,"pl-s"],[255,290,"pl-c1"],[290,291,"pl-s"],[295,296,"pl-s"],[296,307,"pl-c1"],[307,308,"pl-s"]],[[0,1,"pl-v"],[12,13,"pl-s"],[13,27,"pl-c1"],[27,28,"pl-s"],[36,37,"pl-s"],[37,50,"pl-c1"],[50,51,"pl-s"],[58,59,"pl-s"],[59,86,"pl-c1"],[86,87,"pl-s"],[151,152,"pl-s"],[152,162,"pl-c1"],[162,163,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,13,"pl-c1"],[13,14,"pl-s"],[131,132,"pl-s"],[157,158,"pl-s"],[158,159,"pl-s"],[159,196,"pl-corl"],[196,197,"pl-s"]],[],[],[],[[0,60,"pl-mh"],[5,60,"pl-en"]],[],[[114,115,"pl-s"],[115,135,"pl-c1"],[135,136,"pl-s"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,55,"pl-c"],[0,1,"pl-c"]],[[0,6,"pl-c1"],[7,11,"pl-s"],[7,8,"pl-pds"],[10,11,"pl-pds"],[12,25,"pl-s"],[12,13,"pl-pds"],[13,24,"pl-smi"],[24,25,"pl-pds"],[26,27,"pl-k"]],[],[],[],[],[],[],[[0,25,"pl-c"],[0,1,"pl-c"]],[[51,90,"pl-s"],[51,52,"pl-pds"],[89,90,"pl-pds"]],[],[[0,18,"pl-c"],[0,1,"pl-c"]],[[36,43,"pl-s"],[36,37,"pl-pds"],[42,43,"pl-pds"]],[[0,3,"pl-s"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[],[],[],[],[[0,3,"pl-s"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,59,"pl-c"],[0,1,"pl-c"]],[],[],[[45,52,"pl-s"],[45,46,"pl-pds"],[51,52,"pl-pds"]],[],[[0,74,"pl-c"],[0,1,"pl-c"]],[[0,81,"pl-c"],[0,1,"pl-c"]],[],[[34,46,"pl-s"],[34,35,"pl-pds"],[45,46,"pl-pds"],[51,58,"pl-s"],[51,52,"pl-pds"],[57,58,"pl-pds"]],[[0,3,"pl-s"]],[],[[51,52,"pl-s"],[52,62,"pl-c1"],[62,63,"pl-s"],[68,69,"pl-s"],[69,89,"pl-c1"],[89,90,"pl-s"],[280,281,"pl-s"],[281,292,"pl-c1"],[292,293,"pl-s"],[325,326,"pl-s"],[326,341,"pl-c1"],[341,342,"pl-s"]],[],[],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,21,"pl-c1"],[21,22,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,18,"pl-c1"],[18,19,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,26,"pl-c1"],[26,27,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,14,"pl-c1"],[14,15,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,18,"pl-c1"],[18,19,"pl-s"],[40,41,"pl-s"],[41,48,"pl-c1"],[48,49,"pl-s"]],[],[[53,54,"pl-s"],[54,74,"pl-c1"],[74,75,"pl-s"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[1,9,"pl-en"]],[[0,16,"pl-smi"],[19,27,"pl-s"],[19,20,"pl-pds"],[26,27,"pl-pds"]],[[0,13,"pl-smi"],[16,29,"pl-s"],[16,17,"pl-pds"],[28,29,"pl-pds"]],[],[[1,10,"pl-en"],[11,17,"pl-en"]],[[0,4,"pl-smi"],[7,26,"pl-s"],[7,8,"pl-pds"],[25,26,"pl-pds"]],[[0,8,"pl-smi"],[11,39,"pl-s"],[11,12,"pl-pds"],[38,39,"pl-pds"]],[[0,11,"pl-smi"],[14,45,"pl-s"],[14,15,"pl-pds"],[44,45,"pl-pds"]],[[0,8,"pl-smi"],[11,32,"pl-s"],[11,12,"pl-pds"],[31,32,"pl-pds"]],[[0,13,"pl-smi"],[16,29,"pl-s"],[16,17,"pl-pds"],[28,29,"pl-pds"]],[],[[2,11,"pl-en"],[12,18,"pl-en"],[19,25,"pl-en"]],[[0,2,"pl-smi"],[5,18,"pl-s"],[5,6,"pl-pds"],[17,18,"pl-pds"]],[[0,14,"pl-smi"],[17,23,"pl-c1"]],[[0,3,"pl-s"]],[],[],[[0,1,"pl-s"],[1,30,"pl-c1"],[30,31,"pl-s"]],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[1,9,"pl-en"]],[[0,16,"pl-smi"],[19,32,"pl-s"],[19,20,"pl-pds"],[31,32,"pl-pds"]],[[0,13,"pl-smi"],[16,35,"pl-s"],[16,17,"pl-pds"],[34,35,"pl-pds"]],[],[[1,10,"pl-en"],[11,22,"pl-en"]],[[0,4,"pl-smi"],[7,29,"pl-s"],[7,8,"pl-pds"],[28,29,"pl-pds"]],[[0,8,"pl-smi"],[11,53,"pl-s"],[11,12,"pl-pds"],[52,53,"pl-pds"]],[[0,4,"pl-smi"],[7,15,"pl-s"],[7,8,"pl-pds"],[14,15,"pl-pds"]],[[0,11,"pl-smi"],[14,33,"pl-s"],[14,15,"pl-pds"],[32,33,"pl-pds"]],[[0,13,"pl-smi"],[16,35,"pl-s"],[16,17,"pl-pds"],[34,35,"pl-pds"]],[],[[1,10,"pl-en"],[11,22,"pl-en"],[23,30,"pl-en"]],[[0,11,"pl-smi"],[14,25,"pl-s"],[14,15,"pl-pds"],[24,25,"pl-pds"]],[],[[2,11,"pl-en"],[12,23,"pl-en"],[24,30,"pl-en"]],[[0,2,"pl-smi"],[5,24,"pl-s"],[5,6,"pl-pds"],[23,24,"pl-pds"]],[[0,14,"pl-smi"],[17,23,"pl-c1"]],[[0,3,"pl-s"]],[],[[44,45,"pl-s"],[45,63,"pl-c1"],[63,64,"pl-s"]],[[32,33,"pl-s"],[33,53,"pl-c1"],[53,54,"pl-s"]],[],[],[[0,46,"pl-mh"],[6,46,"pl-en"],[33,34,"pl-s"],[34,44,"pl-c1"],[44,45,"pl-s"]],[],[[133,134,"pl-s"],[134,163,"pl-c1"],[163,164,"pl-s"],[166,167,"pl-s"],[167,194,"pl-c1"],[194,195,"pl-s"],[244,245,"pl-s"],[245,265,"pl-c1"],[265,266,"pl-s"]],[],[[0,1,"pl-s"],[1,2,"pl-v"],[26,27,"pl-s"],[27,37,"pl-c1"],[37,38,"pl-s"],[42,43,"pl-s"],[43,54,"pl-c1"],[54,55,"pl-s"]],[],[[3,6,"pl-s"],[6,10,"pl-en"]],[[4,13,"pl-en"],[14,20,"pl-en"]],[[3,7,"pl-smi"],[10,29,"pl-s"],[10,11,"pl-pds"],[28,29,"pl-pds"]],[[3,11,"pl-smi"],[14,51,"pl-s"],[14,15,"pl-pds"],[50,51,"pl-pds"]],[[3,14,"pl-smi"],[17,33,"pl-s"],[17,18,"pl-pds"],[32,33,"pl-pds"]],[[3,16,"pl-smi"],[19,50,"pl-s"],[19,20,"pl-pds"],[49,50,"pl-pds"]],[],[[4,13,"pl-en"],[14,20,"pl-en"],[21,31,"pl-en"],[32,52,"pl-en"]],[[3,11,"pl-smi"],[14,18,"pl-c1"]],[[3,19,"pl-smi"],[22,28,"pl-s"],[22,23,"pl-pds"],[27,28,"pl-pds"]],[[3,6,"pl-s"]],[],[[0,1,"pl-s"],[1,2,"pl-v"],[31,32,"pl-s"],[32,42,"pl-c1"],[42,43,"pl-s"],[70,71,"pl-s"],[71,94,"pl-c1"],[94,95,"pl-s"],[181,182,"pl-s"],[182,212,"pl-c1"],[212,213,"pl-s"]],[],[[3,6,"pl-s"],[6,10,"pl-en"]],[[28,50,"pl-s"],[28,29,"pl-pds"],[49,50,"pl-pds"],[52,62,"pl-s"],[52,53,"pl-pds"],[61,62,"pl-pds"],[68,86,"pl-s"],[68,69,"pl-pds"],[85,86,"pl-pds"],[87,93,"pl-s"],[87,88,"pl-pds"],[92,93,"pl-pds"]],[[3,6,"pl-s"]],[],[[10,11,"pl-s"],[11,21,"pl-c1"],[21,22,"pl-s"],[103,104,"pl-s"],[104,127,"pl-c1"],[127,128,"pl-s"],[150,151,"pl-s"],[151,161,"pl-c1"],[161,162,"pl-s"]],[],[[159,160,"pl-s"],[160,176,"pl-c1"],[176,177,"pl-s"]],[],[[0,3,"pl-s"],[3,7,"pl-en"],[7,7,"pl-c1"]],[[0,37,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[],[[0,38,"pl-c"],[0,1,"pl-c"]],[],[[0,3,"pl-s"]],[],[],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,43,"pl-c1"],[43,44,"pl-s"]],[[0,1,"pl-v"],[8,9,"pl-s"],[9,16,"pl-c1"],[16,17,"pl-s"],[34,35,"pl-s"],[35,44,"pl-c1"],[44,45,"pl-s"]],[[0,1,"pl-v"]],[],[[0,21,"pl-mh"],[5,21,"pl-en"]],[],[[28,29,"pl-s"],[29,40,"pl-c1"],[40,41,"pl-s"]],[],[],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,20,"pl-c1"],[20,21,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,18,"pl-c1"],[18,19,"pl-s"]],[],[],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,17,"pl-c1"],[17,18,"pl-s"],[58,59,"pl-s"],[59,69,"pl-c1"],[69,70,"pl-s"],[103,104,"pl-s"],[104,134,"pl-c1"],[134,135,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,12,"pl-c1"],[12,13,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,19,"pl-c1"],[19,20,"pl-s"]],[],[],[],[],[],[[0,1,"pl-s"],[1,21,"pl-c1"],[21,22,"pl-s"],[28,29,"pl-s"],[29,46,"pl-c1"],[46,47,"pl-s"]],[],[],[],[],[[19,20,"pl-s"],[20,30,"pl-c1"],[30,31,"pl-s"],[59,60,"pl-s"],[60,67,"pl-c1"],[67,68,"pl-s"],[166,167,"pl-s"],[167,181,"pl-c1"],[181,182,"pl-s"],[183,184,"pl-s"],[184,189,"pl-c1"],[189,190,"pl-s"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[[2,14,"pl-ent"]],[[4,16,"pl-ent"]],[[6,15,"pl-ent"],[17,38,"pl-s"],[17,18,"pl-pds"],[37,38,"pl-pds"]],[[6,12,"pl-ent"],[15,23,"pl-s"],[15,16,"pl-pds"],[22,23,"pl-pds"],[25,37,"pl-s"],[25,26,"pl-pds"],[36,37,"pl-pds"]],[[6,11,"pl-ent"]],[[6,14,"pl-ent"],[16,20,"pl-c1"]],[],[],[],[[0,3,"pl-s"]],[],[[60,61,"pl-s"],[61,107,"pl-c1"],[107,108,"pl-s"],[117,118,"pl-s"],[118,128,"pl-c1"],[128,129,"pl-s"]],[],[[34,35,"pl-s"],[35,41,"pl-c1"],[41,42,"pl-s"],[44,45,"pl-s"],[45,51,"pl-c1"],[51,52,"pl-s"],[54,55,"pl-s"],[55,61,"pl-c1"],[61,62,"pl-s"],[68,69,"pl-s"],[69,80,"pl-c1"],[80,81,"pl-s"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,36,"pl-c"],[0,1,"pl-c"]],[],[],[[0,59,"pl-c"],[0,1,"pl-c"]],[[45,86,"pl-s"],[45,46,"pl-pds"],[85,86,"pl-pds"]],[[42,47,"pl-s"],[42,43,"pl-pds"],[46,47,"pl-pds"]],[[0,3,"pl-s"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,65,"pl-c"],[0,1,"pl-c"]],[],[],[],[[0,61,"pl-c"],[0,1,"pl-c"]],[[68,76,"pl-k"]],[[45,72,"pl-s"],[45,46,"pl-pds"],[71,72,"pl-pds"]],[[0,3,"pl-s"]],[],[[47,48,"pl-s"],[48,71,"pl-c1"],[71,72,"pl-s"]],[],[],[[0,1,"pl-s"],[1,36,"pl-c1"],[36,37,"pl-s"]],[],[[1,4,"pl-ent"],[5,10,"pl-e"],[11,12,"pl-s"],[12,16,"pl-s"],[16,17,"pl-s"],[18,24,"pl-e"],[25,26,"pl-s"],[26,30,"pl-s"],[30,31,"pl-s"],[32,35,"pl-e"],[36,37,"pl-s"],[37,72,"pl-s"],[72,73,"pl-s"],[74,77,"pl-e"],[78,79,"pl-s"],[79,158,"pl-s"],[158,159,"pl-s"]],[],[],[[0,22,"pl-mh"],[4,22,"pl-en"]],[],[[0,1,"pl-v"],[2,4,"pl-s"],[41,43,"pl-s"],[44,45,"pl-s"],[45,51,"pl-c1"],[51,52,"pl-s"],[54,55,"pl-s"],[55,61,"pl-c1"],[61,62,"pl-s"],[64,65,"pl-s"],[65,72,"pl-c1"],[72,73,"pl-s"],[75,76,"pl-s"],[76,82,"pl-c1"],[82,83,"pl-s"],[85,86,"pl-s"],[86,91,"pl-c1"],[91,92,"pl-s"],[94,95,"pl-s"],[95,114,"pl-c1"],[114,115,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[41,43,"pl-s"],[44,45,"pl-s"],[45,55,"pl-c1"],[55,56,"pl-s"],[58,59,"pl-s"],[59,69,"pl-c1"],[69,70,"pl-s"],[72,73,"pl-s"],[73,90,"pl-c1"],[90,91,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[37,39,"pl-s"],[40,41,"pl-s"],[41,49,"pl-c1"],[49,50,"pl-s"],[52,53,"pl-s"],[53,64,"pl-c1"],[64,65,"pl-s"],[67,68,"pl-s"],[68,71,"pl-c1"],[71,72,"pl-s"],[75,76,"pl-s"],[76,80,"pl-c1"],[80,81,"pl-s"],[83,84,"pl-s"],[84,89,"pl-c1"],[89,90,"pl-s"],[92,93,"pl-s"],[93,100,"pl-c1"],[100,101,"pl-s"],[103,104,"pl-s"],[104,111,"pl-c1"],[111,112,"pl-s"],[114,115,"pl-s"],[115,123,"pl-c1"],[123,124,"pl-s"],[126,127,"pl-s"],[127,135,"pl-c1"],[135,136,"pl-s"],[138,139,"pl-s"],[139,150,"pl-c1"],[150,151,"pl-s"],[153,154,"pl-s"],[154,164,"pl-c1"],[164,165,"pl-s"],[167,168,"pl-s"],[168,174,"pl-c1"],[174,175,"pl-s"],[177,178,"pl-s"],[178,186,"pl-c1"],[186,187,"pl-s"],[189,190,"pl-s"],[190,197,"pl-c1"],[197,198,"pl-s"],[200,201,"pl-s"],[201,205,"pl-c1"],[205,206,"pl-s"],[208,209,"pl-s"],[209,216,"pl-c1"],[216,217,"pl-s"],[219,220,"pl-s"],[220,230,"pl-c1"],[230,231,"pl-s"],[233,234,"pl-s"],[234,244,"pl-c1"],[244,245,"pl-s"],[247,248,"pl-s"],[248,257,"pl-c1"],[257,258,"pl-s"],[260,261,"pl-s"],[261,270,"pl-c1"],[270,271,"pl-s"],[273,274,"pl-s"],[274,281,"pl-c1"],[281,282,"pl-s"],[284,285,"pl-s"],[285,288,"pl-c1"],[288,289,"pl-s"],[291,292,"pl-s"],[292,300,"pl-c1"],[300,301,"pl-s"],[303,304,"pl-s"],[304,310,"pl-c1"],[310,311,"pl-s"],[313,314,"pl-s"],[314,320,"pl-c1"],[320,321,"pl-s"],[323,324,"pl-s"],[324,332,"pl-c1"],[332,333,"pl-s"],[335,336,"pl-s"],[336,342,"pl-c1"],[342,343,"pl-s"],[345,346,"pl-s"],[346,357,"pl-c1"],[357,358,"pl-s"],[360,361,"pl-s"],[361,367,"pl-c1"],[367,368,"pl-s"]],[],[],[],[[0,3,"pl-ms"]],[],[[0,29,"pl-mh"],[3,29,"pl-en"]],[],[],[],[],[],[[0,67,"pl-c"],[0,4,"pl-c"],[64,67,"pl-c"]],[],[[0,3,"pl-ms"]],[],[[0,8,"pl-mh"],[3,8,"pl-en"]],[],[],[],[],[],[],[],[],[],[],[],[],[],[[1,4,"pl-ent"],[5,10,"pl-e"],[11,12,"pl-s"],[12,16,"pl-s"],[16,17,"pl-s"],[18,24,"pl-e"],[25,26,"pl-s"],[26,30,"pl-s"],[30,31,"pl-s"],[32,35,"pl-e"],[36,37,"pl-s"],[37,72,"pl-s"],[72,73,"pl-s"],[74,77,"pl-e"],[78,79,"pl-s"],[79,158,"pl-s"],[158,159,"pl-s"]],[],[],[],[],[],[[0,3,"pl-ms"]],[],[[0,36,"pl-mh"],[3,36,"pl-en"]],[],[],[],[[0,3,"pl-ms"]],[],[[0,25,"pl-mh"],[3,25,"pl-en"]],[],[],[],[],[],[[0,67,"pl-c"],[0,4,"pl-c"],[64,67,"pl-c"]],[],[[0,3,"pl-ms"]],[],[[1,4,"pl-ent"],[5,10,"pl-e"],[11,12,"pl-s"],[12,18,"pl-s"],[18,19,"pl-s"]],[],[[0,14,"pl-mh"],[3,14,"pl-en"]],[],[[2,5,"pl-ent"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,16,"pl-c"],[0,1,"pl-c"]],[],[],[[0,40,"pl-c"],[0,1,"pl-c"]],[[10,21,"pl-s"],[10,11,"pl-pds"],[20,21,"pl-pds"]],[],[[0,45,"pl-c"],[0,1,"pl-c"]],[],[],[[0,65,"pl-c"],[0,1,"pl-c"]],[],[],[],[[0,51,"pl-c"],[0,1,"pl-c"]],[],[[0,3,"pl-s"]],[],[],[],[],[[1,4,"pl-ent"],[5,10,"pl-e"],[11,12,"pl-s"],[12,18,"pl-s"],[18,19,"pl-s"]],[],[[3,4,"pl-ent"],[5,9,"pl-e"],[10,11,"pl-s"],[11,89,"pl-s"],[89,90,"pl-s"]],[[4,162,"pl-c1"]],[[4,5,"pl-ent"]],[],[[3,4,"pl-ent"],[6,8,"pl-ent"],[39,41,"pl-ent"],[44,45,"pl-ent"]],[],[[2,5,"pl-ent"]],[],[[0,3,"pl-ms"]],[],[[0,21,"pl-mh"],[3,21,"pl-en"]],[],[[38,39,"pl-s"],[39,46,"pl-c1"],[46,47,"pl-s"]],[],[],[[0,1,"pl-v"]],[],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,9,"pl-c1"],[9,10,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,8,"pl-c1"],[8,9,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,7,"pl-c1"],[7,8,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,11,"pl-c1"],[11,12,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,14,"pl-c1"],[14,15,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,16,"pl-c1"],[16,17,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,8,"pl-c1"],[8,9,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,7,"pl-c1"],[7,8,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,12,"pl-c1"],[12,13,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,9,"pl-c1"],[9,10,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,7,"pl-c1"],[7,8,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,13,"pl-c1"],[13,14,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,7,"pl-c1"],[7,8,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,9,"pl-c1"],[9,10,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,9,"pl-c1"],[9,10,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,8,"pl-c1"],[8,9,"pl-s"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[],[[0,3,"pl-s"]],[],[[55,56,"pl-s"],[56,63,"pl-c1"],[63,64,"pl-s"]],[],[],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[],[[0,3,"pl-ms"]],[],[[0,18,"pl-mh"],[3,18,"pl-en"]],[],[[0,1,"pl-v"],[2,3,"pl-s"],[16,17,"pl-s"],[17,18,"pl-s"],[18,39,"pl-corl"],[39,40,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[17,18,"pl-s"],[18,19,"pl-s"],[19,41,"pl-corl"],[41,42,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[15,16,"pl-s"],[16,17,"pl-s"],[17,37,"pl-corl"],[37,38,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[17,18,"pl-s"],[18,19,"pl-s"],[19,41,"pl-corl"],[41,42,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[26,27,"pl-s"],[27,28,"pl-s"],[28,48,"pl-corl"],[48,49,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[28,29,"pl-s"],[29,30,"pl-s"],[30,63,"pl-corl"],[63,64,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[22,23,"pl-s"],[23,24,"pl-s"],[24,51,"pl-corl"],[51,52,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[21,22,"pl-s"],[22,23,"pl-s"],[23,49,"pl-corl"],[49,50,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[22,23,"pl-s"],[23,24,"pl-s"],[24,51,"pl-corl"],[51,52,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[16,17,"pl-s"],[17,18,"pl-s"],[18,39,"pl-corl"],[39,40,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[41,42,"pl-s"],[42,43,"pl-s"],[43,89,"pl-corl"],[89,90,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[16,17,"pl-s"],[17,18,"pl-s"],[18,33,"pl-corl"],[33,34,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[33,34,"pl-s"],[34,35,"pl-s"],[35,51,"pl-corl"],[51,52,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[20,21,"pl-s"],[21,22,"pl-s"],[22,41,"pl-corl"],[41,42,"pl-s"]],[],[[0,3,"pl-ms"]],[],[[0,24,"pl-mh"],[3,24,"pl-en"]],[],[[0,9,"pl-mh"],[4,9,"pl-en"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"],[7,7,"pl-c1"]],[[0,36,"pl-c1"]],[[0,0,"pl-c1"]],[[0,179,"pl-c1"]],[[0,0,"pl-c1"]],[[0,35,"pl-c1"]],[[0,28,"pl-c1"]],[[0,23,"pl-c1"]],[[0,0,"pl-c1"]],[[0,39,"pl-c1"]],[[0,47,"pl-c1"]],[[0,0,"pl-c1"]],[[0,24,"pl-c1"]],[[0,43,"pl-c1"]],[[0,0,"pl-c1"]],[[0,56,"pl-c1"]],[[0,52,"pl-c1"]],[[0,13,"pl-c1"]],[[0,26,"pl-c1"]],[[0,31,"pl-c1"]],[[0,0,"pl-c1"]],[[0,64,"pl-c1"]],[[0,62,"pl-c1"]],[[0,39,"pl-c1"]],[[0,31,"pl-c1"]],[[0,0,"pl-c1"]],[[0,39,"pl-c1"]],[[0,90,"pl-c1"]],[[0,232,"pl-c1"]],[[0,122,"pl-c1"]],[[0,80,"pl-c1"]],[[0,71,"pl-c1"]],[[0,68,"pl-c1"]],[[0,98,"pl-c1"]],[[0,37,"pl-c1"]],[[0,68,"pl-c1"]],[[0,62,"pl-c1"]],[[0,67,"pl-c1"]],[[0,68,"pl-c1"]],[[0,155,"pl-c1"]],[[0,101,"pl-c1"]],[[0,44,"pl-c1"]],[[0,53,"pl-c1"]],[[0,44,"pl-c1"]],[[0,44,"pl-c1"]],[[0,49,"pl-c1"]],[[0,50,"pl-c1"]],[[0,46,"pl-c1"]],[[0,52,"pl-c1"]],[[0,76,"pl-c1"]],[[0,49,"pl-c1"]],[[0,58,"pl-c1"]],[[0,90,"pl-c1"]],[[0,211,"pl-c1"]],[[0,133,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[],[],[[0,17,"pl-mh"],[4,17,"pl-en"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,15,"pl-c"],[0,1,"pl-c"]],[[36,37,"pl-k"]],[[0,3,"pl-s"]],[],[[41,42,"pl-s"],[42,50,"pl-c1"],[50,51,"pl-s"]],[],[[30,31,"pl-s"],[31,41,"pl-c1"],[41,42,"pl-s"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[[36,37,"pl-k"]],[[0,3,"pl-s"]],[],[[0,3,"pl-s"],[3,13,"pl-en"],[13,13,"pl-c1"]],[[0,43,"pl-c1"]],[[0,38,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[],[[22,23,"pl-s"],[23,33,"pl-c1"],[33,34,"pl-s"]],[],[[0,1,"pl-s"],[59,60,"pl-s"],[60,61,"pl-s"],[61,76,"pl-corl"],[76,77,"pl-s"]],[],[],[],[[18,19,"pl-s"],[19,35,"pl-c1"],[35,36,"pl-s"]],[[26,28,"pl-s"],[56,58,"pl-s"]],[],[[0,22,"pl-mh"],[4,22,"pl-en"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[],[[0,3,"pl-s"]],[],[[0,31,"pl-mh"],[4,31,"pl-en"]],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[[0,2,"pl-c1"]],[],[[0,3,"pl-s"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[],[[0,3,"pl-s"]],[],[[32,33,"pl-s"],[33,40,"pl-c1"],[40,41,"pl-s"]],[[28,29,"pl-s"],[29,40,"pl-c1"],[40,41,"pl-s"]],[[0,1,"pl-s"],[1,5,"pl-c1"],[5,6,"pl-s"]],[[0,1,"pl-s"],[1,14,"pl-c1"],[14,15,"pl-s"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[[0,3,"pl-s"]],[],[[0,13,"pl-mh"],[4,13,"pl-en"]],[],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[88,89,"pl-k"]],[[0,3,"pl-s"]],[],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[88,89,"pl-k"]],[[0,3,"pl-s"]],[],[[4,5,"pl-s"],[5,14,"pl-c1"],[14,15,"pl-s"]],[],[[0,20,"pl-mh"],[4,20,"pl-en"]],[],[[0,1,"pl-ml"],[11,12,"pl-ml"],[20,21,"pl-ml"]],[[0,1,"pl-ml"],[4,5,"pl-ml"],[8,9,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[9,11,"pl-s"],[29,30,"pl-ml"],[47,48,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[9,11,"pl-s"],[34,35,"pl-ml"],[46,47,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[11,13,"pl-s"],[21,22,"pl-ml"],[49,50,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[10,12,"pl-s"],[30,31,"pl-ml"],[47,48,"pl-s"],[48,74,"pl-c1"],[74,75,"pl-s"],[76,77,"pl-ml"]],[],[[2,5,"pl-ent"]]],"colorizedLines":null}},"title":"jcode/README.md at master · adminwat/jcode","appPayload":{},"meta":{"title":"jcode/README.md at master · adminwat/jcode"}}</script>
  <div data-target="react-app.reactRoot"><meta name="github-code-view-meta-stats" id="github-code-view-meta-stats" data-hydrostats="publish"/> <!-- --> <a hidden="" id="code-view-repo-link" href="/adminwat/jcode" data-discover="true"></a> <div class="d-none"></div><div><div style="--spacing:var(--spacing-none)" class="prc-PageLayout-PageLayoutRoot--KH-d" data-component="SplitPageLayout" data-has-sidebar="true"><div class="prc-PageLayout-SidebarWrapper-kLG4B CopilotSidePanelSidebar-module__SidePanel__L3O0C CopilotSidePanelSidebar-module__HiddenSidePanel__TBRGn" style="--spacing-column:var(--spacing-none)" data-is-hidden="false" data-position="end" data-sticky="true" data-responsive-variant="fullscreen"><div class="prc-PageLayout-VerticalDivider-9QRmK prc-PageLayout-SidebarVerticalDivider-0Rl0V" data-component="PageLayout.VerticalDivider" data-variant="line" data-position="end" style="--spacing:var(--spacing-none)"><div class="prc-PageLayout-DraggableHandle-9s6B4" data-component="PageLayout.DragHandle" role="slider" aria-label="Draggable pane splitter" aria-valuemin="450" aria-valuemax="768" aria-valuenow="544" aria-valuetext="Pane width 544 pixels" tabindex="0"></div></div><div class="prc-PageLayout-Sidebar-iciWg" data-component="SplitPageLayout.Sidebar" data-resizable="true" style="--spacing:var(--spacing-normal);--pane-min-width:450px;--pane-max-width:768px;--pane-width-custom:544px;--pane-width-size:var(--pane-width-custom);--pane-width:544px"><div class="height-full" data-testid="copilot-code-view-side-panel"><div id="copilot-side-panel-content" class="height-full"></div></div></div></div><div class="prc-PageLayout-PageLayoutWrapper-2BhU2" data-width="full"><div class="prc-PageLayout-PageLayoutContent-BneH9"><div id="repos-file-tree-sidebar" class="CodeViewFileTreeLayout-module__sidebar__n_Aau" tabindex="0"><div class="prc-PageLayout-PaneWrapper-pHPop ReposFileTreePane-module__Pane__rBZpI ReposFileTreePane-module__HideTree__AYZnm ReposFileTreePane-module__HidePane__VHAVt" style="--offset-header:0px;--spacing-row:var(--spacing-none);--spacing-column:var(--spacing-none)" data-is-hidden="false" data-position="start" data-sticky="true"><div class="prc-PageLayout-HorizontalDivider-JLVqp prc-PageLayout-PaneHorizontalDivider-9tbnE" data-component="PageLayout.HorizontalDivider" data-variant-regular="none" data-variant-narrow="none" data-position="start" style="--spacing-divider:var(--spacing-none);--spacing:var(--spacing-none)"></div><div class="prc-PageLayout-Pane-AyzHK" data-component="SplitPageLayout.Pane" data-resizable="true" style="--spacing:var(--spacing-none);--pane-min-width:256px;--pane-max-width:calc(100vw - var(--pane-max-width-diff));--pane-width-size:var(--pane-width-large);--pane-width:320px"></div><div class="prc-PageLayout-VerticalDivider-9QRmK prc-PageLayout-PaneVerticalDivider-le57g" data-component="PageLayout.VerticalDivider" data-variant-narrow="none" data-variant-regular="line" data-variant-wide="line" data-position="start" style="--spacing:var(--spacing-none)"><div class="prc-PageLayout-DraggableHandle-9s6B4" data-component="PageLayout.DragHandle" role="slider" aria-label="Draggable pane splitter" aria-valuemin="256" aria-valuemax="600" aria-valuenow="320" aria-valuetext="Pane width 320 pixels" tabindex="0"></div></div></div></div><div data-component="SplitPageLayout.Content" class="prc-PageLayout-ContentWrapper-gR9eG"><div class="prc-PageLayout-Content-xWL-A" data-width="full" style="--spacing:var(--spacing-none)"><div class="SharedPageLayout-module__content__IwGAp" data-selector="repos-split-pane-content" id="repos-split-pane-content" tabindex="0"> <!-- --> <div class="container CodeViewHeader-module__Box__JkPOb"><div class="CodeViewHeader-module__StickyHeader__Qn7UN" id="StickyHeader"><div class="CodeViewHeader-module__Box_1__SbNDV"><div class="CodeViewHeader-module__Box_2__TB46f"><div class="react-code-view-header-wrap--narrow CodeViewHeader-module__Box_3__q1zUL"><div class="CodeViewHeader-module__treeToggleWrapper__RQ__9"><h2 class="use-tree-pane-module__Heading__s4QbZ prc-Heading-Heading-MtWFE" data-component="Heading"><button data-component="Button" type="button" aria-label="Expand file tree" data-testid="expand-file-tree-button-mobile" class="prc-Button-ButtonBase-9n-Xk ExpandFileTreeButton-module__Button_1__Svs95" data-loading="false" data-size="medium" data-variant="invisible"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-arrow-left" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.78 12.53a.75.75 0 0 1-1.06 0L2.47 8.28a.75.75 0 0 1 0-1.06l4.25-4.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L4.81 7h7.44a.75.75 0 0 1 0 1.5H4.81l2.97 2.97a.75.75 0 0 1 0 1.06Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3">Files</span></span></button><button data-component="IconButton" type="button" data-testid="expand-file-tree-button" aria-controls="repos-file-tree" class="prc-Button-ButtonBase-9n-Xk position-relative ExpandFileTreeButton-module__expandButton__hDOcv ExpandFileTreeButton-module__filesButtonBreakpoint__zEvz3 fgColor-muted prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="invisible" aria-labelledby="_R_4lla9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-sidebar-collapse" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.823 7.823a.25.25 0 0 1 0 .354l-2.396 2.396A.25.25 0 0 1 4 10.396V5.604a.25.25 0 0 1 .427-.177Z"></path><path d="M1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0ZM1.5 1.75v12.5c0 .138.112.25.25.25H9.5v-13H1.75a.25.25 0 0 0-.25.25ZM11 14.5h3.25a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25H11Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="se" data-component="Tooltip" aria-hidden="true" id="_R_4lla9lik5_">Expand file tree</span><div class="d-none"></div></h2></div><div class="react-code-view-header-mb--narrow mr-2"><button data-component="Button" type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-label="master branch" data-testid="anchor-button" data-icv-name="Switch branches/tags" class="prc-Button-ButtonBase-9n-Xk ref-selector-class RefSelectorAnchoredOverlay-module__RefSelectorOverlayBtn__a3WK3" data-loading="false" data-size="medium" data-variant="default" id="ref-picker-repos-header-ref-selector-wide"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3"><div class="RefSelectorAnchoredOverlay-module__RefSelectorOverlayContainer__yaf4p"><div style="max-width:125px" class="ref-selector-button-text-container RefSelectorAnchoredOverlay-module__RefSelectorBtnTextContainer__Di3rk"><span class="RefSelectorAnchoredOverlay-module__RefSelectorText__w_fmP">master</span></div></div></span><span data-component="trailingVisual" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><div class="d-none"></div></div><div class="react-code-view-header-mb--narrow CodeViewHeader-module__Box_5__MQ0hL"><div class="Breadcrumb-module__container__Vxvev Breadcrumb-module__lg__Rjz0A"><nav data-testid="breadcrumbs" aria-labelledby="repos-header-breadcrumb-heading" id="repos-header-breadcrumb" class="Breadcrumb-module__nav__rQFDj"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading" id="repos-header-breadcrumb-heading">Breadcrumbs</h2><ol class="Breadcrumb-module__list__ZH6zr"><li class="Breadcrumb-module__listItem__Ib0x_"><a class="Breadcrumb-module__repoLink__O2Nbs prc-Link-Link-9ZwDx" data-component="Link" data-testid="breadcrumbs-repo-link" href="/adminwat/jcode/tree/master" data-discover="true">jcode</a></li></ol></nav><div data-testid="breadcrumbs-filename" class="Breadcrumb-module__filename__equZR"><span class="Breadcrumb-module__separator__eNwsI Breadcrumb-module__lg__Rjz0A" aria-hidden="true">/</span><h1 class="Breadcrumb-module__filenameHeading__MNMtw Breadcrumb-module__lg__Rjz0A prc-Heading-Heading-MtWFE" data-component="Heading" tabindex="-1" id="file-name-id">README.md</h1></div><button data-component="IconButton" type="button" class="prc-Button-ButtonBase-9n-Xk ml-2 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-labelledby="_R_7lla9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copy" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg></button><span class="CopyToClipboardIconButton-module__tooltip__WyiwL prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" data-component="Tooltip" aria-label="Copy path" aria-hidden="true" id="_R_7lla9lik5_">Copy path</span></div></div></div><div class="react-code-view-header-element--wide"><div class="CodeViewHeader-module__Box_7___0R6c"><div class="d-flex gap-2"><div><div class="CodeViewHeader-module__FileResultsList__JDzUy"><span class="d-flex FileResultsList-module__FilesSearchBox__ivVkc TextInput-wrapper prc-components-TextInputWrapper-Hpdqi prc-components-TextInputBaseWrapper-wY-n0" data-no-trailing-action="true" data-component="TextInput" data-leading-visual="true" data-trailing-visual="true" aria-busy="false"><span class="TextInput-icon" id="_R_1cpla9lik5_" aria-hidden="true" data-component="TextInput.LeadingVisual"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-search" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path></svg></span><input type="text" aria-label="Go to file" role="combobox" aria-controls="file-results-list" aria-expanded="false" aria-haspopup="dialog" autoCorrect="off" spellCheck="false" placeholder="Go to file" aria-describedby="_R_1cpla9lik5_ _R_1cpla9lik5H1_" data-component="input" class="prc-components-Input-IwWrt" value=""/><span class="TextInput-icon" id="_R_1cpla9lik5H1_" aria-hidden="true" data-component="TextInput.TrailingVisual"></span></span></div><div class="d-none"></div></div><button data-component="Button" type="button" style="display:none" class="prc-Button-ButtonBase-9n-Xk NavigationMenu-module__Button__LpKgm" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3">Blame</span></span></button><div class="d-none"></div><button data-component="IconButton" type="button" data-testid="more-file-actions-button-nav-menu-wide" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk js-blob-dropdown-click NavigationMenu-module__IconButton__HpX3G prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default" aria-labelledby="_R_7p9la9lik5_" id="_R_99la9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" data-component="Tooltip" aria-hidden="true" id="_R_7p9la9lik5_">More file actions</span></div></div></div><div class="react-code-view-header-element--narrow"><div class="CodeViewHeader-module__Box_7___0R6c"><div class="d-flex gap-2"><button data-component="Button" type="button" style="display:none" class="prc-Button-ButtonBase-9n-Xk NavigationMenu-module__Button__LpKgm" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3">Blame</span></span></button><div class="d-none"></div><button data-component="IconButton" type="button" data-testid="more-file-actions-button-nav-menu-narrow" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk js-blob-dropdown-click NavigationMenu-module__IconButton__HpX3G prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default" aria-labelledby="_R_7pdla9lik5_" id="_R_9dla9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" data-component="Tooltip" aria-hidden="true" id="_R_7pdla9lik5_">More file actions</span></div></div></div></div></div></div></div><div class="CodeView-module__contentWrapper__cG2JH"><div class="react-code-view-bottom-padding"><div class="BlobTopBanners-module__Box__v_nvx"></div></div> <div class="d-none"></div><div class="d-flex flex-column border rounded-2 tmp-mb-3 pl-1"><div class="LatestCommit-module__Box__B25ZT"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading">Latest commit</h2><div style="width:120px" class="Skeleton Skeleton--text" data-testid="loading"> </div><div class="d-flex flex-shrink-0 gap-2"><div data-testid="latest-commit-details" class="d-none d-sm-flex flex-items-center"></div><div class="d-flex gap-2"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading">History</h2><a data-component="LinkButton" href="/adminwat/jcode/commits/master/README.md" class="prc-Button-ButtonBase-9n-Xk d-none d-lg-flex LinkButton-module__linkButton__nFnov flex-items-center fgColor-default" data-loading="false" data-size="small" data-variant="invisible"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3"><span class="fgColor-default">History</span></span></span></a><div class="d-sm-none"></div><div class="d-flex d-lg-none"><a data-component="LinkButton" aria-label="View commit history for this file." href="/adminwat/jcode/commits/master/README.md" class="prc-Button-ButtonBase-9n-Xk LinkButton-module__linkButton__nFnov flex-items-center fgColor-default" data-loading="false" data-size="small" data-variant="invisible" aria-describedby="_R_4mlala9lik5_"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span></span></a><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="s" data-component="Tooltip" role="tooltip" aria-hidden="true" id="_R_4mlala9lik5_">History</span></div></div></div></div></div><div class="d-flex flex-row"><div class="container BlobViewContent-module__blobContainer__DtH2d"><div class="react-code-size-details-banner BlobViewContent-module__codeSizeDetails__e5sUw"><div class="react-code-size-details-banner CodeSizeDetails-module__Box__VcD6l"><div class="text-mono CodeSizeDetails-module__Box_1__GVxQL"><div data-testid="blob-size" class="CodeSizeDetails-module__Truncate_1__lE93V prc-Truncate-Truncate-2G1eo" data-inline="true" title="40.2 KB" style="--truncate-max-width:100%"><span>922 lines (684 loc) · 40.2 KB</span></div></div></div></div><div class="react-blob-view-header-sticky BlobViewContent-module__stickyHeader__VwxB5" id="repos-sticky-header"><div class="BlobViewHeader-module__Box__yhm9u"><div class="react-blob-sticky-header"><div class="FileNameStickyHeader-module__outerWrapper__ZL4Xc FileNameStickyHeader-module__outerWrapperHidden__Zpynk"><div class="FileNameStickyHeader-module__Box_1__Hazu5"><div class="FileNameStickyHeader-module__Box_2__hoolP"><div class="FileNameStickyHeader-module__Box_3__MVKsk"><button data-component="Button" type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-label="master branch" data-testid="anchor-button" data-icv-name="Switch branches/tags" class="prc-Button-ButtonBase-9n-Xk ref-selector-class RefSelectorAnchoredOverlay-module__RefSelectorOverlayBtn__a3WK3" data-loading="false" data-size="medium" data-variant="default" id="ref-picker-repos-header-ref-selector"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3"><div class="RefSelectorAnchoredOverlay-module__RefSelectorOverlayContainer__yaf4p"><div style="max-width:125px" class="ref-selector-button-text-container RefSelectorAnchoredOverlay-module__RefSelectorBtnTextContainer__Di3rk"><span class="RefSelectorAnchoredOverlay-module__RefSelectorText__w_fmP">master</span></div></div></span><span data-component="trailingVisual" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><div class="d-none"></div></div><div class="FileNameStickyHeader-module__Box_4__FLhtt"><div class="Breadcrumb-module__container__Vxvev Breadcrumb-module__md__Wb1Gs"><nav data-testid="breadcrumbs" aria-labelledby="sticky-breadcrumb-heading" id="sticky-breadcrumb" class="Breadcrumb-module__nav__rQFDj"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading" id="sticky-breadcrumb-heading">Breadcrumbs</h2><ol class="Breadcrumb-module__list__ZH6zr"><li class="Breadcrumb-module__listItem__Ib0x_"><a class="Breadcrumb-module__repoLink__O2Nbs prc-Link-Link-9ZwDx" data-component="Link" data-testid="breadcrumbs-repo-link" href="/adminwat/jcode/tree/master" data-discover="true">jcode</a></li></ol></nav><div data-testid="breadcrumbs-filename" class="Breadcrumb-module__filename__equZR"><span class="Breadcrumb-module__separator__eNwsI Breadcrumb-module__md__Wb1Gs" aria-hidden="true">/</span><h1 class="Breadcrumb-module__filenameHeading__MNMtw Breadcrumb-module__md__Wb1Gs prc-Heading-Heading-MtWFE" data-component="Heading" tabindex="-1" id="sticky-file-name-id">README.md</h1></div><button data-component="IconButton" type="button" class="prc-Button-ButtonBase-9n-Xk ml-2 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-labelledby="_R_7lcpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copy" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg></button><span class="CopyToClipboardIconButton-module__tooltip__WyiwL prc-TooltipV2-Tooltip-tLeuB" data-direction="s" data-component="Tooltip" aria-label="Copy path" aria-hidden="true" id="_R_7lcpala9lik5_">Copy path</span></div></div></div><button data-component="Button" type="button" class="prc-Button-ButtonBase-9n-Xk FileNameStickyHeader-module__Button__LSEU_ FileNameStickyHeader-module__GoToTopButton__nxAFn" data-loading="false" data-size="small" data-variant="invisible"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-arrow-up" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.47 7.78a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0l4.25 4.25a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018L9 4.81v7.44a.75.75 0 0 1-1.5 0V4.81L4.53 7.78a.75.75 0 0 1-1.06 0Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3">Top</span></span></button></div></div></div><div class="BlobViewHeader-module__Box_1__VEmuQ"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading">File metadata and controls</h2><div class="BlobViewHeader-module__Box_2__icUs2"><ul aria-label="File view" class="prc-SegmentedControl-SegmentedControl-lqIXp BlobTabButtons-module__SegmentedControl__jen2u" data-variant="default" data-size="small" data-component="SegmentedControl"><li class="prc-SegmentedControl-Item-tSCQh" data-selected="" data-component="SegmentedControl.Button"><button aria-pressed="true" class="prc-SegmentedControl-Button-E48xz" type="button" style="--separator-color:transparent"><span class="prc-SegmentedControl-Content-1COlk segmentedControl-content"><div class="prc-SegmentedControl-Text-7S2y2 segmentedControl-text" data-text="Preview">Preview</div></span></button></li><li class="prc-SegmentedControl-Item-tSCQh" data-component="SegmentedControl.Button"><button aria-pressed="false" class="prc-SegmentedControl-Button-E48xz" type="button" style="--separator-color:var(--borderColor-default)"><span class="prc-SegmentedControl-Content-1COlk segmentedControl-content"><div class="prc-SegmentedControl-Text-7S2y2 segmentedControl-text" data-text="Code">Code</div></span></button></li><li class="prc-SegmentedControl-Item-tSCQh" data-component="SegmentedControl.Button"><button aria-pressed="false" class="prc-SegmentedControl-Button-E48xz" type="button" style="--separator-color:var(--borderColor-default)"><span class="prc-SegmentedControl-Content-1COlk segmentedControl-content"><div class="prc-SegmentedControl-Text-7S2y2 segmentedControl-text" data-text="Blame">Blame</div></span></button></li></ul><div class="d-none"></div><div class="react-code-size-details-in-header CodeSizeDetails-module__Box__VcD6l"><div class="text-mono CodeSizeDetails-module__Box_1__GVxQL"><div data-testid="blob-size" class="CodeSizeDetails-module__Truncate_1__lE93V prc-Truncate-Truncate-2G1eo" data-inline="true" title="40.2 KB" style="--truncate-max-width:100%"><span>922 lines (684 loc) · 40.2 KB</span></div></div></div></div><div class="BlobViewHeader-module__Box_3__ng6v2"><div class="d-none"></div><div class="react-blob-header-edit-and-raw-actions BlobViewHeader-module__Box_4__J4Y4W"><div class="d-none"></div><div class="prc-ButtonGroup-ButtonGroup-vFUrY" data-component="ButtonGroup"><div class="prc-ButtonGroup-Item-PqvDl"><a data-component="LinkButton" href="https://github.com/adminwat/jcode/raw/refs/heads/master/README.md" data-testid="raw-button" class="prc-Button-ButtonBase-9n-Xk LinkButton-module__linkButton__nFnov BlobViewHeader-module__LinkButton__X9kx2" data-loading="false" data-no-visuals="true" data-size="small" data-variant="default"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3">Raw</span></span></a></div><div class="prc-ButtonGroup-Item-PqvDl"><button data-component="IconButton" type="button" data-testid="copy-raw-button" class="prc-Button-ButtonBase-9n-Xk prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="default" aria-labelledby="_R_qaucpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copy" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="n" data-component="Tooltip" aria-hidden="true" id="_R_qaucpala9lik5_">Copy raw file</span></div><div class="prc-ButtonGroup-Item-PqvDl"><button data-component="IconButton" type="button" data-testid="download-raw-button" class="prc-Button-ButtonBase-9n-Xk BlobViewHeader-module__downloadButton__ef459 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="default" aria-labelledby="_R_eaucpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-download" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2.75 14A1.75 1.75 0 0 1 1 12.25v-2.5a.75.75 0 0 1 1.5 0v2.5c0 .138.112.25.25.25h10.5a.25.25 0 0 0 .25-.25v-2.5a.75.75 0 0 1 1.5 0v2.5A1.75 1.75 0 0 1 13.25 14Z"></path><path d="M7.25 7.689V2a.75.75 0 0 1 1.5 0v5.689l1.97-1.969a.749.749 0 1 1 1.06 1.06l-3.25 3.25a.749.749 0 0 1-1.06 0L4.22 6.78a.749.749 0 1 1 1.06-1.06l1.97 1.969Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="n" data-component="Tooltip" aria-hidden="true" id="_R_eaucpala9lik5_">Download raw file</span></div></div></div><button data-component="IconButton" type="button" aria-pressed="false" class="prc-Button-ButtonBase-9n-Xk tmp-mr-2 TableOfContents-module__IconButton__jrlNM prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-labelledby="_R_3ucpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-list-unordered" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M5.75 2.5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Zm0 5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Zm0 5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5ZM2 14a1 1 0 1 1 0-2 1 1 0 0 1 0 2Zm1-6a1 1 0 1 1-2 0 1 1 0 0 1 2 0ZM2 4a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="n" data-component="Tooltip" aria-hidden="true" id="_R_3ucpala9lik5_">Outline</span><div class="react-blob-header-edit-and-raw-actions-combined"><button data-component="IconButton" type="button" title="More file actions" data-testid="more-file-actions-button" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk js-blob-dropdown-click BlobViewHeader-module__IconButton__XrMQY prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-labelledby="_R_fkecpala9lik5_" id="_R_kecpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" data-component="Tooltip" aria-hidden="true" id="_R_fkecpala9lik5_">Edit and raw actions</span></div></div></div></div><div></div></div><div class="BlobViewContent-module__blobContentWrapper__JS0W6"><section aria-labelledby="file-name-id-wide file-name-id-mobile" class="BlobContent-module__blobContentSection__VOgZq BlobContent-module__blobContentSectionMarkdown__mPLOK" style="margin-top:46px"><div class="js-snippet-clipboard-copy-unpositioned BlobContent-module__markdownBlob__T8jpG" data-hpc="true" containertiming="hpc"><article class="markdown-body entry-content container-lg" itemprop="text"><div align="center" dir="auto">
<div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">jcode</h1><a id="user-content-jcode" class="anchor" aria-label="Permalink: jcode" href="#jcode"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto"><a href="https://github.com/1jehuang/jcode/releases"><img src="https://camo.githubusercontent.com/81e8711b3ae8d6756daa390ea9dd71b3adb8c7e8b578db66923afbd9cd0e0b82/68747470733a2f2f62616467656e2e6e65742f6769746875622f72656c656173652f316a656875616e672f6a636f64653f69636f6e3d676974687562" alt="Latest Release" data-canonical-src="https://badgen.net/github/release/1jehuang/jcode?icon=github" style="max-width: 100%;"></a>
<a href="/adminwat/jcode/blob/master/LICENSE"><img src="https://camo.githubusercontent.com/ac049ef4e7a0b7196b09add6ac2d4f180e544c0ac779c2b2ac2fd2723a209579/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75653f7374796c653d666c61742d737175617265" alt="License: MIT" data-canonical-src="https://img.shields.io/badge/license-MIT-blue?style=flat-square" style="max-width: 100%;"></a>
<a href="https://github.com/1jehuang/jcode/releases"><img src="https://camo.githubusercontent.com/bc7221598118259fb48a26a2437a3100daf77b5a49d0a56bfeb6411b2d11a252/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f706c6174666f726d732d4c696e75782532302537432532306d61634f5325323025374325323057696e646f77732d626c75653f7374796c653d666c61742d737175617265" alt="Platforms" data-canonical-src="https://img.shields.io/badge/platforms-Linux%20%7C%20macOS%20%7C%20Windows-blue?style=flat-square" style="max-width: 100%;"></a>
<a href="https://github.com/1jehuang/jcode/commits/master"><img src="https://camo.githubusercontent.com/19a5f4b3ac3b0a6248f1cb4632b1ac035bb4d9063fce698b2c26f9125122b655/68747470733a2f2f62616467656e2e6e65742f6769746875622f6c6173742d636f6d6d69742f316a656875616e672f6a636f64652f6d61737465723f69636f6e3d676974687562" alt="Last Commit" data-canonical-src="https://badgen.net/github/last-commit/1jehuang/jcode/master?icon=github" style="max-width: 100%;"></a>
<a href="https://github.com/1jehuang/jcode/stargazers"><img src="https://camo.githubusercontent.com/beb7702ef0f030e02e5df0560b08d3cb2f9db61dcbb947b114e8d057519dda05/68747470733a2f2f62616467656e2e6e65742f6769746875622f73746172732f316a656875616e672f6a636f64653f69636f6e3d676974687562" alt="GitHub Stars" data-canonical-src="https://badgen.net/github/stars/1jehuang/jcode?icon=github" style="max-width: 100%;"></a>
<a href="https://discord.gg/nBe9vGyK9a" rel="nofollow"><img src="https://camo.githubusercontent.com/60250c1b6ce82e771da309c4fbb7f53e9c6dc39da677882a0342e88edf155096/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446973636f72642d4a6f696e253230436f6d6d756e6974792d3538363546323f7374796c653d666c61742d737175617265266c6f676f3d646973636f7264266c6f676f436f6c6f723d7768697465" alt="Discord" data-canonical-src="https://img.shields.io/badge/Discord-Join%20Community-5865F2?style=flat-square&amp;logo=discord&amp;logoColor=white" style="max-width: 100%;"></a></p>
<p dir="auto">The most RAM efficient harness <br>
The most intelligent harness</p>
<p dir="auto"><a href="https://trendshift.io/repositories/25042?utm_source=repository-badge&amp;utm_medium=badge&amp;utm_campaign=badge-repository-25042" rel="nofollow"><img src="https://camo.githubusercontent.com/14344e459e91492bf25512a9352022a69fcd9ab4feab8578faa475221e4ceeb2/68747470733a2f2f7472656e6473686966742e696f2f6170692f62616467652f7265706f7369746f726965732f3235303432" alt="1jehuang/jcode | Trendshift" width="250" height="55" data-canonical-src="https://trendshift.io/api/badge/repositories/25042" style="max-width: 100%; height: auto; max-height: 55px;; aspect-ratio: 250 / 55; background-color: var(--bgColor-muted); border-radius: 6px" class="js-gh-image-fallback"></a></p>
<p dir="auto"><a href="https://github.com/1jehuang/jcode/stargazers"><img src="/adminwat/jcode/raw/master/docs/images/star-history.svg" alt="jcode cumulative GitHub stars over time, sampled weekly" width="700" style="max-width: 100%;"></a></p>
<a href="https://github.com/1jehuang/jcode/releases/download/readme-assets/jcode-yc-launch.mp4">
  <img src="https://github.com/1jehuang/jcode/releases/download/readme-assets/jcode-yc-launch.webp" alt="jcode YC launch video" width="800" style="max-width: 100%;">
</a>
<br>
<p dir="auto"><a href="https://jcode.sh" rel="nofollow">Website</a> · <a href="https://jcode.sh/docs" rel="nofollow">Docs</a> · <a href="https://jcode.sh/sdk" rel="nofollow">SDK</a> · <a href="https://jcode.sh/bench" rel="nofollow">Benchmarks</a> · <a href="#features">Features</a> · <a href="#installation">Install</a> · <a href="#quick-start">Quick Start</a> · <a href="#further-reading">Further Reading</a> · <a href="/adminwat/jcode/blob/master/CONTRIBUTING.md">Contributing</a></p>
</div>
<hr>
<div align="center" dir="auto">
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Installation</h2><a id="user-content-installation" class="anchor" aria-label="Permalink: Installation" href="#installation"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
</div>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# macOS &amp; Linux
curl -fsSL https://jcode.sh/install | bash"><pre><span class="pl-c"><span class="pl-c">#</span> macOS &amp; Linux</span>
curl -fsSL https://jcode.sh/install <span class="pl-k">|</span> bash</pre></div>
<div class="highlight highlight-source-powershell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# Windows 11 (PowerShell 5.1+)
irm https://jcode.sh/install.ps1 | iex"><pre><span class="pl-c"><span class="pl-c">#</span> Windows 11 (PowerShell 5.1+)</span>
irm https:<span class="pl-k">//</span>jcode.sh<span class="pl-k">/</span>install.ps1 <span class="pl-k">|</span> iex</pre></div>
<p dir="auto">Need Homebrew, source builds, provider setup, or want an agent to set it up for you?
<a href="#detailed-installation">Jump to detailed installation</a>.</p>
<hr>
<div align="center" dir="auto">
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Performance &amp; Resource Efficiency</h2><a id="user-content-performance--resource-efficiency" class="anchor" aria-label="Permalink: Performance &amp; Resource Efficiency" href="#performance--resource-efficiency"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
</div>
<p dir="auto">jcode is built to be as performant and resource efficient as possible. Every metric is optimized to the bone, which is important for scaling multi-session workflows. Here we sample a few metrics to show the difference: RAM usage and boot up.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">RAM comparison</h3><a id="user-content-ram-comparison" class="anchor" aria-label="Permalink: RAM comparison" href="#ram-comparison"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<div align="center" dir="auto">
<markdown-accessiblity-table><table>
  <tbody><tr>
    <td valign="top" align="center" width="50%">
      <strong>1 active session</strong>
      <table>
        <thead>
          <tr>
            <th>Tool</th>
            <th>PSS</th>
            <th>Comparison</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td><strong>jcode (local embedding off)</strong></td>
            <td align="right"><strong>27.8 MB</strong></td>
            <td align="right">baseline</td>
          </tr>
          <tr>
            <td><strong>jcode</strong></td>
            <td align="right"><strong>167.1 MB</strong></td>
            <td align="right"><strong>6.0× more RAM</strong></td>
          </tr>
          <tr>
            <td><strong>pi</strong></td>
            <td align="right"><strong>144.4 MB</strong></td>
            <td align="right"><strong>5.2× more RAM</strong></td>
          </tr>
          <tr>
            <td><strong>Codex CLI</strong></td>
            <td align="right"><strong>140.0 MB</strong></td>
            <td align="right"><strong>5.0× more RAM</strong></td>
          </tr>
          <tr>
            <td><strong>OpenCode</strong></td>
            <td align="right"><strong>371.5 MB</strong></td>
            <td align="right"><strong>13.4× more RAM</strong></td>
          </tr>
          <tr>
            <td><strong>GitHub Copilot CLI</strong></td>
            <td align="right"><strong>333.3 MB</strong></td>
            <td align="right"><strong>12.0× more RAM</strong></td>
          </tr>
          <tr>
            <td><strong>Cursor Agent</strong></td>
            <td align="right"><strong>214.9 MB</strong></td>
            <td align="right"><strong>7.7× more RAM</strong></td>
          </tr>
          <tr>
            <td><strong>Claude Code</strong></td>
            <td align="right"><strong>386.6 MB</strong></td>
            <td align="right"><strong>13.9× more RAM</strong></td>
          </tr>
          <tr>
            <td><strong>Antigravity CLI</strong></td>
            <td align="right"><strong>243.7 MB</strong></td>
            <td align="right"><strong>8.8× more RAM</strong></td>
          </tr>
        </tbody>
      </table>
    </td>
    <td width="24"></td>
    <td valign="top" align="center" width="50%">
      <strong>10 active sessions</strong>
      <table>
        <thead>
          <tr>
            <th>Tool</th>
            <th>PSS</th>
            <th>Comparison</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td><strong>jcode (local embedding off)</strong></td>
            <td align="right"><strong>117.0 MB</strong></td>
            <td align="right">baseline</td>
          </tr>
          <tr>
            <td><strong>jcode</strong></td>
            <td align="right"><strong>260.8 MB</strong></td>
            <td align="right"><strong>2.2× more RAM</strong></td>
          </tr>
          <tr>
            <td><strong>pi</strong></td>
            <td align="right"><strong>833.0 MB</strong></td>
            <td align="right"><strong>7.1× more RAM</strong></td>
          </tr>
          <tr>
            <td><strong>Codex CLI</strong></td>
            <td align="right"><strong>334.8 MB</strong></td>
            <td align="right"><strong>2.9× more RAM</strong></td>
          </tr>
          <tr>
            <td><strong>OpenCode</strong></td>
            <td align="right"><strong>3237.2 MB</strong></td>
            <td align="right"><strong>27.7× more RAM</strong></td>
          </tr>
          <tr>
            <td><strong>GitHub Copilot CLI</strong></td>
            <td align="right"><strong>1756.5 MB</strong></td>
            <td align="right"><strong>15.0× more RAM</strong></td>
          </tr>
          <tr>
            <td><strong>Cursor Agent</strong></td>
            <td align="right"><strong>1632.4 MB</strong></td>
            <td align="right"><strong>14.0× more RAM</strong></td>
          </tr>
          <tr>
            <td><strong>Claude Code</strong></td>
            <td align="right"><strong>2300.6 MB</strong></td>
            <td align="right"><strong>19.7× more RAM</strong></td>
          </tr>
          <tr>
            <td><strong>Antigravity CLI</strong></td>
            <td align="right"><strong>1021.2 MB</strong></td>
            <td align="right"><strong>8.7× more RAM</strong></td>
          </tr>
        </tbody>
      </table>
    </td>
  </tr>
</tbody></table></markdown-accessiblity-table>
</div>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Time to first frame</h3><a id="user-content-time-to-first-frame" class="anchor" aria-label="Permalink: Time to first frame" href="#time-to-first-frame"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<div align="center" dir="auto">
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Tool</th>
<th align="right">Time to first frame</th>
<th align="right">Range</th>
<th align="right">Comparison</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>jcode</strong></td>
<td align="right"><strong>14.0 ms</strong></td>
<td align="right">10.1–19.3 ms</td>
<td align="right">baseline</td>
</tr>
<tr>
<td><strong>Antigravity CLI</strong></td>
<td align="right"><strong>383.5 ms</strong></td>
<td align="right">363.1–415.4 ms</td>
<td align="right"><strong>27.4× slower</strong></td>
</tr>
<tr>
<td><strong>pi</strong></td>
<td align="right"><strong>590.7 ms</strong></td>
<td align="right">369.6–934.8 ms</td>
<td align="right"><strong>42.2× slower</strong></td>
</tr>
<tr>
<td><strong>Codex CLI</strong></td>
<td align="right"><strong>882.8 ms</strong></td>
<td align="right">742.3–1640.9 ms</td>
<td align="right"><strong>63.1× slower</strong></td>
</tr>
<tr>
<td><strong>OpenCode</strong></td>
<td align="right"><strong>1035.9 ms</strong></td>
<td align="right">922.5–1104.4 ms</td>
<td align="right"><strong>74.0× slower</strong></td>
</tr>
<tr>
<td><strong>GitHub Copilot CLI</strong></td>
<td align="right"><strong>1518.6 ms</strong></td>
<td align="right">1357.4–1826.8 ms</td>
<td align="right"><strong>108.5× slower</strong></td>
</tr>
<tr>
<td><strong>Cursor Agent</strong></td>
<td align="right"><strong>1949.7 ms</strong></td>
<td align="right">1711.0–2104.8 ms</td>
<td align="right"><strong>139.3× slower</strong></td>
</tr>
<tr>
<td><strong>Claude Code</strong></td>
<td align="right"><strong>3436.9 ms</strong></td>
<td align="right">2032.7–8927.2 ms</td>
<td align="right"><strong>245.5× slower</strong></td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
</div>
<p dir="auto">Measured on this Linux machine across 10 interactive PTY launches.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Time to first input</h3><a id="user-content-time-to-first-input" class="anchor" aria-label="Permalink: Time to first input" href="#time-to-first-input"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">(time until typed probe text appears on the rendered screen; Antigravity uses its internal input-ready log marker because the sign-in screen suppresses probe echo.)</p>
<div align="center" dir="auto">
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Tool</th>
<th align="right">Time to first input</th>
<th align="right">Range</th>
<th align="right">Comparison</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>jcode</strong></td>
<td align="right"><strong>48.7 ms</strong></td>
<td align="right">30.3–62.7 ms</td>
<td align="right">baseline</td>
</tr>
<tr>
<td><strong>Antigravity CLI</strong></td>
<td align="right"><strong>383.7 ms</strong></td>
<td align="right">363.4–415.7 ms</td>
<td align="right"><strong>7.9× slower</strong></td>
</tr>
<tr>
<td><strong>pi</strong></td>
<td align="right"><strong>596.4 ms</strong></td>
<td align="right">373.9–955.2 ms</td>
<td align="right"><strong>12.2× slower</strong></td>
</tr>
<tr>
<td><strong>Codex CLI</strong></td>
<td align="right"><strong>905.8 ms</strong></td>
<td align="right">760.1–1675.7 ms</td>
<td align="right"><strong>18.6× slower</strong></td>
</tr>
<tr>
<td><strong>OpenCode</strong></td>
<td align="right"><strong>1047.9 ms</strong></td>
<td align="right">931.1–1116.9 ms</td>
<td align="right"><strong>21.5× slower</strong></td>
</tr>
<tr>
<td><strong>GitHub Copilot CLI</strong></td>
<td align="right"><strong>1583.4 ms</strong></td>
<td align="right">1422.8–1880.0 ms</td>
<td align="right"><strong>32.5× slower</strong></td>
</tr>
<tr>
<td><strong>Cursor Agent</strong></td>
<td align="right"><strong>1978.7 ms</strong></td>
<td align="right">1727.3–2130.0 ms</td>
<td align="right"><strong>40.6× slower</strong></td>
</tr>
<tr>
<td><strong>Claude Code</strong></td>
<td align="right"><strong>3512.8 ms</strong></td>
<td align="right">2137.4–9002.0 ms</td>
<td align="right"><strong>72.2× slower</strong></td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
</div>
<p dir="auto">Measured on this Linux machine across 10 interactive PTY launches. Antigravity CLI was unauthenticated for this run; its sign-in screen rendered normally and emitted an internal <code>CLI ready for user input</code> marker, but did not echo the typed probe.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Additional clients / memory scaling</h3><a id="user-content-additional-clients--memory-scaling" class="anchor" aria-label="Permalink: Additional clients / memory scaling" href="#additional-clients--memory-scaling"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<div align="center" dir="auto">
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Tool</th>
<th align="right">Extra PSS per added session</th>
<th align="right">Comparison</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>jcode (local embedding off)</strong></td>
<td align="right"><strong>~9.9 MB</strong></td>
<td align="right">baseline</td>
</tr>
<tr>
<td><strong>jcode</strong></td>
<td align="right"><strong>~10.4 MB</strong></td>
<td align="right"><strong>1.1× more RAM</strong></td>
</tr>
<tr>
<td><strong>pi</strong></td>
<td align="right"><strong>~76.5 MB</strong></td>
<td align="right"><strong>7.7× more RAM</strong></td>
</tr>
<tr>
<td><strong>Codex CLI</strong></td>
<td align="right"><strong>~21.6 MB</strong></td>
<td align="right"><strong>2.2× more RAM</strong></td>
</tr>
<tr>
<td><strong>OpenCode</strong></td>
<td align="right"><strong>~318.4 MB</strong></td>
<td align="right"><strong>32.2× more RAM</strong></td>
</tr>
<tr>
<td><strong>GitHub Copilot CLI</strong></td>
<td align="right"><strong>~158.1 MB</strong></td>
<td align="right"><strong>16.0× more RAM</strong></td>
</tr>
<tr>
<td><strong>Cursor Agent</strong></td>
<td align="right"><strong>~157.5 MB</strong></td>
<td align="right"><strong>15.9× more RAM</strong></td>
</tr>
<tr>
<td><strong>Claude Code</strong></td>
<td align="right"><strong>~212.7 MB</strong></td>
<td align="right"><strong>21.5× more RAM</strong></td>
</tr>
<tr>
<td><strong>Antigravity CLI</strong></td>
<td align="right"><strong>~86.4 MB</strong></td>
<td align="right"><strong>8.7× more RAM</strong></td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
</div>
versions tested for this corrected memory rerun:
<ul dir="auto">
<li><code>jcode v0.9.1888-dev (be386f2)</code></li>
<li><code>pi 0.62.0</code></li>
<li><code>codex-cli 0.120.0</code></li>
<li><code>opencode 1.0.203</code></li>
<li><code>GitHub Copilot CLI 1.0.24</code> for the 1-session rerun, <code>GitHub Copilot CLI 1.0.27</code> for the 10-session rerun</li>
<li><code>Cursor Agent 2026.04.08-a41fba1</code></li>
<li><code>Claude Code 2.1.86 (Claude Code)</code></li>
<li><code>Antigravity CLI 1.0.0</code></li>
</ul>
<div align="center" dir="auto">
  <a href="https://github.com/1jehuang/jcode/releases/download/readme-assets/jcode-performance-demo.mp4">
    <img src="https://github.com/1jehuang/jcode/releases/download/readme-assets/jcode-performance-demo.webp" alt="jcode performance demonstration" width="900" style="max-width: 100%;">
  </a>
  <p dir="auto"><em>jcode performance demonstration</em></p>
</div>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Memory (Agent memory)</h2><a id="user-content-memory-agent-memory" class="anchor" aria-label="Permalink: Memory (Agent memory)" href="#memory-agent-memory"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Jcode embeds each turn/response as a semantic vector. Every turn does queries a graph of memories to efficiently find related memory entries via a cosine similarity check. The embedding hits are fed into the conversation, or optionally uses a memory sideagent which verifies the memories are relevant, and potentially does more work for information retreival before injecting into the conversation. This results in a human like memory system which allows the agent to automatically recall relevant information to the conversation without actively calling memory tools or being a token burner.
ot
To have memories which are retrieved, they must also be extracted and stored. Every so often (semantic drift, K turns since last extraction, session end, etc), memories are extracted via a memory sideagent, and put into the memory graph.</p>
<p dir="auto">The harness also provides explicit memory tools to allow the agent to actively search or store the memory without relying on a passive background process. The harness also provides session search for traditional RAG on previous sessions.</p>
<p dir="auto">Memories are automatically consolidated every so often via the ambient mode. This reorganizes, checks for staleness and conflicts, etc</p>
<div align="center" dir="auto">
  <a href="https://github.com/1jehuang/jcode/releases/download/readme-assets/jcode-memory-demo.mp4">
    <img src="https://github.com/1jehuang/jcode/releases/download/readme-assets/jcode-memory-demo.webp" alt="jcode memory demonstration" width="900" style="max-width: 100%;">
  </a>
  <p dir="auto"><em>jcode memory demonstration</em></p>
</div>

<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">UI: Side panels, Diagrams, Info Widgets, rendering, scrolling, alignment</h2><a id="user-content-ui-side-panels-diagrams-info-widgets-rendering-scrolling-alignment" class="anchor" aria-label="Permalink: UI: Side panels, Diagrams, Info Widgets, rendering, scrolling, alignment" href="#ui-side-panels-diagrams-info-widgets-rendering-scrolling-alignment"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">The side panel is a place for auxiliary information. Tell your jcode agent to load a file into the side panel and see it update in real time, or tell your agent to write directly to the side panel, or use it as a diff viewer. The side panel (and chat) is able to render mermaid diagrams inline.
<a target="_blank" rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/94247773/571793349-6c7bec81-ef3f-434d-8a7b-d55f8a54e5cf.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3OTE0NTcwMDYsIm5iZiI6MTc5MTQ1NjcwNiwicGF0aCI6Ii85NDI0Nzc3My81NzE3OTMzNDktNmM3YmVjODEtZWYzZi00MzRkLThhN2ItZDU1ZjhhNTRlNWNmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjEwMDglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYxMDA4VDEwNTE0NlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTY3ODhjYTliYWEwMzg2OWMwMTVjMDk4MzhmN2I2MmRlNDU1N2JjNzhkYWQ4NzZkYzA2NWFmNzE2MjgyYmRjYjQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRnBuZyJ9.C5vJtZnrg5b450oBtZ2gpXkL2QX3r-YI7uaBlga1RAY"><img width="2000" height="1225" alt="image" src="https://private-user-images.githubusercontent.com/94247773/571793349-6c7bec81-ef3f-434d-8a7b-d55f8a54e5cf.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3OTE0NTcwMDYsIm5iZiI6MTc5MTQ1NjcwNiwicGF0aCI6Ii85NDI0Nzc3My81NzE3OTMzNDktNmM3YmVjODEtZWYzZi00MzRkLThhN2ItZDU1ZjhhNTRlNWNmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjEwMDglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYxMDA4VDEwNTE0NlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTY3ODhjYTliYWEwMzg2OWMwMTVjMDk4MzhmN2I2MmRlNDU1N2JjNzhkYWQ4NzZkYzA2NWFmNzE2MjgyYmRjYjQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRnBuZyJ9.C5vJtZnrg5b450oBtZ2gpXkL2QX3r-YI7uaBlga1RAY" style="max-width: 100%; height: auto; max-height: 1225px;; aspect-ratio: 2000 / 1225; background-color: var(--bgColor-muted); border-radius: 6px" class="js-gh-image-fallback"></a></p>
<p dir="auto">To make this possible, I created a new mermaid rendering library to render diagrams 1800x faster. It has no browser or Typescript dependency. See <a href="https://github.com/1jehuang/mermaid-rs-renderer">https://github.com/1jehuang/mermaid-rs-renderer</a></p>
<p dir="auto">To show you important information without taking space away from the screen that could be used for responses, I developed info widgets. Info widgets will only ever take up the negative space on the screen to show you information, and will get out of the way if there isn't any.</p>
<p dir="auto">Jcode can render at over a thousand fps. Your monitor will not have the refresh rate to show you, but this means you will not have silly flicker problems.</p>
<p dir="auto">The custom scrollback implementation of jcode allows it to do much more than a native scrollback. However, it is a terminal-level limitation that I cannot have smooth, partial line scrolling with a custom scrollback. To fix this, I made my own terminal. Handterm <a href="https://github.com/1jehuang/handterm">https://github.com/1jehuang/handterm</a> implements a native scroll api, and also happens to be very efficient. This is a work in progress. Scrolling is still well implemented for normal terminals.</p>
<p dir="auto">Jcode is left-aligned by default. You can switch to centered mode with the <code>Alt+C</code> hotkey, with the <code>/alignment</code> command, or in the config.</p>
<p dir="auto">To disable emoji globally in TUI and CLI output, set <code>emoji = false</code> under <code>[display]</code> in <code>~/.jcode/config.toml</code>, or launch with <code>JCODE_NO_EMOJI=1</code>. Jcode replaces emoji with compact ASCII markers while preserving other Unicode text.</p>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Swarm</h2><a id="user-content-swarm" class="anchor" aria-label="Permalink: Swarm" href="#swarm"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Spawn two or more agents in the same repo, and they will automatically be managed by the server to allow native collaboration. When agent A edits a file that agent B has read (code shifting under its feet), the server notifies agent B. Agent B can ignore it if it is not relevant, or it can check the diff to make sure that it doesn't conflict. Each agent has messaging abilities, capable of DMing just one agent, broadcasting to all other agents hosted by the server, or just agents working in that repo. This allows you to spawn multiple sessions in the same repo, and have all conflicts automatically resolved.</p>
<div align="center" dir="auto">
  <a href="https://github.com/1jehuang/jcode/releases/download/readme-assets/swarm-demo.mp4">
    <img src="https://github.com/1jehuang/jcode/releases/download/readme-assets/jcode-swarm-demonstration.webp" alt="jcode swarm demonstration" width="900" style="max-width: 100%;">
  </a>
  <p dir="auto"><em>jcode swarm demonstration</em></p>
</div>
<p dir="auto">Agents are also able to spawn their own swarms autonomously. They have a swarm tool which allows them to spawn in their own teamates to accomplish tasks in parallel. Doing so turns the main agent into a coordinator and the spawned agents into workers. Groups of agents, their messaging channels, their completion statuses, etc are all automatically managed. This can be done headlessly or headed.</p>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">OAuth and Providers</h2><a id="user-content-oauth-and-providers" class="anchor" aria-label="Permalink: OAuth and Providers" href="#oauth-and-providers"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">jcode works with subscription-backed OAuth flows and many provider integrations, so you can use the models you already pay for and still fall back to direct API providers when needed.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Supported built-in login flows</h3><a id="user-content-supported-built-in-login-flows" class="anchor" aria-label="Permalink: Supported built-in login flows" href="#supported-built-in-login-flows"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<ul dir="auto">
<li><strong>Claude</strong> (<code>jcode login --provider claude</code>)</li>
<li><strong>OpenAI / ChatGPT / Codex</strong> (<code>jcode login --provider openai</code>)</li>
<li><strong>Google Gemini</strong> (<code>jcode login --provider gemini</code>)</li>
<li><strong>GitHub Copilot</strong> (<code>jcode login --provider copilot</code>)</li>
<li><strong>Azure OpenAI</strong> (<code>jcode login --provider azure</code>)</li>
<li><strong>Alibaba Cloud Coding Plan</strong> (<code>jcode login --provider alibaba-coding-plan</code>)</li>
<li><strong>Fireworks</strong> (<code>jcode login --provider fireworks</code>)</li>
<li><strong>MiniMax</strong> (<code>jcode login --provider minimax</code>)</li>
<li><strong>Meta Model API / Muse</strong> (<code>jcode login --provider meta-muse</code>)</li>
<li><strong>LM Studio</strong> (<code>jcode login --provider lmstudio</code>)</li>
<li><strong>Ollama</strong> (<code>jcode login --provider ollama</code>)</li>
<li><strong>Custom OpenAI-compatible endpoint</strong> (<code>jcode login --provider openai-compatible</code>)</li>
</ul>
<p dir="auto">For custom OpenAI-compatible endpoints, jcode now prompts for the API base and supports local localhost servers without requiring an API key.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Config-file setup for self-hosted endpoints and MCP</h3><a id="user-content-config-file-setup-for-self-hosted-endpoints-and-mcp" class="anchor" aria-label="Permalink: Config-file setup for self-hosted endpoints and MCP" href="#config-file-setup-for-self-hosted-endpoints-and-mcp"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">If you prefer to configure things by editing files instead of using the login UI, jcode supports both a custom OpenAI-compatible endpoint config and MCP config files.</p>
<div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">OpenAI-compatible providers</h4><a id="user-content-openai-compatible-providers" class="anchor" aria-label="Permalink: OpenAI-compatible providers" href="#openai-compatible-providers"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Many hosted services speak the standard OpenAI <code>/v1/chat/completions</code> API. jcode talks to them through one shared OpenAI-compatible provider, so you can use almost any such endpoint without waiting for a dedicated integration.</p>
<p dir="auto">There are two ways to set one up:</p>
<ul dir="auto">
<li>
<p dir="auto"><strong>Built-in named profiles</strong> — jcode ships ready-made profiles for several popular OpenAI-compatible services. Log in by id and jcode fills in the base URL and key environment variable for you:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="jcode login --provider &lt;profile-id&gt;
# for example:
jcode login --provider openrouter
jcode login --provider orcarouter
jcode login --provider deepseek
jcode login --provider opencode      # OpenCode Zen
jcode login --provider moonshotai
jcode login --provider meta-muse     # Meta Model API / Muse Spark"><pre>jcode login --provider <span class="pl-k">&lt;</span>profile-id<span class="pl-k">&gt;</span>
<span class="pl-c"><span class="pl-c">#</span> for example:</span>
jcode login --provider openrouter
jcode login --provider orcarouter
jcode login --provider deepseek
jcode login --provider opencode      <span class="pl-c"><span class="pl-c">#</span> OpenCode Zen</span>
jcode login --provider moonshotai
jcode login --provider meta-muse     <span class="pl-c"><span class="pl-c">#</span> Meta Model API / Muse Spark</span></pre></div>
<p dir="auto">Built-in OpenAI-compatible profile ids include: <code>openrouter</code>, <code>orcarouter</code>, <code>deepseek</code>, <code>zai</code>, <code>kimi</code>, <code>moonshotai</code>, <code>meta-muse</code> (Meta Model API / Muse Spark), <code>opencode</code> (OpenCode Zen), <code>opencode-go</code>, <code>302ai</code>, <code>baseten</code>, <code>cortecs</code>, <code>huggingface</code>, <code>nebius</code>, <code>scaleway</code>, <code>stackit</code>, and <code>firmware</code>. Each profile only sets the endpoint and key variable; you still pick the model with <code>/model</code> (or <code>--model</code>). Run <code>jcode login</code> with no provider to see the interactive list.</p>
</li>
<li>
<p dir="auto"><strong>Any other endpoint</strong> — point jcode at an arbitrary OpenAI-compatible API (hosted or local) with <code>jcode login --provider openai-compatible</code> or the scriptable <code>jcode provider add</code> command described below.</p>
</li>
</ul>
<p dir="auto">Useful environment overrides for these endpoints:</p>
<ul dir="auto">
<li><code>JCODE_STREAM_IDLE_TIMEOUT_SECS</code> — raise the base streaming idle timeout (default 180s) for slow reasoning models that think silently before emitting tokens. High reasoning efforts scale this automatically (high 2x, xhigh 3x, max 4x). Also settable as <code>[provider] stream_idle_timeout_secs</code> in <code>config.toml</code>.</li>
<li>Per-model <code>context_window</code> (alias <code>context_limit</code>) in a <code>[[providers.&lt;name&gt;.models]]</code> entry — set the context window when the endpoint has no usable <code>/v1/models</code> response, so jcode does not fall back to the generic 200k default.</li>
<li><code>extra_body</code> — inject non-standard top-level fields into every chat/completions request body for backends that require them. See <a href="#extra-request-body-fields-extra_body">Extra request-body fields</a> below.</li>
</ul>
<p dir="auto">For details on self-hosting, local runtimes, and the exact config file shape, see below.</p>
<div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Self-hosted OpenAI-compatible endpoints, including vLLM</h4><a id="user-content-self-hosted-openai-compatible-endpoints-including-vllm" class="anchor" aria-label="Permalink: Self-hosted OpenAI-compatible endpoints, including vLLM" href="#self-hosted-openai-compatible-endpoints-including-vllm"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">For agents and scripts, the preferred path is the one-shot provider profile command. It writes a named profile to <code>~/.jcode/config.toml</code>, stores secrets in jcode's private app config directory when requested, and prints exact run/validation commands:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# Secret-safe setup for a hosted OpenAI-compatible API.
printf '%s' &quot;$MY_API_KEY&quot; | jcode provider add my-api \
  --base-url https://llm.example.com/v1 \
  --model my-model-id \
  --api-key-stdin \
  --set-default \
  --json

# Smoke test the profile.
jcode --provider-profile my-api auth-test --prompt 'Reply exactly JCODE_PROVIDER_SETUP_OK'

# Use it directly.
jcode --provider-profile my-api run 'hello'"><pre><span class="pl-c"><span class="pl-c">#</span> Secret-safe setup for a hosted OpenAI-compatible API.</span>
<span class="pl-c1">printf</span> <span class="pl-s"><span class="pl-pds">'</span>%s<span class="pl-pds">'</span></span> <span class="pl-s"><span class="pl-pds">"</span><span class="pl-smi">$MY_API_KEY</span><span class="pl-pds">"</span></span> <span class="pl-k">|</span> jcode provider add my-api \
  --base-url https://llm.example.com/v1 \
  --model my-model-id \
  --api-key-stdin \
  --set-default \
  --json

<span class="pl-c"><span class="pl-c">#</span> Smoke test the profile.</span>
jcode --provider-profile my-api auth-test --prompt <span class="pl-s"><span class="pl-pds">'</span>Reply exactly JCODE_PROVIDER_SETUP_OK<span class="pl-pds">'</span></span>

<span class="pl-c"><span class="pl-c">#</span> Use it directly.</span>
jcode --provider-profile my-api run <span class="pl-s"><span class="pl-pds">'</span>hello<span class="pl-pds">'</span></span></pre></div>
<p dir="auto">For local servers that do not require auth:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="jcode provider add local-vllm \
  --base-url http://localhost:8000/v1 \
  --model Qwen/Qwen3-Coder-30B-A3B-Instruct \
  --no-api-key \
  --set-default"><pre>jcode provider add local-vllm \
  --base-url http://localhost:8000/v1 \
  --model Qwen/Qwen3-Coder-30B-A3B-Instruct \
  --no-api-key \
  --set-default</pre></div>
<p dir="auto">Built-in local profiles are available for the common desktop/local runtimes:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# Ollama: start the local server and install a model first.
ollama pull llama3.2
jcode login --provider ollama
jcode --provider ollama --model llama3.2 run 'hello'

# LM Studio: start the Local Server, load a chat model, then use the exact
# model identifier shown by LM Studio or by curl http://localhost:1234/v1/models.
jcode login --provider lmstudio
jcode --provider lmstudio --model '&lt;model-id&gt;' run 'hello'"><pre><span class="pl-c"><span class="pl-c">#</span> Ollama: start the local server and install a model first.</span>
ollama pull llama3.2
jcode login --provider ollama
jcode --provider ollama --model llama3.2 run <span class="pl-s"><span class="pl-pds">'</span>hello<span class="pl-pds">'</span></span>

<span class="pl-c"><span class="pl-c">#</span> LM Studio: start the Local Server, load a chat model, then use the exact</span>
<span class="pl-c"><span class="pl-c">#</span> model identifier shown by LM Studio or by curl http://localhost:1234/v1/models.</span>
jcode login --provider lmstudio
jcode --provider lmstudio --model <span class="pl-s"><span class="pl-pds">'</span>&lt;model-id&gt;<span class="pl-pds">'</span></span> run <span class="pl-s"><span class="pl-pds">'</span>hello<span class="pl-pds">'</span></span></pre></div>
<p dir="auto">Ollama and LM Studio both expose OpenAI-compatible <code>/v1/models</code> and <code>/v1/chat/completions</code> endpoints. jcode uses streaming chat completions, function/tool calling, and OpenAI-style image content for vision-capable local models. If a local server requires a token, enter it during <code>jcode login</code> or create a named profile with <code>--api-key-stdin</code>.</p>
<p dir="auto">Useful flags:</p>
<ul dir="auto">
<li><code>--api-key-env NAME</code>: reference an existing environment variable instead of storing a key.</li>
<li><code>--api-key-stdin</code>: read and store a key without putting it in shell history.</li>
<li><code>--context-window TOKENS</code>: persist the model context window for model selection and routing.</li>
<li><code>--overwrite</code>: replace an existing profile of the same name.</li>
<li><code>--model-catalog</code>: use the endpoint's <code>/models</code> response in addition to configured models.</li>
</ul>
<p dir="auto">The generated profile can also be edited manually in <code>~/.jcode/config.toml</code>:</p>
<div class="highlight highlight-source-toml notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="[provider]
default_provider = &quot;my-api&quot;
default_model = &quot;my-model-id&quot;

[providers.my-api]
type = &quot;openai-compatible&quot;
base_url = &quot;https://llm.example.com/v1&quot;
api_key_env = &quot;JCODE_PROVIDER_MY_API_API_KEY&quot;
env_file = &quot;provider-my-api.env&quot;
default_model = &quot;my-model-id&quot;

[[providers.my-api.models]]
id = &quot;my-model-id&quot;
context_window = 128000"><pre>[<span class="pl-en">provider</span>]
<span class="pl-smi">default_provider</span> = <span class="pl-s"><span class="pl-pds">"</span>my-api<span class="pl-pds">"</span></span>
<span class="pl-smi">default_model</span> = <span class="pl-s"><span class="pl-pds">"</span>my-model-id<span class="pl-pds">"</span></span>

[<span class="pl-en">providers</span>.<span class="pl-en">my-api</span>]
<span class="pl-smi">type</span> = <span class="pl-s"><span class="pl-pds">"</span>openai-compatible<span class="pl-pds">"</span></span>
<span class="pl-smi">base_url</span> = <span class="pl-s"><span class="pl-pds">"</span>https://llm.example.com/v1<span class="pl-pds">"</span></span>
<span class="pl-smi">api_key_env</span> = <span class="pl-s"><span class="pl-pds">"</span>JCODE_PROVIDER_MY_API_API_KEY<span class="pl-pds">"</span></span>
<span class="pl-smi">env_file</span> = <span class="pl-s"><span class="pl-pds">"</span>provider-my-api.env<span class="pl-pds">"</span></span>
<span class="pl-smi">default_model</span> = <span class="pl-s"><span class="pl-pds">"</span>my-model-id<span class="pl-pds">"</span></span>

[[<span class="pl-en">providers</span>.<span class="pl-en">my-api</span>.<span class="pl-en">models</span>]]
<span class="pl-smi">id</span> = <span class="pl-s"><span class="pl-pds">"</span>my-model-id<span class="pl-pds">"</span></span>
<span class="pl-smi">context_window</span> = <span class="pl-c1">128000</span></pre></div>
<p dir="auto">Anthropic Messages-compatible gateways use the same named-profile surface with
<code>type = "anthropic-compatible"</code>. The profile can select bearer, custom-header,
or no authentication and attach gateway-specific headers to every request:</p>
<div class="highlight highlight-source-toml notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="[provider]
default_provider = &quot;corp-claude&quot;
default_model = &quot;claude-sonnet-4-6&quot;

[providers.corp-claude]
type = &quot;anthropic-compatible&quot;
base_url = &quot;https://gateway.example.com/anthropic/v1&quot;
auth = &quot;bearer&quot;
api_key_env = &quot;CORP_CLAUDE_TOKEN&quot;
default_model = &quot;claude-sonnet-4-6&quot;

[providers.corp-claude.headers]
x-tenant-id = &quot;tenant-42&quot;

[[providers.corp-claude.models]]
id = &quot;claude-sonnet-4-6&quot;
context_window = 200000"><pre>[<span class="pl-en">provider</span>]
<span class="pl-smi">default_provider</span> = <span class="pl-s"><span class="pl-pds">"</span>corp-claude<span class="pl-pds">"</span></span>
<span class="pl-smi">default_model</span> = <span class="pl-s"><span class="pl-pds">"</span>claude-sonnet-4-6<span class="pl-pds">"</span></span>

[<span class="pl-en">providers</span>.<span class="pl-en">corp-claude</span>]
<span class="pl-smi">type</span> = <span class="pl-s"><span class="pl-pds">"</span>anthropic-compatible<span class="pl-pds">"</span></span>
<span class="pl-smi">base_url</span> = <span class="pl-s"><span class="pl-pds">"</span>https://gateway.example.com/anthropic/v1<span class="pl-pds">"</span></span>
<span class="pl-smi">auth</span> = <span class="pl-s"><span class="pl-pds">"</span>bearer<span class="pl-pds">"</span></span>
<span class="pl-smi">api_key_env</span> = <span class="pl-s"><span class="pl-pds">"</span>CORP_CLAUDE_TOKEN<span class="pl-pds">"</span></span>
<span class="pl-smi">default_model</span> = <span class="pl-s"><span class="pl-pds">"</span>claude-sonnet-4-6<span class="pl-pds">"</span></span>

[<span class="pl-en">providers</span>.<span class="pl-en">corp-claude</span>.<span class="pl-en">headers</span>]
<span class="pl-smi">x-tenant-id</span> = <span class="pl-s"><span class="pl-pds">"</span>tenant-42<span class="pl-pds">"</span></span>

[[<span class="pl-en">providers</span>.<span class="pl-en">corp-claude</span>.<span class="pl-en">models</span>]]
<span class="pl-smi">id</span> = <span class="pl-s"><span class="pl-pds">"</span>claude-sonnet-4-6<span class="pl-pds">"</span></span>
<span class="pl-smi">context_window</span> = <span class="pl-c1">200000</span></pre></div>
<p dir="auto">For direct environment-based configuration, <code>ANTHROPIC_BASE_URL</code> overrides the
non-OAuth Messages endpoint and <code>ANTHROPIC_AUTH_TOKEN</code> is sent as a bearer token.
Claude OAuth traffic always continues to use Anthropic's official endpoints.</p>
<div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Extra request-body fields (<code>extra_body</code>)</h5><a id="user-content-extra-request-body-fields-extra_body" class="anchor" aria-label="Permalink: Extra request-body fields (extra_body)" href="#extra-request-body-fields-extra_body"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Some OpenAI-compatible backends require non-standard top-level request fields. For example, NVIDIA NIM DeepSeek-V4 reasoning models (<code>deepseek-ai/deepseek-v4-flash</code>, <code>deepseek-ai/deepseek-v4-pro</code>) only enable thinking when the request includes <code>chat_template_kwargs</code>; without it they reply without reasoning (or, for some deployments, hang). jcode lets you inject arbitrary top-level fields two ways.</p>
<ol dir="auto">
<li>
<p dir="auto">Per named profile, via <code>extra_body</code> in <code>config.toml</code> (a TOML table merged verbatim into the JSON body):</p>
<div class="highlight highlight-source-toml notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="[providers.my-nim]
type = &quot;openai-compatible&quot;
base_url = &quot;https://integrate.api.nvidia.com/v1&quot;
api_key_env = &quot;NVIDIA_API_KEY&quot;
default_model = &quot;deepseek-ai/deepseek-v4-flash&quot;

[providers.my-nim.extra_body.chat_template_kwargs]
thinking = true
reasoning_effort = &quot;high&quot;"><pre>[<span class="pl-en">providers</span>.<span class="pl-en">my-nim</span>]
<span class="pl-smi">type</span> = <span class="pl-s"><span class="pl-pds">"</span>openai-compatible<span class="pl-pds">"</span></span>
<span class="pl-smi">base_url</span> = <span class="pl-s"><span class="pl-pds">"</span>https://integrate.api.nvidia.com/v1<span class="pl-pds">"</span></span>
<span class="pl-smi">api_key_env</span> = <span class="pl-s"><span class="pl-pds">"</span>NVIDIA_API_KEY<span class="pl-pds">"</span></span>
<span class="pl-smi">default_model</span> = <span class="pl-s"><span class="pl-pds">"</span>deepseek-ai/deepseek-v4-flash<span class="pl-pds">"</span></span>

[<span class="pl-en">providers</span>.<span class="pl-en">my-nim</span>.<span class="pl-en">extra_body</span>.<span class="pl-en">chat_template_kwargs</span>]
<span class="pl-smi">thinking</span> = <span class="pl-c1">true</span>
<span class="pl-smi">reasoning_effort</span> = <span class="pl-s"><span class="pl-pds">"</span>high<span class="pl-pds">"</span></span></pre></div>
</li>
<li>
<p dir="auto">For built-in profiles (e.g. <code>nvidia-nim</code>) or any endpoint, via the <code>JCODE_OPENAI_EXTRA_BODY</code> environment variable (a JSON object string). It can live in the provider's env file (<code>~/.config/jcode/nvidia-nim.env</code>) next to the API key:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="JCODE_OPENAI_EXTRA_BODY={&quot;chat_template_kwargs&quot;:{&quot;thinking&quot;:true,&quot;reasoning_effort&quot;:&quot;high&quot;}}"><pre>JCODE_OPENAI_EXTRA_BODY={<span class="pl-s"><span class="pl-pds">"</span>chat_template_kwargs<span class="pl-pds">"</span></span>:{<span class="pl-s"><span class="pl-pds">"</span>thinking<span class="pl-pds">"</span></span>:true,<span class="pl-s"><span class="pl-pds">"</span>reasoning_effort<span class="pl-pds">"</span></span>:<span class="pl-s"><span class="pl-pds">"</span>high<span class="pl-pds">"</span></span>}}</pre></div>
</li>
</ol>
<p dir="auto">Keys from <code>extra_body</code> are merged last and override any jcode-generated body field with the same name (<code>JCODE_OPENAI_EXTRA_BODY</code> wins over the config <code>extra_body</code> on key collisions). Invalid values are logged and ignored rather than failing the request.</p>
<p dir="auto">The custom OpenAI-compatible provider reads overrides from environment variables or from an env file in jcode's app config directory. On Linux this is usually <code>~/.config/jcode/</code>, so the default file is usually:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="~/.config/jcode/openai-compatible.env"><pre lang="text" class="notranslate"><code>~/.config/jcode/openai-compatible.env
</code></pre></div>
<p dir="auto">Example for a local or LAN vLLM server:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="JCODE_OPENAI_COMPAT_API_BASE=http://192.168.1.50:8000/v1
JCODE_OPENAI_COMPAT_DEFAULT_MODEL=Qwen/Qwen3-Coder-30B-A3B-Instruct
# Optional if your server expects auth
OPENAI_COMPAT_API_KEY=your-token-here"><pre>JCODE_OPENAI_COMPAT_API_BASE=http://192.168.1.50:8000/v1
JCODE_OPENAI_COMPAT_DEFAULT_MODEL=Qwen/Qwen3-Coder-30B-A3B-Instruct
<span class="pl-c"><span class="pl-c">#</span> Optional if your server expects auth</span>
OPENAI_COMPAT_API_KEY=your-token-here</pre></div>
<p dir="auto">Notes:</p>
<ul dir="auto">
<li><code>jcode login --provider openai-compatible</code> can create or update this for you.</li>
<li>Plain <code>http://</code> is accepted for <code>localhost</code> and private LAN IPs. Public remote HTTP is still rejected.</li>
<li>HTTPS endpoints work as usual.</li>
</ul>
<div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">MCP config files</h4><a id="user-content-mcp-config-files" class="anchor" aria-label="Permalink: MCP config files" href="#mcp-config-files"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">MCP config is separate from <code>config.toml</code>.</p>
<p dir="auto">Primary config files:</p>
<ul dir="auto">
<li><code>~/.jcode/mcp.json</code> for global MCP servers</li>
<li><code>.jcode/mcp.json</code> for project-local MCP servers</li>
</ul>
<p dir="auto">Claude Code compatibility:</p>
<ul dir="auto">
<li><code>~/.claude.json</code> (Claude Code's user config): top-level <code>mcpServers</code>, plus per-project servers under <code>projects.&lt;abs_path&gt;.mcpServers</code> for the current directory</li>
<li><code>.mcp.json</code> at the repo root (Claude Code's project config)</li>
<li><code>.claude/mcp.json</code> (legacy fallback)</li>
</ul>
<p dir="auto">Claude Code config is read live on every load rather than copied into jcode's
global config. Additions, edits, and deletions therefore take effect without
leaving a stale snapshot (and inline environment values are not duplicated).
For migration from Codex CLI, jcode still performs a one-time import from
<code>~/.codex/config.toml</code> into <code>~/.jcode/mcp.json</code> when the latter does not exist.
That imported file is then jcode-owned; later Codex changes are not synced
automatically. Imported environment values are copied too and may contain
secrets.</p>
<p dir="auto">Both the canonical <code>mcpServers</code> key and jcode's historical <code>servers</code> key are accepted. jcode currently supports stdio (command-based) servers only; HTTP/SSE entries (<code>"type": "http"</code>/<code>"sse"</code>) are recognized and skipped with a log line.</p>
<p dir="auto">Example MCP config:</p>
<div class="highlight highlight-source-json notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="{
  &quot;mcpServers&quot;: {
    &quot;filesystem&quot;: {
      &quot;command&quot;: &quot;/path/to/mcp-server&quot;,
      &quot;args&quot;: [&quot;--root&quot;, &quot;/workspace&quot;],
      &quot;env&quot;: {},
      &quot;shared&quot;: true
    }
  }
}"><pre>{
  <span class="pl-ent">"mcpServers"</span>: {
    <span class="pl-ent">"filesystem"</span>: {
      <span class="pl-ent">"command"</span>: <span class="pl-s"><span class="pl-pds">"</span>/path/to/mcp-server<span class="pl-pds">"</span></span>,
      <span class="pl-ent">"args"</span>: [<span class="pl-s"><span class="pl-pds">"</span>--root<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>/workspace<span class="pl-pds">"</span></span>],
      <span class="pl-ent">"env"</span>: {},
      <span class="pl-ent">"shared"</span>: <span class="pl-c1">true</span>
    }
  }
}</pre></div>
<p dir="auto">For headless or SSH sessions, OAuth-style providers support <code>jcode login --provider &lt;provider&gt; --no-browser</code> (alias: <code>--headless</code>) so jcode prints the auth URL/QR and falls back to manual code or callback paste instead of trying to launch a local browser.</p>
<p dir="auto">For more scriptable remote flows, <code>claude</code>, <code>openai</code>, <code>gemini</code>, and <code>antigravity</code> also support a two-step pattern:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# Step 1: print a resumable auth URL
jcode login --provider openai --print-auth-url --json

# Step 2: complete later with the callback URL or auth code
jcode login --provider openai --callback-url 'http://localhost:1455/auth/callback?...'
jcode login --provider gemini --auth-code '...'"><pre><span class="pl-c"><span class="pl-c">#</span> Step 1: print a resumable auth URL</span>
jcode login --provider openai --print-auth-url --json

<span class="pl-c"><span class="pl-c">#</span> Step 2: complete later with the callback URL or auth code</span>
jcode login --provider openai --callback-url <span class="pl-s"><span class="pl-pds">'</span>http://localhost:1455/auth/callback?...<span class="pl-pds">'</span></span>
jcode login --provider gemini --auth-code <span class="pl-s"><span class="pl-pds">'</span>...<span class="pl-pds">'</span></span></pre></div>
<p dir="auto">Additional scriptable cases:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# Copilot device flow: print URL + user code, then complete later
jcode login --provider copilot --print-auth-url --json
jcode login --provider copilot --complete

# Gmail/Google OAuth after credentials are already configured
jcode login --provider google --print-auth-url --google-access-tier readonly
jcode login --provider google --callback-url 'http://127.0.0.1:8456?...'"><pre><span class="pl-c"><span class="pl-c">#</span> Copilot device flow: print URL + user code, then complete later</span>
jcode login --provider copilot --print-auth-url --json
jcode login --provider copilot --complete

<span class="pl-c"><span class="pl-c">#</span> Gmail/Google OAuth after credentials are already configured</span>
jcode login --provider google --print-auth-url --google-access-tier <span class="pl-k">readonly</span>
jcode login --provider google --callback-url <span class="pl-s"><span class="pl-pds">'</span>http://127.0.0.1:8456?...<span class="pl-pds">'</span></span></pre></div>
<p dir="auto">Pending scriptable login state is stored under <code>~/.jcode/pending-login/</code>, automatically expires, and stale entries are cleaned up when new scriptable logins start or resume.</p>
<p dir="auto">For the built-in OpenAI login flow, jcode opens a local callback on
<code>http://localhost:1455/auth/callback</code> by default.</p>
<a target="_blank" rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/94247773/573295480-530684c0-9d12-4363-aa0e-1b39a0d4e1be.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3OTE0NTcwMDYsIm5iZiI6MTc5MTQ1NjcwNiwicGF0aCI6Ii85NDI0Nzc3My81NzMyOTU0ODAtNTMwNjg0YzAtOWQxMi00MzYzLWFhMGUtMWIzOWEwZDRlMWJlLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjEwMDglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYxMDA4VDEwNTE0NlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTI5ODJkY2I4NDlmZDJjYTQ2Yjc2NmUzNzBkZWJlNzFlOGJmYzM1MWQ3Mjk0MGU4M2QzOGQ1ZTNhYWY0YWEyMzMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRnBuZyJ9.JhI0zVVBu10CF7mgnXerYJG-bPwXbjRjTKbcwkzLeD8"><img width="2000" height="1225" alt="Screenshot from 2026-04-02 14-28-51" src="https://private-user-images.githubusercontent.com/94247773/573295480-530684c0-9d12-4363-aa0e-1b39a0d4e1be.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3OTE0NTcwMDYsIm5iZiI6MTc5MTQ1NjcwNiwicGF0aCI6Ii85NDI0Nzc3My81NzMyOTU0ODAtNTMwNjg0YzAtOWQxMi00MzYzLWFhMGUtMWIzOWEwZDRlMWJlLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjEwMDglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYxMDA4VDEwNTE0NlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTI5ODJkY2I4NDlmZDJjYTQ2Yjc2NmUzNzBkZWJlNzFlOGJmYzM1MWQ3Mjk0MGU4M2QzOGQ1ZTNhYWY0YWEyMzMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRnBuZyJ9.JhI0zVVBu10CF7mgnXerYJG-bPwXbjRjTKbcwkzLeD8" style="max-width: 100%; height: auto; max-height: 1225px;; aspect-ratio: 2000 / 1225; background-color: var(--bgColor-muted); border-radius: 6px" class="js-gh-image-fallback"></a>
The above image is the first page of provider logins
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Supported provider</h3><a id="user-content-supported-provider" class="anchor" aria-label="Permalink: Supported provider" href="#supported-provider"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<ul dir="auto">
<li><strong>Native / first-party style providers:</strong> <code>claude</code>, <code>openai</code>, <code>copilot</code>, <code>gemini</code>, <code>azure</code>, <code>alibaba-coding-plan</code></li>
<li><strong>Aggregator / compatibility providers:</strong> <code>openrouter</code>, <code>orcarouter</code>, <code>openai-compatible</code></li>
<li><strong>Additional provider integrations:</strong> <code>opencode</code>, <code>opencode-go</code>, <code>zai</code> / <code>kimi</code>, <code>302ai</code>, <code>baseten</code>, <code>cortecs</code>, <code>deepseek</code>, <code>firmware</code>, <code>huggingface</code>, <code>moonshotai</code>, <code>nebius</code>, <code>scaleway</code>, <code>stackit</code>, <code>groq</code>, <code>mistral</code>, <code>perplexity</code>, <code>togetherai</code>, <code>deepinfra</code>, <code>fireworks</code>, <code>minimax</code>, <code>xai</code>, <code>lmstudio</code>, <code>ollama</code>, <code>chutes</code>, <code>cerebras</code>, <code>cursor</code>, <code>antigravity</code>, <code>google</code></li>
</ul>
<p dir="auto">Jcode also supports easy multi-account switching. Ran out of tokens on your first ChatGPT Pro subscription? /account and quickly switch to your second.</p>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Customizability / Self-Dev</h2><a id="user-content-customizability--self-dev" class="anchor" aria-label="Permalink: Customizability / Self-Dev" href="#customizability--self-dev"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Jcode is inventing a new form of customizability. One that doesn't limit you to what a plugin or extension can do. Tell your jcode agent to enter self dev mode, and it will start modifying its own source code. Jcode is optimized to iterate on itself. There is significant infrastructure around self developement, which allows it to edit, build, and test its own source code, then reload its own binary and continue work in your (potentially many) sessions, fully automatically.</p>
<p dir="auto">It is reccomended that you use a frontier model for this. The jcode codebase is not a simple one, and weaker models can make subtle, breaking changes. GPT 5.5 or the latest available frontier model works well.</p>

<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Misc.</h2><a id="user-content-misc" class="anchor" aria-label="Permalink: Misc." href="#misc"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">The devil is in the details. There are many undocumented optimizations and niceties that jcode implements. Some examples:</p>
<p dir="auto">Anthropic's Claude cache goes cold after 5 minutes. If you initiate Claude after these 5 minutes, you have a cache miss, potentially costing you lots of tokens. The ui warns you when the cache went cold, and notfies you if there was an unexpected cache miss.</p>
<p dir="auto">jcode comes with instructions on how to set up Firefox Agent Bridge. Ask you agent to set it up, and then you will have browser automation in jcode as well.</p>
<p dir="auto">Agent grep is a grep tool I made for the jcode agent. It adds file strucuture information (ie the list of functions, their displacement, etc) to the grep return, so that the agent can infer more of what the file doesn without actually reading the file. It also implements a harness-level integration that adaptively truncates returns based on what the agent has already seen. This saves on context a lot.</p>
<p dir="auto">Inputs are by default interleaved with the working agent. It sends the input as soon as it safely can without breaking the KV cache. Submit with shift enter instead, and it will send a queue send, and wait for the agent to fully finish its turn before sending.</p>
<p dir="auto">Resume sessions from different harnesses. Claude code broke on you? Resume the session from jcode and continue where you left off. Session resume is supported for codex, claude code, opencode, and pi.</p>
<a target="_blank" rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/94247773/577004125-c2b383cf-2531-4217-85ae-6a863354dc97.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3OTE0NTcwMDYsIm5iZiI6MTc5MTQ1NjcwNiwicGF0aCI6Ii85NDI0Nzc3My81NzcwMDQxMjUtYzJiMzgzY2YtMjUzMS00MjE3LTg1YWUtNmE4NjMzNTRkYzk3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjEwMDglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYxMDA4VDEwNTE0NlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTRmMTFmNDljN2RkMWQ3MWYwOWRhMjIyZDlmM2E1OTJiNTFjOGMzNjEzMjI1ZjM0Y2FjYTBmOTZjMjdhZmMzYzYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRnBuZyJ9.wvdYV5W9mAG4ZY0yDYv0-NFx8ajZtojk2aEHqLBe_0E"><img width="2000" height="1225" alt="Screenshot from 2026-04-11 16-28-52" src="https://private-user-images.githubusercontent.com/94247773/577004125-c2b383cf-2531-4217-85ae-6a863354dc97.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3OTE0NTcwMDYsIm5iZiI6MTc5MTQ1NjcwNiwicGF0aCI6Ii85NDI0Nzc3My81NzcwMDQxMjUtYzJiMzgzY2YtMjUzMS00MjE3LTg1YWUtNmE4NjMzNTRkYzk3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjEwMDglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYxMDA4VDEwNTE0NlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTRmMTFmNDljN2RkMWQ3MWYwOWRhMjIyZDlmM2E1OTJiNTFjOGMzNjEzMjI1ZjM0Y2FjYTBmOTZjMjdhZmMzYzYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JnJlc3BvbnNlLWNvbnRlbnQtdHlwZT1pbWFnZSUyRnBuZyJ9.wvdYV5W9mAG4ZY0yDYv0-NFx8ajZtojk2aEHqLBe_0E" style="max-width: 100%; height: auto; max-height: 1225px;; aspect-ratio: 2000 / 1225; background-color: var(--bgColor-muted); border-radius: 6px" class="js-gh-image-fallback"></a>
image of /Resume for codex sessions
<p dir="auto">Skills are not all loaded on startup. The conversation is embedded as a semantic vector, and will automatically inject a skill if there is an embedding hit similar to memories. The agent has a skill tool for you to manually activate a skill at anytime. You may also activate via slash commands.</p>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">iOS Application / Native OpenClaw</h2><a id="user-content-ios-application--native-openclaw" class="anchor" aria-label="Permalink: iOS Application / Native OpenClaw" href="#ios-application--native-openclaw"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">A native iOS application version of jcode is coming soon. This will allow you to work with jcode on your personal machine's environment from your phone, via Tailscale. Openclaw like features will be bundled with this iOS application.</p>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Other planned features</h2><a id="user-content-other-planned-features" class="anchor" aria-label="Permalink: Other planned features" href="#other-planned-features"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Agents dont like to commit in dirty git state with active changes. Git was clearly not built for multi-agent workflows, and git worktrees is not a good solution. Given this, I believe that is an opporunity for a new git like primitive to be born.</p>
<p dir="auto">Build speed improvements: An incremental debug cargo build with cache enabled takes about 1 minute on my machine. The goal is 5-20 seconds. Refactors and crates seams should be able to make this happen.</p>

<hr>
<div align="center" dir="auto">
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Quick Start</h2><a id="user-content-quick-start" class="anchor" aria-label="Permalink: Quick Start" href="#quick-start"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
</div>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# Launch the TUI
jcode

# Run a single command non-interactively
jcode run &quot;say hello&quot;

# Resume a previous session by memorable name
jcode --resume fox

# Run as a persistent background server, then attach more clients
jcode serve
jcode connect

# Send voice input from your configured STT command
jcode dictate"><pre><span class="pl-c"><span class="pl-c">#</span> Launch the TUI</span>
jcode

<span class="pl-c"><span class="pl-c">#</span> Run a single command non-interactively</span>
jcode run <span class="pl-s"><span class="pl-pds">"</span>say hello<span class="pl-pds">"</span></span>

<span class="pl-c"><span class="pl-c">#</span> Resume a previous session by memorable name</span>
jcode --resume fox

<span class="pl-c"><span class="pl-c">#</span> Run as a persistent background server, then attach more clients</span>
jcode serve
jcode connect

<span class="pl-c"><span class="pl-c">#</span> Send voice input from your configured STT command</span>
jcode dictate</pre></div>
<p dir="auto">jcode supports interactive TUI use, non-interactive runs, persistent server/client workflows,
and hotkey-friendly dictation without requiring a bundled speech-to-text stack.</p>
<div align="center" dir="auto">
  <a href="https://github.com/1jehuang/jcode/releases/download/readme-assets/workflow.mp4">
    <img src="https://github.com/1jehuang/jcode/releases/download/readme-assets/jcode-workflow-demonstration.webp" alt="jcode workflow demonstration" width="900" style="max-width: 100%;">
  </a>
  <p dir="auto"><em>jcode workflow demonstration</em></p>
</div>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Browser Automation</h2><a id="user-content-browser-automation" class="anchor" aria-label="Permalink: Browser Automation" href="#browser-automation"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">jcode includes a first-class built-in <code>browser</code> tool for browser control inside agent sessions.</p>
<p dir="auto">Current built-in backend:</p>
<ul dir="auto">
<li>Firefox via Firefox Agent Bridge</li>
</ul>
<p dir="auto">Current built-in tool actions include:</p>
<ul dir="auto">
<li><code>status</code></li>
<li><code>setup</code></li>
<li><code>open</code></li>
<li><code>snapshot</code></li>
<li><code>get_content</code></li>
<li><code>interactables</code></li>
<li><code>click</code></li>
<li><code>type</code></li>
<li><code>fill_form</code></li>
<li><code>select</code></li>
<li><code>wait</code></li>
<li><code>screenshot</code></li>
<li><code>eval</code></li>
<li><code>scroll</code></li>
<li><code>upload</code></li>
<li><code>press</code></li>
</ul>
<p dir="auto">Quick setup:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="jcode browser status
jcode browser setup"><pre>jcode browser status
jcode browser setup</pre></div>
<p dir="auto">Once setup is complete, the model can use the built-in <code>browser</code> tool directly. The UI also summarizes browser tool calls compactly, for example opening a URL, clicking a selector, or typing into a field without echoing sensitive typed text.</p>
<p dir="auto">Notes:</p>
<ul dir="auto">
<li>the provider/tool architecture is in place for additional backends</li>
<li>Firefox is the wired built-in backend today</li>
<li>Chrome bridge / remote debugging style providers can be added on top of the same browser tool later</li>
</ul>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Further Reading</h2><a id="user-content-further-reading" class="anchor" aria-label="Permalink: Further Reading" href="#further-reading"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<ul dir="auto">
<li><a href="https://jcode.sh/docs" rel="nofollow">jcode.sh/docs</a> — install, providers, configuration, keybindings</li>
<li><a href="https://jcode.sh/swarm" rel="nofollow">jcode.sh/swarm</a> — many coding agents in one repository</li>
<li><a href="https://jcode.sh/sdk" rel="nofollow">jcode.sh/sdk</a> — TypeScript SDK: drive jcode sessions from your own program</li>
<li><a href="https://jcode.sh/bench" rel="nofollow">jcode.sh/bench</a> — benchmark methodology and results</li>
<li><a href="/adminwat/jcode/blob/master/docs/AMBIENT_MODE.md">Ambient Mode / OpenClaw</a></li>
<li><a href="/adminwat/jcode/blob/master/docs/BROWSER_PROVIDER_PROTOCOL.md">Browser Provider Protocol</a></li>
<li><a href="/adminwat/jcode/blob/master/docs/MEMORY_ARCHITECTURE.md">Memory Architecture</a></li>
<li><a href="/adminwat/jcode/blob/master/docs/SWARM_ARCHITECTURE.md">Swarm Architecture</a></li>
<li><a href="/adminwat/jcode/blob/master/docs/SERVER_ARCHITECTURE.md">Server Architecture</a></li>
<li><a href="/adminwat/jcode/blob/master/docs/SAFETY_SYSTEM.md">Safety System</a></li>
<li><a href="/adminwat/jcode/blob/master/docs/SPONSORED_DISCOVERY_SPONSOR_ONBOARDING.md">Sponsored Discovery Sponsor Onboarding</a></li>
<li><a href="/adminwat/jcode/blob/master/docs/WINDOWS.md">Windows Notes</a></li>
<li><a href="/adminwat/jcode/blob/master/docs/WRAPPERS.md">Wrappers and Shell Integration</a></li>
<li><a href="/adminwat/jcode/blob/master/docs/REFACTORING.md">Refactoring Notes</a></li>
</ul>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Detailed Installation</h2><a id="user-content-detailed-installation" class="anchor" aria-label="Permalink: Detailed Installation" href="#detailed-installation"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Setup</h3><a id="user-content-setup" class="anchor" aria-label="Permalink: Setup" href="#setup"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">If you want another agent to set up jcode for you, give it this prompt:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="Set up jcode on this machine for me.

1. Detect the operating system, available package managers, and shell environment, then install jcode using the best matching command below instead of referring me somewhere else:

   - macOS with Homebrew available:
     brew tap 1jehuang/jcode
     brew install jcode

   - macOS or Linux via install script:
     curl -fsSL https://jcode.sh/install | bash

   - Windows PowerShell:
     irm https://jcode.sh/install.ps1 | iex

   - From source if the above paths are not appropriate:
     git clone https://github.com/1jehuang/jcode.git
     cd jcode
     cargo build --release
     scripts/install_release.sh

   - For local self-dev / refactor work on Linux x86_64, prefer:
     scripts/dev_cargo.sh build --release -p jcode --bin jcode
     scripts/dev_cargo.sh --print-setup
     scripts/install_release.sh

2. Verify that `jcode` is on my `PATH`.
3. Launch `jcode` once in a new terminal window/session to confirm it starts successfully.
4. Before attempting any interactive login flow, assess which providers are already available non-interactively and prefer those first. Check existing local credentials, config files, CLI sessions, and environment variables such as:
   - Claude: `~/.jcode/auth.json`, `~/.claude/.credentials.json`, `~/.local/share/opencode/auth.json`, `ANTHROPIC_API_KEY`
   - OpenAI: `~/.jcode/openai-auth.json`, `~/.codex/auth.json`, `OPENAI_API_KEY`
   - Gemini: `~/.jcode/gemini_oauth.json`, `~/.gemini/oauth_creds.json`
   - GitHub Copilot: existing auth under `~/.config/github-copilot/`
   - Azure OpenAI: `~/.config/jcode/azure-openai.env`, `AZURE_OPENAI_*`, or an existing `az login`
   - OpenRouter: `OPENROUTER_API_KEY`
   - Fireworks: `~/.config/jcode/fireworks.env`, `FIREWORKS_API_KEY`
   - MiniMax: `~/.config/jcode/minimax.env`, `MINIMAX_API_KEY`
   - NVIDIA NIM: `~/.config/jcode/nvidia-nim.env`, `NVIDIA_API_KEY`
   - Alibaba Cloud Coding Plan: existing jcode config/env if present
5. Prefer whichever provider is already configured and verify it with `jcode auth-test --all-configured` or a provider-specific auth test when appropriate.
6. Only if no usable provider is already configured, guide me through the minimal manual step needed:
   - Claude: `jcode login --provider claude`
   - GitHub Copilot: `jcode login --provider copilot`
   - OpenAI: `jcode login --provider openai`
   - Gemini: `jcode login --provider gemini`
   - Azure OpenAI: `jcode login --provider azure`
   - Fireworks: `jcode login --provider fireworks`
   - MiniMax: `jcode login --provider minimax`
   - NVIDIA NIM: `jcode login --provider nvidia-nim`
   - Alibaba Cloud Coding Plan: `jcode login --provider alibaba-coding-plan`
   - OpenRouter: help me set `OPENROUTER_API_KEY`
   - Anthropic direct API: help me set `ANTHROPIC_API_KEY`
7. After setup, run a simple smoke test with `jcode run &quot;say hello&quot;` and confirm it works.
8. If I want browser automation, also check `jcode browser status`. If browser automation is not ready, run `jcode browser setup`, verify the built-in `browser` tool works, and explain any remaining manual step.
9. Explain any manual step that still needs me, especially browser OAuth, device login, API key entry, or browser extension approval."><pre lang="text" class="notranslate"><code>Set up jcode on this machine for me.

1. Detect the operating system, available package managers, and shell environment, then install jcode using the best matching command below instead of referring me somewhere else:

   - macOS with Homebrew available:
     brew tap 1jehuang/jcode
     brew install jcode

   - macOS or Linux via install script:
     curl -fsSL https://jcode.sh/install | bash

   - Windows PowerShell:
     irm https://jcode.sh/install.ps1 | iex

   - From source if the above paths are not appropriate:
     git clone https://github.com/1jehuang/jcode.git
     cd jcode
     cargo build --release
     scripts/install_release.sh

   - For local self-dev / refactor work on Linux x86_64, prefer:
     scripts/dev_cargo.sh build --release -p jcode --bin jcode
     scripts/dev_cargo.sh --print-setup
     scripts/install_release.sh

2. Verify that `jcode` is on my `PATH`.
3. Launch `jcode` once in a new terminal window/session to confirm it starts successfully.
4. Before attempting any interactive login flow, assess which providers are already available non-interactively and prefer those first. Check existing local credentials, config files, CLI sessions, and environment variables such as:
   - Claude: `~/.jcode/auth.json`, `~/.claude/.credentials.json`, `~/.local/share/opencode/auth.json`, `ANTHROPIC_API_KEY`
   - OpenAI: `~/.jcode/openai-auth.json`, `~/.codex/auth.json`, `OPENAI_API_KEY`
   - Gemini: `~/.jcode/gemini_oauth.json`, `~/.gemini/oauth_creds.json`
   - GitHub Copilot: existing auth under `~/.config/github-copilot/`
   - Azure OpenAI: `~/.config/jcode/azure-openai.env`, `AZURE_OPENAI_*`, or an existing `az login`
   - OpenRouter: `OPENROUTER_API_KEY`
   - Fireworks: `~/.config/jcode/fireworks.env`, `FIREWORKS_API_KEY`
   - MiniMax: `~/.config/jcode/minimax.env`, `MINIMAX_API_KEY`
   - NVIDIA NIM: `~/.config/jcode/nvidia-nim.env`, `NVIDIA_API_KEY`
   - Alibaba Cloud Coding Plan: existing jcode config/env if present
5. Prefer whichever provider is already configured and verify it with `jcode auth-test --all-configured` or a provider-specific auth test when appropriate.
6. Only if no usable provider is already configured, guide me through the minimal manual step needed:
   - Claude: `jcode login --provider claude`
   - GitHub Copilot: `jcode login --provider copilot`
   - OpenAI: `jcode login --provider openai`
   - Gemini: `jcode login --provider gemini`
   - Azure OpenAI: `jcode login --provider azure`
   - Fireworks: `jcode login --provider fireworks`
   - MiniMax: `jcode login --provider minimax`
   - NVIDIA NIM: `jcode login --provider nvidia-nim`
   - Alibaba Cloud Coding Plan: `jcode login --provider alibaba-coding-plan`
   - OpenRouter: help me set `OPENROUTER_API_KEY`
   - Anthropic direct API: help me set `ANTHROPIC_API_KEY`
7. After setup, run a simple smoke test with `jcode run "say hello"` and confirm it works.
8. If I want browser automation, also check `jcode browser status`. If browser automation is not ready, run `jcode browser setup`, verify the built-in `browser` tool works, and explain any remaining manual step.
9. Explain any manual step that still needs me, especially browser OAuth, device login, API key entry, or browser extension approval.
</code></pre></div>
<p dir="auto">This is intended to be a copy-paste bootstrap prompt for jcode itself or any other coding agent.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Quick Install</h3><a id="user-content-quick-install" class="anchor" aria-label="Permalink: Quick Install" href="#quick-install"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# macOS &amp; Linux
curl -fsSL https://jcode.sh/install | bash"><pre><span class="pl-c"><span class="pl-c">#</span> macOS &amp; Linux</span>
curl -fsSL https://jcode.sh/install <span class="pl-k">|</span> bash</pre></div>
<p dir="auto">On Termux, install the glibc runtime and <code>patchelf</code> first so the installer can
patch the downloaded Linux binary to Termux's glibc dynamic linker and create a
launcher that avoids Termux's <code>LD_PRELOAD</code> shim:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="pkg install glibc patchelf
curl -fsSL https://jcode.sh/install | bash"><pre>pkg install glibc patchelf
curl -fsSL https://jcode.sh/install <span class="pl-k">|</span> bash</pre></div>
<div class="highlight highlight-source-powershell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# Windows 11 x64 or ARM64 (PowerShell 5.1+)
irm https://jcode.sh/install.ps1 | iex"><pre><span class="pl-c"><span class="pl-c">#</span> Windows 11 x64 or ARM64 (PowerShell 5.1+)</span>
irm https:<span class="pl-k">//</span>jcode.sh<span class="pl-k">/</span>install.ps1 <span class="pl-k">|</span> iex</pre></div>
<p dir="auto">The Windows installer selects the correct architecture and verifies the download
against the release's <code>SHA256SUMS</code>. Alacritty and the optional global launch
hotkey require explicit consent and are not installed by default. See
<a href="/adminwat/jcode/blob/master/docs/WINDOWS.md">Windows support, security, Defender, and SmartScreen notes</a>.</p>
<p dir="auto">If a release does not contain a matching Windows asset, the installer stops
instead of unexpectedly starting a long compilation. An explicit source build
is available with <code>-BuildFromSource</code> and requires Git, Rust, and Visual Studio
2022 Build Tools with the <strong>Desktop development with C++</strong> workload.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">macOS via Homebrew</h3><a id="user-content-macos-via-homebrew" class="anchor" aria-label="Permalink: macOS via Homebrew" href="#macos-via-homebrew"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="brew tap 1jehuang/jcode
brew install jcode"><pre>brew tap 1jehuang/jcode
brew install jcode</pre></div>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">From Source (all platforms)</h3><a id="user-content-from-source-all-platforms" class="anchor" aria-label="Permalink: From Source (all platforms)" href="#from-source-all-platforms"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="git clone https://github.com/1jehuang/jcode.git
cd jcode
cargo build --release"><pre>git clone https://github.com/1jehuang/jcode.git
<span class="pl-c1">cd</span> jcode
cargo build --release</pre></div>
<p dir="auto">For local self-dev / refactor work on Linux x86_64, prefer:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="scripts/dev_cargo.sh build --release -p jcode --bin jcode
scripts/dev_cargo.sh --print-setup"><pre>scripts/dev_cargo.sh build --release -p jcode --bin jcode
scripts/dev_cargo.sh --print-setup</pre></div>
<p dir="auto">That wrapper automatically uses <code>sccache</code> when available, prefers a fast
working local linker setup (<code>clang + lld</code>) instead of assuming every machine's
<code>mold</code> configuration is valid, and can print the active linker/cache setup via
<code>--print-setup</code> so slow-path builds are easier to diagnose.</p>
<p dir="auto">Then symlink to your PATH:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="scripts/install_release.sh"><pre>scripts/install_release.sh</pre></div>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Uninstall</h3><a id="user-content-uninstall" class="anchor" aria-label="Permalink: Uninstall" href="#uninstall"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Removes installed binaries and the launcher but keeps your config, auth, and
sessions so a clean reinstall picks up where you left off:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="curl -fsSL https://raw.githubusercontent.com/1jehuang/jcode/master/scripts/uninstall.sh | bash -s -- --yes"><pre>curl -fsSL https://raw.githubusercontent.com/1jehuang/jcode/master/scripts/uninstall.sh <span class="pl-k">|</span> bash -s -- --yes</pre></div>
<p dir="auto">For a full wipe of everything including config, auth, sessions, logs, and
memory (useful for recovering from a broken install):</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="curl -fsSL https://raw.githubusercontent.com/1jehuang/jcode/master/scripts/uninstall.sh | bash -s -- --purge --yes"><pre>curl -fsSL https://raw.githubusercontent.com/1jehuang/jcode/master/scripts/uninstall.sh <span class="pl-k">|</span> bash -s -- --purge --yes</pre></div>
<p dir="auto">Add <code>--dry-run</code> to preview what would be removed without deleting anything.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Platform Support</h3><a id="user-content-platform-support" class="anchor" aria-label="Permalink: Platform Support" href="#platform-support"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Platform</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Linux</strong> x86_64 / aarch64</td>
<td>Fully supported</td>
</tr>
<tr>
<td><strong>macOS</strong> Apple Silicon &amp; Intel</td>
<td>Supported</td>
</tr>
<tr>
<td><strong>Windows</strong> x86_64</td>
<td>Supported (native + WSL2)</td>
</tr>
<tr>
<td><strong>Termux</strong> aarch64 / x86_64</td>
<td>Supported with <code>pkg install glibc patchelf</code></td>
</tr>
</tbody>
</table></markdown-accessiblity-table>

</article></div><div class="d-none"></div></section></div></div></div> </div> <!-- --> </div></div></div></div></div></div><div class="ScrollMarksContainer-module__scrollMarksContainer__Eu7uU" id="find-result-marks-container"></div><div class="d-none"></div><div class="d-none"></div></div> <!-- --> <!-- --> </div>
</react-app>




  </div>

</turbo-frame>

    </main>
  </div>

  </div>

          <footer class="footer f6 color-fg-muted color-border-subtle tmp-pt-7 tmp-pb-6 p-responsive" role="contentinfo"  >
  <h2 class='sr-only'>Footer</h2>

  


  <div class="d-flex flex-justify-center flex-items-center flex-column-reverse flex-lg-row flex-wrap flex-lg-nowrap">
    <div class="d-flex flex-items-center flex-shrink-0 mx-2">
      <a aria-label="GitHub Homepage" class="footer-octicon mr-2" href="https://github.com">
        <svg aria-hidden="true" data-component="Octicon" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-mark-github">
    <path d="M10.226 17.284c-2.965-.36-5.054-2.493-5.054-5.256 0-1.123.404-2.336 1.078-3.144-.292-.741-.247-2.314.09-2.965.898-.112 2.111.36 2.83 1.01.853-.269 1.752-.404 2.853-.404 1.1 0 1.999.135 2.807.382.696-.629 1.932-1.1 2.83-.988.315.606.36 2.179.067 2.942.72.854 1.101 2 1.101 3.167 0 2.763-2.089 4.852-5.098 5.234.763.494 1.28 1.572 1.28 2.807v2.336c0 .674.561 1.056 1.235.786 4.066-1.55 7.255-5.615 7.255-10.646C23.5 6.188 18.334 1 11.978 1 5.62 1 .5 6.188.5 12.545c0 4.986 3.167 9.12 7.435 10.669.606.225 1.19-.18 1.19-.786V20.63a2.9 2.9 0 0 1-1.078.224c-1.483 0-2.359-.808-2.987-2.313-.247-.607-.517-.966-1.034-1.033-.27-.023-.359-.135-.359-.27 0-.27.45-.471.898-.471.652 0 1.213.404 1.797 1.235.45.651.921.943 1.483.943.561 0 .92-.202 1.437-.719.382-.381.674-.718.944-.943"></path>
</svg>
</a>
      <span>
        &copy; 2026 GitHub,&nbsp;Inc.
      </span>
    </div>

    <nav aria-label="Footer">
      <h3 class="sr-only" id="sr-footer-heading">Footer navigation</h3>

      <ul class="list-style-none d-flex flex-justify-center flex-wrap mb-2 mb-lg-0" aria-labelledby="sr-footer-heading">


          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to Terms&quot;,&quot;label&quot;:&quot;text:terms&quot;}" href="https://docs.github.com/site-policy/github-terms/github-terms-of-service" data-view-component="true" class="Link--secondary Link">Terms</a>
          </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to privacy&quot;,&quot;label&quot;:&quot;text:privacy&quot;}" href="https://docs.github.com/site-policy/privacy-policies/github-privacy-statement" data-view-component="true" class="Link--secondary Link">Privacy</a>
          </li>


            <li class="mx-2">
              <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to security&quot;,&quot;label&quot;:&quot;text:security&quot;}" href="https://github.com/security" data-view-component="true" class="Link--secondary Link">Security</a>
            </li>

            <li class="mx-2">
              <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to status&quot;,&quot;label&quot;:&quot;text:status&quot;}" href="https://www.githubstatus.com/" data-view-component="true" class="Link--secondary Link">Status</a>
            </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to community&quot;,&quot;label&quot;:&quot;text:community&quot;}" href="https://github.community/" data-view-component="true" class="Link--secondary Link">Community</a>
          </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to docs&quot;,&quot;label&quot;:&quot;text:docs&quot;}" href="https://docs.github.com/" data-view-component="true" class="Link--secondary Link">Docs</a>
          </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to contact&quot;,&quot;label&quot;:&quot;text:contact&quot;}" href="https://support.github.com?tags=dotcom-footer" data-view-component="true" class="Link--secondary Link">Contact</a>
          </li>

          
<li class="mx-2" >
  <cookie-consent-link>
    <button
      type="button"
      class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent"
      data-action="click:cookie-consent-link#showConsentManagement"
      data-analytics-event="{&quot;location&quot;:&quot;footer&quot;,&quot;action&quot;:&quot;cookies&quot;,&quot;context&quot;:&quot;subfooter&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;cookies_link_subfooter_footer&quot;}"
    >
      Manage cookies
    </button>
  </cookie-consent-link>
</li>

  <li class="mx-2">
    <cookie-consent-link>
      <button
        type="button"
        class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent text-left"
        data-action="click:cookie-consent-link#showConsentManagement"
        data-analytics-event="{&quot;location&quot;:&quot;footer&quot;,&quot;action&quot;:&quot;dont_share_info&quot;,&quot;context&quot;:&quot;subfooter&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;dont_share_info_link_subfooter_footer&quot;}"
      >
        Do not share my personal information
      </button>
    </cookie-consent-link>
  </li>

      </ul>
    </nav>
  </div>
</footer>



    <ghcc-consent id="ghcc" class="position-fixed bottom-0 left-0" style="z-index: 999999"
      data-locale="en"
      data-initial-cookie-consent-allowed=""
      data-cookie-consent-required="true"
    ></ghcc-consent>




  <div id="ajax-error-message" class="ajax-error-message flash flash-error" hidden>
    <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
    <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
    <button type="button" class="flash-close js-ajax-error-dismiss" aria-label="Dismiss error">
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
    </button>
    You can’t perform that action at this time.
  </div>

    <template id="site-details-dialog">
  <details class="details-reset details-overlay details-overlay-dark lh-default color-fg-default hx_rsm" open>
    <summary role="button" aria-label="Close dialog"></summary>
    <details-dialog class="Box Box--overlay d-flex flex-column anim-fade-in fast hx_rsm-dialog hx_rsm-modal">
      <button class="Box-btn-octicon m-0 btn-octicon position-absolute right-0 top-0" type="button" aria-label="Close dialog" data-close-dialog>
        <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
      </button>
      <div class="octocat-spinner tmp-my-6 js-details-dialog-spinner"></div>
    </details-dialog>
  </details>
</template>

    <div class="Popover js-hovercard-content position-absolute" style="display: none; outline: none;">
  <div class="Popover-message Popover-message--bottom-left Popover-message--large Box color-shadow-large" style="width:360px;">
  </div>
</div>

    <template id="snippet-clipboard-copy-button">
  <div class="zeroclipboard-container position-absolute right-0 top-0">
    <clipboard-copy aria-label="Copy code to clipboard" class="ClipboardButton btn js-clipboard-copy m-2 p-0" data-copy-feedback="Copied!" data-tooltip-direction="w">
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon m-2 tmp-m-2">
    <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
</svg>
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none m-2 tmp-m-2">
    <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path>
</svg>
    </clipboard-copy>
  </div>
</template>
<template id="snippet-clipboard-copy-button-unpositioned">
  <div class="zeroclipboard-container">
    <clipboard-copy aria-label="Copy code to clipboard" class="ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 d-flex flex-justify-center flex-items-center" data-copy-feedback="Copied!" data-tooltip-direction="w">
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon">
    <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
</svg>
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none">
    <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path>
</svg>
    </clipboard-copy>
  </div>
</template>




    </div>
    <div id="js-global-screen-reader-notice" class="sr-only mt-n1" aria-live="polite" aria-atomic="true" ></div>
    <div id="js-global-screen-reader-notice-assertive" class="sr-only mt-n1" aria-live="assertive" aria-atomic="true"></div>
  </body>
</html>

