FSNotes 6 新特性深度解析:Git 版本控制、AES-256 文件夹加密与网页分享实战
桌面应用移动开发知识管理【免费下载链接】fsnotesFast Markdown note-taking app for Mac and iPhone项目地址https://gitcode.com/gh_mirrors/fs/fsnotes点击查看免费下载FSNotes 6 是这款 macOS 与 iPhone 双端 Markdown 笔记应用的一次重大版本更新它重构了界面设计为每个笔记文件夹引入了基于 Git 的版本控制在移动端补齐了 AES-256 整文件夹加密并新增一键将笔记发布为网页的能力。本文以官方 6.0 版本说明为骨架结合仓库源码逐项拆解这些功能的配置路径、操作流程与底层实现读完即可在自己的笔记库中落地一套版本化 加密 分享的完整工作流。6.0 版带来了什么6.0 的更新可以归纳为四条主线全新设计官方称之为程序历史上最大的一次设计变化全面贴近 Apple 人机界面指南HIGGit 版本控制在上一版版本化内置历史快照的基础上直接为每个笔记文件夹接入 Git 仓库支持提交、拉取、推送文件夹加密桌面端此前已有的文件夹加密能力这一次同步到了移动版整个文件夹的笔记统一使用 AES-256 加密Web 分享把单篇笔记渲染成网页发布到线上生成链接并复制到剪贴板。除此之外还有编辑器工具栏的增强、应用图标的更换以及对旧版加密、崩溃、预览问题的修复。下面逐一展开。全新的界面设计向 Apple HIG 全面对齐官方说明指出6.0 的设计是程序历史上最大的一次设计变革——品牌化的图标、菜单、工具栏、头部、动画与平滑过渡整体观感更接近 Apple 系统自带程序。仓库中的资源也印证了这次设计资产的大规模更新macOS 端在 Images.xcassets/Icons/ 下同时保留了AppIconClassic.imageset经典风格图标与AppIconModern.imageset6.0 新图标可随时切换iOS 端则维护了三套可选的图标工程classic-2025.icon、modern.icon 与 ny-2026.icon均为 SVG 源文件对应偏好设置中的 AppIconViewController.swift侧边栏、工具栏等各处 UI 图标在 Images.xcassets 中大量更新例如sidebar_project、sidebar_tag、sidebar_archive等成套的 sidebar 图标集。作者在文档中特别致谢设计师 Dylan Seeger 的宝贵建议感谢其通过提交工单推动本次改版成型。应用图标方面旧版图标由 Roman Kliuchkovych 绘制6.0 的新图标改由 Dylan Seeger 绘制在设置界面可以找到设计者的信息页。对于喜欢深色壁纸的用户还提供了一款全黑all-black图标变体方便与纯黑桌面融为一体。用 Git 为每个笔记文件夹建立版本仓库6.0 的核心卖点之一是让每一个笔记文件夹都可以独立成为一个 Git 仓库你可以初始化仓库、提交笔记并把变更推送到自己的服务器应用激活时会自动拉取远端变更也可以在偏好设置中开启定时自动同步。在偏好设置中完成初始化打开「偏好设置 → Git」对应源码是 PreferencesGitViewController.swift核心配置项如下配置项控件说明源码中的默认行为仓库存储路径repositoriesPathNSPathControl所有 Git 仓库的存放根目录默认读取UserDefaultsManagement.gitStorage备份方式backupManually/backupBySchedule手动备份或按计划自动备份选择定时备份时调用schedulePull()启动定时器定时拉取间隔pullIntervalNSTextField自动git pull的间隔秒默认 10 秒源码中强制最小值 10 秒见 UserDefaultsManagement.swift 的pullInterval快照周期小时snapshotsTextField按小时触发自动快照提交输入 0 会被重置为 1snapshotsInterval快照分钟对齐minutesNSTextField指定快照在每小时的第几分钟触发snapshotsIntervalMinutes独立 .git 目录separateDotGit为每个项目单独存放.git而不是集中存放在仓库根目录separateRepo仅对非 iCloud 项目生效提交时询问信息askCommitMessage每次提交前弹出对话框填写 commit message历史 message 会记忆在lastCommitMessage中需要注意Git 仓库存储路径不能与默认笔记存储路径相同选择时会弹出 Default storage path should not be equal to Git path. 的提示并拒绝设置。仓库路径确定后该路径会通过SandboxBookmark保存沙盒访问书签并支持一键在 Finder 或 Terminal.app 中打开showFinder/showTerminal。官方文档中提到可以设置为每 30 秒自动同步从当前源码看自动拉取间隔的最小值被限制为 10 秒、默认也为 10 秒你可以按需把pullInterval调大例如 30 秒或更长以减少频繁同步对服务器和网络的压力。四种仓库状态与对应操作初始化之后每个项目会根据是否已有仓库、是否配置了远端处于四种状态之一源码见 ProjectGit.swift 的getRepositoryState()状态判定条件执行的动作gitDoinitCommit无仓库、无远端初始化裸仓库并做首次提交commit message 默认为 FSNotes InitclonePush无仓库、有远端从 origin clone 到本地临时目录再把.git移入仓库目录随后强制检出本地分支commit有仓库、无远端直接git add . commit默认 message Usual commitpullPush有仓库、有远端先 pull 再 push若 pull 失败未提交的冲突会先自动 commit 再重试 pull 并 pushgit add .、commit、push、pull 全部封装在 ProjectGit.swift 的commit(message:progress:)、push(progress:)、pull(progress:)中。值得注意的实现细节远程认证支持密码或 SSH 密钥两种方式密钥通过StaticSshKeyDelegateSshKeyHandler注入私钥/公钥会写入 git 密钥目录见 KeyAuthentication.swift 与 PasswordAuthentication.swift冲突兜底pull抛出GitError.uncommittedConflict时先自动commit()一次再重新 pull 并 push避免远端变更被本地未提交内容阻塞后台队列所有 Git 操作都投递到ViewController.gitQueue一个maxConcurrentOperationCount 1的串行 OperationQueue执行避免并发读写同一仓库如果某次操作卡住超过 2 分钟代码还会重建队列见 ViewControllerGit.swift 的pull。版本历史快照与回溯除了主动/定时提交6.0 还提供历史快照机制makeFullSnapshot会按配置的小时与分钟周期snapshotsInterval、snapshotsIntervalMinutes对启用 Git 的项目逐一执行 commit → pull → push实现近乎自动化的笔记备份到服务器。需要回溯历史版本时通过saveRevision可自定义 commit message与checkoutRevision在笔记上检出某个 Commit检出前若尚未保存会先自动 commitAuto save on history checkout随后重新加载笔记内容并刷新界面——对应的历史遍历由 FileHistoryIterator.swift 等 Git 封装模块支撑。![FSNotes 6 移动端的 Git 同步与版本控制界面](https://raw.gitcode.com/gh_mirrors/fs/fsnotes/raw/ca305e464c469e6372cccba11b37d4a58bb51e2c/Resources/Initial/Meet FSNotes 6.textbundle/assets/IMG_1882.jpeg?utm_sourcegitcode_repo_files)文件夹加密AES-256 保护整目录笔记文件夹加密此前已存在于桌面程序6.0 将其完整带到了移动版。官方给出的流程分两步先在设置中设定主密码再对具体文件夹执行加密。第一步设置主密码在 macOS 的「偏好设置 → 安全」中对应 PreferencesSecurityViewController.swift可以配置主密码Master Password点击后弹出 MasterPasswordViewController.swift 设置密码与密码提示hintTouch ID / Face IDallowTouchID开启后主密码可保存在 macOS KeychainKeychainPasswordItemservice 见 KeychainConfiguration.swift后续解锁时先通过LAContext.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics)做生物识别再从钥匙串读取密码见 EditorViewController.swift 的getMasterPassword锁定策略支持锁屏lockOnSleep、屏幕激活lockOnScreenActivated、快速用户切换lockWhenFastUser时自动锁定加密内容。第二步加密 / 解锁文件夹在侧边栏对文件夹长按移动端或在导航菜单中操作桌面端选择加密/锁定动作底层入口是 SidebarOutlineView.swift 的toggleFolderLock未加密的文件夹弹出两次密码输入框密码 确认见masterPasswordPrompt(validation:)的 Password: / Verify Password: 字段随后对该文件夹下的所有笔记执行加密已加密但处于解锁状态执行锁定lock已加密且处于锁定状态输入主密码后统一解锁unlock。Project层的isLocked()、encrypt(password:)、decrypt(password:)、lock()、unlock(password:)见 Project.swift负责在项目维度批量加密/解密其下所有笔记。单笔记加密的底层原理以单篇笔记为例Note.swift 的encrypt(password:)展示了完整的加密管线若笔记是普通 Markdown 文件先转换为 textbundle 容器convertFlatToTextBundle保证图片等附件一并打包用SSZipArchive把 textbundle 目录压缩成 zip读取 zip 数据后调用RNCryptor.encrypt(data:withPassword:)加密RNCryptor 默认采用AES-256算法并由密码经 PBKDF2 派生密钥加密产物以.etpEncryptedTextPack扩展名落盘同时删除原始文件、清理内存缓存。加密后的状态判定由isEncrypted()、isEncryptedAndLocked()、isUnlocked()管理笔记内容在解锁前不加载到编辑器lock()会在密文写入队列清空后删除临时明文并复位密码从而保证锁定时磁盘上只有密文。![FSNotes 移动端加密文件夹的上下文菜单](https://raw.gitcode.com/gh_mirrors/fs/fsnotes/raw/ca305e464c469e6372cccba11b37d4a58bb51e2c/Resources/Initial/Meet FSNotes 6.textbundle/assets/encrypt-menu.jpeg?utm_sourcegitcode_repo_files)Web 分享把一篇笔记发布成网页很多时候需要快速把某条笔记分享给别人但对方未必安装了支持 Markdown 乃至 textbundle 的编辑器。为此 6.0 新增了 Web 发布在笔记列表中长按笔记从上下文菜单选择Create Web Page发布为网页笔记即被渲染成网页并在浏览器中打开链接同时复制到剪贴板。发布流程的实现细节桌面端入口是 ViewControllerWeb.swift 的uploadWebNote完整流程为用MPreviewView.buildPage(for:at:web:)把笔记渲染成自包含的静态页面index.html若笔记包含图片图片会被一并处理并上传到远程i/子目录发布完成后调用NSWorkspace.shared.open(url)在默认浏览器打开并通过NSPasteboard.general把链接写入系统剪贴板需要下线时通过上下文菜单执行删除发布removeWebNote删除远程目录并清除本地上传路径记录saveUploadPaths。两种发布通道FSNotes 官方托管服务默认无需自建服务器发布走createAPI见 ViewControllerWebApi.swift。作者在文档中说明目前不会主动删除已发布的笔记但未来发布页可能改为临时页面保质期约 1 个月适合短期分享场景。自定义服务器SFTP在「偏好设置 → Web」中切换到自定义服务器customWebServer并配置 SFTP 参数PreferencesWebViewController.swift主机sftpHost、端口sftpPort、远程路径sftpPath、公开访问地址sftpWeb、用户名/密码以及可选的 RSA 私钥/公钥与 passphrase密钥文件通过沙盒书签保存。上传时会执行mkdir -p建目录依次上传index.html、zip 归档与图片资源。![FSNotes 6 将笔记发布为网页的界面](https://raw.gitcode.com/gh_mirrors/fs/fsnotes/raw/ca305e464c469e6372cccba11b37d4a58bb51e2c/Resources/Initial/Meet FSNotes 6.textbundle/assets/web-sharing.png?utm_sourcegitcode_repo_files)编辑器与工具栏改进6.0 在编辑器内直接提供更多操作入口借助全新的工具栏可以快速新建笔记或直接跳转到主屏幕进行搜索减少了在编辑器与主界面之间来回切换的次数。macOS 端的编辑器主体为 EditTextView.swift 配合 EditorViewController.swiftiOS 端对应 EditTextView.swift工具栏按钮在 Assets.xcassets/Toolbar 中提供了成套的加粗、斜体、标题、待办、图片、引用等图标资源。修复与已知问题官方文档同时确认了以下修复与预期修复了此前文件夹加密相关的问题修复了若干应用崩溃修复了笔记预览方面的问题作者也坦诚地预告本次更新当然也可能引入新的 bug。小结FSNotes 6 的这次更新把笔记应用的数据安全感提升到了开发者友好的层级Git 仓库让每个文件夹都有了完整的历史版本与远程备份能力AES-256 加密让敏感笔记在桌面与移动端同样可控Web 分享则打通了笔记 → 网页 → 剪贴板链接的最短分享路径。配合偏好设置中的 Git 存储路径、拉取间隔、快照周期与 SFTP 参数你可以组合出一套完全属于自己的笔记版本化与分发方案。—— 本文基于仓库内官方版本说明 Meet FSNotes 6.textbundle/text.markdown 及对应源码撰写。赞分享桌面应用移动开发知识管理【免费下载链接】fsnotesFast Markdown note-taking app for Mac and iPhone项目地址https://gitcode.com/gh_mirrors/fs/fsnotes点击查看免费下载相关推荐python-mini-projects 文件与文件夹加密实战深入解析 AES-128 CFB 加密脚本 encrypt.pypython mini projects 文件与文件夹加密实战深入解析 AES 128 CFB 加密脚本 encrypt.py 导读 本文围绕 python示例工程3000文件加密实测Seafile AES-256与ChaCha20性能深度对比3000文件加密实测Seafile AES 256与ChaCha20性能深度对比 你是否遇到过团队协作时文件同步缓慢、加密导致系统卡顿的问题作为高性能文件同存储数据同步Keepass2Android安全机制深度解析AES-256加密与密钥管理作为一款功能强大的安卓密码管理器 Keepass2Android 采用了业界领先的 AES 256加密 技术来保护用户数据安全。这款开源应用通过多层次的安全机移动开发应用安全密码学创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Cocos Creator 3D单纹理动态发光Shader实战

Cocos Creator 3D单纹理动态发光Shader实战

1. 这个“单张纹理发光”到底在解决什么真实问题?我第一次在某跨平台动作Demo里看到这个效果时,心里其实是有点疑惑的:不就是加个发光吗?引擎自带的HDR、Bloom后处理不就能搞定?为什么非得折腾Shader,还强调…

2026/10/15 12:32:02 阅读更多 →
HDFS块存储与MapReduce确定性计算原理深度解析

HDFS块存储与MapReduce确定性计算原理深度解析

1. 为什么今天还要啃透Hadoop这套“老架构”? 很多人看到Hadoop第一反应是:“这不早过时了吗?现在都上云原生、Flink、Spark了。”我去年在某高校实验室带一个分布式日志分析项目时,也这么想。结果刚把Spark Streaming跑通&#x…

2026/10/15 12:32:02 阅读更多 →
日常运维不常见问题

日常运维不常见问题

1.软件1.1会议软件问题1.1.1teams会议软件自动删除邮箱收到的会议邀请teams会议软件,只支持绑定的邮箱在outlook登录。解决:查看邮箱账号有没有在其他客户端登录。有点话在其他客户端删除邮箱。2.硬件2.1 对码双飞燕蓝牙鼠标换接收器对码

2026/10/15 12:31:01 阅读更多 →

最新新闻

Linux弱口令检测实战:John the Ripper从原理到加固全指南

Linux弱口令检测实战:John the Ripper从原理到加固全指南

前几天帮某单位做例行安全巡检,登录测试服务器以后,我习惯性地收集了一波Linux账号口令哈希,丢给John the Ripper跑了一会儿,结果连五分钟都没用到,一个运维账号的弱口令就被直接撞了出来。这种场景在真实环境里几乎每…

2026/10/15 14:07:04 阅读更多 →
深入理解 Claude Code 的 Token 预算与压缩策略:从 Autocompact 到 TaoToken 的上下文窗口管理

深入理解 Claude Code 的 Token 预算与压缩策略:从 Autocompact 到 TaoToken 的上下文窗口管理

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 14:07:04 阅读更多 →
微信小程序社区后勤报修管理系统源码解析与部署实践

微信小程序社区后勤报修管理系统源码解析与部署实践

这套基于微信小程序的社区后勤报修管理系统,到底值不值得花时间研究先说个让人兴奋的事:这类报修管理系统的源码是开放的,标题里搜到的项目包基本都带完整前后端代码和数据库脚本。我拿到源码后实际跑了一遍,又从头到尾读了核心模…

2026/10/15 14:07:04 阅读更多 →
深入解析SQL删除操作:DELETE、TRUNCATE、DROP的区别与正确使用

深入解析SQL删除操作:DELETE、TRUNCATE、DROP的区别与正确使用

写这篇文章的起因很简单:我处理过太多因为三个SQL关键字没分清导致的线上事故。有人用delete清表,结果跑了四十分钟还没结束;有人想清空数据,却一哆嗦敲成了drop,整个表连同结构直接没了;还有人面试时被问到…

2026/10/15 14:07:04 阅读更多 →
XGBoost竞赛实战:从数据处理到模型融合的完整方法论

XGBoost竞赛实战:从数据处理到模型融合的完整方法论

1. XGBoost为什么到今天还是竞赛的硬通货先说结论:在各类数据科学竞赛平台上,XGBoost依旧是表格类问题里最稳、最容易上手的首发模型。我见过太多人一开始就想上深度神经网络,结果在表格数据上被XGBoost的单个baseline打得抬不起头。这个局面…

2026/10/15 14:07:04 阅读更多 →
React Native与鸿蒙系统跨平台书架应用开发实践

React Native与鸿蒙系统跨平台书架应用开发实践

1. 项目背景与核心需求在移动应用开发领域,跨平台技术已经成为提升开发效率的主流选择。React Native作为Facebook推出的跨平台框架,允许开发者使用JavaScript和React语法构建原生应用体验。而鸿蒙系统作为新兴的分布式操作系统,其跨设备协同…

2026/10/15 14:06:01 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →