Privacy Policy for Readnow Safari Extension

Effective date: June 14, 2023

Kun Ran (“we,” “our,” or “us”) respects your privacy and is committed to protecting it through this Privacy Policy. This Privacy Policy governs your access to and use of the Readnow Safari Extension, including any content, functionality, and services offered on or through it (the “Extension”).

Please read this policy carefully to understand our policies and practices regarding your information and how we will treat it. By using or accessing the Extension, you agree to this Privacy Policy.

1. Information We Collect

The Extension uses storage permissions to store your reading progress. It also uses tab permissions to get the current reading tab URL. The alarms permission is used to update the Extension badge text. The data gathered by these features is stored locally on your device and is not collected or used by us.

We use the ‘‘ server to parse articles. No personal information from your use of our Extension is communicated back to us in this way.

2. How We Use Your Information

We use the information we collect from the Extension to provide, maintain, and improve the Extension and to develop new services.

We do not share personal information with companies, organizations, or individuals outside of our organization unless one of the following circumstances applies:

  • For legal reasons. We will share personal information with companies, organizations, or individuals if we have a good-faith belief that access, use, preservation or disclosure of the information is reasonably necessary to meet any applicable law, regulation, legal process, or enforceable governmental request.

3. Security

We work hard to protect our users from unauthorized access to or unauthorized alteration, disclosure or destruction of information we hold. We use various security measures to protect your information, which includes but is not limited to encryption, firewalls, and secure socket layer technology.

4. Changes to Our Privacy Policy

It is our policy to post any changes we make to our Privacy Policy on this page. The date the Privacy Policy was last revised is identified at the top of the page.

5. Contact Information

Kun Ran welcomes your questions or comments regarding the Privacy Policy. Please contact us at:
Email Address:

6. Language

This contract was originally written in English (US). To the extent any translated version of this agreement conflicts with the English version, the English version controls.

This policy is effective as of the date set forth above and is only a summary of our data collection, usage, and protection practices. By using our Extension, you signify your assent to this Privacy Policy. If you do not agree with our policies and practices, your choice is not to use our Extension.

7. Data Retention

We retain personal data as long as it is needed to to conduct our legitimate business purposes or to comply with our legal obligations, or until you ask us to delete your data. For example, we will retain certain personal information indefinitely for the purposes of maintaining your account, unless and until you delete your account.

8. Third-Party Sites

Our Extension may contain links to other websites. If you choose to click on a third-party link, you will be directed to that third party’s website. The fact that we link to a website is not an endorsement, authorization or representation of our affiliation with that third party, nor is it an endorsement of their privacy or information security policies or practices.

9. Governing Law

This Privacy Policy is governed by the laws of China. Any dispute arising from the use of the Extension shall be submitted to the competent court in the jurisdiction where Kun Ran resides.

By using the Extension, you are consenting to our processing of your information as set forth in this Privacy Policy now and as amended by us.

11. Contact Us

If you have any additional questions or concerns about this Privacy Policy, please feel free to contact us any time through the Extension or at

12. Changes to the Privacy Policy

We may revise our Privacy Policy from time to time. The most current version of the policy will govern our processing of your personal data and will always be available to you. If we make a change to this policy that, in our sole discretion, is material, we will notify you via the email address associated with your account.

Kun Ran reserves the right to amend this privacy policy at any time with or without notice. Please check back frequently in case of changes to this policy. Your continued use of our Extension following the posting of changes to these terms will mean you accept those changes.

Give everything you have and watch the ripples

Give everything you have and watch the ripples.

居然被热醒了… 有一些时间没回来成都了,刚刚 Jimmy 给我发了他公司 “new space” 的 3D 模型跟场景渲染图,我太喜欢了,明天去看看施工进展。现在他公司做的整体装修布置我觉得已经很🉑了(好吧我是眼馋他满桌子的无人机 跟 3D 打印的机械臂,哪个科技发烧友不眼馋 😂),但我知道他想要更多,更好,”more”, more! 多么富有人类情感的一个词 😝

他之前描述他以前在美国的公司设计思路的时候,我就觉得他很注重细节和整体用户体验,谈项目 as an experience 也可以是一个设计点,要知道那个时候即便是在美国他也是科技公司里比较早做这样的考虑的。”because we wanna give our clients a better experience when they come to us”, “they ended up working at our office more than their own, because it just, feels good”(原话已经忘的差不多了,大概就是这样)为什么人家能拿到你的项目啊?因为你从踏进人家公司的那一刻就处于人家的体验之中,如果没把你感动说明他活儿不好 😂😂

我最近在 adidas 办公了一段时间,也体验到了类似于他当时说的那种环境,大的夸张的 4K 屏幕放在会议室里,各种处于同一 eco-system 中的设备相互连接提供最佳的现场与远程参会体验。不过相比于不差钱的 adidas,你在金钱有限的时候能把活儿做的多好这才是更有趣的地方。在有限的资源与无限的欲望之间,「设计」发光发热 🤹

无疑他是一个优秀的商人,他的时间与精力大都浇灌在了他做的事情上面。想起 19 年我们刚合作那会儿他刚完成一个前后协同开发的架构设计跟基础开发,然后除了我们项目,他跟他老婆还开始了现在这个公司,这种 200% 做事的激情是打动我的地方。想一想身边还有许多这样的朋友,Haishan, Kaleo , Sol, Trista 他们,有的打磨自己的手艺,有的浇灌自己的生活。感动,实在是感动 🥳🥳 如开头那句最近看到的话我很喜欢,我感觉有这样的朋友我自己都觉得很有力量。

我只列举了几个最近玩的比较多,技术/艺术相关的朋友,其他朋友各有所长 😜 要是有机会真希望给他们每人都发一条这样的朋友圈 😂😂

SSH to overseas server too slow?

UPDATE (2018-05-03):

I ended up using a BandWagon VPS as high volume traffic proxy with an AEAD encryption method and another faster one as a backup instead of those ssh forwarding stuff, it was unstable and quickly fallen only one month later and never be fast again.

The original post:

Use China mainland cloud server as a hop.

ssh -v -N -L 2222:remote.oversea:2222  cloud.mainland


ssh -p 2222 root@localhost

Or even mount as a local folder:

sshfs -p 2222 root@localhost:/var/www/html ~/docker/nhweb -oauto_cache,reconnect,defer_permissions,noappledouble,negative_vncache,volname=nhweb

A few sweet ssh features to improve your development experience.

Expose local port to internet with a delegate:

# Remote server
sudo vi /etc/ssh/sshd_config
# Append below content:
# GatewayPorts yes

# Local
ssh -v -N -R *:9090:localhost:8080 cloud.mainland

Then heading to http://cloud.mainland:9090 for the results.


Enable Google Drive file sync, on a Mac, in China

UPDATE (2018-05-03):

Another option is to use Surge for Mac, it just works, fantastically well!

Use Polipo to convert a socks connection into a http proxy.

brew install polipo

Once you had polipo installed, config it to work properly with a polipo.proxy:

socksParentProxy = "localhost:8089"
socksProxyType = socks5

proxyAddress = "::0" # both IPv4 and IPv6
# allowedClients =,

pmmFirstSize = 16384
pmmSize = 8192

And start polipo.

polipo -c ./polipo.config

Then config Web Proxy (HTTP) & Secure Web Proxy (HTTPS) to (Settings -> Network -> Advanced -> Proxies -> Web Proxy (HTTP) -> OK -> Apply).

And you will get your Google Drive sync each changes on the fly.

For convenient, use our bash tool :)

Bash, OS X: pSet - a CLI, help you manage your OSX network settings.

Browse the Internet from China


  • 2016-05-27 14:25:20
    • Docker enthusiast? (7MB/s)

Let’s talk about network. Chinese version.

ssh -v -N -C -D 8089 -o ServerAliveInterval=60 -o ServerAliveCountMax=2048

One step further.

Before long, your will see a lot of error messages like this:

debug1: Connection to port 8089 forwarding to socks port 0 requested.
debug1: channel 24: new [dynamic-tcpip]
debug1: channel 24: free: dynamic-tcpip, nchannels 35
debug1: Connection to port 8089 forwarding to socks port 0 requested.
debug1: channel 24: new [dynamic-tcpip]
debug1: channel 24: free: dynamic-tcpip, nchannels 35

Which means your just lost the connection to remote server, but you can use autossh to monitor and restart it.

autossh -M 2000 -v -N -C -D 8089 -o ServerAliveInterval=60 -o ServerAliveCountMax=2048

3-tier forwarding

Idea: shadowsocks + port forwarding (ssh tunnel)

# Start a ssserver in a server outside of China (here: listen on oversea:993)
ssserver -c /path/to/config.json

# Setup a Chinese Cloud server, connect to that ssserver (rkus.json pointing to oversea:993 and listen on cloud:993)
sslocal -c rkus.json

# Finally, connect to cloud server at local (socks on local:8089, local forwarding to cloud:993)
ssh -v -C -N -L 8089:localhost:993 cloud

# If you want the local ssh port forwarding to be auto restart, try autossh
autossh -M 2000 -v -C -N -L 8089:localhost:993 -o ServerAliveInterval=60 -o ServerAliveCountMax=2048

The result?

Might surprise you :-)

OK, attached the video ;)

Step closer to development:

~/docker/nhweb on  master ⌚ 1:08:21
$ git push -uf origin master
Counting objects: 5993, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (5698/5698), done.
Writing objects: 100% (5993/5993), 29.00 MiB | 5.17 MiB/s, done.
Total 5993 (delta 627), reused 1422 (delta 120)
+ 1b34252...dc448a1 master -> master (forced update)
Branch master set up to track remote branch master from origin.

Push code to Bitbucket (that one, normally 10-20KB/s…) can be up to 6MB/s.

Test environment: 四川省 长城宽带…


  • You will need 2 servers or at least ¥50 in your pocket to rent one.
  • Some Internet are bad enough, in such condition, you will need to use a AUTOSSH_POLL env to force autossh check the connection health more frequent. Let’s do a checking every 5 seconds!
    export AUTOSSH_POLL=5 &&  autossh -M 2000 -v -g -C -N -L 8089:localhost:993 -o ServerAliveInterval=60 -o ServerAliveCountMax=2048

Thank you for reading,

Ultimate docker on OSX collection - mapping docker files to local

Yes, you’ve heard, and have looked around here, here, or maybe here, it’s different to Linux with a simple volume mapped to your local machine. In OSX world, Docker is working in a VirtualBox…

So the file permission got be a problem, you can’t simply change its group or permission, neither. let’s fix it.

The idea is like this:

  • Everything in Docker operate as normal.
  • Create a new docker container that serves a ssh endpoint.
  • Connect to that ssh point, and get access to the file system inside our docker.
  • Get deeper, map the files of docker volume to local file system.

Let’s get started.

Run your containers as normal.

Go to your docker-compose directory, edit the file docker-compose.yml.

image: 'krlmlr/debian-ssh'
- '2222:22'
- SSH_KEY=ssh-rsa AAAAxxxx_ssh_rsa_pub_content
- data
working_dir: /var/www/html

Run it

docker-compose up sshd

Mount the docker file system to your local file system:

sshfs -p 2222 ~/docker/nhweb -oauto_cache,reconnect,defer_permissions,noappledouble,negative_vncache,volname=nhweb


  • volname=nhweb is the directory name of the mount point.
  • ~/docker/nhweb is the mount point.
  • These options are selected for more friendly and less errors.

Now your local folder ~/docker/nhweb are just the same as inside the Docker, but with the right access rights.


  • All the file created by you will on the name of root user inside the docker.
  • If you want to use another limited user with sudo permission, use docker.


Docker with wordpress

UPDATE (2018-05-11):

Our team at LodeStream has built a scaffold specifically for Wordpress development. You can check it out today and start play with it. Out of the box, it supports:

  • Docker, Docker Compose
  • Let’s encrypt HTTPS
  • Nginx as a reverse proxy with auto generated config
  • Simplified domain configuration
  • More information in the repo

Github repo: lodestreams/wordpress-docker-compose

The original post:

Install Docker on a Ubuntu:

Docker installation guide:

If you don’t know about datastore yet, refer to:

  • sudo docker create -v "$PWD":/var/lib/mysql --name dbstore mysql
  • sudo docker create -v "$PWD":/var/www/html --name htmlstore php
  • sudo docker run --name mysql -e MYSQL_ROOT_PASSWORD=password --volumes-from=dbstore -dp 3306:3306 mysql
  • git clone
  • sudo docker run -d --name wordpress --link mysql:mysql --volumes-from=htmlstore -p 80:80 youdar/wordpress
  • sudo docker run -d --link mysql:mysql -e MYSQL_USERNAME=root --name phpmyadmin -p 3307:80 corbinu/docker-phpmyadmin


添加新的 Wordpress 网站:

使用现有的 MySQL 数据库。

  • sudo docker create -v "$PWD":/var/www/html --name wordpressNameStore php
  • sudo docker run -d --name wordpressName --link mysql:mysql --volumes-from=htmlstore -p 800x:80 youdar/wordpress


  • Remove dangling volumes: sudo docker volume ls -f dangling=true | awk 'FNR > 1 {print $2}' | xargs sudo docker volume rm
  • Run a nginx at current dir: sudo docker run -it --rm -v "$PWD":/usr/share/nginx/html -p 8081:80 nginx

  • sudo docker inspect --format="" nginx | json_pp

Read More