Git Product home page Git Product logo

activitywatch / activitywatch Goto Github PK

View Code? Open in Web Editor NEW
11.2K 112.0 506.0 1.13 MB

The best free and open-source automated time tracker. Cross-platform, extensible, privacy-focused.

Home Page: https://activitywatch.net/

License: Mozilla Public License 2.0

Python 92.18% Inno Setup 7.28% Batchfile 0.54%
quantified-self activitywatch productivity time-tracking time-tracker afk cross-platform app timetracker analytics

activitywatch's Introduction

Records what you do so that you can know how you've spent your time.
All in a secure way where you control the data.


WebsiteForumDocumentationReleases
Contributor statsCI overview



Do you want to receive email updates on major announcements?
Signup for the newsletter!

Table of Contents

About

The goal of ActivityWatch is simple: Enable the collection of as much valuable lifedata as possible without compromising user privacy.

We've worked towards this goal by creating an application for safe storage of the data on the user's local machine and as well as a set of watchers which record data such as:

  • Currently active application and the title of its window
  • Currently active browser tab and its title and URL
  • Keyboard and mouse activity, to detect if you are AFK ("away from keyboard") or not

It is up to you as user to collect as much as you want, or as little as you want (and we hope some of you will help write watchers so we can collect more).

Screenshots

You can find more (and newer) screenshots on the website.

Installation & Usage

Downloads are available on the releases page.

For instructions on how to get started, please see the guide in the documentation.

Interested in building from source? There's a guide for that too.

Is this yet another time tracker?

Yes, but we found that most time trackers lack one or more important features.

Common dealbreakers:

  • Not open source
  • The user does not own the data (common with non-open source options)
  • Lack of synchronization (and when available: it's centralized and the sync server knows everything)
  • Difficult to setup/use (most open source options tend to target programmers)
  • Low data resolution (low level of detail, does not store raw data, long intervals between entries)
  • Hard or impossible to extend (collecting more data is not as simple as it could be)

To sum it up:

  • Closed source solutions suffer from privacy issues and limited features.
  • Open source solutions aren't developed with end-users in mind and are usually not written to be easily extended (they lack a proper API). They also lack synchronization.

We have a plan to address all of these and we're well on our way. See the table below for our progress.

Feature comparison

Basics
User owns data GUI Sync Open Source
ActivityWatch WIP, decentralized
Selfspy
ulogme
RescueTime Centralized
WakaTime Centralized Clients
Platforms
Windows macOS Linux Android iOS
ActivityWatch
Selfspy
ulogme
RescueTime Limited functionality
Tracking
App & Window Title AFK Browser Extensions Editor Plugins Extensible
ActivityWatch
Selfspy
ulogme
RescueTime
WakaTime Only for text editors

For a complete list of the things ActivityWatch can track, see the page on watchers in the documentation.

About this repository

This repo is a bundle of the core components and official modules of ActivityWatch (managed with git submodule). Its primary use is as a meta-package providing all the components in one repo; enabling easier packaging and installation. It is also where releases of the full suite are published (see releases).

Server

aw-server is the official implementation of the core service which the other ActivityWatch services interact with. It provides a REST API to a datastore and query engine. It also serves the web interface developed in the aw-webui project (which provides the frontend part of the webapp).

The REST API includes:

  • Access to a datastore suitable for timeseries/timeperiod-data
  • A query engine and language for such data

The webapp includes:

  • Data visualization & browser
  • Query explorer
  • Export functionality

Watchers

ActivityWatch comes pre-installed with two watchers:

  • aw-watcher-afk tracks the user active/inactive state from keyboard and mouse input
  • aw-watcher-window tracks the currently active application and its window title.

There are lots of other watchers for ActivityWatch which can track more types of activity. Like aw-watcher-web which tracks time spent on websites, multiple editor watchers which track spent time coding, and many more! A full list of watchers can be found in the documentation.

Libraries

  • aw-core - core library, provides no runnable modules
  • aw-client - client library, useful when writing watchers

Folder structure

Contributing

Want to help? Great! Check out the CONTRIBUTING.md file!

Questions and support

Have a question, suggestion, problem, or just want to say hi? Post on the forum!

activitywatch's People

Contributors

alwinator avatar archaeotheriumsapienter avatar belked avatar cclauss avatar crazypython avatar dependabot[bot] avatar erikbjare avatar exoji2e avatar feep avatar fossabot avatar gwynevans avatar iloveitaly avatar johan-bjareholt avatar kewde avatar lgtm-com[bot] avatar liutiming avatar lunarwatcher avatar michaeljelly avatar nikanar avatar omahs avatar pktiuk avatar rakleed avatar shubham0324 avatar sunrosa avatar vedantmgoyal9 avatar victorwinberg avatar xylix avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

activitywatch's Issues

Syncing

Vote on this issue on the forum!


There are two usage issues with ActivityWatch at the moment to which syncing is a solution:

  • If you use more than one device, you need to check every device individually, or run one centralized instance of aw-server (not recommended!)
  • If a machine is lost, so is the data (the user could have exported it, but data stored after the export would still be lost). While ActivityWatch cannot replace a proper backup system, syncing could help by storing copies of the data across devices.

I know of two interesting solutions to this problem:

  • Centralized server which stores all data encrypted (the server is unable to decrypt)
  • P2P synchronization (encrypted, possibly including relays)
    • Done by @syncthing very well, perhaps we could use it in some way. Also: MPL2 licensed and written in Go.
      • Downside: Clients must be online at the same time for sync.
      • They have the ability to set some folders to "read only", useful when you want to ensure the data stays intact in its source.
    • Implementing it ourselves would be an enormous effort, I assume.

Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

Implement Windows support

This includes:

  • Set up AppVeyor
    • For aw-core
    • For activitywatch bundle repo
  • Ensure aw-server works under Windows (I've had weird errors when I tried it in the past)
  • Fix windows support in aw-watcher-afk (might already work, see issue ActivityWatch/aw-watcher-afk#12)
  • Fix windows support in aw-watcher-window (definitely doesn't work)
  • Test aw-qt

Extract datastore module into its own repository

Also create a new function available_storagemethods() that returns all available strategies in a set. The storage strategies should also probably be renamed storage methods, a comment can be added that explain the classes are actually using the design pattern strategies.

A new issue should also be added regarding preventing JSON files (in the file storage method) growing larger than a certain size (which takes considerable resources deserializing, storing in memory, and then again serializing).

Error in directions from virtualenv

README.md has this command to great a virtual environment:

virtualenv venv --python=python3 --clear

This does not work. Here is the python3 recommended way (which works):

python3 -m venv venv

Implement OpenVR watcher

The current state of logging what is done is VR is horrible. RescueTime stops logging completely when mouse & keyboard input stops and since the window doesn't have to be in focus when in VR it likely wont in the short-medium term.

Should be easy enough, there are Python bindings here: https://pypi.python.org/pypi/openvr

Write basic browser watchers

Preferably one with code that can be shared between Firefox and Chrome (which will be what we are going to support primarily).

Work should begin with the Chrome watcher, which can then hopefully be ported without major difficulty to Firefox thanks to WebExtensions.

Basic data analysis

After discussion with @exoji2e and @johan-bjareholt we concluded that some basic data analysis would be necessary for the project to have any non-minor appeal.

Basic analysis includes:

  • Historical overview of non-afk tim
  • Time spent per application/website (after filtering using afkwatcher data)

Implement reading watcher

A watcher that can observes which book and page is read and when.

Possibly as a modification to koreader or similar open source reader (such that it runs on multiple platforms).

Concept discussed with @patrik-laurell and @exoji2e.

Failed events causes havoc in terms of order-of-requests

If aw-server and a watcher is running and then the server suddenly dies the client will start queueing up failed requests to store events, as it should.

However, when the server comes back up, the watcher could try to send another event before it tried to empty it's failed_events_queue. This leads to the events getting out of order, effectively ruining replace_last_event.

Should be an easy fix, simply always add the request to the queue when it is non-empty. However, the added complexity makes for an argument for moving towards a heartbeat-based API since that would only require queueing heartbeat-objects instead of requests to different endpoints (new event, replace last event, new event, etc.).

Requests fails to build on Appveyor

I was trying to implement a workaround for #51 when this happened: https://ci.appveyor.com/project/ErikBjare/activitywatch/build/job/nj0e99xty0vskdi2

Relevant output
Searching for requests
Reading https://pypi.python.org/simple/requests/
Downloading https://pypi.python.org/packages/4c/54/1d3abddbd4c7544138b88e8329ef5294ffdc6c5d7ea965bf42e3cc4c9c39/requests-2.16.1.tar.gz#md5=4acb351824461eb3ae1f74ec3a65ff28
Best match: requests 2.16.1
Processing requests-2.16.1.tar.gz
Writing C:\Users\appveyor\AppData\Local\Temp\1\easy_install-qoyp00fn\requests-2.16.1\setup.cfg
Running requests-2.16.1\setup.py -q bdist_egg --dist-dir C:\Users\appveyor\AppData\Local\Temp\1\easy_install-qoyp00fn\requests-2.16.1\egg-dist-tmp-rqjnti7r
Traceback (most recent call last):
  File "C:\Python35\lib\site-packages\setuptools\sandbox.py", line 157, in save_modules
    yield saved
  File "C:\Python35\lib\site-packages\setuptools\sandbox.py", line 198, in setup_context
    yield
  File "C:\Python35\lib\site-packages\setuptools\sandbox.py", line 255, in run_setup
    DirectorySandbox(setup_dir).run(runner)
  File "C:\Python35\lib\site-packages\setuptools\sandbox.py", line 285, in run
    return func()
  File "C:\Python35\lib\site-packages\setuptools\sandbox.py", line 253, in runner
    _execfile(setup_script, ns)
  File "C:\Python35\lib\site-packages\setuptools\sandbox.py", line 47, in _execfile
    exec(code, globals, locals)
  File "C:\Users\appveyor\AppData\Local\Temp\1\easy_install-qoyp00fn\requests-2.16.1\setup.py", line 51, in <module>
  File "C:\Python35\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 441: character maps to <undefined>
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "setup.py", line 18, in <module>
    'https://github.com/ActivityWatch/aw-core/tarball/master#egg=aw-core'
  File "C:\Python35\lib\distutils\core.py", line 148, in setup
    dist.run_commands()
  File "C:\Python35\lib\distutils\dist.py", line 955, in run_commands
    self.run_command(cmd)
  File "C:\Python35\lib\distutils\dist.py", line 974, in run_command
    cmd_obj.run()
  File "C:\Python35\lib\site-packages\setuptools\command\install.py", line 67, in run
    self.do_egg_install()
  File "C:\Python35\lib\site-packages\setuptools\command\install.py", line 117, in do_egg_install
    cmd.run()
  File "C:\Python35\lib\site-packages\setuptools\command\easy_install.py", line 411, in run
    self.easy_install(spec, not self.no_deps)
  File "C:\Python35\lib\site-packages\setuptools\command\easy_install.py", line 654, in easy_install
    return self.install_item(None, spec, tmpdir, deps, True)
  File "C:\Python35\lib\site-packages\setuptools\command\easy_install.py", line 701, in install_item
    self.process_distribution(spec, dist, deps)
  File "C:\Python35\lib\site-packages\setuptools\command\easy_install.py", line 746, in process_distribution
    [requirement], self.local_index, self.easy_install
  File "C:\Python35\lib\site-packages\pkg_resources\__init__.py", line 851, in resolve
    dist = best[req.key] = env.best_match(req, ws, installer)
  File "C:\Python35\lib\site-packages\pkg_resources\__init__.py", line 1123, in best_match
    return self.obtain(req, installer)
  File "C:\Python35\lib\site-packages\pkg_resources\__init__.py", line 1135, in obtain
    return installer(requirement)
  File "C:\Python35\lib\site-packages\setuptools\command\easy_install.py", line 673, in easy_install
    return self.install_item(spec, dist.location, tmpdir, deps)
  File "C:\Python35\lib\site-packages\setuptools\command\easy_install.py", line 699, in install_item
    dists = self.install_eggs(spec, download, tmpdir)
  File "C:\Python35\lib\site-packages\setuptools\command\easy_install.py", line 880, in install_eggs
    return self.build_and_install(setup_script, setup_base)
  File "C:\Python35\lib\site-packages\setuptools\command\easy_install.py", line 1119, in build_and_install
    self.run_setup(setup_script, setup_base, args)
  File "C:\Python35\lib\site-packages\setuptools\command\easy_install.py", line 1105, in run_setup
    run_setup(setup_script, args)
  File "C:\Python35\lib\site-packages\setuptools\sandbox.py", line 258, in run_setup
    raise
  File "C:\Python35\lib\contextlib.py", line 77, in __exit__
    self.gen.throw(type, value, traceback)
  File "C:\Python35\lib\site-packages\setuptools\sandbox.py", line 198, in setup_context
    yield
  File "C:\Python35\lib\contextlib.py", line 77, in __exit__
    self.gen.throw(type, value, traceback)
  File "C:\Python35\lib\site-packages\setuptools\sandbox.py", line 169, in save_modules
    saved_exc.resume()
  File "C:\Python35\lib\site-packages\setuptools\sandbox.py", line 144, in resume
    six.reraise(type, exc, self._tb)
  File "C:\Python35\lib\site-packages\six.py", line 685, in reraise
    raise value.with_traceback(tb)
  File "C:\Python35\lib\site-packages\setuptools\sandbox.py", line 157, in save_modules
    yield saved
  File "C:\Python35\lib\site-packages\setuptools\sandbox.py", line 198, in setup_context
    yield
  File "C:\Python35\lib\site-packages\setuptools\sandbox.py", line 255, in run_setup
    DirectorySandbox(setup_dir).run(runner)
  File "C:\Python35\lib\site-packages\setuptools\sandbox.py", line 285, in run
    return func()
  File "C:\Python35\lib\site-packages\setuptools\sandbox.py", line 253, in runner
    _execfile(setup_script, ns)
  File "C:\Python35\lib\site-packages\setuptools\sandbox.py", line 47, in _execfile
    exec(code, globals, locals)
  File "C:\Users\appveyor\AppData\Local\Temp\1\easy_install-qoyp00fn\requests-2.16.1\setup.py", line 51, in <module>
  File "C:\Python35\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 441: character maps to <undefined>

Implement basic Web GUI

Doesn't need to be complex, just working with overview of buckets and events (no need to be graphical, yet).

Depends on aw-client-js.

Set up proper integrationtests

Right now the tests only run when the activitywatch repo is committed. We want to run the tests every time the aw-client or aw-server is updated.

For now I guess this will work okay, at least the tests will run every time it's time for a release, but it would be nice to set up properly.

Release announcement

We might want to share here:

I'm pretty sure I have a list of more places where announcements would be appropriate. Unfortunately, I can't be bothered to find it right now since it's still a bit off.

Excessive split on `:`

screenshot_2017-03-13_13-48-15

In the bucket viewer it shows up as title:[Main:python3] aw-watcher-afk /home/erb/.local/share/activitywatch/aw-server (/home/erb/.local/share/activitywatch/aw-server), so I suspect something is going wrong in the webui. But I'm not sure.

Add GitLab CI

By doing this we could test everything (which isn't possible with Travis) by setting up a docker-compose file containing the platform-in-a-box for public use (including backend services like Elasticsearch, RethinkDB and MongoDB).

Add functionality to redact/filter sensitive data

We need a model to filter out sensitive data by default.

For example if a window title contains: "[title] - Firefox (Private Browsing)" we should redact [title] to some magic string such as "REDACTED".

For some cases we might want to filter the window out entirely, giving 0 information about which window is running, better catch too much than too little.

It should be the goal that every user has a set of "clean" data. The filtering should also be able to be run on an existing database of data, so that cleaner data can be output. Preferably, the data should be so clean that there is little (or even no) reason not to share it (which would be great since easy access to a large dataset could make research in some areas a lot easier!).

The question left is where this processing step should take place. We want the filtering/redacting to happen before data is sent anywhere but it should also be able to be enforceable on a server (if the server owner doesn't trust the servers security, if in the cloud for example) and have clients notified of this so that they can do the filtering on their side, removing the need to send sensitive data at all. It might therefore be prudent to write a module in aw-core that implements this functionality since it should be useable from the server and all clients (which transmit sensitive data).

This feature should be on by default, we don't need anything advanced yet, first priority is to redact titles from Incognito/Private Browsing, that's a good step in the right direction.

This should have a far higher priority than Zero-Knowledge storage right now, because it's a lot easier and is more user friendly (In ZK storage: if you lose your keys you lose your data).


Useful when:

  • We want to export data to a 3rd party service but don't need them to know all the details.
  • We want to do overview analysis where full detail is not necessary.
  • We want to redact some information in the log, such as the window titles of Incognito/Private browser-windows, Tor Browser, etc.

This issue was originally moved from ActivityWatch/aw-server#4 which ended up here because it ended up having wider scope not only relating to aw-server.


Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

Decide on format for window/tab/application data

This data format should be similar for the following watchers, accommodating all their needs:

  • Executable path/URL (could be URL, we might want to have arguments as well, such as when the executable is Python/Java running a program)
  • Window/tab title (could be title)
  • Window class (could be tags/labels)

Release checklist for version 0.7

Checklist moved here from: #34

This is planned to be the last in the 0.x series, will be followed by 1.0 if all goes according to plan.

  • Update submodules
  • Packaging
    • Unify build/install/CI scripts using makefile (see #43)
    • Fix macOS packaging (see #27)
    • Create Debian package
  • Passing builds in CI
    • Travis
    • Run all tests in submodules (use pytest for test discovery, call their make test)
    • AppVeyor (might be delayed to a later version)
      • Upload artifact on releases

Create installation methods for non-developers

Right now you pretty much need to be a developer to start using ActivityWatch. (not anymore!)

One easy improvement we could make is to create a bash one-liner that installs ActivityWatch (much like the one-liner used to install brew). In the future (when we leave beta) we'd likely have to distribute installers/packages.

Would require some kind of process management for aw-server and watchers. (we now have aw-qt)

Must do:

  • Linux: Build a portable .zip
  • macOS: Build a portable .zip
  • Windows: Create a portable .zip

May do (secondary goals):

And finally:

  • Put installation instructions in README

Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

File structure of client configuration directories

On Linux, all user-level config files should be stored in a subdirectory of $XDG_USER_CONFIG (defaults to $HOME/.config) according to XDG spec.

Currently we have an issue where we don't place the configuration files of different modules in a consistent manner. We currently use appdirs for this in a lot of places, we should consider putting a function get_global_config_dir() and get_config_dir(module_name) in the aw-core package which is used everywhere. We might also want a get_log_dir(), even though it might end up only being used in aw_core.log.

We might also want to consider $XDG_DATA_HOME (defaults to $HOME/.local/share) for data such as databases (sqlite etc.) managed by aw-server. We might even want to consider $XDG_CACHE_HOME in case we ever want to cache some dataviews presented by aw-server for instance (which is likely).

Implement basic Android client

Note if you came from the README: ActivityWatch for Android is likely to take quite a while to get built, but Google is adding an Usage dashboard to Android P, and there are several apps already good at collecting usage-data (such as SmarterTime). We suggest you use something like SmarterTime in the meanwhile (or anything else that has a good data export), and we'll work together on creating a way to import that data into ActivityWatch later. Thank you for understanding 🙂

Update: ActivityWatch is now available for Android on the Google Play Store. Still early beta, but it works!


Two parts:

  • A basic client lib in Java
  • An Android watcher (app)

Spotify Watcher

Apparently Spotify has clean API for getting playing song. Would be nice to use this for logging. @emarforio knows more.

Might want to do this on Android too, so a watcher that works on all platforms would be nice.

An event would look something like:

{
  "label": ["title:chns", "artist:Hannes Nilsson", "album:Unfinished shit"], 
  "duration": 115, 
  "timestamp": ...
} 

Choose a license

I've recently become a fan of MPL2, a "file-level" copy left license used by Firefox, Syncthing among others. It is GPL and Apache compatible.

I've considered the GPL, but I've had concerns about it being "too much". I also considered the MIT License but it isn't copy left, which I think is needed for a project like this.

Thoughts @johan-bjareholt?

Finish basic docs

This issue is not meant to be the end-all of doc writing needs, but a few things need to be finished by the 1.0 release:

  • Write a basic introduction as well as specify the scope of the project.
  • Write an installation guide
  • Move some content in README:s to the docs (such as aw-server/README.md).
  • Improve activitywatch/README.md, that's usually the first thing people who've been linked to the project will see (add a link to an installation guide or link to the releases page)
  • Add screenshots to activitywatch/README.md
  • Write pages for the existing watchers, explaining their purpose and functionality.

Add badges and ways for new users to follow/find ActivityWatch on the web

So, a few things we could do to increase the number of people who'll interact with ActivityWatch on the web.

Related: we should have some method of collecting feedback.

Create a logo

We need something basic, something possibly clean and uncoloured that can be styled later if needed.

Possible designs will likely be brainstormed at next meetup.

aw-watcher-window error

aw-watcher-window gets a list index out of range error while trying to get the active window. Here is the stack trace:

Guys-MacBook-Pro:activitywatch guybieber$ source ./venv/bin/activate
(venv) Guys-MacBook-Pro:activitywatch guybieber$ aw-watcher-window
osascript: /Users/guybieber/Documents/guy/2016Karmas/Development/source/activitywatch/venv/lib/python3.6/site-packages/aw_watcher_window-0.1-py3.6.egg/aw_watcher_window/printAppTitle.scpt: No such file or directory
2017-06-01 18:20:09,324 [ERROR]: Exception thrown while trying to get active window: list index out of range (main.py:59)
Traceback (most recent call last):
File "/Users/guybieber/Documents/guy/2016Karmas/Development/source/activitywatch/venv/lib/python3.6/site-packages/aw_watcher_window-0.1-py3.6.egg/aw_watcher_window/main.py", line 56, in main
current_window = get_current_window()
File "/Users/guybieber/Documents/guy/2016Karmas/Development/source/activitywatch/venv/lib/python3.6/site-packages/aw_watcher_window-0.1-py3.6.egg/aw_watcher_window/lib.py", line 49, in get_current_window
return get_current_window_macos()
File "/Users/guybieber/Documents/guy/2016Karmas/Development/source/activitywatch/venv/lib/python3.6/site-packages/aw_watcher_window-0.1-py3.6.egg/aw_watcher_window/lib.py", line 29, in get_current_window_macos
title = macos.getTitle(info)
File "/Users/guybieber/Documents/guy/2016Karmas/Development/source/activitywatch/venv/lib/python3.6/site-packages/aw_watcher_window-0.1-py3.6.egg/aw_watcher_window/macos.py", line 17, in getTitle
return info.split('","')[1][:-1]
IndexError: list index out of range

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/Users/guybieber/Documents/guy/2016Karmas/Development/source/activitywatch/venv/bin/aw-watcher-window", line 11, in
load_entry_point('aw-watcher-window==0.1', 'console_scripts', 'aw-watcher-window')()
File "/Users/guybieber/Documents/guy/2016Karmas/Development/source/activitywatch/venv/lib/python3.6/site-packages/aw_watcher_window-0.1-py3.6.egg/aw_watcher_window/main.py", line 60, in main
traceback.print_exc(e)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/traceback.py", line 159, in print_exc
print_exception(*sys.exc_info(), limit=limit, file=file, chain=chain)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/traceback.py", line 100, in print_exception
type(value), value, tb, limit=limit).format(chain=chain):
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/traceback.py", line 497, in init
capture_locals=capture_locals)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/traceback.py", line 332, in extract
if limit >= 0:
TypeError: '>=' not supported between instances of 'IndexError' and 'int'

Use proper versioning in submodules

All modules currently have version 0.1 (or, in some few cases, 0.2). I think now would be a good time to finally start versioning them properly. aw-core, aw-server and aw-client specifically. The watchers should also specify which versions they depend on.

I also want to get rid of the dependency_links in all the setup.py's, but that might be postponed to later.

Perhaps we should use something semver-like?

Oh, and also: I don't think we should attempt to keep the versions of the subrepos "in sync" (aw-core and aw-client should not have to have the same version number), but that's up for debate.


Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

Fix packaging on macOS

Note to readers: ActivityWatch should still work on macOS, this issue is about building a stand-alone bundle not dependent on Python 3.5+ being installed on the system.

Currently PyInstaller is broken on Python 3.6, which the macOS target uses.

The relevant issue for PyInstaller is here: pyinstaller/pyinstaller#2331

A temporary workaround would be to try and make the macOS travis target use Python 3.5, but there didn't seem to be a straight forward solution.

Builds for macOS no longer required to pass in:

  • activitywatch
  • aw-watcher-window

Needs to be fixed for:

Create a feature comparison matrix

We should compare ActivityWatch to: RescueTime, arbtt, selfspy, ...

Features to compare:

  • User owns the data
  • Platforms supported
  • Sync
  • Open Source
  • Browser plugin/URL logging
  • Available watchers (active window, afk, browser, editor)
  • More?

Add upload to Zenobase feature

Analysis and visualization of data is explicitly a non-goal of the core ActivityWatch project. Zenobase does a great job of it though, and since we have gotten a lot of inspiration from it it seems only fair to give it some publicity by making Zenobase uploading a core feature (should add very limited complexity/code by making good use of PyZenobase) and advertising it as a good way to visualize data. It is expected to be easy to implement due to the similarity of the Event model.

Ping @ejain

Name the release artifacts better

Currently the format is activitywatch-{os}.zip, something better would be activitywatch-{os}-{platform}-{tag}.zip. (Platform indicates x86/x86_64 as the pyinstaller build presumably depends upon it)

It would be neat if we could also get the commit out of a --help or --version command.

Investigating implementing code in Rust

Python is pain to manage and uses a lot of memory and isn't exactly lean (important if we want to minimize battery footprint).

Some parts of ActivityWatch, who's design has matured and could need a leaner version should be considered for reimplementation in Rust.

I don't expect much to happen to this issue for quite a while, a lot will depend on the development of the Rust language and community. I've tried to implement a barebones aw-server in the repo aw-rust.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.