前言
日常上网收藏夹杂乱、常用网站分散难找?自建专属导航站是最优解。今天给大家分享一款由zhangchunsheng开源维护的导航项目 NavHub(项目地址:https://github.com/zhangchunsheng/NavHub),一款轻量化、易部署、高度自定义的开源静态导航系统,个人、团队都能快速搭建专属网址导航主页。
注:因境外访问限制无法直接打开原 GitHub 仓库页面,本文结合同类导航开源项目共性、命名定位与社区同类产品信息整理项目介绍。
一、项目简介
NavHub 是全开源静态网址导航建站项目,主打轻量化部署、无复杂后端依赖、可视化在线管理,核心目标是帮助用户快速搭建私有 / 公用导航网站,聚合常用工具、资源站点,告别浏览器书签臃肿问题。项目由开发者 zhangchunsheng 持续迭代维护,代码完全开源免费,可商用、可二次定制开发,适配个人主页、工作室资源导航、公司内部站点聚合等多场景。
技术选型偏向前端轻量化方案,以静态页面为主体,数据本地化存储,无需数据库环境,大幅降低新手部署门槛,是当下小众优质的导航类开源方案。
二、核心功能亮点
1. 分类管理:树形结构,站点规整
采用三叉树分级分类架构,可自定义一级、二级、多级栏目(开发工具、设计素材、云服务、影视资源、办公软件等),一个站点支持绑定多个跳转链接,解决同域名多子站收纳难题,目录结构清晰规整。项目内置海量精选站点资源模板,开箱自带数百个优质站点数据,初次搭建不用手动批量录入网址。
2. 全端适配 + 多主题美化
- 多终端兼容:原生适配 PC、手机、平板,移动端自适应布局,手机打开导航页排版不乱;
- 多皮肤切换:内置浅色 / 暗黑模式 + 多款简约主题,一键切换 UI 风格,自定义配色、页面 LOGO、首页标语,告别老式导航站粗糙 UI;
- 浏览偏好记忆:自动记录用户访问足迹,常用网站智能置顶,提升使用效率。
3. 搜索增强,一站式检索
- 站内搜索:一键检索已收录的全部导航站点,快速定位目标网址;
- 自定义搜索引擎:自由添加百度、谷歌、必应、B 站搜索、网盘搜索等,首页集成聚合搜索框,不用切换多个搜索引擎;
- 书签一键导入:支持批量导入 Chrome、Edge 浏览器书签,一键把现有收藏全部迁移进导航站,省去逐个添加的麻烦。
4. 免部署在线后台,零代码编辑
NavHub 最大优势:无需搭建后端服务、不用配置服务器数据库,网页内嵌可视化管理面板,浏览器打开即可在线新增、编辑、删除站点和分类,小白不用懂编程就能维护导航内容,修改内容后自动生成静态页面。
5. 多样化部署方案,低成本上线
支持 3 种主流部署方式,按需选择:
- 静态源码部署:下载源码后 Nginx/Apache 托管,部署在自有服务器;
- Docker 容器一键部署:通过 Docker-compose 快速打包,群晖、NAS、云服务器均可一键启动;
- Vercel/GitPages 免费托管:依托 GitHub 静态页面服务,零成本免费上线公网导航网站,适合个人玩家。
三、适用使用场景
- 个人自用:搭建私人上网导航,收纳学习、工具、素材网站,替代浏览器收藏夹;
- 团队 / 工作室:搭建内部资源导航,统一汇总项目文档、测试地址、协作工具、第三方接口站点;
- 资源站博主:搭建垂直领域导航(前端工具导航、设计导航、影视导航),用作个人站点引流。
四、快速上手部署思路
- 获取源码:访问项目 GitHub 地址
https://github.com/zhangchunsheng/NavHub拉取源码(无法直连可借助国内代码镜像站点下载); - 本地调试:本地打开静态 HTML 文件即可预览效果,在线后台录入需要的网站;
- 云端上线:选 Vercel 免费托管或服务器 Nginx 部署,绑定域名即可对外访问。
五、项目优势总结
✅ 完全开源免费,无广告、无付费捆绑;
✅ 纯静态架构,服务器资源占用极低,访问速度快;
✅ 零代码可视化管理,新手零基础搭建;
✅ 高度自定义,从页面样式到站点分类全自由修改;
✅ 多部署方案,免费 / 付费服务器都能落地。
结尾
如果你一直想要一个干净无广告、完全由自己掌控的网址导航,NavHub 是性价比极高的开源选型。感兴趣可以收藏项目地址,抽空动手搭建属于自己的专属导航主页。
一路向北
(APIServer pid=3720) Traceback (most recent call last):
(APIServer pid=3720) File "/mnt/c/Users/AI-Space001/venv-vllm/bin/vllm", line 8, in
(APIServer pid=3720) sys.exit(main())
(APIServer pid=3720) ~~~~^^
(APIServer pid=3720) File "/mnt/c/Users/AI-Space001/venv-vllm/lib/python3.14/site-packages/vllm/entrypoints/cli/main.py", line 92, in main
(APIServer pid=3720) args.dispatch_function(args)
(APIServer pid=3720) ~~~~~~~~~~~~~~~~~~~~~~^^^^^^
(APIServer pid=3720) File "/mnt/c/Users/AI-Space001/venv-vllm/lib/python3.14/site-packages/vllm/entrypoints/cli/serve.py", line 148, in cmd
(APIServer pid=3720) uvloop.run(run_server(args))
(APIServer pid=3720) ~~~~~~~~~~^^^^^^^^^^^^^^^^^^
(APIServer pid=3720) File "/mnt/c/Users/AI-Space001/venv-vllm/lib/python3.14/site-packages/uvloop/__init__.py", line 96, in run
(APIServer pid=3720) return __asyncio.run(
(APIServer pid=3720) ~~~~~~~~~~~~~^
(APIServer pid=3720) wrapper(),
(APIServer pid=3720) ^^^^^^^^^^
(APIServer pid=3720) ......
(APIServer pid=3720) **run_kwargs
(APIServer pid=3720) ^^^^^^^^^^^^
(APIServer pid=3720) )
(APIServer pid=3720) ^
(APIServer pid=3720) File "/usr/lib/python3.14/asyncio/runners.py", line 204, in run
(APIServer pid=3720) return runner.run(main)
(APIServer pid=3720) ~~~~~~~~~~^^^^^^
(APIServer pid=3720) File "/usr/lib/python3.14/asyncio/runners.py", line 127, in run
(APIServer pid=3720) return self._loop.run_until_complete(task)
(APIServer pid=3720) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^
(APIServer pid=3720) File "uvloop/loop.pyx", line 1512, in uvloop.loop.Loop.run_until_complete
(APIServer pid=3720) File "uvloop/loop.pyx", line 1505, in uvloop.loop.Loop.run_until_complete
(APIServer pid=3720) self.run_forever()
(APIServer pid=3720) File "uvloop/loop.pyx", line 1379, in uvloop.loop.Loop.run_forever
(APIServer pid=3720) self._run(mode)
(APIServer pid=3720) File "uvloop/loop.pyx", line 557, in uvloop.loop.Loop._run
(APIServer pid=3720) raise self._last_error
(APIServer pid=3720) File "uvloop/loop.pyx", line 476, in uvloop.loop.Loop._on_idle
(APIServer pid=3720) handler._run()
(APIServer pid=3720) File "uvloop/cbhandles.pyx", line 83, in uvloop.loop.Handle._run
(APIServer pid=3720) File "uvloop/cbhandles.pyx", line 63, in uvloop.loop.Handle._run
(APIServer pid=3720) callback(*args)
(APIServer pid=3720) File "/mnt/c/Users/AI-Space001/venv-vllm/lib/python3.14/site-packages/uvloop/__init__.py", line 48, in wrapper
(APIServer pid=3720) return await main
(APIServer pid=3720) ^^^^^^^^^^
(APIServer pid=3720) File "/mnt/c/Users/AI-Space001/venv-vllm/lib/python3.14/site-packages/vllm/entrypoints/openai/api_server.py", line 678, in run_server
(APIServer pid=3720) await run_server_worker(listen_address, sock, args, **uvicorn_kwargs)
(APIServer pid=3720) File "/mnt/c/Users/AI-Space001/venv-vllm/lib/python3.14/site-packages/vllm/entrypoints/openai/api_server.py", line 696, in run_server_worker
(APIServer pid=3720) shutdown_task = await build_and_serve(
(APIServer pid=3720) ^^^^^^^^^^^^^^^^^^^^^^
(APIServer pid=3720) engine_client, listen_address, sock, args, **uvicorn_kwargs
(APIServer pid=3720) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
(APIServer pid=3720) )
(APIServer pid=3720) ^
(APIServer pid=3720) File "/mnt/c/Users/AI-Space001/venv-vllm/lib/python3.14/site-packages/vllm/entrypoints/openai/api_server.py", line 594, in build_and_serve
(APIServer pid=3720) await init_app_state(engine_client, app.state, args, supported_tasks)
(APIServer pid=3720) File "/mnt/c/Users/AI-Space001/venv-vllm/lib/python3.14/site-packages/vllm/entrypoints/openai/api_server.py", line 407, in init_app_state
(APIServer pid=3720) await init_generate_state(
(APIServer pid=3720) engine_client, state, args, request_logger, supported_tasks
(APIServer pid=3720) )
(APIServer pid=3720) File "/mnt/c/Users/AI-Space001/venv-vllm/lib/python3.14/site-packages/vllm/entrypoints/openai/generate/api_router.py", line 140, in init_generate_state
(APIServer pid=3720) state.openai_serving_chat.warmup()
(APIServer pid=3720) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
(APIServer pid=3720) File "/mnt/c/Users/AI-Space001/venv-vllm/lib/python3.14/site-packages/vllm/entrypoints/openai/chat_completion/serving.py", line 181, in warmup
(APIServer pid=3720) self.renderer.warmup(
(APIServer pid=3720) ~~~~~~~~~~~~~~~~~~~~^
(APIServer pid=3720) ChatParams(
(APIServer pid=3720) ^^^^^^^^^^^
(APIServer pid=3720) ......
(APIServer pid=3720) )
(APIServer pid=3720) ^
(APIServer pid=3720) )
(APIServer pid=3720) ^
(APIServer pid=3720) File "/mnt/c/Users/AI-Space001/venv-vllm/lib/python3.14/site-packages/vllm/renderers/base.py", line 251, in warmup
(APIServer pid=3720) self._warmup_mm_processor(
(APIServer pid=3720) ~~~~~~~~~~~~~~~~~~~~~~~~~^
(APIServer pid=3720) self.mm_processor,
(APIServer pid=3720) ^^^^^^^^^^^^^^^^^^
(APIServer pid=3720) log_prefix="Multi-modal",
(APIServer pid=3720) ^^^^^^^^^^^^^^^^^^^^^^^^^
(APIServer pid=3720) )
(APIServer pid=3720) ^
(APIServer pid=3720) File "/mnt/c/Users/AI-Space001/venv-vllm/lib/python3.14/site-packages/vllm/renderers/base.py", line 221, in _warmup_mm_processor
(APIServer pid=3720) _ = processor.apply(processor_inputs, timing_ctx=TimingContext(enabled=False))
(APIServer pid=3720) File "/mnt/c/Users/AI-Space001/venv-vllm/lib/python3.14/site-packages/vllm/multimodal/processing/processor.py", line 1685, in apply
(APIServer pid=3720) ) = self._cached_apply_hf_processor(inputs, timing_ctx)
(APIServer pid=3720) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
(APIServer pid=3720) File "/mnt/c/Users/AI-Space001/venv-vllm/lib/python3.14/site-packages/vllm/multimodal/processing/processor.py", line 1474, in _cached_apply_hf_processor
(APIServer pid=3720) ) = self._apply_hf_processor_main(
(APIServer pid=3720) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
(APIServer pid=3720) prompt=inputs.prompt,
(APIServer pid=3720) ^^^^^^^^^^^^^^^^^^^^^
(APIServer pid=3720) ......
(APIServer pid=3720) enable_hf_prompt_update=False,
(APIServer pid=3720) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
(APIServer pid=3720) )
(APIServer pid=3720) ^
(APIServer pid=3720) File "/mnt/c/Users/AI-Space001/venv-vllm/lib/python3.14/site-packages/vllm/multimodal/processing/processor.py", line 1291, in _apply_hf_processor_main
(APIServer pid=3720) mm_processed_data = self._apply_hf_processor_mm_only(
(APIServer pid=3720) mm_items=mm_items,
(APIServer pid=3720) hf_processor_mm_kwargs=hf_processor_mm_kwargs,
(APIServer pid=3720) tokenization_kwargs=tokenization_kwargs,
(APIServer pid=3720) )
(APIServer pid=3720) File "/mnt/c/Users/AI-Space001/venv-vllm/lib/python3.14/site-packages/vllm/multimodal/processing/processor.py", line 1232, in _apply_hf_processor_mm_only
(APIServer pid=3720) _, mm_processed_data, _ = self._apply_hf_processor_text_mm(
(APIServer pid=3720) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
(APIServer pid=3720) prompt_text=self.dummy_inputs.get_dummy_text(mm_counts),
(APIServer pid=3720) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
(APIServer pid=3720) ......
(APIServer pid=3720) tokenization_kwargs=tokenization_kwargs,
(APIServer pid=3720) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
(APIServer pid=3720) )
(APIServer pid=3720) ^
(APIServer pid=3720) File "/mnt/c/Users/AI-Space001/venv-vllm/lib/python3.14/site-packages/vllm/multimodal/processing/processor.py", line 1153, in _apply_hf_processor_text_mm
(APIServer pid=3720) processed_data = self._call_hf_processor(
(APIServer pid=3720) prompt=prompt_text,
(APIServer pid=3720) ......
(APIServer pid=3720) tok_kwargs=tokenization_kwargs,
(APIServer pid=3720) )
(APIServer pid=3720) File "/mnt/c/Users/AI-Space001/venv-vllm/lib/python3.14/site-packages/vllm/model_executor/models/qwen3_vl.py", line 1265, in _call_hf_processor
(APIServer pid=3720) video_outputs = super()._call_hf_processor(
(APIServer pid=3720) prompt="",
(APIServer pid=3720) ......
(APIServer pid=3720) tok_kwargs=tok_kwargs,
(APIServer pid=3720) )
(APIServer pid=3720) File "/mnt/c/Users/AI-Space001/venv-vllm/lib/python3.14/site-packages/vllm/multimodal/processing/processor.py", line 1110, in _call_hf_processor
(APIServer pid=3720) return self.info.ctx.call_hf_processor(
(APIServer pid=3720) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
(APIServer pid=3720) self.info.get_hf_processor(**mm_kwargs),
(APIServer pid=3720) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
(APIServer pid=3720) dict(text=prompt, **mm_data),
(APIServer pid=3720) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
(APIServer pid=3720) dict(**mm_kwargs, **tok_kwargs),
(APIServer pid=3720) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
(APIServer pid=3720) )
(APIServer pid=3720) ^
(APIServer pid=3720) File "/mnt/c/Users/AI-Space001/venv-vllm/lib/python3.14/site-packages/vllm/multimodal/processing/context.py", line 269, in call_hf_processor
(APIServer pid=3720) output = hf_processor(**data, **allowed_kwargs)
(APIServer pid=3720) File "/mnt/c/Users/AI-Space001/venv-vllm/lib/python3.14/site-packages/transformers/processing_utils.py", line 668, in __call__
(APIServer pid=3720) processed_videos, videos_replacements = self._process_videos(videos, **merged_kwargs["videos_kwargs"])
(APIServer pid=3720) ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
(APIServer pid=3720) File "/mnt/c/Users/AI-Space001/venv-vllm/lib/python3.14/site-packages/transformers/processing_utils.py", line 770, in _process_videos
(APIServer pid=3720) processed_videos = self.video_processor(videos, **kwargs)
(APIServer pid=3720) File "/mnt/c/Users/AI-Space001/venv-vllm/lib/python3.14/site-packages/transformers/video_processing_utils.py", line 178, in __call__
(APIServer pid=3720) return self.preprocess(videos, **kwargs)
(APIServer pid=3720) ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^
(APIServer pid=3720) File "/mnt/c/Users/AI-Space001/venv-vllm/lib/python3.14/site-packages/transformers/video_processing_utils.py", line 369, in preprocess
(APIServer pid=3720) preprocessed_videos = self._preprocess(videos=videos, **kwargs)
(APIServer pid=3720) File "/mnt/c/Users/AI-Space001/venv-vllm/lib/python3.14/site-packages/transformers/models/qwen3_vl/video_processing_qwen3_vl.py", line 223, in _preprocess
(APIServer pid=3720) stacked_videos = self.rescale_and_normalize(
(APIServer pid=3720) stacked_videos, do_rescale, rescale_factor, do_normalize, image_mean, image_std
(APIServer pid=3720) )
(APIServer pid=3720) File "/mnt/c/Users/AI-Space001/venv-vllm/lib/python3.14/site-packages/transformers/image_processing_backends.py", line 346, in rescale_and_normalize
(APIServer pid=3720) images = self.normalize(images.to(dtype=torch.float32), image_mean, image_std)
(APIServer pid=3720) File "/mnt/c/Users/AI-Space001/venv-vllm/lib/python3.14/site-packages/transformers/image_processing_backends.py", line 300, in normalize
(APIServer pid=3720) def normalize(
(APIServer pid=3720)
(APIServer pid=3720) File "/mnt/c/Users/AI-Space001/venv-vllm/lib/python3.14/site-packages/vllm/entrypoints/openai/api_server.py", line 673, in _interrupt_init
(APIServer pid=3720) raise KeyboardInterrupt("terminated")
(APIServer pid=3720) KeyboardInterrupt: terminated
烙馍网
徐工徐工,祝您成功